ZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9LY29uZmlnIGIvYXJjaC9pMzg2L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdhMGNiYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9LY29uZmlnCkBAIC0wLDAgKzEsMTI2OSBAQAorIworIyBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc3ludGF4IG9mIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLAorIyBzZWUgRG9jdW1lbnRhdGlvbi9rYnVpbGQva2NvbmZpZy1sYW5ndWFnZS50eHQuCisjCisKK21haW5tZW51ICJMaW51eCBLZXJuZWwgQ29uZmlndXJhdGlvbiIKKworY29uZmlnIFg4NgorCWJvb2wKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIGlzIExpbnV4J3MgaG9tZSBwb3J0LiAgTGludXggd2FzIG9yaWdpbmFsbHkgbmF0aXZlIHRvIHRoZSBJbnRlbAorCSAgMzg2LCBhbmQgcnVucyBvbiBhbGwgdGhlIGxhdGVyIHg4NiBwcm9jZXNzb3JzIGluY2x1ZGluZyB0aGUgSW50ZWwKKwkgIDQ4NiwgNTg2LCBQZW50aXVtcywgYW5kIHZhcmlvdXMgaW5zdHJ1Y3Rpb24tc2V0LWNvbXBhdGlibGUgY2hpcHMgYnkKKwkgIEFNRCwgQ3lyaXgsIGFuZCBvdGhlcnMuCisKK2NvbmZpZyBNTVUKKwlib29sCisJZGVmYXVsdCB5CisKK2NvbmZpZyBTQlVTCisJYm9vbAorCitjb25maWcgVUlEMTYKKwlib29sCisJZGVmYXVsdCB5CisKK2NvbmZpZyBHRU5FUklDX0lTQV9ETUEKKwlib29sCisJZGVmYXVsdCB5CisKK2NvbmZpZyBHRU5FUklDX0lPTUFQCisJYm9vbAorCWRlZmF1bHQgeQorCitzb3VyY2UgImluaXQvS2NvbmZpZyIKKworbWVudSAiUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzIgorCitjaG9pY2UKKwlwcm9tcHQgIlN1YmFyY2hpdGVjdHVyZSBUeXBlIgorCWRlZmF1bHQgWDg2X1BDCisKK2NvbmZpZyBYODZfUEMKKwlib29sICJQQy1jb21wYXRpYmxlIgorCWhlbHAKKwkgIENob29zZSB0aGlzIG9wdGlvbiBpZiB5b3VyIGNvbXB1dGVyIGlzIGEgc3RhbmRhcmQgUEMgb3IgY29tcGF0aWJsZS4KKworY29uZmlnIFg4Nl9FTEFOCisJYm9vbCAiQU1EIEVsYW4iCisJaGVscAorCSAgU2VsZWN0IHRoaXMgZm9yIGFuIEFNRCBFbGFuIHByb2Nlc3Nvci4KKworCSAgRG8gbm90IHVzZSB0aGlzIG9wdGlvbiBmb3IgSzYvQXRobG9uL09wdGVyb24gcHJvY2Vzc29ycyEKKworCSAgSWYgdW5zdXJlLCBjaG9vc2UgIlBDLWNvbXBhdGlibGUiIGluc3RlYWQuCisKK2NvbmZpZyBYODZfVk9ZQUdFUgorCWJvb2wgIlZveWFnZXIgKE5DUikiCisJaGVscAorCSAgVm95YWdlciBpcyBhbiBNQ0EtYmFzZWQgMzItd2F5IGNhcGFibGUgU01QIGFyY2hpdGVjdHVyZSBwcm9wcmlldGFyeQorCSAgdG8gTkNSIENvcnAuICBNYWNoaW5lIGNsYXNzZXMgMzQ1eC8zNXh4LzQxMDAvNTF4eCBhcmUgVm95YWdlci1iYXNlZC4KKworCSAgKioqIFdBUk5JTkcgKioqCisKKwkgIElmIHlvdSBkbyBub3Qgc3BlY2lmaWNhbGx5IGtub3cgeW91IGhhdmUgYSBWb3lhZ2VyIGJhc2VkIG1hY2hpbmUsCisJICBzYXkgTiBoZXJlLCBvdGhlcndpc2UgdGhlIGtlcm5lbCB5b3UgYnVpbGQgd2lsbCBub3QgYmUgYm9vdGFibGUuCisKK2NvbmZpZyBYODZfTlVNQVEKKwlib29sICJOVU1BUSAoSUJNL1NlcXVlbnQpIgorCXNlbGVjdCBESVNDT05USUdNRU0KKwlzZWxlY3QgTlVNQQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGlzIHVzZWQgZm9yIGdldHRpbmcgTGludXggdG8gcnVuIG9uIGEgKElCTS9TZXF1ZW50KSBOVU1BCisJICBtdWx0aXF1YWQgYm94LiBUaGlzIGNoYW5nZXMgdGhlIHdheSB0aGF0IHByb2Nlc3NvcnMgYXJlIGJvb3RzdHJhcHBlZCwKKwkgIGFuZCB1c2VzIENsdXN0ZXJlZCBMb2dpY2FsIEFQSUMgYWRkcmVzc2luZyBtb2RlIGluc3RlYWQgb2YgRmxhdCBMb2dpY2FsLgorCSAgWW91IHdpbGwgbmVlZCBhIG5ldyBseW54ZXIuZWxmIGZpbGUgdG8gZmxhc2ggeW91ciBmaXJtd2FyZSB3aXRoIC0gc2VuZAorCSAgZW1haWwgdG8gPE1hcnRpbi5CbGlnaEB1cy5pYm0uY29tPi4KKworY29uZmlnIFg4Nl9TVU1NSVQKKwlib29sICJTdW1taXQvRVhBIChJQk0geDQ0MCkiCisJZGVwZW5kcyBvbiBTTVAKKwloZWxwCisJICBUaGlzIG9wdGlvbiBpcyBuZWVkZWQgZm9yIElCTSBzeXN0ZW1zIHRoYXQgdXNlIHRoZSBTdW1taXQvRVhBIGNoaXBzZXQuCisJICBJbiBwYXJ0aWN1bGFyLCBpdCBpcyBuZWVkZWQgZm9yIHRoZSB4NDQwLgorCisJICBJZiB5b3UgZG9uJ3QgaGF2ZSBvbmUgb2YgdGhlc2UgY29tcHV0ZXJzLCB5b3Ugc2hvdWxkIHNheSBOIGhlcmUuCisKK2NvbmZpZyBYODZfQklHU01QCisJYm9vbCAiU3VwcG9ydCBmb3Igb3RoZXIgc3ViLWFyY2ggU01QIHN5c3RlbXMgd2l0aCBtb3JlIHRoYW4gOCBDUFVzIgorCWRlcGVuZHMgb24gU01QCisJaGVscAorCSAgVGhpcyBvcHRpb24gaXMgbmVlZGVkIGZvciB0aGUgc3lzdGVtcyB0aGF0IGhhdmUgbW9yZSB0aGFuIDggQ1BVcworCSAgYW5kIGlmIHRoZSBzeXN0ZW0gaXMgbm90IG9mIGFueSBzdWItYXJjaCB0eXBlIGFib3ZlLgorCisJICBJZiB5b3UgZG9uJ3QgaGF2ZSBzdWNoIGEgc3lzdGVtLCB5b3Ugc2hvdWxkIHNheSBOIGhlcmUuCisKK2NvbmZpZyBYODZfVklTV1MKKwlib29sICJTR0kgMzIwLzU0MCAoVmlzdWFsIFdvcmtzdGF0aW9uKSIKKwloZWxwCisJICBUaGUgU0dJIFZpc3VhbCBXb3Jrc3RhdGlvbiBzZXJpZXMgaXMgYW4gSUEzMi1iYXNlZCB3b3Jrc3RhdGlvbgorCSAgYmFzZWQgb24gU0dJIHN5c3RlbXMgY2hpcHMgd2l0aCBzb21lIGxlZ2FjeSBQQyBoYXJkd2FyZSBhdHRhY2hlZC4KKworCSAgU2F5IFkgaGVyZSB0byBjcmVhdGUgYSBrZXJuZWwgdG8gcnVuIG9uIHRoZSBTR0kgMzIwIG9yIDU0MC4KKworCSAgQSBrZXJuZWwgY29tcGlsZWQgZm9yIHRoZSBWaXN1YWwgV29ya3N0YXRpb24gd2lsbCBub3QgcnVuIG9uIFBDcworCSAgYW5kIHZpY2UgdmVyc2EuIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3NnaS12aXN3cy50eHQ+IGZvciBkZXRhaWxzLgorCitjb25maWcgWDg2X0dFTkVSSUNBUkNICisgICAgICAgYm9vbCAiR2VuZXJpYyBhcmNoaXRlY3R1cmUgKFN1bW1pdCwgYmlnc21wLCBFUzcwMDAsIGRlZmF1bHQpIgorICAgICAgIGRlcGVuZHMgb24gU01QCisgICAgICAgaGVscAorICAgICAgICAgIFRoaXMgb3B0aW9uIGNvbXBpbGVzIGluIHRoZSBTdW1taXQsIGJpZ3NtcCwgRVM3MDAwLCBkZWZhdWx0IHN1YmFyY2hpdGVjdHVyZXMuCisJICBJdCBpcyBpbnRlbmRlZCBmb3IgYSBnZW5lcmljIGJpbmFyeSBrZXJuZWwuCisKK2NvbmZpZyBYODZfRVM3MDAwCisJYm9vbCAiU3VwcG9ydCBmb3IgVW5pc3lzIEVTNzAwMCBJQTMyIHNlcmllcyIKKwlkZXBlbmRzIG9uIFNNUAorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIFVuaXN5cyBFUzcwMDAgc3lzdGVtcy4gIFNheSAnWScgaGVyZSBpZiB0aGlzIGtlcm5lbCBpcworCSAgc3VwcG9zZWQgdG8gcnVuIG9uIGFuIElBMzItYmFzZWQgVW5pc3lzIEVTNzAwMCBzeXN0ZW0uCisJICBPbmx5IGNob29zZSB0aGlzIG9wdGlvbiBpZiB5b3UgaGF2ZSBzdWNoIGEgc3lzdGVtLCBvdGhlcndpc2UgeW91CisJICBzaG91bGQgc2F5IE4gaGVyZS4KKworZW5kY2hvaWNlCisKK2NvbmZpZyBBQ1BJX1NSQVQKKwlib29sCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBOVU1BICYmIChYODZfU1VNTUlUIHx8IFg4Nl9HRU5FUklDQVJDSCkKKworY29uZmlnIFg4Nl9TVU1NSVRfTlVNQQorCWJvb2wKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIE5VTUEgJiYgKFg4Nl9TVU1NSVQgfHwgWDg2X0dFTkVSSUNBUkNIKQorCitjb25maWcgWDg2X0NZQ0xPTkVfVElNRVIKKwlib29sCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBYODZfU1VNTUlUIHx8IFg4Nl9HRU5FUklDQVJDSAorCitjb25maWcgRVM3MDAwX0NMVVNURVJFRF9BUElDCisJYm9vbAorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gU01QICYmIFg4Nl9FUzcwMDAgJiYgTVBFTlRJVU1JSUkKKworaWYgIVg4Nl9FTEFOCisKK2Nob2ljZQorCXByb21wdCAiUHJvY2Vzc29yIGZhbWlseSIKKwlkZWZhdWx0IE02ODYKKworY29uZmlnIE0zODYKKwlib29sICIzODYiCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyB0aGUgcHJvY2Vzc29yIHR5cGUgb2YgeW91ciBDUFUuIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCBmb3IKKwkgIG9wdGltaXppbmcgcHVycG9zZXMuIEluIG9yZGVyIHRvIGNvbXBpbGUgYSBrZXJuZWwgdGhhdCBjYW4gcnVuIG9uCisJICBhbGwgeDg2IENQVSB0eXBlcyAoYWxiZWl0IG5vdCBvcHRpbWFsbHkgZmFzdCksIHlvdSBjYW4gc3BlY2lmeQorCSAgIjM4NiIgaGVyZS4KKworCSAgVGhlIGtlcm5lbCB3aWxsIG5vdCBuZWNlc3NhcmlseSBydW4gb24gZWFybGllciBhcmNoaXRlY3R1cmVzIHRoYW4KKwkgIHRoZSBvbmUgeW91IGhhdmUgY2hvc2VuLCBlLmcuIGEgUGVudGl1bSBvcHRpbWl6ZWQga2VybmVsIHdpbGwgcnVuIG9uCisJICBhIFBQcm8sIGJ1dCBub3QgbmVjZXNzYXJpbHkgb24gYSBpNDg2LgorCisJICBIZXJlIGFyZSB0aGUgc2V0dGluZ3MgcmVjb21tZW5kZWQgZm9yIGdyZWF0ZXN0IHNwZWVkOgorCSAgLSAiMzg2IiBmb3IgdGhlIEFNRC9DeXJpeC9JbnRlbCAzODZEWC9EWEwvU0wvU0xDL1NYLCBDeXJpeC9USQorCSAgNDg2RExDL0RMQzIsIFVNQyA0ODZTWC1TIGFuZCBOZXhHZW4gTng1ODYuICBPbmx5ICIzODYiIGtlcm5lbHMKKwkgIHdpbGwgcnVuIG9uIGEgMzg2IGNsYXNzIG1hY2hpbmUuCisJICAtICI0ODYiIGZvciB0aGUgQU1EL0N5cml4L0lCTS9JbnRlbCA0ODZEWC9EWDIvRFg0IG9yCisJICBTTC9TTEMvU0xDMi9TTEMzL1NYL1NYMiBhbmQgVU1DIFU1RCBvciBVNVMuCisJICAtICI1ODYiIGZvciBnZW5lcmljIFBlbnRpdW0gQ1BVcyBsYWNraW5nIHRoZSBUU0MKKwkgICh0aW1lIHN0YW1wIGNvdW50ZXIpIHJlZ2lzdGVyLgorCSAgLSAiUGVudGl1bS1DbGFzc2ljIiBmb3IgdGhlIEludGVsIFBlbnRpdW0uCisJICAtICJQZW50aXVtLU1NWCIgZm9yIHRoZSBJbnRlbCBQZW50aXVtIE1NWC4KKwkgIC0gIlBlbnRpdW0tUHJvIiBmb3IgdGhlIEludGVsIFBlbnRpdW0gUHJvLgorCSAgLSAiUGVudGl1bS1JSSIgZm9yIHRoZSBJbnRlbCBQZW50aXVtIElJIG9yIHByZS1Db3BwZXJtaW5lIENlbGVyb24uCisJICAtICJQZW50aXVtLUlJSSIgZm9yIHRoZSBJbnRlbCBQZW50aXVtIElJSSBvciBDb3BwZXJtaW5lIENlbGVyb24uCisJICAtICJQZW50aXVtLTQiIGZvciB0aGUgSW50ZWwgUGVudGl1bSA0IG9yIFA0LWJhc2VkIENlbGVyb24uCisJICAtICJLNiIgZm9yIHRoZSBBTUQgSzYsIEs2LUlJIGFuZCBLNi1JSUkgKGFrYSBLNi0zRCkuCisJICAtICJBdGhsb24iIGZvciB0aGUgQU1EIEs3IGZhbWlseSAoQXRobG9uL0R1cm9uL1RodW5kZXJiaXJkKS4KKwkgIC0gIkNydXNvZSIgZm9yIHRoZSBUcmFuc21ldGEgQ3J1c29lIHNlcmllcy4KKwkgIC0gIkVmZmljZW9uIiBmb3IgdGhlIFRyYW5zbWV0YSBFZmZpY2VvbiBzZXJpZXMuCisJICAtICJXaW5jaGlwLUM2IiBmb3Igb3JpZ2luYWwgSURUIFdpbmNoaXAuCisJICAtICJXaW5jaGlwLTIiIGZvciBJRFQgV2luY2hpcCAyLgorCSAgLSAiV2luY2hpcC0yQSIgZm9yIElEVCBXaW5jaGlwcyB3aXRoIDNkTm93ISBjYXBhYmlsaXRpZXMuCisJICAtICJNZWRpYUdYL0dlb2RlIiBmb3IgQ3lyaXggTWVkaWFHWCBha2EgR2VvZGUuCisJICAtICJDeXJpeElJSS9WSUEgQzMiIGZvciBWSUEgQ3lyaXggSUlJIG9yIFZJQSBDMy4KKwkgIC0gIlZJQSBDMy0yIGZvciBWSUEgQzMtMiAiTmVoZW1pYWgiIChtb2RlbCA5IGFuZCBhYm92ZSkuCisKKwkgIElmIHlvdSBkb24ndCBrbm93IHdoYXQgdG8gZG8sIGNob29zZSAiMzg2Ii4KKworY29uZmlnIE00ODYKKwlib29sICI0ODYiCisJaGVscAorCSAgU2VsZWN0IHRoaXMgZm9yIGEgNDg2IHNlcmllcyBwcm9jZXNzb3IsIGVpdGhlciBJbnRlbCBvciBvbmUgb2YgdGhlCisJICBjb21wYXRpYmxlIHByb2Nlc3NvcnMgZnJvbSBBTUQsIEN5cml4LCBJQk0sIG9yIEludGVsLiAgSW5jbHVkZXMgRFgsCisJICBEWDIsIGFuZCBEWDQgdmFyaWFudHM7IGFsc28gU0wvU0xDL1NMQzIvU0xDMy9TWC9TWDIgYW5kIFVNQyBVNUQgb3IKKwkgIFU1Uy4KKworY29uZmlnIE01ODYKKwlib29sICI1ODYvSzUvNXg4Ni82eDg2LzZ4ODZNWCIKKwloZWxwCisJICBTZWxlY3QgdGhpcyBmb3IgYW4gNTg2IG9yIDY4NiBzZXJpZXMgcHJvY2Vzc29yIHN1Y2ggYXMgdGhlIEFNRCBLNSwKKwkgIHRoZSBDeXJpeCA1eDg2LCA2eDg2IGFuZCA2eDg2TVguICBUaGlzIGNob2ljZSBkb2VzIG5vdAorCSAgYXNzdW1lIHRoZSBSRFRTQyAoUmVhZCBUaW1lIFN0YW1wIENvdW50ZXIpIGluc3RydWN0aW9uLgorCitjb25maWcgTTU4NlRTQworCWJvb2wgIlBlbnRpdW0tQ2xhc3NpYyIKKwloZWxwCisJICBTZWxlY3QgdGhpcyBmb3IgYSBQZW50aXVtIENsYXNzaWMgcHJvY2Vzc29yIHdpdGggdGhlIFJEVFNDIChSZWFkCisJICBUaW1lIFN0YW1wIENvdW50ZXIpIGluc3RydWN0aW9uIGZvciBiZW5jaG1hcmtpbmcuCisKK2NvbmZpZyBNNTg2TU1YCisJYm9vbCAiUGVudGl1bS1NTVgiCisJaGVscAorCSAgU2VsZWN0IHRoaXMgZm9yIGEgUGVudGl1bSB3aXRoIHRoZSBNTVggZ3JhcGhpY3MvbXVsdGltZWRpYQorCSAgZXh0ZW5kZWQgaW5zdHJ1Y3Rpb25zLgorCitjb25maWcgTTY4NgorCWJvb2wgIlBlbnRpdW0tUHJvIgorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIGZvciBJbnRlbCBQZW50aXVtIFBybyBjaGlwcy4gIFRoaXMgZW5hYmxlcyB0aGUgdXNlIG9mCisJICBQZW50aXVtIFBybyBleHRlbmRlZCBpbnN0cnVjdGlvbnMsIGFuZCBkaXNhYmxlcyB0aGUgaW5pdC10aW1lIGd1YXJkCisJICBhZ2FpbnN0IHRoZSBmMDBmIGJ1ZyBmb3VuZCBpbiBlYXJsaWVyIFBlbnRpdW1zLgorCitjb25maWcgTVBFTlRJVU1JSQorCWJvb2wgIlBlbnRpdW0tSUkvQ2VsZXJvbihwcmUtQ29wcGVybWluZSkiCisJaGVscAorCSAgU2VsZWN0IHRoaXMgZm9yIEludGVsIGNoaXBzIGJhc2VkIG9uIHRoZSBQZW50aXVtLUlJIGFuZAorCSAgcHJlLUNvcHBlcm1pbmUgQ2VsZXJvbiBjb3JlLiAgVGhpcyBvcHRpb24gZW5hYmxlcyBhbiB1bmFsaWduZWQKKwkgIGNvcHkgb3B0aW1pemF0aW9uLCBjb21waWxlcyB0aGUga2VybmVsIHdpdGggb3B0aW1pemF0aW9uIGZsYWdzCisJICB0YWlsb3JlZCBmb3IgdGhlIGNoaXAsIGFuZCBhcHBsaWVzIGFueSBhcHBsaWNhYmxlIFBlbnRpdW0gUHJvCisJICBvcHRpbWl6YXRpb25zLgorCitjb25maWcgTVBFTlRJVU1JSUkKKwlib29sICJQZW50aXVtLUlJSS9DZWxlcm9uKENvcHBlcm1pbmUpL1BlbnRpdW0tSUlJIFhlb24iCisJaGVscAorCSAgU2VsZWN0IHRoaXMgZm9yIEludGVsIGNoaXBzIGJhc2VkIG9uIHRoZSBQZW50aXVtLUlJSSBhbmQKKwkgIENlbGVyb24tQ29wcGVybWluZSBjb3JlLiAgVGhpcyBvcHRpb24gZW5hYmxlcyB1c2Ugb2Ygc29tZQorCSAgZXh0ZW5kZWQgcHJlZmV0Y2ggaW5zdHJ1Y3Rpb25zIGluIGFkZGl0aW9uIHRvIHRoZSBQZW50aXVtIElJCisJICBleHRlbnNpb25zLgorCitjb25maWcgTVBFTlRJVU1NCisJYm9vbCAiUGVudGl1bSBNIgorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIGZvciBJbnRlbCBQZW50aXVtIE0gKG5vdCBQZW50aXVtLTQgTSkKKwkgIG5vdGVib29rIGNoaXBzLgorCitjb25maWcgTVBFTlRJVU00CisJYm9vbCAiUGVudGl1bS00L0NlbGVyb24oUDQtYmFzZWQpL1BlbnRpdW0tNCBNL1hlb24iCisJaGVscAorCSAgU2VsZWN0IHRoaXMgZm9yIEludGVsIFBlbnRpdW0gNCBjaGlwcy4gIFRoaXMgaW5jbHVkZXMgdGhlCisJICBQZW50aXVtIDQsIFA0LWJhc2VkIENlbGVyb24gYW5kIFhlb24sIGFuZCBQZW50aXVtLTQgTQorCSAgKG5vdCBQZW50aXVtIE0pIGNoaXBzLiAgVGhpcyBvcHRpb24gZW5hYmxlcyBjb21waWxlIGZsYWdzCisJICBvcHRpbWl6ZWQgZm9yIHRoZSBjaGlwLCB1c2VzIHRoZSBjb3JyZWN0IGNhY2hlIHNoaWZ0LCBhbmQKKwkgIGFwcGxpZXMgYW55IGFwcGxpY2FibGUgUGVudGl1bSBJSUkgb3B0aW1pemF0aW9ucy4KKworY29uZmlnIE1LNgorCWJvb2wgIks2L0s2LUlJL0s2LUlJSSIKKwloZWxwCisJICBTZWxlY3QgdGhpcyBmb3IgYW4gQU1EIEs2LWZhbWlseSBwcm9jZXNzb3IuICBFbmFibGVzIHVzZSBvZgorCSAgc29tZSBleHRlbmRlZCBpbnN0cnVjdGlvbnMsIGFuZCBwYXNzZXMgYXBwcm9wcmlhdGUgb3B0aW1pemF0aW9uCisJICBmbGFncyB0byBHQ0MuCisKK2NvbmZpZyBNSzcKKwlib29sICJBdGhsb24vRHVyb24vSzciCisJaGVscAorCSAgU2VsZWN0IHRoaXMgZm9yIGFuIEFNRCBBdGhsb24gSzctZmFtaWx5IHByb2Nlc3Nvci4gIEVuYWJsZXMgdXNlIG9mCisJICBzb21lIGV4dGVuZGVkIGluc3RydWN0aW9ucywgYW5kIHBhc3NlcyBhcHByb3ByaWF0ZSBvcHRpbWl6YXRpb24KKwkgIGZsYWdzIHRvIEdDQy4KKworY29uZmlnIE1LOAorCWJvb2wgIk9wdGVyb24vQXRobG9uNjQvSGFtbWVyL0s4IgorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIGZvciBhbiBBTUQgT3B0ZXJvbiBvciBBdGhsb242NCBIYW1tZXItZmFtaWx5IHByb2Nlc3Nvci4gIEVuYWJsZXMKKwkgIHVzZSBvZiBzb21lIGV4dGVuZGVkIGluc3RydWN0aW9ucywgYW5kIHBhc3NlcyBhcHByb3ByaWF0ZSBvcHRpbWl6YXRpb24KKwkgIGZsYWdzIHRvIEdDQy4KKworY29uZmlnIE1DUlVTT0UKKwlib29sICJDcnVzb2UiCisJaGVscAorCSAgU2VsZWN0IHRoaXMgZm9yIGEgVHJhbnNtZXRhIENydXNvZSBwcm9jZXNzb3IuICBUcmVhdHMgdGhlIHByb2Nlc3NvcgorCSAgbGlrZSBhIDU4NiB3aXRoIFRTQywgYW5kIHNldHMgc29tZSBHQ0Mgb3B0aW1pemF0aW9uIGZsYWdzIChsaWtlIGEKKwkgIFBlbnRpdW0gUHJvIHdpdGggbm8gYWxpZ25tZW50IHJlcXVpcmVtZW50cykuCisKK2NvbmZpZyBNRUZGSUNFT04KKwlib29sICJFZmZpY2VvbiIKKwloZWxwCisJICBTZWxlY3QgdGhpcyBmb3IgYSBUcmFuc21ldGEgRWZmaWNlb24gcHJvY2Vzc29yLgorCitjb25maWcgTVdJTkNISVBDNgorCWJvb2wgIldpbmNoaXAtQzYiCisJaGVscAorCSAgU2VsZWN0IHRoaXMgZm9yIGFuIElEVCBXaW5jaGlwIEM2IGNoaXAuICBMaW51eCBhbmQgR0NDCisJICB0cmVhdCB0aGlzIGNoaXAgYXMgYSA1ODZUU0Mgd2l0aCBzb21lIGV4dGVuZGVkIGluc3RydWN0aW9ucworCSAgYW5kIGFsaWdubWVudCByZXF1aXJlbWVudHMuCisKK2NvbmZpZyBNV0lOQ0hJUDIKKwlib29sICJXaW5jaGlwLTIiCisJaGVscAorCSAgU2VsZWN0IHRoaXMgZm9yIGFuIElEVCBXaW5jaGlwLTIuICBMaW51eCBhbmQgR0NDCisJICB0cmVhdCB0aGlzIGNoaXAgYXMgYSA1ODZUU0Mgd2l0aCBzb21lIGV4dGVuZGVkIGluc3RydWN0aW9ucworCSAgYW5kIGFsaWdubWVudCByZXF1aXJlbWVudHMuCisKK2NvbmZpZyBNV0lOQ0hJUDNECisJYm9vbCAiV2luY2hpcC0yQS9XaW5jaGlwLTMiCisJaGVscAorCSAgU2VsZWN0IHRoaXMgZm9yIGFuIElEVCBXaW5jaGlwLTJBIG9yIDMuICBMaW51eCBhbmQgR0NDCisJICB0cmVhdCB0aGlzIGNoaXAgYXMgYSA1ODZUU0Mgd2l0aCBzb21lIGV4dGVuZGVkIGluc3RydWN0aW9ucworCSAgYW5kIGFsaWdubWVudCByZXFpcmVtZW50cy4gIEFsc28gZW5hYmxlIG91dCBvZiBvcmRlciBtZW1vcnkKKwkgIHN0b3JlcyBmb3IgdGhpcyBDUFUsIHdoaWNoIGNhbiBpbmNyZWFzZSBwZXJmb3JtYW5jZSBvZiBzb21lCisJICBvcGVyYXRpb25zLgorCitjb25maWcgTUdFT0RFCisJYm9vbCAiTWVkaWFHWC9HZW9kZSIKKwloZWxwCisJICBTZWxlY3QgdGhpcyBmb3IgYSBDeXJpeCBNZWRpYUdYIGFrYSBHZW9kZSBjaGlwLiBMaW51eCBhbmQgR0NDCisgICAgICAgICAgdHJlYXQgdGhpcyBjaGlwIGFzIGEgNTg2VFNDIHdpdGggc29tZSBleHRlbmRlZCBpbnN0cnVjdGlvbnMKKyAgICAgICAgICBhbmQgYWxpZ25tZW50IHJlcWlyZW1lbnRzLgorCitjb25maWcgTUNZUklYSUlJCisJYm9vbCAiQ3lyaXhJSUkvVklBLUMzIgorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIGZvciBhIEN5cml4IElJSSBvciBDMyBjaGlwLiAgUHJlc2VudGx5IExpbnV4IGFuZCBHQ0MKKwkgIHRyZWF0IHRoaXMgY2hpcCBhcyBhIGdlbmVyaWMgNTg2LiBXaGlsc3QgdGhlIENQVSBpcyA2ODYgY2xhc3MsCisJICBpdCBsYWNrcyB0aGUgY21vdiBleHRlbnNpb24gd2hpY2ggZ2NjIGFzc3VtZXMgaXMgcHJlc2VudCB3aGVuCisJICBnZW5lcmF0aW5nIDY4NiBjb2RlLgorCSAgTm90ZSB0aGF0IE5laGVtaWFoIChNb2RlbCA5KSBhbmQgYWJvdmUgd2lsbCBub3QgYm9vdCB3aXRoIHRoaXMKKwkgIGtlcm5lbCBkdWUgdG8gdGhlbSBsYWNraW5nIHRoZSAzRE5vdyEgaW5zdHJ1Y3Rpb25zIHVzZWQgaW4gZWFybGllcgorCSAgaW5jYXJuYXRpb25zIG9mIHRoZSBDUFUuCisKK2NvbmZpZyBNVklBQzNfMgorCWJvb2wgIlZJQSBDMy0yIChOZWhlbWlhaCkiCisJaGVscAorCSAgU2VsZWN0IHRoaXMgZm9yIGEgVklBIEMzICJOZWhlbWlhaCIuIFNlbGVjdGluZyB0aGlzIGVuYWJsZXMgdXNhZ2UKKwkgIG9mIFNTRSBhbmQgdGVsbHMgZ2NjIHRvIHRyZWF0IHRoZSBDUFUgYXMgYSA2ODYuCisJICBOb3RlLCB0aGlzIGtlcm5lbCB3aWxsIG5vdCBib290IG9uIG9sZGVyIChwcmUgbW9kZWwgOSkgQzNzLgorCitlbmRjaG9pY2UKKworY29uZmlnIFg4Nl9HRU5FUklDCisgICAgICAgYm9vbCAiR2VuZXJpYyB4ODYgc3VwcG9ydCIKKyAgICAgICBoZWxwCisJICBJbnN0ZWFkIG9mIGp1c3QgaW5jbHVkaW5nIG9wdGltaXphdGlvbnMgZm9yIHRoZSBzZWxlY3RlZAorCSAgeDg2IHZhcmlhbnQgKGUuZy4gUElJLCBDcnVzb2Ugb3IgQXRobG9uKSwgaW5jbHVkZSBzb21lIG1vcmUKKwkgIGdlbmVyaWMgb3B0aW1pemF0aW9ucyBhcyB3ZWxsLiBUaGlzIHdpbGwgbWFrZSB0aGUga2VybmVsCisJICBwZXJmb3JtIGJldHRlciBvbiB4ODYgQ1BVcyBvdGhlciB0aGFuIHRoYXQgc2VsZWN0ZWQuCisKKwkgIFRoaXMgaXMgcmVhbGx5IGludGVuZGVkIGZvciBkaXN0cmlidXRvcnMgd2hvIG5lZWQgbW9yZQorCSAgZ2VuZXJpYyBvcHRpbWl6YXRpb25zLgorCitlbmRpZgorCisjCisjIERlZmluZSBpbXBsaWVkIG9wdGlvbnMgZnJvbSB0aGUgQ1BVIHNlbGVjdGlvbiBoZXJlCisjCitjb25maWcgWDg2X0NNUFhDSEcKKwlib29sCisJZGVwZW5kcyBvbiAhTTM4NgorCWRlZmF1bHQgeQorCitjb25maWcgWDg2X1hBREQKKwlib29sCisJZGVwZW5kcyBvbiAhTTM4NgorCWRlZmF1bHQgeQorCitjb25maWcgWDg2X0wxX0NBQ0hFX1NISUZUCisJaW50CisJZGVmYXVsdCAiNyIgaWYgTVBFTlRJVU00IHx8IFg4Nl9HRU5FUklDCisJZGVmYXVsdCAiNCIgaWYgWDg2X0VMQU4gfHwgTTQ4NiB8fCBNMzg2CisJZGVmYXVsdCAiNSIgaWYgTVdJTkNISVAzRCB8fCBNV0lOQ0hJUDIgfHwgTVdJTkNISVBDNiB8fCBNQ1JVU09FIHx8IE1FRkZJQ0VPTiB8fCBNQ1lSSVhJSUkgfHwgTUs2IHx8IE1QRU5USVVNSUlJIHx8IE1QRU5USVVNSUkgfHwgTTY4NiB8fCBNNTg2TU1YIHx8IE01ODZUU0MgfHwgTTU4NiB8fCBNVklBQzNfMiB8fCBNR0VPREUKKwlkZWZhdWx0ICI2IiBpZiBNSzcgfHwgTUs4IHx8IE1QRU5USVVNTQorCitjb25maWcgUldTRU1fR0VORVJJQ19TUElOTE9DSworCWJvb2wKKwlkZXBlbmRzIG9uIE0zODYKKwlkZWZhdWx0IHkKKworY29uZmlnIFJXU0VNX1hDSEdBRERfQUxHT1JJVEhNCisJYm9vbAorCWRlcGVuZHMgb24gIU0zODYKKwlkZWZhdWx0IHkKKworY29uZmlnIEdFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZCisJYm9vbAorCWRlZmF1bHQgeQorCitjb25maWcgWDg2X1BQUk9fRkVOQ0UKKwlib29sCisJZGVwZW5kcyBvbiBNNjg2IHx8IE01ODZNTVggfHwgTTU4NlRTQyB8fCBNNTg2IHx8IE00ODYgfHwgTTM4NiB8fCBNR0VPREUKKwlkZWZhdWx0IHkKKworY29uZmlnIFg4Nl9GMDBGX0JVRworCWJvb2wKKwlkZXBlbmRzIG9uIE01ODZNTVggfHwgTTU4NlRTQyB8fCBNNTg2IHx8IE00ODYgfHwgTTM4NgorCWRlZmF1bHQgeQorCitjb25maWcgWDg2X1dQX1dPUktTX09LCisJYm9vbAorCWRlcGVuZHMgb24gIU0zODYKKwlkZWZhdWx0IHkKKworY29uZmlnIFg4Nl9JTlZMUEcKKwlib29sCisJZGVwZW5kcyBvbiAhTTM4NgorCWRlZmF1bHQgeQorCitjb25maWcgWDg2X0JTV0FQCisJYm9vbAorCWRlcGVuZHMgb24gIU0zODYKKwlkZWZhdWx0IHkKKworY29uZmlnIFg4Nl9QT1BBRF9PSworCWJvb2wKKwlkZXBlbmRzIG9uICFNMzg2CisJZGVmYXVsdCB5CisKK2NvbmZpZyBYODZfQUxJR05NRU5UXzE2CisJYm9vbAorCWRlcGVuZHMgb24gTVdJTkNISVAzRCB8fCBNV0lOQ0hJUDIgfHwgTVdJTkNISVBDNiB8fCBNQ1lSSVhJSUkgfHwgWDg2X0VMQU4gfHwgTUs2IHx8IE01ODZNTVggfHwgTTU4NlRTQyB8fCBNNTg2IHx8IE00ODYgfHwgTVZJQUMzXzIgfHwgTUdFT0RFCisJZGVmYXVsdCB5CisKK2NvbmZpZyBYODZfR09PRF9BUElDCisJYm9vbAorCWRlcGVuZHMgb24gTUs3IHx8IE1QRU5USVVNNCB8fCBNUEVOVElVTU0gfHwgTVBFTlRJVU1JSUkgfHwgTVBFTlRJVU1JSSB8fCBNNjg2IHx8IE01ODZNTVggfHwgTUs4IHx8IE1FRkZJQ0VPTgorCWRlZmF1bHQgeQorCitjb25maWcgWDg2X0lOVEVMX1VTRVJDT1BZCisJYm9vbAorCWRlcGVuZHMgb24gTVBFTlRJVU00IHx8IE1QRU5USVVNTSB8fCBNUEVOVElVTUlJSSB8fCBNUEVOVElVTUlJIHx8IE01ODZNTVggfHwgWDg2X0dFTkVSSUMgfHwgTUs4IHx8IE1LNyB8fCBNRUZGSUNFT04KKwlkZWZhdWx0IHkKKworY29uZmlnIFg4Nl9VU0VfUFBST19DSEVDS1NVTQorCWJvb2wKKwlkZXBlbmRzIG9uIE1XSU5DSElQM0QgfHwgTVdJTkNISVAyIHx8IE1XSU5DSElQQzYgfHwgTUNZUklYSUlJIHx8IE1LNyB8fCBNSzYgfHwgTVBFTlRJVU00IHx8IE1QRU5USVVNTSB8fCBNUEVOVElVTUlJSSB8fCBNUEVOVElVTUlJIHx8IE02ODYgfHwgTUs4IHx8IE1WSUFDM18yIHx8IE1FRkZJQ0VPTgorCWRlZmF1bHQgeQorCitjb25maWcgWDg2X1VTRV8zRE5PVworCWJvb2wKKwlkZXBlbmRzIG9uIE1DWVJJWElJSSB8fCBNSzcKKwlkZWZhdWx0IHkKKworY29uZmlnIFg4Nl9PT1NUT1JFCisJYm9vbAorCWRlcGVuZHMgb24gKE1XSU5DSElQM0QgfHwgTVdJTkNISVAyIHx8IE1XSU5DSElQQzYgfHwgTUdFT0RFKSAmJiBNVFJSCisJZGVmYXVsdCB5CisKK2NvbmZpZyBIUEVUX1RJTUVSCisJYm9vbCAiSFBFVCBUaW1lciBTdXBwb3J0IgorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyB0aGUgdXNlIG9mIHRoZSBIUEVUIGZvciB0aGUga2VybmVsJ3MgaW50ZXJuYWwgdGltZXIuCisJICBIUEVUIGlzIHRoZSBuZXh0IGdlbmVyYXRpb24gdGltZXIgcmVwbGFjaW5nIGxlZ2FjeSA4MjU0cy4KKwkgIFlvdSBjYW4gc2FmZWx5IGNob29zZSBZIGhlcmUuICBIb3dldmVyLCBIUEVUIHdpbGwgb25seSBiZQorCSAgYWN0aXZhdGVkIGlmIHRoZSBwbGF0Zm9ybSBhbmQgdGhlIEJJT1Mgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCisJICBPdGhlcndpc2UgdGhlIDgyNTQgd2lsbCBiZSB1c2VkIGZvciB0aW1pbmcgc2VydmljZXMuCisKKwkgIENob29zZSBOIHRvIGNvbnRpbnVlIHVzaW5nIHRoZSBsZWdhY3kgODI1NCB0aW1lci4KKworY29uZmlnIEhQRVRfRU1VTEFURV9SVEMKKwlib29sICJQcm92aWRlIFJUQyBpbnRlcnJ1cHQiCisJZGVwZW5kcyBvbiBIUEVUX1RJTUVSICYmIFJUQz15CisKK2NvbmZpZyBTTVAKKwlib29sICJTeW1tZXRyaWMgbXVsdGktcHJvY2Vzc2luZyBzdXBwb3J0IgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBzeXN0ZW1zIHdpdGggbW9yZSB0aGFuIG9uZSBDUFUuIElmIHlvdSBoYXZlCisJICBhIHN5c3RlbSB3aXRoIG9ubHkgb25lIENQVSwgbGlrZSBtb3N0IHBlcnNvbmFsIGNvbXB1dGVycywgc2F5IE4uIElmCisJICB5b3UgaGF2ZSBhIHN5c3RlbSB3aXRoIG1vcmUgdGhhbiBvbmUgQ1BVLCBzYXkgWS4KKworCSAgSWYgeW91IHNheSBOIGhlcmUsIHRoZSBrZXJuZWwgd2lsbCBydW4gb24gc2luZ2xlIGFuZCBtdWx0aXByb2Nlc3NvcgorCSAgbWFjaGluZXMsIGJ1dCB3aWxsIHVzZSBvbmx5IG9uZSBDUFUgb2YgYSBtdWx0aXByb2Nlc3NvciBtYWNoaW5lLiBJZgorCSAgeW91IHNheSBZIGhlcmUsIHRoZSBrZXJuZWwgd2lsbCBydW4gb24gbWFueSwgYnV0IG5vdCBhbGwsCisJICBzaW5nbGVwcm9jZXNzb3IgbWFjaGluZXMuIE9uIGEgc2luZ2xlcHJvY2Vzc29yIG1hY2hpbmUsIHRoZSBrZXJuZWwKKwkgIHdpbGwgcnVuIGZhc3RlciBpZiB5b3Ugc2F5IE4gaGVyZS4KKworCSAgTm90ZSB0aGF0IGlmIHlvdSBzYXkgWSBoZXJlIGFuZCBjaG9vc2UgYXJjaGl0ZWN0dXJlICI1ODYiIG9yCisJICAiUGVudGl1bSIgdW5kZXIgIlByb2Nlc3NvciBmYW1pbHkiLCB0aGUga2VybmVsIHdpbGwgbm90IHdvcmsgb24gNDg2CisJICBhcmNoaXRlY3R1cmVzLiBTaW1pbGFybHksIG11bHRpcHJvY2Vzc29yIGtlcm5lbHMgZm9yIHRoZSAiUFBybyIKKwkgIGFyY2hpdGVjdHVyZSBtYXkgbm90IHdvcmsgb24gYWxsIFBlbnRpdW0gYmFzZWQgYm9hcmRzLgorCisJICBQZW9wbGUgdXNpbmcgbXVsdGlwcm9jZXNzb3IgbWFjaGluZXMgd2hvIHNheSBZIGhlcmUgc2hvdWxkIGFsc28gc2F5CisJICBZIHRvICJFbmhhbmNlZCBSZWFsIFRpbWUgQ2xvY2sgU3VwcG9ydCIsIGJlbG93LiBUaGUgIkFkdmFuY2VkIFBvd2VyCisJICBNYW5hZ2VtZW50IiBjb2RlIHdpbGwgYmUgZGlzYWJsZWQgaWYgeW91IHNheSBZIGhlcmUuCisKKwkgIFNlZSBhbHNvIHRoZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3NtcC50eHQ+LAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9pMzg2L0lPLUFQSUMudHh0PiwKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbm1pX3dhdGNoZG9nLnR4dD4gYW5kIHRoZSBTTVAtSE9XVE8gYXZhaWxhYmxlIGF0CisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIGhlcmUsIHNheSBOLgorCitjb25maWcgTlJfQ1BVUworCWludCAiTWF4aW11bSBudW1iZXIgb2YgQ1BVcyAoMi0yNTUpIgorCXJhbmdlIDIgMjU1CisJZGVwZW5kcyBvbiBTTVAKKwlkZWZhdWx0ICIzMiIgaWYgWDg2X05VTUFRIHx8IFg4Nl9TVU1NSVQgfHwgWDg2X0JJR1NNUCB8fCBYODZfRVM3MDAwCisJZGVmYXVsdCAiOCIKKwloZWxwCisJICBUaGlzIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgbWF4aW11bSBudW1iZXIgb2YgQ1BVcyB3aGljaCB0aGlzCisJICBrZXJuZWwgd2lsbCBzdXBwb3J0LiAgVGhlIG1heGltdW0gc3VwcG9ydGVkIHZhbHVlIGlzIDI1NSBhbmQgdGhlCisJICBtaW5pbXVtIHZhbHVlIHdoaWNoIG1ha2VzIHNlbnNlIGlzIDIuCisKKwkgIFRoaXMgaXMgcHVyZWx5IHRvIHNhdmUgbWVtb3J5IC0gZWFjaCBzdXBwb3J0ZWQgQ1BVIGFkZHMKKwkgIGFwcHJveGltYXRlbHkgZWlnaHQga2lsb2J5dGVzIHRvIHRoZSBrZXJuZWwgaW1hZ2UuCisKK2NvbmZpZyBTQ0hFRF9TTVQKKwlib29sICJTTVQgKEh5cGVydGhyZWFkaW5nKSBzY2hlZHVsZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNNUAorCWRlZmF1bHQgb2ZmCisJaGVscAorCSAgU01UIHNjaGVkdWxlciBzdXBwb3J0IGltcHJvdmVzIHRoZSBDUFUgc2NoZWR1bGVyJ3MgZGVjaXNpb24gbWFraW5nCisJICB3aGVuIGRlYWxpbmcgd2l0aCBJbnRlbCBQZW50aXVtIDQgY2hpcHMgd2l0aCBIeXBlclRocmVhZGluZyBhdCBhCisJICBjb3N0IG9mIHNsaWdodGx5IGluY3JlYXNlZCBvdmVyaGVhZCBpbiBzb21lIHBsYWNlcy4gSWYgdW5zdXJlIHNheQorCSAgTiBoZXJlLgorCitjb25maWcgUFJFRU1QVAorCWJvb2wgIlByZWVtcHRpYmxlIEtlcm5lbCIKKwloZWxwCisJICBUaGlzIG9wdGlvbiByZWR1Y2VzIHRoZSBsYXRlbmN5IG9mIHRoZSBrZXJuZWwgd2hlbiByZWFjdGluZyB0bworCSAgcmVhbC10aW1lIG9yIGludGVyYWN0aXZlIGV2ZW50cyBieSBhbGxvd2luZyBhIGxvdyBwcmlvcml0eSBwcm9jZXNzIHRvCisJICBiZSBwcmVlbXB0ZWQgZXZlbiBpZiBpdCBpcyBpbiBrZXJuZWwgbW9kZSBleGVjdXRpbmcgYSBzeXN0ZW0gY2FsbC4KKwkgIFRoaXMgYWxsb3dzIGFwcGxpY2F0aW9ucyB0byBydW4gbW9yZSByZWxpYWJseSBldmVuIHdoZW4gdGhlIHN5c3RlbSBpcworCSAgdW5kZXIgbG9hZC4KKworCSAgU2F5IFkgaGVyZSBpZiB5b3UgYXJlIGJ1aWxkaW5nIGEga2VybmVsIGZvciBhIGRlc2t0b3AsIGVtYmVkZGVkCisJICBvciByZWFsLXRpbWUgc3lzdGVtLiAgU2F5IE4gaWYgeW91IGFyZSB1bnN1cmUuCisKK2NvbmZpZyBQUkVFTVBUX0JLTAorCWJvb2wgIlByZWVtcHQgVGhlIEJpZyBLZXJuZWwgTG9jayIKKwlkZXBlbmRzIG9uIFBSRUVNUFQKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIG9wdGlvbiByZWR1Y2VzIHRoZSBsYXRlbmN5IG9mIHRoZSBrZXJuZWwgYnkgbWFraW5nIHRoZQorCSAgYmlnIGtlcm5lbCBsb2NrIHByZWVtcHRpYmxlLgorCisJICBTYXkgWSBoZXJlIGlmIHlvdSBhcmUgYnVpbGRpbmcgYSBrZXJuZWwgZm9yIGEgZGVza3RvcCBzeXN0ZW0uCisJICBTYXkgTiBpZiB5b3UgYXJlIHVuc3VyZS4KKworY29uZmlnIFg4Nl9VUF9BUElDCisJYm9vbCAiTG9jYWwgQVBJQyBzdXBwb3J0IG9uIHVuaXByb2Nlc3NvcnMiCisJZGVwZW5kcyBvbiAhU01QICYmICEoWDg2X1ZJU1dTIHx8IFg4Nl9WT1lBR0VSKQorCWhlbHAKKwkgIEEgbG9jYWwgQVBJQyAoQWR2YW5jZWQgUHJvZ3JhbW1hYmxlIEludGVycnVwdCBDb250cm9sbGVyKSBpcyBhbgorCSAgaW50ZWdyYXRlZCBpbnRlcnJ1cHQgY29udHJvbGxlciBpbiB0aGUgQ1BVLiBJZiB5b3UgaGF2ZSBhIHNpbmdsZS1DUFUKKwkgIHN5c3RlbSB3aGljaCBoYXMgYSBwcm9jZXNzb3Igd2l0aCBhIGxvY2FsIEFQSUMsIHlvdSBjYW4gc2F5IFkgaGVyZSB0bworCSAgZW5hYmxlIGFuZCB1c2UgaXQuIElmIHlvdSBzYXkgWSBoZXJlIGV2ZW4gdGhvdWdoIHlvdXIgbWFjaGluZSBkb2Vzbid0CisJICBoYXZlIGEgbG9jYWwgQVBJQywgdGhlbiB0aGUga2VybmVsIHdpbGwgc3RpbGwgcnVuIHdpdGggbm8gc2xvd2Rvd24gYXQKKwkgIGFsbC4gVGhlIGxvY2FsIEFQSUMgc3VwcG9ydHMgQ1BVLWdlbmVyYXRlZCBzZWxmLWludGVycnVwdHMgKHRpbWVyLAorCSAgcGVyZm9ybWFuY2UgY291bnRlcnMpLCBhbmQgdGhlIE5NSSB3YXRjaGRvZyB3aGljaCBkZXRlY3RzIGhhcmQKKwkgIGxvY2t1cHMuCisKK2NvbmZpZyBYODZfVVBfSU9BUElDCisJYm9vbCAiSU8tQVBJQyBzdXBwb3J0IG9uIHVuaXByb2Nlc3NvcnMiCisJZGVwZW5kcyBvbiBYODZfVVBfQVBJQworCWhlbHAKKwkgIEFuIElPLUFQSUMgKEkvTyBBZHZhbmNlZCBQcm9ncmFtbWFibGUgSW50ZXJydXB0IENvbnRyb2xsZXIpIGlzIGFuCisJICBTTVAtY2FwYWJsZSByZXBsYWNlbWVudCBmb3IgUEMtc3R5bGUgaW50ZXJydXB0IGNvbnRyb2xsZXJzLiBNb3N0CisJICBTTVAgc3lzdGVtcyBhbmQgbWFueSByZWNlbnQgdW5pcHJvY2Vzc29yIHN5c3RlbXMgaGF2ZSBvbmUuCisKKwkgIElmIHlvdSBoYXZlIGEgc2luZ2xlLUNQVSBzeXN0ZW0gd2l0aCBhbiBJTy1BUElDLCB5b3UgY2FuIHNheSBZIGhlcmUKKwkgIHRvIHVzZSBpdC4gSWYgeW91IHNheSBZIGhlcmUgZXZlbiB0aG91Z2ggeW91ciBtYWNoaW5lIGRvZXNuJ3QgaGF2ZQorCSAgYW4gSU8tQVBJQywgdGhlbiB0aGUga2VybmVsIHdpbGwgc3RpbGwgcnVuIHdpdGggbm8gc2xvd2Rvd24gYXQgYWxsLgorCitjb25maWcgWDg2X0xPQ0FMX0FQSUMKKwlib29sCisJZGVwZW5kcyBvbiBYODZfVVBfQVBJQyB8fCAoKFg4Nl9WSVNXUyB8fCBTTVApICYmICFYODZfVk9ZQUdFUikKKwlkZWZhdWx0IHkKKworY29uZmlnIFg4Nl9JT19BUElDCisJYm9vbAorCWRlcGVuZHMgb24gWDg2X1VQX0lPQVBJQyB8fCAoU01QICYmICEoWDg2X1ZJU1dTIHx8IFg4Nl9WT1lBR0VSKSkKKwlkZWZhdWx0IHkKKworY29uZmlnIFg4Nl9WSVNXU19BUElDCisJYm9vbAorCWRlcGVuZHMgb24gWDg2X1ZJU1dTCisJZGVmYXVsdCB5CisKK2NvbmZpZyBYODZfVFNDCisJYm9vbAorCWRlcGVuZHMgb24gKE1XSU5DSElQM0QgfHwgTVdJTkNISVAyIHx8IE1DUlVTT0UgfHwgTUVGRklDRU9OIHx8IE1DWVJJWElJSSB8fCBNSzcgfHwgTUs2IHx8IE1QRU5USVVNNCB8fCBNUEVOVElVTU0gfHwgTVBFTlRJVU1JSUkgfHwgTVBFTlRJVU1JSSB8fCBNNjg2IHx8IE01ODZNTVggfHwgTTU4NlRTQyB8fCBNSzggfHwgTVZJQUMzXzIgfHwgTUdFT0RFKSAmJiAhWDg2X05VTUFRCisJZGVmYXVsdCB5CisKK2NvbmZpZyBYODZfTUNFCisJYm9vbCAiTWFjaGluZSBDaGVjayBFeGNlcHRpb24iCisJZGVwZW5kcyBvbiAhWDg2X1ZPWUFHRVIKKwktLS1oZWxwLS0tCisJICBNYWNoaW5lIENoZWNrIEV4Y2VwdGlvbiBzdXBwb3J0IGFsbG93cyB0aGUgcHJvY2Vzc29yIHRvIG5vdGlmeSB0aGUKKwkgIGtlcm5lbCBpZiBpdCBkZXRlY3RzIGEgcHJvYmxlbSAoZS5nLiBvdmVyaGVhdGluZywgY29tcG9uZW50IGZhaWx1cmUpLgorCSAgVGhlIGFjdGlvbiB0aGUga2VybmVsIHRha2VzIGRlcGVuZHMgb24gdGhlIHNldmVyaXR5IG9mIHRoZSBwcm9ibGVtLAorCSAgcmFuZ2luZyBmcm9tIGEgd2FybmluZyBtZXNzYWdlIG9uIHRoZSBjb25zb2xlLCB0byBoYWx0aW5nIHRoZSBtYWNoaW5lLgorCSAgWW91ciBwcm9jZXNzb3IgbXVzdCBiZSBhIFBlbnRpdW0gb3IgbmV3ZXIgdG8gc3VwcG9ydCB0aGlzIC0gY2hlY2sgdGhlCisJICBmbGFncyBpbiAvcHJvYy9jcHVpbmZvIGZvciBtY2UuICBOb3RlIHRoYXQgc29tZSBvbGRlciBQZW50aXVtIHN5c3RlbXMKKwkgIGhhdmUgYSBkZXNpZ24gZmxhdyB3aGljaCBsZWFkcyB0byBmYWxzZSBNQ0UgZXZlbnRzIC0gaGVuY2UgTUNFIGlzCisJICBkaXNhYmxlZCBvbiBhbGwgUDUgcHJvY2Vzc29ycywgdW5sZXNzIGV4cGxpY2l0bHkgZW5hYmxlZCB3aXRoICJtY2UiCisJICBhcyBhIGJvb3QgYXJndW1lbnQuICBTaW1pbGFybHksIGlmIE1DRSBpcyBidWlsdCBpbiBhbmQgY3JlYXRlcyBhCisJICBwcm9ibGVtIG9uIHNvbWUgbmV3IG5vbi1zdGFuZGFyZCBtYWNoaW5lLCB5b3UgY2FuIGJvb3Qgd2l0aCAibm9tY2UiCisJICB0byBkaXNhYmxlIGl0LiAgTUNFIHN1cHBvcnQgc2ltcGx5IGlnbm9yZXMgbm9uLU1DRSBwcm9jZXNzb3JzIGxpa2UKKwkgIHRoZSAzODYgYW5kIDQ4Niwgc28gbmVhcmx5IGV2ZXJ5b25lIGNhbiBzYXkgWSBoZXJlLgorCitjb25maWcgWDg2X01DRV9OT05GQVRBTAorCXRyaXN0YXRlICJDaGVjayBmb3Igbm9uLWZhdGFsIGVycm9ycyBvbiBBTUQgQXRobG9uL0R1cm9uIC8gSW50ZWwgUGVudGl1bSA0IgorCWRlcGVuZHMgb24gWDg2X01DRQorCWhlbHAKKwkgIEVuYWJsaW5nIHRoaXMgZmVhdHVyZSBzdGFydHMgYSB0aW1lciB0aGF0IHRyaWdnZXJzIGV2ZXJ5IDUgc2Vjb25kcyB3aGljaAorCSAgd2lsbCBsb29rIGF0IHRoZSBtYWNoaW5lIGNoZWNrIHJlZ2lzdGVycyB0byBzZWUgaWYgYW55dGhpbmcgaGFwcGVuZWQuCisJICBOb24tZmF0YWwgcHJvYmxlbXMgYXV0b21hdGljYWxseSBnZXQgY29ycmVjdGVkIChidXQgc3RpbGwgbG9nZ2VkKS4KKwkgIERpc2FibGUgdGhpcyBpZiB5b3UgZG9uJ3Qgd2FudCB0byBzZWUgdGhlc2UgbWVzc2FnZXMuCisJICBTZWVpbmcgdGhlIG1lc3NhZ2VzIHRoaXMgb3B0aW9uIHByaW50cyBvdXQgbWF5IGJlIGluZGljYXRpdmUgb2YgZHlpbmcgaGFyZHdhcmUsCisJICBvciBvdXQtb2Ytc3BlYyAoaWUsIG92ZXJjbG9ja2VkKSBoYXJkd2FyZS4KKwkgIFRoaXMgb3B0aW9uIG9ubHkgZG9lcyBzb21ldGhpbmcgb24gY2VydGFpbiBDUFVzLgorCSAgKEFNRCBBdGhsb24vRHVyb24gYW5kIEludGVsIFBlbnRpdW0gNCkKKworY29uZmlnIFg4Nl9NQ0VfUDRUSEVSTUFMCisJYm9vbCAiY2hlY2sgZm9yIFA0IHRoZXJtYWwgdGhyb3R0bGluZyBpbnRlcnJ1cHQuIgorCWRlcGVuZHMgb24gWDg2X01DRSAmJiAoWDg2X1VQX0FQSUMgfHwgU01QKSAmJiAhWDg2X1ZJU1dTCisJaGVscAorCSAgRW5hYmxpbmcgdGhpcyBmZWF0dXJlIHdpbGwgY2F1c2UgYSBtZXNzYWdlIHRvIGJlIHByaW50ZWQgd2hlbiB0aGUgUDQKKwkgIGVudGVycyB0aGVybWFsIHRocm90dGxpbmcuCisKK2NvbmZpZyBUT1NISUJBCisJdHJpc3RhdGUgIlRvc2hpYmEgTGFwdG9wIHN1cHBvcnQiCisJLS0taGVscC0tLQorCSAgVGhpcyBhZGRzIGEgZHJpdmVyIHRvIHNhZmVseSBhY2Nlc3MgdGhlIFN5c3RlbSBNYW5hZ2VtZW50IE1vZGUgb2YKKwkgIHRoZSBDUFUgb24gVG9zaGliYSBwb3J0YWJsZXMgd2l0aCBhIGdlbnVpbmUgVG9zaGliYSBCSU9TLiBJdCBkb2VzCisJICBub3Qgd29yayBvbiBtb2RlbHMgd2l0aCBhIFBob2VuaXggQklPUy4gVGhlIFN5c3RlbSBNYW5hZ2VtZW50IE1vZGUKKwkgIGlzIHVzZWQgdG8gc2V0IHRoZSBCSU9TIGFuZCBwb3dlciBzYXZpbmcgb3B0aW9ucyBvbiBUb3NoaWJhIHBvcnRhYmxlcy4KKworCSAgRm9yIGluZm9ybWF0aW9uIG9uIHV0aWxpdGllcyB0byBtYWtlIHVzZSBvZiB0aGlzIGRyaXZlciBzZWUgdGhlCisJICBUb3NoaWJhIExpbnV4IHV0aWxpdGllcyB3ZWIgc2l0ZSBhdDoKKwkgIDxodHRwOi8vd3d3LmJ1enphcmQub3JnLnVrL3Rvc2hpYmEvPi4KKworCSAgU2F5IFkgaWYgeW91IGludGVuZCB0byBydW4gdGhpcyBrZXJuZWwgb24gYSBUb3NoaWJhIHBvcnRhYmxlLgorCSAgU2F5IE4gb3RoZXJ3aXNlLgorCitjb25maWcgSThLCisJdHJpc3RhdGUgIkRlbGwgbGFwdG9wIHN1cHBvcnQiCisJLS0taGVscC0tLQorCSAgVGhpcyBhZGRzIGEgZHJpdmVyIHRvIHNhZmVseSBhY2Nlc3MgdGhlIFN5c3RlbSBNYW5hZ2VtZW50IE1vZGUKKwkgIG9mIHRoZSBDUFUgb24gdGhlIERlbGwgSW5zcGlyb24gODAwMC4gVGhlIFN5c3RlbSBNYW5hZ2VtZW50IE1vZGUKKwkgIGlzIHVzZWQgdG8gcmVhZCBjcHUgdGVtcGVyYXR1cmUgYW5kIGNvb2xpbmcgZmFuIHN0YXR1cyBhbmQgdG8KKwkgIGNvbnRyb2wgdGhlIGZhbnMgb24gdGhlIEk4SyBwb3J0YWJsZXMuCisKKwkgIFRoaXMgZHJpdmVyIGhhcyBiZWVuIHRlc3RlZCBvbmx5IG9uIHRoZSBJbnNwaXJvbiA4MDAwIGJ1dCBpdCBtYXkKKwkgIGFsc28gd29yayB3aXRoIG90aGVyIERlbGwgbGFwdG9wcy4gWW91IGNhbiBmb3JjZSBsb2FkaW5nIG9uIG90aGVyCisJICBtb2RlbHMgYnkgcGFzc2luZyB0aGUgcGFyYW1ldGVyIGBmb3JjZT0xJyB0byB0aGUgbW9kdWxlLiBVc2UgYXQKKwkgIHlvdXIgb3duIHJpc2suCisKKwkgIEZvciBpbmZvcm1hdGlvbiBvbiB1dGlsaXRpZXMgdG8gbWFrZSB1c2Ugb2YgdGhpcyBkcml2ZXIgc2VlIHRoZQorCSAgSThLIExpbnV4IHV0aWxpdGllcyB3ZWIgc2l0ZSBhdDoKKwkgIDxodHRwOi8vcGVvcGxlLmRlYmlhbi5vcmcvfmR6L2k4ay8+CisKKwkgIFNheSBZIGlmIHlvdSBpbnRlbmQgdG8gcnVuIHRoaXMga2VybmVsIG9uIGEgRGVsbCBJbnNwaXJvbiA4MDAwLgorCSAgU2F5IE4gb3RoZXJ3aXNlLgorCitjb25maWcgTUlDUk9DT0RFCisJdHJpc3RhdGUgIi9kZXYvY3B1L21pY3JvY29kZSAtIEludGVsIElBMzIgQ1BVIG1pY3JvY29kZSBzdXBwb3J0IgorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSBzYXkgWSBoZXJlIGFuZCBhbHNvIHRvICIvZGV2IGZpbGUgc3lzdGVtIHN1cHBvcnQiIGluIHRoZQorCSAgJ0ZpbGUgc3lzdGVtcycgc2VjdGlvbiwgeW91IHdpbGwgYmUgYWJsZSB0byB1cGRhdGUgdGhlIG1pY3JvY29kZSBvbgorCSAgSW50ZWwgcHJvY2Vzc29ycyBpbiB0aGUgSUEzMiBmYW1pbHksIGUuZy4gUGVudGl1bSBQcm8sIFBlbnRpdW0gSUksCisJICBQZW50aXVtIElJSSwgUGVudGl1bSA0LCBYZW9uIGV0Yy4gIFlvdSB3aWxsIG9idmlvdXNseSBuZWVkIHRoZQorCSAgYWN0dWFsIG1pY3JvY29kZSBiaW5hcnkgZGF0YSBpdHNlbGYgd2hpY2ggaXMgbm90IHNoaXBwZWQgd2l0aCB0aGUKKwkgIExpbnV4IGtlcm5lbC4KKworCSAgRm9yIGxhdGVzdCBuZXdzIGFuZCBpbmZvcm1hdGlvbiBvbiBvYnRhaW5pbmcgYWxsIHRoZSByZXF1aXJlZAorCSAgaW5ncmVkaWVudHMgZm9yIHRoaXMgZHJpdmVyLCBjaGVjazoKKwkgIDxodHRwOi8vd3d3LnVyYmFubXl0aC5vcmcvbWljcm9jb2RlLz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG1pY3JvY29kZS4KKworY29uZmlnIFg4Nl9NU1IKKwl0cmlzdGF0ZSAiL2Rldi9jcHUvKi9tc3IgLSBNb2RlbC1zcGVjaWZpYyByZWdpc3RlciBzdXBwb3J0IgorCWhlbHAKKwkgIFRoaXMgZGV2aWNlIGdpdmVzIHByaXZpbGVnZWQgcHJvY2Vzc2VzIGFjY2VzcyB0byB0aGUgeDg2CisJICBNb2RlbC1TcGVjaWZpYyBSZWdpc3RlcnMgKE1TUnMpLiAgSXQgaXMgYSBjaGFyYWN0ZXIgZGV2aWNlIHdpdGgKKwkgIG1ham9yIDIwMiBhbmQgbWlub3JzIDAgdG8gMzEgZm9yIC9kZXYvY3B1LzAvbXNyIHRvIC9kZXYvY3B1LzMxL21zci4KKwkgIE1TUiBhY2Nlc3NlcyBhcmUgZGlyZWN0ZWQgdG8gYSBzcGVjaWZpYyBDUFUgb24gbXVsdGktcHJvY2Vzc29yCisJICBzeXN0ZW1zLgorCitjb25maWcgWDg2X0NQVUlECisJdHJpc3RhdGUgIi9kZXYvY3B1LyovY3B1aWQgLSBDUFUgaW5mb3JtYXRpb24gc3VwcG9ydCIKKwloZWxwCisJICBUaGlzIGRldmljZSBnaXZlcyBwcm9jZXNzZXMgYWNjZXNzIHRvIHRoZSB4ODYgQ1BVSUQgaW5zdHJ1Y3Rpb24gdG8KKwkgIGJlIGV4ZWN1dGVkIG9uIGEgc3BlY2lmaWMgcHJvY2Vzc29yLiAgSXQgaXMgYSBjaGFyYWN0ZXIgZGV2aWNlCisJICB3aXRoIG1ham9yIDIwMyBhbmQgbWlub3JzIDAgdG8gMzEgZm9yIC9kZXYvY3B1LzAvY3B1aWQgdG8KKwkgIC9kZXYvY3B1LzMxL2NwdWlkLgorCitzb3VyY2UgImRyaXZlcnMvZmlybXdhcmUvS2NvbmZpZyIKKworY2hvaWNlCisJcHJvbXB0ICJIaWdoIE1lbW9yeSBTdXBwb3J0IgorCWRlZmF1bHQgTk9ISUdITUVNCisKK2NvbmZpZyBOT0hJR0hNRU0KKwlib29sICJvZmYiCisJLS0taGVscC0tLQorCSAgTGludXggY2FuIHVzZSB1cCB0byA2NCBHaWdhYnl0ZXMgb2YgcGh5c2ljYWwgbWVtb3J5IG9uIHg4NiBzeXN0ZW1zLgorCSAgSG93ZXZlciwgdGhlIGFkZHJlc3Mgc3BhY2Ugb2YgMzItYml0IHg4NiBwcm9jZXNzb3JzIGlzIG9ubHkgNAorCSAgR2lnYWJ5dGVzIGxhcmdlLiBUaGF0IG1lYW5zIHRoYXQsIGlmIHlvdSBoYXZlIGEgbGFyZ2UgYW1vdW50IG9mCisJICBwaHlzaWNhbCBtZW1vcnksIG5vdCBhbGwgb2YgaXQgY2FuIGJlICJwZXJtYW5lbnRseSBtYXBwZWQiIGJ5IHRoZQorCSAga2VybmVsLiBUaGUgcGh5c2ljYWwgbWVtb3J5IHRoYXQncyBub3QgcGVybWFuZW50bHkgbWFwcGVkIGlzIGNhbGxlZAorCSAgImhpZ2ggbWVtb3J5Ii4KKworCSAgSWYgeW91IGFyZSBjb21waWxpbmcgYSBrZXJuZWwgd2hpY2ggd2lsbCBuZXZlciBydW4gb24gYSBtYWNoaW5lIHdpdGgKKwkgIG1vcmUgdGhhbiAxIEdpZ2FieXRlIHRvdGFsIHBoeXNpY2FsIFJBTSwgYW5zd2VyICJvZmYiIGhlcmUgKGRlZmF1bHQKKwkgIGNob2ljZSBhbmQgc3VpdGFibGUgZm9yIG1vc3QgdXNlcnMpLiBUaGlzIHdpbGwgcmVzdWx0IGluIGEgIjNHQi8xR0IiCisJICBzcGxpdDogM0dCIGFyZSBtYXBwZWQgc28gdGhhdCBlYWNoIHByb2Nlc3Mgc2VlcyBhIDNHQiB2aXJ0dWFsIG1lbW9yeQorCSAgc3BhY2UgYW5kIHRoZSByZW1haW5pbmcgcGFydCBvZiB0aGUgNEdCIHZpcnR1YWwgbWVtb3J5IHNwYWNlIGlzIHVzZWQKKwkgIGJ5IHRoZSBrZXJuZWwgdG8gcGVybWFuZW50bHkgbWFwIGFzIG11Y2ggcGh5c2ljYWwgbWVtb3J5IGFzCisJICBwb3NzaWJsZS4KKworCSAgSWYgdGhlIG1hY2hpbmUgaGFzIGJldHdlZW4gMSBhbmQgNCBHaWdhYnl0ZXMgcGh5c2ljYWwgUkFNLCB0aGVuCisJICBhbnN3ZXIgIjRHQiIgaGVyZS4KKworCSAgSWYgbW9yZSB0aGFuIDQgR2lnYWJ5dGVzIGlzIHVzZWQgdGhlbiBhbnN3ZXIgIjY0R0IiIGhlcmUuIFRoaXMKKwkgIHNlbGVjdGlvbiB0dXJucyBJbnRlbCBQQUUgKFBoeXNpY2FsIEFkZHJlc3MgRXh0ZW5zaW9uKSBtb2RlIG9uLgorCSAgUEFFIGltcGxlbWVudHMgMy1sZXZlbCBwYWdpbmcgb24gSUEzMiBwcm9jZXNzb3JzLiBQQUUgaXMgZnVsbHkKKwkgIHN1cHBvcnRlZCBieSBMaW51eCwgUEFFIG1vZGUgaXMgaW1wbGVtZW50ZWQgb24gYWxsIHJlY2VudCBJbnRlbAorCSAgcHJvY2Vzc29ycyAoUGVudGl1bSBQcm8gYW5kIGJldHRlcikuIE5PVEU6IElmIHlvdSBzYXkgIjY0R0IiIGhlcmUsCisJICB0aGVuIHRoZSBrZXJuZWwgd2lsbCBub3QgYm9vdCBvbiBDUFVzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBQQUUhCisKKwkgIFRoZSBhY3R1YWwgYW1vdW50IG9mIHRvdGFsIHBoeXNpY2FsIG1lbW9yeSB3aWxsIGVpdGhlciBiZQorCSAgYXV0byBkZXRlY3RlZCBvciBjYW4gYmUgZm9yY2VkIGJ5IHVzaW5nIGEga2VybmVsIGNvbW1hbmQgbGluZSBvcHRpb24KKwkgIHN1Y2ggYXMgIm1lbT0yNTZNIi4gKFRyeSAibWFuIGJvb3RwYXJhbSIgb3Igc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mCisJICB5b3VyIGJvb3QgbG9hZGVyIChsaWxvIG9yIGxvYWRsaW4pIGFib3V0IGhvdyB0byBwYXNzIG9wdGlvbnMgdG8gdGhlCisJICBrZXJuZWwgYXQgYm9vdCB0aW1lLikKKworCSAgSWYgdW5zdXJlLCBzYXkgIm9mZiIuCisKK2NvbmZpZyBISUdITUVNNEcKKwlib29sICI0R0IiCisJaGVscAorCSAgU2VsZWN0IHRoaXMgaWYgeW91IGhhdmUgYSAzMi1iaXQgcHJvY2Vzc29yIGFuZCBiZXR3ZWVuIDEgYW5kIDQKKwkgIGdpZ2FieXRlcyBvZiBwaHlzaWNhbCBSQU0uCisKK2NvbmZpZyBISUdITUVNNjRHCisJYm9vbCAiNjRHQiIKKwloZWxwCisJICBTZWxlY3QgdGhpcyBpZiB5b3UgaGF2ZSBhIDMyLWJpdCBwcm9jZXNzb3IgYW5kIG1vcmUgdGhhbiA0CisJICBnaWdhYnl0ZXMgb2YgcGh5c2ljYWwgUkFNLgorCitlbmRjaG9pY2UKKworY29uZmlnIEhJR0hNRU0KKwlib29sCisJZGVwZW5kcyBvbiBISUdITUVNNjRHIHx8IEhJR0hNRU00RworCWRlZmF1bHQgeQorCitjb25maWcgWDg2X1BBRQorCWJvb2wKKwlkZXBlbmRzIG9uIEhJR0hNRU02NEcKKwlkZWZhdWx0IHkKKworIyBDb21tb24gTlVNQSBGZWF0dXJlcworY29uZmlnIE5VTUEKKwlib29sICJOdW1hIE1lbW9yeSBBbGxvY2F0aW9uIGFuZCBTY2hlZHVsZXIgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNNUCAmJiBISUdITUVNNjRHICYmIChYODZfTlVNQVEgfHwgWDg2X0dFTkVSSUNBUkNIIHx8IChYODZfU1VNTUlUICYmIEFDUEkpKQorCWRlZmF1bHQgbiBpZiBYODZfUEMKKwlkZWZhdWx0IHkgaWYgKFg4Nl9OVU1BUSB8fCBYODZfU1VNTUlUKQorCisjIE5lZWQgY29tbWVudHMgdG8gaGVscCB0aGUgaGFwbGVzcyB1c2VyIHRyeWluZyB0byB0dXJuIG9uIE5VTUEgc3VwcG9ydAorY29tbWVudCAiTlVNQSAoTlVNQS1RKSByZXF1aXJlcyBTTVAsIDY0R0IgaGlnaG1lbSBzdXBwb3J0IgorCWRlcGVuZHMgb24gWDg2X05VTUFRICYmICghSElHSE1FTTY0RyB8fCAhU01QKQorCitjb21tZW50ICJOVU1BIChTdW1taXQpIHJlcXVpcmVzIFNNUCwgNjRHQiBoaWdobWVtIHN1cHBvcnQsIEFDUEkiCisJZGVwZW5kcyBvbiBYODZfU1VNTUlUICYmICghSElHSE1FTTY0RyB8fCAhQUNQSSkKKworY29uZmlnIERJU0NPTlRJR01FTQorCWJvb2wKKwlkZXBlbmRzIG9uIE5VTUEKKwlkZWZhdWx0IHkKKworY29uZmlnIEhBVkVfQVJDSF9CT09UTUVNX05PREUKKwlib29sCisJZGVwZW5kcyBvbiBOVU1BCisJZGVmYXVsdCB5CisKK2NvbmZpZyBIQVZFX01FTU9SWV9QUkVTRU5UCisJYm9vbAorCWRlcGVuZHMgb24gRElTQ09OVElHTUVNCisJZGVmYXVsdCB5CisKK2NvbmZpZyBORUVEX05PREVfTUVNTUFQX1NJWkUKKwlib29sCisJZGVwZW5kcyBvbiBESVNDT05USUdNRU0KKwlkZWZhdWx0IHkKKworY29uZmlnIEhJR0hQVEUKKwlib29sICJBbGxvY2F0ZSAzcmQtbGV2ZWwgcGFnZXRhYmxlcyBmcm9tIGhpZ2htZW0iCisJZGVwZW5kcyBvbiBISUdITUVNNEcgfHwgSElHSE1FTTY0RworCWhlbHAKKwkgIFRoZSBWTSB1c2VzIG9uZSBwYWdlIHRhYmxlIGVudHJ5IGZvciBlYWNoIHBhZ2Ugb2YgcGh5c2ljYWwgbWVtb3J5LgorCSAgRm9yIHN5c3RlbXMgd2l0aCBhIGxvdCBvZiBSQU0sIHRoaXMgY2FuIGJlIHdhc3RlZnVsIG9mIHByZWNpb3VzCisJICBsb3cgbWVtb3J5LiAgU2V0dGluZyB0aGlzIG9wdGlvbiB3aWxsIHB1dCB1c2VyLXNwYWNlIHBhZ2UgdGFibGUKKwkgIGVudHJpZXMgaW4gaGlnaCBtZW1vcnkuCisKK2NvbmZpZyBNQVRIX0VNVUxBVElPTgorCWJvb2wgIk1hdGggZW11bGF0aW9uIgorCS0tLWhlbHAtLS0KKwkgIExpbnV4IGNhbiBlbXVsYXRlIGEgbWF0aCBjb3Byb2Nlc3NvciAodXNlZCBmb3IgZmxvYXRpbmcgcG9pbnQKKwkgIG9wZXJhdGlvbnMpIGlmIHlvdSBkb24ndCBoYXZlIG9uZS4gNDg2RFggYW5kIFBlbnRpdW0gcHJvY2Vzc29ycyBoYXZlCisJICBhIG1hdGggY29wcm9jZXNzb3IgYnVpbHQgaW4sIDQ4NlNYIGFuZCAzODYgZG8gbm90LCB1bmxlc3MgeW91IGFkZGVkCisJICBhIDQ4N0RYIG9yIDM4NywgcmVzcGVjdGl2ZWx5LiAoVGhlIG1lc3NhZ2VzIGR1cmluZyBib290IHRpbWUgY2FuCisJICBnaXZlIHlvdSBzb21lIGhpbnRzIGhlcmUgWyJtYW4gZG1lc2ciXS4pIEV2ZXJ5b25lIG5lZWRzIGVpdGhlciBhCisJICBjb3Byb2Nlc3NvciBvciB0aGlzIGVtdWxhdGlvbi4KKworCSAgSWYgeW91IGRvbid0IGhhdmUgYSBtYXRoIGNvcHJvY2Vzc29yLCB5b3UgbmVlZCB0byBzYXkgWSBoZXJlOyBpZiB5b3UKKwkgIHNheSBZIGhlcmUgZXZlbiB0aG91Z2ggeW91IGhhdmUgYSBjb3Byb2Nlc3NvciwgdGhlIGNvcHJvY2Vzc29yIHdpbGwKKwkgIGJlIHVzZWQgbmV2ZXJ0aGVsZXNzLiAoVGhpcyBiZWhhdmlvciBjYW4gYmUgY2hhbmdlZCB3aXRoIHRoZSBrZXJuZWwKKwkgIGNvbW1hbmQgbGluZSBvcHRpb24gIm5vMzg3Iiwgd2hpY2ggY29tZXMgaGFuZHkgaWYgeW91ciBjb3Byb2Nlc3NvcgorCSAgaXMgYnJva2VuLiBUcnkgIm1hbiBib290cGFyYW0iIG9yIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB5b3VyIGJvb3QKKwkgIGxvYWRlciAobGlsbyBvciBsb2FkbGluKSBhYm91dCBob3cgdG8gcGFzcyBvcHRpb25zIHRvIHRoZSBrZXJuZWwgYXQKKwkgIGJvb3QgdGltZS4pIFRoaXMgbWVhbnMgdGhhdCBpdCBpcyBhIGdvb2QgaWRlYSB0byBzYXkgWSBoZXJlIGlmIHlvdQorCSAgaW50ZW5kIHRvIHVzZSB0aGlzIGtlcm5lbCBvbiBkaWZmZXJlbnQgbWFjaGluZXMuCisKKwkgIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGludGVybmFscyBvZiB0aGUgTGludXggbWF0aCBjb3Byb2Nlc3NvcgorCSAgZW11bGF0aW9uIGNhbiBiZSBmb3VuZCBpbiA8ZmlsZTphcmNoL2kzODYvbWF0aC1lbXUvUkVBRE1FPi4KKworCSAgSWYgeW91IGFyZSBub3Qgc3VyZSwgc2F5IFk7IGFwYXJ0IGZyb20gcmVzdWx0aW5nIGluIGEgNjYgS0IgYmlnZ2VyCisJICBrZXJuZWwsIGl0IHdvbid0IGh1cnQuCisKK2NvbmZpZyBNVFJSCisJYm9vbCAiTVRSUiAoTWVtb3J5IFR5cGUgUmFuZ2UgUmVnaXN0ZXIpIHN1cHBvcnQiCisJLS0taGVscC0tLQorCSAgT24gSW50ZWwgUDYgZmFtaWx5IHByb2Nlc3NvcnMgKFBlbnRpdW0gUHJvLCBQZW50aXVtIElJIGFuZCBsYXRlcikKKwkgIHRoZSBNZW1vcnkgVHlwZSBSYW5nZSBSZWdpc3RlcnMgKE1UUlJzKSBtYXkgYmUgdXNlZCB0byBjb250cm9sCisJICBwcm9jZXNzb3IgYWNjZXNzIHRvIG1lbW9yeSByYW5nZXMuIFRoaXMgaXMgbW9zdCB1c2VmdWwgaWYgeW91IGhhdmUKKwkgIGEgdmlkZW8gKFZHQSkgY2FyZCBvbiBhIFBDSSBvciBBR1AgYnVzLiBFbmFibGluZyB3cml0ZS1jb21iaW5pbmcKKwkgIGFsbG93cyBidXMgd3JpdGUgdHJhbnNmZXJzIHRvIGJlIGNvbWJpbmVkIGludG8gYSBsYXJnZXIgdHJhbnNmZXIKKwkgIGJlZm9yZSBidXJzdGluZyBvdmVyIHRoZSBQQ0kvQUdQIGJ1cy4gVGhpcyBjYW4gaW5jcmVhc2UgcGVyZm9ybWFuY2UKKwkgIG9mIGltYWdlIHdyaXRlIG9wZXJhdGlvbnMgMi41IHRpbWVzIG9yIG1vcmUuIFNheWluZyBZIGhlcmUgY3JlYXRlcyBhCisJICAvcHJvYy9tdHJyIGZpbGUgd2hpY2ggbWF5IGJlIHVzZWQgdG8gbWFuaXB1bGF0ZSB5b3VyIHByb2Nlc3NvcidzCisJICBNVFJScy4gVHlwaWNhbGx5IHRoZSBYIHNlcnZlciBzaG91bGQgdXNlIHRoaXMuCisKKwkgIFRoaXMgY29kZSBoYXMgYSByZWFzb25hYmx5IGdlbmVyaWMgaW50ZXJmYWNlIHNvIHRoYXQgc2ltaWxhcgorCSAgY29udHJvbCByZWdpc3RlcnMgb24gb3RoZXIgcHJvY2Vzc29ycyBjYW4gYmUgZWFzaWx5IHN1cHBvcnRlZAorCSAgYXMgd2VsbDoKKworCSAgVGhlIEN5cml4IDZ4ODYsIDZ4ODZNWCBhbmQgTSBJSSBwcm9jZXNzb3JzIGhhdmUgQWRkcmVzcyBSYW5nZQorCSAgUmVnaXN0ZXJzIChBUlJzKSB3aGljaCBwcm92aWRlIGEgc2ltaWxhciBmdW5jdGlvbmFsaXR5IHRvIE1UUlJzLiBGb3IKKwkgIHRoZXNlLCB0aGUgQVJScyBhcmUgdXNlZCB0byBlbXVsYXRlIHRoZSBNVFJScy4KKwkgIFRoZSBBTUQgSzYtMiAoc3RlcHBpbmcgOCBhbmQgYWJvdmUpIGFuZCBLNi0zIHByb2Nlc3NvcnMgaGF2ZSB0d28KKwkgIE1UUlJzLiBUaGUgQ2VudGF1ciBDNiAoV2luQ2hpcCkgaGFzIDggTUNScywgYWxsb3dpbmcKKwkgIHdyaXRlLWNvbWJpbmluZy4gQWxsIG9mIHRoZXNlIHByb2Nlc3NvcnMgYXJlIHN1cHBvcnRlZCBieSB0aGlzIGNvZGUKKwkgIGFuZCBpdCBtYWtlcyBzZW5zZSB0byBzYXkgWSBoZXJlIGlmIHlvdSBoYXZlIG9uZSBvZiB0aGVtLgorCisJICBTYXlpbmcgWSBoZXJlIGFsc28gZml4ZXMgYSBwcm9ibGVtIHdpdGggYnVnZ3kgU01QIEJJT1NlcyB3aGljaCBvbmx5CisJICBzZXQgdGhlIE1UUlJzIGZvciB0aGUgYm9vdCBDUFUgYW5kIG5vdCBmb3IgdGhlIHNlY29uZGFyeSBDUFVzLiBUaGlzCisJICBjYW4gbGVhZCB0byBhbGwgc29ydHMgb2YgcHJvYmxlbXMsIHNvIGl0J3MgZ29vZCB0byBzYXkgWSBoZXJlLgorCisJICBZb3UgY2FuIHNhZmVseSBzYXkgWSBldmVuIGlmIHlvdXIgbWFjaGluZSBkb2Vzbid0IGhhdmUgTVRSUnMsIHlvdSdsbAorCSAganVzdCBhZGQgYWJvdXQgOSBLQiB0byB5b3VyIGtlcm5lbC4KKworCSAgU2VlIDxmaWxlOkRvY3VtZW50YXRpb24vbXRyci50eHQ+IGZvciBtb3JlIGluZm9ybWF0aW9uLgorCitjb25maWcgRUZJCisJYm9vbCAiQm9vdCBmcm9tIEVGSSBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gQUNQSQorCWRlZmF1bHQgbgorCS0tLWhlbHAtLS0KKwlUaGlzIGVuYWJsZXMgdGhlIHRoZSBrZXJuZWwgdG8gYm9vdCBvbiBFRkkgcGxhdGZvcm1zIHVzaW5nCisJc3lzdGVtIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gcGFzc2VkIHRvIGl0IGZyb20gdGhlIGZpcm13YXJlLgorCVRoaXMgYWxzbyBlbmFibGVzIHRoZSBrZXJuZWwgdG8gdXNlIGFueSBFRkkgcnVudGltZSBzZXJ2aWNlcyB0aGF0IGFyZQorCWF2YWlsYWJsZSAoc3VjaCBhcyB0aGUgRUZJIHZhcmlhYmxlIHNlcnZpY2VzKS4KKworCVRoaXMgb3B0aW9uIGlzIG9ubHkgdXNlZnVsIG9uIHN5c3RlbXMgdGhhdCBoYXZlIEVGSSBmaXJtd2FyZQorCWFuZCB3aWxsIHJlc3VsdCBpbiBhIGtlcm5lbCBpbWFnZSB0aGF0IGlzIH44ayBsYXJnZXIuICBJbiBhZGRpdGlvbiwKKwl5b3UgbXVzdCB1c2UgdGhlIGxhdGVzdCBFTElMTyBsb2FkZXIgYXZhaWxhYmxlIGF0CisJPGh0dHA6Ly9lbGlsby5zb3VyY2Vmb3JnZS5uZXQ+IGluIG9yZGVyIHRvIHRha2UgYWR2YW50YWdlIG9mCisJa2VybmVsIGluaXRpYWxpemF0aW9uIHVzaW5nIEVGSSBpbmZvcm1hdGlvbiAobmVpdGhlciBHUlVCIG5vciBMSUxPIGtub3cKKwlhbnl0aGluZyBhYm91dCBFRkkpLiAgSG93ZXZlciwgZXZlbiB3aXRoIHRoaXMgb3B0aW9uLCB0aGUgcmVzdWx0YW50CisJa2VybmVsIHNob3VsZCBjb250aW51ZSB0byBib290IG9uIGV4aXN0aW5nIG5vbi1FRkkgcGxhdGZvcm1zLgorCitjb25maWcgSVJRQkFMQU5DRQorIAlib29sICJFbmFibGUga2VybmVsIGlycSBiYWxhbmNpbmciCisJZGVwZW5kcyBvbiBTTVAgJiYgWDg2X0lPX0FQSUMKKwlkZWZhdWx0IHkKKwloZWxwCisgCSAgVGhlIGRlZmF1bHQgeWVzIHdpbGwgYWxsb3cgdGhlIGtlcm5lbCB0byBkbyBpcnEgbG9hZCBiYWxhbmNpbmcuCisJICBTYXlpbmcgbm8gd2lsbCBrZWVwIHRoZSBrZXJuZWwgZnJvbSBkb2luZyBpcnEgbG9hZCBiYWxhbmNpbmcuCisKK2NvbmZpZyBIQVZFX0RFQ19MT0NLCisJYm9vbAorCWRlcGVuZHMgb24gKFNNUCB8fCBQUkVFTVBUKSAmJiBYODZfQ01QWENIRworCWRlZmF1bHQgeQorCisjIHR1cm5pbmcgdGhpcyBvbiB3YXN0ZXMgYSBidW5jaCBvZiBzcGFjZS4KKyMgU3VtbWl0IG5lZWRzIGl0IG9ubHkgd2hlbiBOVU1BIGlzIG9uCitjb25maWcgQk9PVF9JT1JFTUFQCisJYm9vbAorCWRlcGVuZHMgb24gKCgoWDg2X1NVTU1JVCB8fCBYODZfR0VORVJJQ0FSQ0gpICYmIE5VTUEpIHx8IChYODYgJiYgRUZJKSkKKwlkZWZhdWx0IHkKKworY29uZmlnIFJFR1BBUk0KKwlib29sICJVc2UgcmVnaXN0ZXIgYXJndW1lbnRzIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJZGVmYXVsdCBuCisJaGVscAorCUNvbXBpbGUgdGhlIGtlcm5lbCB3aXRoIC1tcmVncGFybT0zLiBUaGlzIHVzZXMgYSBkaWZmZXJlbnQgQUJJCisJYW5kIHBhc3NlcyB0aGUgZmlyc3QgdGhyZWUgYXJndW1lbnRzIG9mIGEgZnVuY3Rpb24gY2FsbCBpbiByZWdpc3RlcnMuCisJVGhpcyB3aWxsIHByb2JhYmx5IGJyZWFrIGJpbmFyeSBvbmx5IG1vZHVsZXMuCisKKwlUaGlzIGZlYXR1cmUgaXMgb25seSBlbmFibGVkIGZvciBnY2MtMy4wIGFuZCBsYXRlciAtIGVhcmxpZXIgY29tcGlsZXJzCisJZ2VuZXJhdGUgaW5jb3JyZWN0IG91dHB1dCB3aXRoIGNlcnRhaW4ga2VybmVsIGNvbnN0cnVjdHMgd2hlbgorCS1tcmVncGFybT0zIGlzIHVzZWQuCisKK2NvbmZpZyBTRUNDT01QCisJYm9vbCAiRW5hYmxlIHNlY2NvbXAgdG8gc2FmZWx5IGNvbXB1dGUgdW50cnVzdGVkIGJ5dGVjb2RlIgorCWRlcGVuZHMgb24gUFJPQ19GUworCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMga2VybmVsIGZlYXR1cmUgaXMgdXNlZnVsIGZvciBudW1iZXIgY3J1bmNoaW5nIGFwcGxpY2F0aW9ucworCSAgdGhhdCBtYXkgbmVlZCB0byBjb21wdXRlIHVudHJ1c3RlZCBieXRlY29kZSBkdXJpbmcgdGhlaXIKKwkgIGV4ZWN1dGlvbi4gQnkgdXNpbmcgcGlwZXMgb3Igb3RoZXIgdHJhbnNwb3J0cyBtYWRlIGF2YWlsYWJsZSB0bworCSAgdGhlIHByb2Nlc3MgYXMgZmlsZSBkZXNjcmlwdG9ycyBzdXBwb3J0aW5nIHRoZSByZWFkL3dyaXRlCisJICBzeXNjYWxscywgaXQncyBwb3NzaWJsZSB0byBpc29sYXRlIHRob3NlIGFwcGxpY2F0aW9ucyBpbgorCSAgdGhlaXIgb3duIGFkZHJlc3Mgc3BhY2UgdXNpbmcgc2VjY29tcC4gT25jZSBzZWNjb21wIGlzCisJICBlbmFibGVkIHZpYSAvcHJvYy88cGlkPi9zZWNjb21wLCBpdCBjYW5ub3QgYmUgZGlzYWJsZWQKKwkgIGFuZCB0aGUgdGFzayBpcyBvbmx5IGFsbG93ZWQgdG8gZXhlY3V0ZSBhIGZldyBzYWZlIHN5c2NhbGxzCisJICBkZWZpbmVkIGJ5IGVhY2ggc2VjY29tcCBtb2RlLgorCisJICBJZiB1bnN1cmUsIHNheSBZLiBPbmx5IGVtYmVkZGVkIHNob3VsZCBzYXkgTiBoZXJlLgorCitlbmRtZW51CisKKworbWVudSAiUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zIChBQ1BJLCBBUE0pIgorCWRlcGVuZHMgb24gIVg4Nl9WT1lBR0VSCisKK3NvdXJjZSBrZXJuZWwvcG93ZXIvS2NvbmZpZworCitzb3VyY2UgImRyaXZlcnMvYWNwaS9LY29uZmlnIgorCittZW51ICJBUE0gKEFkdmFuY2VkIFBvd2VyIE1hbmFnZW1lbnQpIEJJT1MgU3VwcG9ydCIKK2RlcGVuZHMgb24gUE0gJiYgIVg4Nl9WSVNXUworCitjb25maWcgQVBNCisJdHJpc3RhdGUgIkFQTSAoQWR2YW5jZWQgUG93ZXIgTWFuYWdlbWVudCkgQklPUyBzdXBwb3J0IgorCWRlcGVuZHMgb24gUE0KKwktLS1oZWxwLS0tCisJICBBUE0gaXMgYSBCSU9TIHNwZWNpZmljYXRpb24gZm9yIHNhdmluZyBwb3dlciB1c2luZyBzZXZlcmFsIGRpZmZlcmVudAorCSAgdGVjaG5pcXVlcy4gVGhpcyBpcyBtb3N0bHkgdXNlZnVsIGZvciBiYXR0ZXJ5IHBvd2VyZWQgbGFwdG9wcyB3aXRoCisJICBBUE0gY29tcGxpYW50IEJJT1Nlcy4gSWYgeW91IHNheSBZIGhlcmUsIHRoZSBzeXN0ZW0gdGltZSB3aWxsIGJlCisJICByZXNldCBhZnRlciBhIFJFU1VNRSBvcGVyYXRpb24sIHRoZSAvcHJvYy9hcG0gZGV2aWNlIHdpbGwgcHJvdmlkZQorCSAgYmF0dGVyeSBzdGF0dXMgaW5mb3JtYXRpb24sIGFuZCB1c2VyLXNwYWNlIHByb2dyYW1zIHdpbGwgcmVjZWl2ZQorCSAgbm90aWZpY2F0aW9uIG9mIEFQTSAiZXZlbnRzIiAoZS5nLiBiYXR0ZXJ5IHN0YXR1cyBjaGFuZ2UpLgorCisJICBJZiB5b3Ugc2VsZWN0ICJZIiBoZXJlLCB5b3UgY2FuIGRpc2FibGUgYWN0dWFsIHVzZSBvZiB0aGUgQVBNCisJICBCSU9TIGJ5IHBhc3NpbmcgdGhlICJhcG09b2ZmIiBvcHRpb24gdG8gdGhlIGtlcm5lbCBhdCBib290IHRpbWUuCisKKwkgIE5vdGUgdGhhdCB0aGUgQVBNIHN1cHBvcnQgaXMgYWxtb3N0IGNvbXBsZXRlbHkgZGlzYWJsZWQgZm9yCisJICBtYWNoaW5lcyB3aXRoIG1vcmUgdGhhbiBvbmUgQ1BVLgorCisJICBJbiBvcmRlciB0byB1c2UgQVBNLCB5b3Ugd2lsbCBuZWVkIHN1cHBvcnRpbmcgc29mdHdhcmUuIEZvciBsb2NhdGlvbgorCSAgYW5kIG1vcmUgaW5mb3JtYXRpb24sIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9wbS50eHQ+IGFuZCB0aGUKKwkgIEJhdHRlcnkgUG93ZXJlZCBMaW51eCBtaW5pLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVGhpcyBkcml2ZXIgZG9lcyBub3Qgc3BpbiBkb3duIGRpc2sgZHJpdmVzIChzZWUgdGhlIGhkcGFybSg4KQorCSAgbWFucGFnZSAoIm1hbiA4IGhkcGFybSIpIGZvciB0aGF0KSwgYW5kIGl0IGRvZXNuJ3QgdHVybiBvZmYKKwkgIFZFU0EtY29tcGxpYW50ICJncmVlbiIgbW9uaXRvcnMuCisKKwkgIFRoaXMgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIFRJIDQwMDBNIFRyYXZlbE1hdGUgYW5kIHRoZSBBQ0VSCisJICA0ODYvRFg0Lzc1IGJlY2F1c2UgdGhleSBkb24ndCBoYXZlIGNvbXBsaWFudCBCSU9TZXMuIE1hbnkgImdyZWVuIgorCSAgZGVza3RvcCBtYWNoaW5lcyBhbHNvIGRvbid0IGhhdmUgY29tcGxpYW50IEJJT1NlcywgYW5kIHRoaXMgZHJpdmVyCisJICBtYXkgY2F1c2UgdGhvc2UgbWFjaGluZXMgdG8gcGFuaWMgZHVyaW5nIHRoZSBib290IHBoYXNlLgorCisJICBHZW5lcmFsbHksIGlmIHlvdSBkb24ndCBoYXZlIGEgYmF0dGVyeSBpbiB5b3VyIG1hY2hpbmUsIHRoZXJlIGlzbid0CisJICBtdWNoIHBvaW50IGluIHVzaW5nIHRoaXMgZHJpdmVyIGFuZCB5b3Ugc2hvdWxkIHNheSBOLiBJZiB5b3UgZ2V0CisJICByYW5kb20ga2VybmVsIE9PUFNlcyBvciByZWJvb3RzIHRoYXQgZG9uJ3Qgc2VlbSB0byBiZSByZWxhdGVkIHRvCisJICBhbnl0aGluZywgdHJ5IGRpc2FibGluZy9lbmFibGluZyB0aGlzIG9wdGlvbiAob3IgZGlzYWJsaW5nL2VuYWJsaW5nCisJICBBUE0gaW4geW91ciBCSU9TKS4KKworCSAgU29tZSBvdGhlciB0aGluZ3MgeW91IHNob3VsZCB0cnkgd2hlbiBleHBlcmllbmNpbmcgc2VlbWluZ2x5IHJhbmRvbSwKKwkgICJ3ZWlyZCIgcHJvYmxlbXM6CisKKwkgIDEpIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGVub3VnaCBzd2FwIHNwYWNlIGFuZCB0aGF0IGl0IGlzCisJICBlbmFibGVkLgorCSAgMikgcGFzcyB0aGUgIm5vLWhsdCIgb3B0aW9uIHRvIHRoZSBrZXJuZWwKKwkgIDMpIHN3aXRjaCBvbiBmbG9hdGluZyBwb2ludCBlbXVsYXRpb24gaW4gdGhlIGtlcm5lbCBhbmQgcGFzcworCSAgdGhlICJubzM4NyIgb3B0aW9uIHRvIHRoZSBrZXJuZWwKKwkgIDQpIHBhc3MgdGhlICJmbG9wcHk9bm9kbWEiIG9wdGlvbiB0byB0aGUga2VybmVsCisJICA1KSBwYXNzIHRoZSAibWVtPTRNIiBvcHRpb24gdG8gdGhlIGtlcm5lbCAodGhlcmVieSBkaXNhYmxpbmcKKwkgIGFsbCBidXQgdGhlIGZpcnN0IDQgTUIgb2YgUkFNKQorCSAgNikgbWFrZSBzdXJlIHRoYXQgdGhlIENQVSBpcyBub3Qgb3ZlciBjbG9ja2VkLgorCSAgNykgcmVhZCB0aGUgc2lnMTEgRkFRIGF0IDxodHRwOi8vd3d3LmJpdHdpemFyZC5ubC9zaWcxMS8+CisJICA4KSBkaXNhYmxlIHRoZSBjYWNoZSBmcm9tIHlvdXIgQklPUyBzZXR0aW5ncworCSAgOSkgaW5zdGFsbCBhIGZhbiBmb3IgdGhlIHZpZGVvIGNhcmQgb3IgZXhjaGFuZ2UgdmlkZW8gUkFNCisJICAxMCkgaW5zdGFsbCBhIGJldHRlciBmYW4gZm9yIHRoZSBDUFUKKwkgIDExKSBleGNoYW5nZSBSQU0gY2hpcHMKKwkgIDEyKSBleGNoYW5nZSB0aGUgbW90aGVyYm9hcmQuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFwbS4KKworY29uZmlnIEFQTV9JR05PUkVfVVNFUl9TVVNQRU5ECisJYm9vbCAiSWdub3JlIFVTRVIgU1VTUEVORCIKKwlkZXBlbmRzIG9uIEFQTQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIHdpbGwgaWdub3JlIFVTRVIgU1VTUEVORCByZXF1ZXN0cy4gT24gbWFjaGluZXMgd2l0aCBhCisJICBjb21wbGlhbnQgQVBNIEJJT1MsIHlvdSB3YW50IHRvIHNheSBOLiBIb3dldmVyLCBvbiB0aGUgTkVDIFZlcnNhIE0KKwkgIHNlcmllcyBub3RlYm9va3MsIGl0IGlzIG5lY2Vzc2FyeSB0byBzYXkgWSBiZWNhdXNlIG9mIGEgQklPUyBidWcuCisKK2NvbmZpZyBBUE1fRE9fRU5BQkxFCisJYm9vbCAiRW5hYmxlIFBNIGF0IGJvb3QgdGltZSIKKwlkZXBlbmRzIG9uIEFQTQorCS0tLWhlbHAtLS0KKwkgIEVuYWJsZSBBUE0gZmVhdHVyZXMgYXQgYm9vdCB0aW1lLiBGcm9tIHBhZ2UgMzYgb2YgdGhlIEFQTSBCSU9TCisJICBzcGVjaWZpY2F0aW9uOiAiV2hlbiBkaXNhYmxlZCwgdGhlIEFQTSBCSU9TIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkKKwkgIHBvd2VyIG1hbmFnZSBkZXZpY2VzLCBlbnRlciB0aGUgU3RhbmRieSBTdGF0ZSwgZW50ZXIgdGhlIFN1c3BlbmQKKwkgIFN0YXRlLCBvciB0YWtlIHBvd2VyIHNhdmluZyBzdGVwcyBpbiByZXNwb25zZSB0byBDUFUgSWRsZSBjYWxscy4iCisJICBUaGlzIGRyaXZlciB3aWxsIG1ha2UgQ1BVIElkbGUgY2FsbHMgd2hlbiBMaW51eCBpcyBpZGxlICh1bmxlc3MgdGhpcworCSAgZmVhdHVyZSBpcyB0dXJuZWQgb2ZmIC0tIHNlZSAiRG8gQ1BVIElETEUgY2FsbHMiLCBiZWxvdykuIFRoaXMKKwkgIHNob3VsZCBhbHdheXMgc2F2ZSBiYXR0ZXJ5IHBvd2VyLCBidXQgbW9yZSBjb21wbGljYXRlZCBBUE0gZmVhdHVyZXMKKwkgIHdpbGwgYmUgZGVwZW5kZW50IG9uIHlvdXIgQklPUyBpbXBsZW1lbnRhdGlvbi4gWW91IG1heSBuZWVkIHRvIHR1cm4KKwkgIHRoaXMgb3B0aW9uIG9mZiBpZiB5b3VyIGNvbXB1dGVyIGhhbmdzIGF0IGJvb3QgdGltZSB3aGVuIHVzaW5nIEFQTQorCSAgc3VwcG9ydCwgb3IgaWYgaXQgYmVlcHMgY29udGludW91c2x5IGluc3RlYWQgb2Ygc3VzcGVuZGluZy4gVHVybgorCSAgdGhpcyBvZmYgaWYgeW91IGhhdmUgYSBORUMgVWx0cmFMaXRlIFZlcnNhIDMzL0Mgb3IgYSBUb3NoaWJhCisJICBUNDAwQ0RULiBUaGlzIGlzIG9mZiBieSBkZWZhdWx0IHNpbmNlIG1vc3QgbWFjaGluZXMgZG8gZmluZSB3aXRob3V0CisJICB0aGlzIGZlYXR1cmUuCisKK2NvbmZpZyBBUE1fQ1BVX0lETEUKKwlib29sICJNYWtlIENQVSBJZGxlIGNhbGxzIHdoZW4gaWRsZSIKKwlkZXBlbmRzIG9uIEFQTQorCWhlbHAKKwkgIEVuYWJsZSBjYWxscyB0byBBUE0gQ1BVIElkbGUvQ1BVIEJ1c3kgaW5zaWRlIHRoZSBrZXJuZWwncyBpZGxlIGxvb3AuCisJICBPbiBzb21lIG1hY2hpbmVzLCB0aGlzIGNhbiBhY3RpdmF0ZSBpbXByb3ZlZCBwb3dlciBzYXZpbmdzLCBzdWNoIGFzCisJICBhIHNsb3dlZCBDUFUgY2xvY2sgcmF0ZSwgd2hlbiB0aGUgbWFjaGluZSBpcyBpZGxlLiBUaGVzZSBpZGxlIGNhbGxzCisJICBhcmUgbWFkZSBhZnRlciB0aGUgaWRsZSBsb29wIGhhcyBydW4gZm9yIHNvbWUgbGVuZ3RoIG9mIHRpbWUgKGUuZy4sCisJICAzMzMgbVMpLiBPbiBzb21lIG1hY2hpbmVzLCB0aGlzIHdpbGwgY2F1c2UgYSBoYW5nIGF0IGJvb3QgdGltZSBvcgorCSAgd2hlbmV2ZXIgdGhlIENQVSBiZWNvbWVzIGlkbGUuIChPbiBtYWNoaW5lcyB3aXRoIG1vcmUgdGhhbiBvbmUgQ1BVLAorCSAgdGhpcyBvcHRpb24gZG9lcyBub3RoaW5nLikKKworY29uZmlnIEFQTV9ESVNQTEFZX0JMQU5LCisJYm9vbCAiRW5hYmxlIGNvbnNvbGUgYmxhbmtpbmcgdXNpbmcgQVBNIgorCWRlcGVuZHMgb24gQVBNCisJaGVscAorCSAgRW5hYmxlIGNvbnNvbGUgYmxhbmtpbmcgdXNpbmcgdGhlIEFQTS4gU29tZSBsYXB0b3BzIGNhbiB1c2UgdGhpcyB0bworCSAgdHVybiBvZmYgdGhlIExDRCBiYWNrbGlnaHQgd2hlbiB0aGUgc2NyZWVuIGJsYW5rZXIgb2YgdGhlIExpbnV4CisJICB2aXJ0dWFsIGNvbnNvbGUgYmxhbmtzIHRoZSBzY3JlZW4uIE5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgdXNlZCBieQorCSAgdGhlIHZpcnR1YWwgY29uc29sZSBzY3JlZW4gYmxhbmtlciwgYW5kIHdvbid0IHR1cm4gb2ZmIHRoZSBiYWNrbGlnaHQKKwkgIHdoZW4gdXNpbmcgdGhlIFggV2luZG93IHN5c3RlbS4gVGhpcyBhbHNvIGRvZXNuJ3QgaGF2ZSBhbnl0aGluZyB0bworCSAgZG8gd2l0aCB5b3VyIFZFU0EtY29tcGxpYW50IHBvd2VyLXNhdmluZyBtb25pdG9yLiBGdXJ0aGVyLCB0aGlzCisJICBvcHRpb24gZG9lc24ndCB3b3JrIGZvciBhbGwgbGFwdG9wcyAtLSBpdCBtaWdodCBub3QgdHVybiBvZmYgeW91cgorCSAgYmFja2xpZ2h0IGF0IGFsbCwgb3IgaXQgbWlnaHQgcHJpbnQgYSBsb3Qgb2YgZXJyb3JzIHRvIHRoZSBjb25zb2xlLAorCSAgZXNwZWNpYWxseSBpZiB5b3UgYXJlIHVzaW5nIGdwbS4KKworY29uZmlnIEFQTV9SVENfSVNfR01UCisJYm9vbCAiUlRDIHN0b3JlcyB0aW1lIGluIEdNVCIKKwlkZXBlbmRzIG9uIEFQTQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91ciBSVEMgKFJlYWwgVGltZSBDbG9jayBhLmsuYS4gaGFyZHdhcmUgY2xvY2spCisJICBzdG9yZXMgdGhlIHRpbWUgaW4gR01UIChHcmVlbndpY2ggTWVhbiBUaW1lKS4gU2F5IE4gaWYgeW91ciBSVEMKKwkgIHN0b3JlcyBsb2NhbHRpbWUuCisKKwkgIEl0IGlzIGluIGZhY3QgcmVjb21tZW5kZWQgdG8gc3RvcmUgR01UIGluIHlvdXIgUlRDLCBiZWNhdXNlIHRoZW4geW91CisJICBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IGRheWxpZ2h0IHNhdmluZ3MgdGltZSBjaGFuZ2VzLiBUaGUgb25seQorCSAgcmVhc29uIG5vdCB0byB1c2UgR01UIGluIHlvdXIgUlRDIGlzIGlmIHlvdSBhbHNvIHJ1biBhIGJyb2tlbiBPUworCSAgdGhhdCBkb2Vzbid0IHVuZGVyc3RhbmQgR01ULgorCitjb25maWcgQVBNX0FMTE9XX0lOVFMKKwlib29sICJBbGxvdyBpbnRlcnJ1cHRzIGR1cmluZyBBUE0gQklPUyBjYWxscyIKKwlkZXBlbmRzIG9uIEFQTQorCWhlbHAKKwkgIE5vcm1hbGx5IHdlIGRpc2FibGUgZXh0ZXJuYWwgaW50ZXJydXB0cyB3aGlsZSB3ZSBhcmUgbWFraW5nIGNhbGxzIHRvCisJICB0aGUgQVBNIEJJT1MgYXMgYSBtZWFzdXJlIHRvIGxlc3NlbiB0aGUgZWZmZWN0cyBvZiBhIGJhZGx5IGJlaGF2aW5nCisJICBCSU9TIGltcGxlbWVudGF0aW9uLiAgVGhlIEJJT1Mgc2hvdWxkIHJlZW5hYmxlIGludGVycnVwdHMgaWYgaXQKKwkgIG5lZWRzIHRvLiAgVW5mb3J0dW5hdGVseSwgc29tZSBCSU9TZXMgZG8gbm90IC0tIGVzcGVjaWFsbHkgdGhvc2UgaW4KKwkgIG1hbnkgb2YgdGhlIG5ld2VyIElCTSBUaGlua3BhZHMuICBJZiB5b3UgZXhwZXJpZW5jZSBoYW5ncyB3aGVuIHlvdQorCSAgc3VzcGVuZCwgdHJ5IHNldHRpbmcgdGhpcyB0byBZLiAgT3RoZXJ3aXNlLCBzYXkgTi4KKworY29uZmlnIEFQTV9SRUFMX01PREVfUE9XRVJfT0ZGCisJYm9vbCAiVXNlIHJlYWwgbW9kZSBBUE0gQklPUyBjYWxsIHRvIHBvd2VyIG9mZiIKKwlkZXBlbmRzIG9uIEFQTQorCWhlbHAKKwkgIFVzZSByZWFsIG1vZGUgQVBNIEJJT1MgY2FsbHMgdG8gc3dpdGNoIG9mZiB0aGUgY29tcHV0ZXIuIFRoaXMgaXMKKwkgIGEgd29yay1hcm91bmQgZm9yIGEgbnVtYmVyIG9mIGJ1Z2d5IEJJT1Nlcy4gU3dpdGNoIHRoaXMgb3B0aW9uIG9uIGlmCisJICB5b3VyIGNvbXB1dGVyIGNyYXNoZXMgaW5zdGVhZCBvZiBwb3dlcmluZyBvZmYgcHJvcGVybHkuCisKK2VuZG1lbnUKKworc291cmNlICJhcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL0tjb25maWciCisKK2VuZG1lbnUKKworbWVudSAiQnVzIG9wdGlvbnMgKFBDSSwgUENNQ0lBLCBFSVNBLCBNQ0EsIElTQSkiCisKK2NvbmZpZyBQQ0kKKwlib29sICJQQ0kgc3VwcG9ydCIgaWYgIVg4Nl9WSVNXUworCWRlcGVuZHMgb24gIVg4Nl9WT1lBR0VSCisJZGVmYXVsdCB5IGlmIFg4Nl9WSVNXUworCWhlbHAKKwkgIEZpbmQgb3V0IHdoZXRoZXIgeW91IGhhdmUgYSBQQ0kgbW90aGVyYm9hcmQuIFBDSSBpcyB0aGUgbmFtZSBvZiBhCisJICBidXMgc3lzdGVtLCBpLmUuIHRoZSB3YXkgdGhlIENQVSB0YWxrcyB0byB0aGUgb3RoZXIgc3R1ZmYgaW5zaWRlCisJICB5b3VyIGJveC4gT3RoZXIgYnVzIHN5c3RlbXMgYXJlIElTQSwgRUlTQSwgTWljcm9DaGFubmVsIChNQ0EpIG9yCisJICBWRVNBLiBJZiB5b3UgaGF2ZSBQQ0ksIHNheSBZLCBvdGhlcndpc2UgTi4KKworCSAgVGhlIFBDSS1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4sIGNvbnRhaW5zIHZhbHVhYmxlCisJICBpbmZvcm1hdGlvbiBhYm91dCB3aGljaCBQQ0kgaGFyZHdhcmUgZG9lcyB3b3JrIHVuZGVyIExpbnV4IGFuZCB3aGljaAorCSAgZG9lc24ndC4KKworY2hvaWNlCisJcHJvbXB0ICJQQ0kgYWNjZXNzIG1vZGUiCisJZGVwZW5kcyBvbiBQQ0kgJiYgIVg4Nl9WSVNXUworCWRlZmF1bHQgUENJX0dPQU5ZCisJLS0taGVscC0tLQorCSAgT24gUENJIHN5c3RlbXMsIHRoZSBCSU9TIGNhbiBiZSB1c2VkIHRvIGRldGVjdCB0aGUgUENJIGRldmljZXMgYW5kCisJICBkZXRlcm1pbmUgdGhlaXIgY29uZmlndXJhdGlvbi4gSG93ZXZlciwgc29tZSBvbGQgUENJIG1vdGhlcmJvYXJkcworCSAgaGF2ZSBCSU9TIGJ1Z3MgYW5kIG1heSBjcmFzaCBpZiB0aGlzIGlzIGRvbmUuIEFsc28sIHNvbWUgZW1iZWRkZWQKKwkgIFBDSS1iYXNlZCBzeXN0ZW1zIGRvbid0IGhhdmUgYW55IEJJT1MgYXQgYWxsLiBMaW51eCBjYW4gYWxzbyB0cnkgdG8KKwkgIGRldGVjdCB0aGUgUENJIGhhcmR3YXJlIGRpcmVjdGx5IHdpdGhvdXQgdXNpbmcgdGhlIEJJT1MuCisKKwkgIFdpdGggdGhpcyBvcHRpb24sIHlvdSBjYW4gc3BlY2lmeSBob3cgTGludXggc2hvdWxkIGRldGVjdCB0aGUKKwkgIFBDSSBkZXZpY2VzLiBJZiB5b3UgY2hvb3NlICJCSU9TIiwgdGhlIEJJT1Mgd2lsbCBiZSB1c2VkLAorCSAgaWYgeW91IGNob29zZSAiRGlyZWN0IiwgdGhlIEJJT1Mgd29uJ3QgYmUgdXNlZCwgYW5kIGlmIHlvdQorCSAgY2hvb3NlICJNTUNvbmZpZyIsIHRoZW4gUENJIEV4cHJlc3MgTU1DT05GSUcgd2lsbCBiZSB1c2VkLgorCSAgSWYgeW91IGNob29zZSAiQW55IiwgdGhlIGtlcm5lbCB3aWxsIHRyeSBNTUNPTkZJRywgdGhlbiB0aGUKKwkgIGRpcmVjdCBhY2Nlc3MgbWV0aG9kIGFuZCBmYWxscyBiYWNrIHRvIHRoZSBCSU9TIGlmIHRoYXQgZG9lc24ndAorCSAgd29yay4gSWYgdW5zdXJlLCBnbyB3aXRoIHRoZSBkZWZhdWx0LCB3aGljaCBpcyAiQW55Ii4KKworY29uZmlnIFBDSV9HT0JJT1MKKwlib29sICJCSU9TIgorCitjb25maWcgUENJX0dPTU1DT05GSUcKKwlib29sICJNTUNvbmZpZyIKKworY29uZmlnIFBDSV9HT0RJUkVDVAorCWJvb2wgIkRpcmVjdCIKKworY29uZmlnIFBDSV9HT0FOWQorCWJvb2wgIkFueSIKKworZW5kY2hvaWNlCisKK2NvbmZpZyBQQ0lfQklPUworCWJvb2wKKwlkZXBlbmRzIG9uICFYODZfVklTV1MgJiYgUENJICYmIChQQ0lfR09CSU9TIHx8IFBDSV9HT0FOWSkKKwlkZWZhdWx0IHkKKworY29uZmlnIFBDSV9ESVJFQ1QKKwlib29sCisgCWRlcGVuZHMgb24gUENJICYmICgoUENJX0dPRElSRUNUIHx8IFBDSV9HT0FOWSkgfHwgWDg2X1ZJU1dTKQorCWRlZmF1bHQgeQorCitjb25maWcgUENJX01NQ09ORklHCisJYm9vbAorCWRlcGVuZHMgb24gUENJICYmIChQQ0lfR09NTUNPTkZJRyB8fCAoUENJX0dPQU5ZICYmIEFDUEkpKQorCXNlbGVjdCBBQ1BJX0JPT1QKKwlkZWZhdWx0IHkKKworc291cmNlICJkcml2ZXJzL3BjaS9wY2llL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9wY2kvS2NvbmZpZyIKKworY29uZmlnIElTQQorCWJvb2wgIklTQSBzdXBwb3J0IgorCWRlcGVuZHMgb24gIShYODZfVk9ZQUdFUiB8fCBYODZfVklTV1MpCisJaGVscAorCSAgRmluZCBvdXQgd2hldGhlciB5b3UgaGF2ZSBJU0Egc2xvdHMgb24geW91ciBtb3RoZXJib2FyZC4gIElTQSBpcyB0aGUKKwkgIG5hbWUgb2YgYSBidXMgc3lzdGVtLCBpLmUuIHRoZSB3YXkgdGhlIENQVSB0YWxrcyB0byB0aGUgb3RoZXIgc3R1ZmYKKwkgIGluc2lkZSB5b3VyIGJveC4gIE90aGVyIGJ1cyBzeXN0ZW1zIGFyZSBQQ0ksIEVJU0EsIE1pY3JvQ2hhbm5lbAorCSAgKE1DQSkgb3IgVkVTQS4gIElTQSBpcyBhbiBvbGRlciBzeXN0ZW0sIG5vdyBiZWluZyBkaXNwbGFjZWQgYnkgUENJOworCSAgbmV3ZXIgYm9hcmRzIGRvbid0IHN1cHBvcnQgaXQuICBJZiB5b3UgaGF2ZSBJU0EsIHNheSBZLCBvdGhlcndpc2UgTi4KKworY29uZmlnIEVJU0EKKwlib29sICJFSVNBIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJU0EKKwktLS1oZWxwLS0tCisJICBUaGUgRXh0ZW5kZWQgSW5kdXN0cnkgU3RhbmRhcmQgQXJjaGl0ZWN0dXJlIChFSVNBKSBidXMgd2FzCisJICBkZXZlbG9wZWQgYXMgYW4gb3BlbiBhbHRlcm5hdGl2ZSB0byB0aGUgSUJNIE1pY3JvQ2hhbm5lbCBidXMuCisKKwkgIFRoZSBFSVNBIGJ1cyBwcm92aWRlZCBzb21lIG9mIHRoZSBmZWF0dXJlcyBvZiB0aGUgSUJNIE1pY3JvQ2hhbm5lbAorCSAgYnVzIHdoaWxlIG1haW50YWluaW5nIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBjYXJkcyBtYWRlIGZvcgorCSAgdGhlIG9sZGVyIElTQSBidXMuICBUaGUgRUlTQSBidXMgc2F3IGxpbWl0ZWQgdXNlIGJldHdlZW4gMTk4OCBhbmQKKwkgIDE5OTUgd2hlbiBpdCB3YXMgbWFkZSBvYnNvbGV0ZSBieSB0aGUgUENJIGJ1cy4KKworCSAgU2F5IFkgaGVyZSBpZiB5b3UgYXJlIGJ1aWxkaW5nIGEga2VybmVsIGZvciBhbiBFSVNBLWJhc2VkIG1hY2hpbmUuCisKKwkgIE90aGVyd2lzZSwgc2F5IE4uCisKK3NvdXJjZSAiZHJpdmVycy9laXNhL0tjb25maWciCisKK2NvbmZpZyBNQ0EKKwlib29sICJNQ0Egc3VwcG9ydCIgaWYgIShYODZfVklTV1MgfHwgWDg2X1ZPWUFHRVIpCisJZGVmYXVsdCB5IGlmIFg4Nl9WT1lBR0VSCisJaGVscAorCSAgTWljcm9DaGFubmVsIEFyY2hpdGVjdHVyZSBpcyBmb3VuZCBpbiBzb21lIElCTSBQUy8yIG1hY2hpbmVzIGFuZAorCSAgbGFwdG9wcy4gIEl0IGlzIGEgYnVzIHN5c3RlbSBzaW1pbGFyIHRvIFBDSSBvciBJU0EuIFNlZQorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9tY2EudHh0PiAoYW5kIGVzcGVjaWFsbHkgdGhlIHdlYiBwYWdlIGdpdmVuCisJICB0aGVyZSkgYmVmb3JlIGF0dGVtcHRpbmcgdG8gYnVpbGQgYW4gTUNBIGJ1cyBrZXJuZWwuCisKK3NvdXJjZSAiZHJpdmVycy9tY2EvS2NvbmZpZyIKKworY29uZmlnIFNDeDIwMAorCXRyaXN0YXRlICJOYXRTZW1pIFNDeDIwMCBzdXBwb3J0IgorCWRlcGVuZHMgb24gIVg4Nl9WT1lBR0VSCisJaGVscAorCSAgVGhpcyBwcm92aWRlcyBiYXNpYyBzdXBwb3J0IGZvciB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBTQ3gyMDAKKwkgIHByb2Nlc3Nvci4gIFJpZ2h0IG5vdyB0aGlzIGlzIGp1c3QgYSBkcml2ZXIgZm9yIHRoZSBHUElPIHBpbnMuCisKKwkgIElmIHlvdSBkb24ndCBrbm93IHdoYXQgdG8gZG8gaGVyZSwgc2F5IE4uCisKKwkgIFRoaXMgc3VwcG9ydCBpcyBhbHNvIGF2YWlsYWJsZSBhcyBhIG1vZHVsZS4gIElmIGNvbXBpbGVkIGFzIGEKKwkgIG1vZHVsZSwgaXQgd2lsbCBiZSBjYWxsZWQgc2N4MjAwLgorCitzb3VyY2UgImRyaXZlcnMvcGNtY2lhL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9wY2kvaG90cGx1Zy9LY29uZmlnIgorCitlbmRtZW51CisKK21lbnUgIkV4ZWN1dGFibGUgZmlsZSBmb3JtYXRzIgorCitzb3VyY2UgImZzL0tjb25maWcuYmluZm10IgorCitlbmRtZW51CisKK3NvdXJjZSAiZHJpdmVycy9LY29uZmlnIgorCitzb3VyY2UgImZzL0tjb25maWciCisKK3NvdXJjZSAiYXJjaC9pMzg2L29wcm9maWxlL0tjb25maWciCisKK3NvdXJjZSAiYXJjaC9pMzg2L0tjb25maWcuZGVidWciCisKK3NvdXJjZSAic2VjdXJpdHkvS2NvbmZpZyIKKworc291cmNlICJjcnlwdG8vS2NvbmZpZyIKKworc291cmNlICJsaWIvS2NvbmZpZyIKKworIworIyBVc2UgdGhlIGdlbmVyaWMgaW50ZXJydXB0IGhhbmRsaW5nIGNvZGUgaW4ga2VybmVsL2lycS86CisjCitjb25maWcgR0VORVJJQ19IQVJESVJRUworCWJvb2wKKwlkZWZhdWx0IHkKKworY29uZmlnIEdFTkVSSUNfSVJRX1BST0JFCisJYm9vbAorCWRlZmF1bHQgeQorCitjb25maWcgWDg2X1NNUAorCWJvb2wKKwlkZXBlbmRzIG9uIFNNUCAmJiAhWDg2X1ZPWUFHRVIKKwlkZWZhdWx0IHkKKworY29uZmlnIFg4Nl9IVAorCWJvb2wKKwlkZXBlbmRzIG9uIFNNUCAmJiAhKFg4Nl9WSVNXUyB8fCBYODZfVk9ZQUdFUikKKwlkZWZhdWx0IHkKKworY29uZmlnIFg4Nl9CSU9TX1JFQk9PVAorCWJvb2wKKwlkZXBlbmRzIG9uICEoWDg2X1ZJU1dTIHx8IFg4Nl9WT1lBR0VSKQorCWRlZmF1bHQgeQorCitjb25maWcgWDg2X1RSQU1QT0xJTkUKKwlib29sCisJZGVwZW5kcyBvbiBYODZfU01QIHx8IChYODZfVk9ZQUdFUiAmJiBTTVApCisJZGVmYXVsdCB5CisKK2NvbmZpZyBQQworCWJvb2wKKwlkZXBlbmRzIG9uIFg4NiAmJiAhRU1CRURERUQKKwlkZWZhdWx0IHkKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9LY29uZmlnLmRlYnVnIGIvYXJjaC9pMzg2L0tjb25maWcuZGVidWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZiMjA2NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9LY29uZmlnLmRlYnVnCkBAIC0wLDAgKzEsNzIgQEAKK21lbnUgIktlcm5lbCBoYWNraW5nIgorCitzb3VyY2UgImxpYi9LY29uZmlnLmRlYnVnIgorCitjb25maWcgRUFSTFlfUFJJTlRLCisJYm9vbCAiRWFybHkgcHJpbnRrIiBpZiBFTUJFRERFRCAmJiBERUJVR19LRVJORUwKKwlkZWZhdWx0IHkKKwloZWxwCisJICBXcml0ZSBrZXJuZWwgbG9nIG91dHB1dCBkaXJlY3RseSBpbnRvIHRoZSBWR0EgYnVmZmVyIG9yIHRvIGEgc2VyaWFsCisJICBwb3J0LgorCisJICBUaGlzIGlzIHVzZWZ1bCBmb3Iga2VybmVsIGRlYnVnZ2luZyB3aGVuIHlvdXIgbWFjaGluZSBjcmFzaGVzIHZlcnkKKwkgIGVhcmx5IGJlZm9yZSB0aGUgY29uc29sZSBjb2RlIGlzIGluaXRpYWxpemVkLiBGb3Igbm9ybWFsIG9wZXJhdGlvbgorCSAgaXQgaXMgbm90IHJlY29tbWVuZGVkIGJlY2F1c2UgaXQgbG9va3MgdWdseSBhbmQgZG9lc24ndCBjb29wZXJhdGUKKwkgIHdpdGgga2xvZ2Qvc3lzbG9nZCBvciB0aGUgWCBzZXJ2ZXIuIFlvdSBzaG91bGQgbm9ybWFsbHkgTiBoZXJlLAorCSAgdW5sZXNzIHlvdSB3YW50IHRvIGRlYnVnIHN1Y2ggYSBjcmFzaC4KKworY29uZmlnIERFQlVHX1NUQUNLT1ZFUkZMT1cKKwlib29sICJDaGVjayBmb3Igc3RhY2sgb3ZlcmZsb3dzIgorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMCisKK2NvbmZpZyBLUFJPQkVTCisJYm9vbCAiS3Byb2JlcyIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTAorCWhlbHAKKwkgIEtwcm9iZXMgYWxsb3dzIHlvdSB0byB0cmFwIGF0IGFsbW9zdCBhbnkga2VybmVsIGFkZHJlc3MgYW5kCisJICBleGVjdXRlIGEgY2FsbGJhY2sgZnVuY3Rpb24uICByZWdpc3Rlcl9rcHJvYmUoKSBlc3RhYmxpc2hlcworCSAgYSBwcm9iZXBvaW50IGFuZCBzcGVjaWZpZXMgdGhlIGNhbGxiYWNrLiAgS3Byb2JlcyBpcyB1c2VmdWwKKwkgIGZvciBrZXJuZWwgZGVidWdnaW5nLCBub24taW50cnVzaXZlIGluc3RydW1lbnRhdGlvbiBhbmQgdGVzdGluZy4KKwkgIElmIGluIGRvdWJ0LCBzYXkgIk4iLgorCitjb25maWcgREVCVUdfU1RBQ0tfVVNBR0UKKwlib29sICJTdGFjayB1dGlsaXphdGlvbiBpbnN0cnVtZW50YXRpb24iCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKKwloZWxwCisJICBFbmFibGVzIHRoZSBkaXNwbGF5IG9mIHRoZSBtaW5pbXVtIGFtb3VudCBvZiBmcmVlIHN0YWNrIHdoaWNoIGVhY2gKKwkgIHRhc2sgaGFzIGV2ZXIgaGFkIGF2YWlsYWJsZSBpbiB0aGUgc3lzcnEtVCBhbmQgc3lzcnEtUCBkZWJ1ZyBvdXRwdXQuCisKKwkgIFRoaXMgb3B0aW9uIHdpbGwgc2xvdyBkb3duIHByb2Nlc3MgY3JlYXRpb24gc29tZXdoYXQuCisKK2NvbW1lbnQgIlBhZ2UgYWxsb2MgZGVidWcgaXMgaW5jb21wYXRpYmxlIHdpdGggU29mdHdhcmUgU3VzcGVuZCBvbiBpMzg2IgorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMICYmIFNPRlRXQVJFX1NVU1BFTkQKKworY29uZmlnIERFQlVHX1BBR0VBTExPQworCWJvb2wgIlBhZ2UgYWxsb2MgZGVidWdnaW5nIgorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMICYmICFTT0ZUV0FSRV9TVVNQRU5ECisJaGVscAorCSAgVW5tYXAgcGFnZXMgZnJvbSB0aGUga2VybmVsIGxpbmVhciBtYXBwaW5nIGFmdGVyIGZyZWVfcGFnZXMoKS4KKwkgIFRoaXMgcmVzdWx0cyBpbiBhIGxhcmdlIHNsb3dkb3duLCBidXQgaGVscHMgdG8gZmluZCBjZXJ0YWluIHR5cGVzCisJICBvZiBtZW1vcnkgY29ycnVwdGlvbnMuCisKK2NvbmZpZyA0S1NUQUNLUworCWJvb2wgIlVzZSA0S2IgZm9yIGtlcm5lbCBzdGFja3MgaW5zdGVhZCBvZiA4S2IiCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSB0aGUga2VybmVsIHdpbGwgdXNlIGEgNEtiIHN0YWNrc2l6ZSBmb3IgdGhlCisJICBrZXJuZWwgc3RhY2sgYXR0YWNoZWQgdG8gZWFjaCBwcm9jZXNzL3RocmVhZC4gVGhpcyBmYWNpbGl0YXRlcworCSAgcnVubmluZyBtb3JlIHRocmVhZHMgb24gYSBzeXN0ZW0gYW5kIGFsc28gcmVkdWNlcyB0aGUgcHJlc3N1cmUKKwkgIG9uIHRoZSBWTSBzdWJzeXN0ZW0gZm9yIGhpZ2hlciBvcmRlciBhbGxvY2F0aW9ucy4gVGhpcyBvcHRpb24KKwkgIHdpbGwgYWxzbyB1c2UgSVJRIHN0YWNrcyB0byBjb21wZW5zYXRlIGZvciB0aGUgcmVkdWNlZCBzdGFja3NwYWNlLgorCitjb25maWcgWDg2X0ZJTkRfU01QX0NPTkZJRworCWJvb2wKKwlkZXBlbmRzIG9uIFg4Nl9MT0NBTF9BUElDIHx8IFg4Nl9WT1lBR0VSCisJZGVmYXVsdCB5CisKK2NvbmZpZyBYODZfTVBQQVJTRQorCWJvb2wKKwlkZXBlbmRzIG9uIFg4Nl9MT0NBTF9BUElDICYmICFYODZfVklTV1MKKwlkZWZhdWx0IHkKKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L01ha2VmaWxlIGIvYXJjaC9pMzg2L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNGM3MTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvTWFrZWZpbGUKQEAgLTAsMCArMSwxNzMgQEAKKyMKKyMgaTM4Ni9NYWtlZmlsZQorIworIyBUaGlzIGZpbGUgaXMgaW5jbHVkZWQgYnkgdGhlIGdsb2JhbCBtYWtlZmlsZSBzbyB0aGF0IHlvdSBjYW4gYWRkIHlvdXIgb3duCisjIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBmbGFncyBhbmQgZGVwZW5kZW5jaWVzLiBSZW1lbWJlciB0byBkbyBoYXZlIGFjdGlvbnMKKyMgZm9yICJhcmNoY2xlYW4iIGNsZWFuaW5nIHVwIGZvciB0aGlzIGFyY2hpdGVjdHVyZS4KKyMKKyMgVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorIyBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBDb3B5cmlnaHQgKEMpIDE5OTQgYnkgTGludXMgVG9ydmFsZHMKKyMKKyMgMTk5OTA3MTMgIEFydHVyIFNrYXdpbmEgPHNrYXdpbmFAZ2VvY2l0aWVzLmNvbT4KKyMgICAgICAgICAgIEFkZGVkICctbWFyY2gnIGFuZCAnLW1wcmVmZXJyZWQtc3RhY2stYm91bmRhcnknIHN1cHBvcnQKKyMKKyMgICAgICAgICAgIEtpYW51c2NoIFNheWFoIEthcmFkamkgPGtpYW51c2NoQHNrLXRlY2gubmV0PgorIyAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgR0VPREUgQ1BVCisKK0xERkxBR1MJCTo9IC1tIGVsZl9pMzg2CitPQkpDT1BZRkxBR1MJOj0gLU8gYmluYXJ5IC1SIC5ub3RlIC1SIC5jb21tZW50IC1TCitMREZMQUdTX3ZtbGludXggOj0KK0NIRUNLRkxBR1MJKz0gLURfX2kzODZfXworCitDRkxBR1MgKz0gLXBpcGUgLW1zb2Z0LWZsb2F0CisKKyMgcHJldmVudCBnY2MgZnJvbSBrZWVwaW5nIHRoZSBzdGFjayAxNiBieXRlIGFsaWduZWQKK0NGTEFHUyArPSAkKGNhbGwgY2Mtb3B0aW9uLC1tcHJlZmVycmVkLXN0YWNrLWJvdW5kYXJ5PTIpCisKK2FsaWduIDo9ICQoY2Mtb3B0aW9uLWFsaWduKQorY2ZsYWdzLSQoQ09ORklHX00zODYpCQkrPSAtbWFyY2g9aTM4NgorY2ZsYWdzLSQoQ09ORklHX000ODYpCQkrPSAtbWFyY2g9aTQ4NgorY2ZsYWdzLSQoQ09ORklHX001ODYpCQkrPSAtbWFyY2g9aTU4NgorY2ZsYWdzLSQoQ09ORklHX001ODZUU0MpCSs9IC1tYXJjaD1pNTg2CitjZmxhZ3MtJChDT05GSUdfTTU4Nk1NWCkJKz0gJChjYWxsIGNjLW9wdGlvbiwtbWFyY2g9cGVudGl1bS1tbXgsLW1hcmNoPWk1ODYpCitjZmxhZ3MtJChDT05GSUdfTTY4NikJCSs9IC1tYXJjaD1pNjg2CitjZmxhZ3MtJChDT05GSUdfTVBFTlRJVU1JSSkJKz0gLW1hcmNoPWk2ODYgJChjYWxsIGNjLW9wdGlvbiwtbXR1bmU9cGVudGl1bTIpCitjZmxhZ3MtJChDT05GSUdfTVBFTlRJVU1JSUkpCSs9IC1tYXJjaD1pNjg2ICQoY2FsbCBjYy1vcHRpb24sLW10dW5lPXBlbnRpdW0zKQorY2ZsYWdzLSQoQ09ORklHX01QRU5USVVNTSkJKz0gLW1hcmNoPWk2ODYgJChjYWxsIGNjLW9wdGlvbiwtbXR1bmU9cGVudGl1bTMpCitjZmxhZ3MtJChDT05GSUdfTVBFTlRJVU00KQkrPSAtbWFyY2g9aTY4NiAkKGNhbGwgY2Mtb3B0aW9uLC1tdHVuZT1wZW50aXVtNCkKK2NmbGFncy0kKENPTkZJR19NSzYpCQkrPSAtbWFyY2g9azYKKyMgUGxlYXNlIG5vdGUsIHRoYXQgcGF0Y2hlcyB0aGF0IGFkZCAtbWFyY2g9YXRobG9uLXhwIGFuZCBmcmllbmRzIGFyZSBwb2ludGxlc3MuCisjIFRoZXkgbWFrZSB6ZXJvIGRpZmZlcmVuY2Ugd2hhdHNvc2V2ZXIgdG8gcGVyZm9ybWFuY2UgYXQgdGhpcyB0aW1lLgorY2ZsYWdzLSQoQ09ORklHX01LNykJCSs9ICQoY2FsbCBjYy1vcHRpb24sLW1hcmNoPWF0aGxvbiwtbWFyY2g9aTY4NiAkKGFsaWduKS1mdW5jdGlvbnM9NCkKK2NmbGFncy0kKENPTkZJR19NSzgpCQkrPSAkKGNhbGwgY2Mtb3B0aW9uLC1tYXJjaD1rOCwkKGNhbGwgY2Mtb3B0aW9uLC1tYXJjaD1hdGhsb24sLW1hcmNoPWk2ODYgJChhbGlnbiktZnVuY3Rpb25zPTQpKQorY2ZsYWdzLSQoQ09ORklHX01DUlVTT0UpCSs9IC1tYXJjaD1pNjg2ICQoYWxpZ24pLWZ1bmN0aW9ucz0wICQoYWxpZ24pLWp1bXBzPTAgJChhbGlnbiktbG9vcHM9MAorY2ZsYWdzLSQoQ09ORklHX01FRkZJQ0VPTikJKz0gLW1hcmNoPWk2ODYgJChjYWxsIGNjLW9wdGlvbiwtbXR1bmU9cGVudGl1bTMpICQoYWxpZ24pLWZ1bmN0aW9ucz0wICQoYWxpZ24pLWp1bXBzPTAgJChhbGlnbiktbG9vcHM9MAorY2ZsYWdzLSQoQ09ORklHX01XSU5DSElQQzYpCSs9ICQoY2FsbCBjYy1vcHRpb24sLW1hcmNoPXdpbmNoaXAtYzYsLW1hcmNoPWk1ODYpCitjZmxhZ3MtJChDT05GSUdfTVdJTkNISVAyKQkrPSAkKGNhbGwgY2Mtb3B0aW9uLC1tYXJjaD13aW5jaGlwMiwtbWFyY2g9aTU4NikKK2NmbGFncy0kKENPTkZJR19NV0lOQ0hJUDNEKQkrPSAkKGNhbGwgY2Mtb3B0aW9uLC1tYXJjaD13aW5jaGlwMiwtbWFyY2g9aTU4NikKK2NmbGFncy0kKENPTkZJR19NQ1lSSVhJSUkpCSs9ICQoY2FsbCBjYy1vcHRpb24sLW1hcmNoPWMzLC1tYXJjaD1pNDg2KSAkKGFsaWduKS1mdW5jdGlvbnM9MCAkKGFsaWduKS1qdW1wcz0wICQoYWxpZ24pLWxvb3BzPTAKK2NmbGFncy0kKENPTkZJR19NVklBQzNfMikJKz0gJChjYWxsIGNjLW9wdGlvbiwtbWFyY2g9YzMtMiwtbWFyY2g9aTY4NikKKworIyBBTUQgRWxhbiBzdXBwb3J0CitjZmxhZ3MtJChDT05GSUdfWDg2X0VMQU4pCSs9IC1tYXJjaD1pNDg2CisKKyMgTWVkaWFHWCBha2EgR2VvZGUgc3VwcG9ydAorY2ZsYWdzLSQoQ09ORklHX01HRU9ERSkJCSs9ICQoY2FsbCBjYy1vcHRpb24sLW1hcmNoPXBlbnRpdW0tbW14LC1tYXJjaD1pNTg2KQorCisjIC1tcmVncGFybT0zIHdvcmtzIG9rIG9uIGdjYy0zLjAgYW5kIGxhdGVyCisjCitHQ0NfVkVSU0lPTgkJCTo9ICQoY2FsbCBjYy12ZXJzaW9uKQorY2ZsYWdzLSQoQ09ORklHX1JFR1BBUk0pIAkrPSAkKHNoZWxsIGlmIFsgJChHQ0NfVkVSU0lPTikgLWdlIDAzMDAgXSA7IHRoZW4gZWNobyAiLW1yZWdwYXJtPTMiOyBmaSA7KQorCisjIERpc2FibGUgdW5pdC1hdC1hLXRpbWUgbW9kZSwgaXQgbWFrZXMgZ2NjIHVzZSBhIGxvdCBtb3JlIHN0YWNrCisjIGR1ZSB0byB0aGUgbGFjayBvZiBzaGFyaW5nIG9mIHN0YWNrbG90cy4KK0NGTEFHUyArPSAkKGNhbGwgY2Mtb3B0aW9uLC1mbm8tdW5pdC1hdC1hLXRpbWUpCisKK0NGTEFHUyArPSAkKGNmbGFncy15KQorCisjIERlZmF1bHQgc3ViYXJjaCAuYyBmaWxlcworbWNvcmUteSAgOj0gbWFjaC1kZWZhdWx0CisKKyMgVm95YWdlciBzdWJhcmNoIHN1cHBvcnQKK21mbGFncy0kKENPTkZJR19YODZfVk9ZQUdFUikJOj0gLUlpbmNsdWRlL2FzbS1pMzg2L21hY2gtdm95YWdlcgorbWNvcmUtJChDT05GSUdfWDg2X1ZPWUFHRVIpCTo9IG1hY2gtdm95YWdlcgorCisjIFZJU1dTIHN1YmFyY2ggc3VwcG9ydAorbWZsYWdzLSQoQ09ORklHX1g4Nl9WSVNXUykJOj0gLUlpbmNsdWRlL2FzbS1pMzg2L21hY2gtdmlzd3MKK21jb3JlLSQoQ09ORklHX1g4Nl9WSVNXUykJOj0gbWFjaC12aXN3cworCisjIE5VTUFRIHN1YmFyY2ggc3VwcG9ydAorbWZsYWdzLSQoQ09ORklHX1g4Nl9OVU1BUSkJOj0gLUlpbmNsdWRlL2FzbS1pMzg2L21hY2gtbnVtYXEKK21jb3JlLSQoQ09ORklHX1g4Nl9OVU1BUSkJOj0gbWFjaC1kZWZhdWx0CisKKyMgQklHU01QIHN1YmFyY2ggc3VwcG9ydAorbWZsYWdzLSQoQ09ORklHX1g4Nl9CSUdTTVApCTo9IC1JaW5jbHVkZS9hc20taTM4Ni9tYWNoLWJpZ3NtcAorbWNvcmUtJChDT05GSUdfWDg2X0JJR1NNUCkJOj0gbWFjaC1kZWZhdWx0CisKKyNTdW1taXQgc3ViYXJjaCBzdXBwb3J0CittZmxhZ3MtJChDT05GSUdfWDg2X1NVTU1JVCkgOj0gLUlpbmNsdWRlL2FzbS1pMzg2L21hY2gtc3VtbWl0CittY29yZS0kKENPTkZJR19YODZfU1VNTUlUKSAgOj0gbWFjaC1kZWZhdWx0CisKKyMgZ2VuZXJpYyBzdWJhcmNoaXRlY3R1cmUKK21mbGFncy0kKENPTkZJR19YODZfR0VORVJJQ0FSQ0gpIDo9IC1JaW5jbHVkZS9hc20taTM4Ni9tYWNoLWdlbmVyaWMKK21jb3JlLSQoQ09ORklHX1g4Nl9HRU5FUklDQVJDSCkgOj0gbWFjaC1kZWZhdWx0Citjb3JlLSQoQ09ORklHX1g4Nl9HRU5FUklDQVJDSCkgKz0gYXJjaC9pMzg2L21hY2gtZ2VuZXJpYy8KKworIyBFUzcwMDAgc3ViYXJjaCBzdXBwb3J0CittZmxhZ3MtJChDT05GSUdfWDg2X0VTNzAwMCkJOj0gLUlpbmNsdWRlL2FzbS1pMzg2L21hY2gtZXM3MDAwCittY29yZS0kKENPTkZJR19YODZfRVM3MDAwKQk6PSBtYWNoLWRlZmF1bHQKK2NvcmUtJChDT05GSUdfWDg2X0VTNzAwMCkJOj0gYXJjaC9pMzg2L21hY2gtZXM3MDAwLworCisjIGRlZmF1bHQgc3ViYXJjaCAuaCBmaWxlcworbWZsYWdzLXkgKz0gLUlpbmNsdWRlL2FzbS1pMzg2L21hY2gtZGVmYXVsdAorCitoZWFkLXkgOj0gYXJjaC9pMzg2L2tlcm5lbC9oZWFkLm8gYXJjaC9pMzg2L2tlcm5lbC9pbml0X3Rhc2subworCitsaWJzLXkgCQkJCQkrPSBhcmNoL2kzODYvbGliLworY29yZS15CQkJCQkrPSBhcmNoL2kzODYva2VybmVsLyBcCisJCQkJCSAgIGFyY2gvaTM4Ni9tbS8gXAorCQkJCQkgICBhcmNoL2kzODYvJChtY29yZS15KS8gXAorCQkJCQkgICBhcmNoL2kzODYvY3J5cHRvLworZHJpdmVycy0kKENPTkZJR19NQVRIX0VNVUxBVElPTikJKz0gYXJjaC9pMzg2L21hdGgtZW11LworZHJpdmVycy0kKENPTkZJR19QQ0kpCQkJKz0gYXJjaC9pMzg2L3BjaS8KKyMgbXVzdCBiZSBsaW5rZWQgYWZ0ZXIga2VybmVsLworZHJpdmVycy0kKENPTkZJR19PUFJPRklMRSkJCSs9IGFyY2gvaTM4Ni9vcHJvZmlsZS8KK2RyaXZlcnMtJChDT05GSUdfUE0pCQkJKz0gYXJjaC9pMzg2L3Bvd2VyLworCitDRkxBR1MgKz0gJChtZmxhZ3MteSkKK0FGTEFHUyArPSAkKG1mbGFncy15KQorCitib290IDo9IGFyY2gvaTM4Ni9ib290CisKKy5QSE9OWTogekltYWdlIGJ6SW1hZ2UgY29tcHJlc3NlZCB6bGlsbyBiemxpbG8gXAorCXpkaXNrIGJ6ZGlzayBmZGltYWdlIGZkaW1hZ2UxNDQgZmRpbWFnZTI4OCBpbnN0YWxsCisKK2FsbDogYnpJbWFnZQorCisjIEtCVUlMRF9JTUFHRSBzcGVjaWZ5IHRhcmdldCBpbWFnZSBiZWluZyBidWlsdAorICAgICAgICAgICAgICAgICAgICBLQlVJTERfSU1BR0UgOj0gJChib290KS9iekltYWdlCit6SW1hZ2UgemxpbG8gemRpc2s6IEtCVUlMRF9JTUFHRSA6PSBhcmNoL2kzODYvYm9vdC96SW1hZ2UKKworekltYWdlIGJ6SW1hZ2U6IHZtbGludXgKKwkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKGJvb3QpICQoS0JVSUxEX0lNQUdFKQorCitjb21wcmVzc2VkOiB6SW1hZ2UKKworemxpbG8gYnpsaWxvOiB2bWxpbnV4CisJJChRKSQoTUFLRSkgJChidWlsZCk9JChib290KSBCT09USU1BR0U9JChLQlVJTERfSU1BR0UpIHpsaWxvCisKK3pkaXNrIGJ6ZGlzazogdm1saW51eAorCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoYm9vdCkgQk9PVElNQUdFPSQoS0JVSUxEX0lNQUdFKSB6ZGlzaworCitmZGltYWdlIGZkaW1hZ2UxNDQgZmRpbWFnZTI4ODogdm1saW51eAorCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoYm9vdCkgQk9PVElNQUdFPSQoS0JVSUxEX0lNQUdFKSAkQAorCitpbnN0YWxsOgorCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoYm9vdCkgQk9PVElNQUdFPSQoS0JVSUxEX0lNQUdFKSAkQAorCitwcmVwYXJlOiBpbmNsdWRlL2FzbS0kKEFSQ0gpL2FzbV9vZmZzZXRzLmgKK0NMRUFOX0ZJTEVTICs9IGluY2x1ZGUvYXNtLSQoQVJDSCkvYXNtX29mZnNldHMuaAorCithcmNoLyQoQVJDSCkva2VybmVsL2FzbS1vZmZzZXRzLnM6IGluY2x1ZGUvYXNtIGluY2x1ZGUvbGludXgvdmVyc2lvbi5oIFwKKwkJCQkgICBpbmNsdWRlL2NvbmZpZy9NQVJLRVIKKworaW5jbHVkZS9hc20tJChBUkNIKS9hc21fb2Zmc2V0cy5oOiBhcmNoLyQoQVJDSCkva2VybmVsL2FzbS1vZmZzZXRzLnMKKwkkKGNhbGwgZmlsZWNoayxnZW4tYXNtLW9mZnNldHMpCisKK2FyY2hjbGVhbjoKKwkkKFEpJChNQUtFKSAkKGNsZWFuKT1hcmNoL2kzODYvYm9vdAorCitkZWZpbmUgYXJjaGhlbHAKKyAgZWNobyAgJyogYnpJbWFnZQktIENvbXByZXNzZWQga2VybmVsIGltYWdlIChhcmNoLyQoQVJDSCkvYm9vdC9iekltYWdlKScKKyAgZWNobyAgJyAgaW5zdGFsbAktIEluc3RhbGwga2VybmVsIHVzaW5nJworICBlY2hvICAnCQkgICAoeW91cikgfi9iaW4vaW5zdGFsbGtlcm5lbCBvcicKKyAgZWNobyAgJwkJICAgKGRpc3RyaWJ1dGlvbikgL3NiaW4vaW5zdGFsbGtlcm5lbCBvcicKKyAgZWNobyAgJwkJICAgaW5zdGFsbCB0byAkJChJTlNUQUxMX1BBVEgpIGFuZCBydW4gbGlsbycKKyAgZWNobyAgJyAgYnpkaXNrICAgICAgIC0gQ3JlYXRlIGEgYm9vdCBmbG9wcHkgaW4gL2Rldi9mZDAnCisgIGVjaG8gICcgIGZkaW1hZ2UgICAgICAtIENyZWF0ZSBhIGJvb3QgZmxvcHB5IGltYWdlJworZW5kZWYKKworQ0xFQU5fRklMRVMgKz0gYXJjaC8kKEFSQ0gpL2Jvb3QvZmRpbWFnZSBhcmNoLyQoQVJDSCkvYm9vdC9tdG9vbHMuY29uZgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2Jvb3QvTWFrZWZpbGUgYi9hcmNoL2kzODYvYm9vdC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTcwNjRhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2Jvb3QvTWFrZWZpbGUKQEAgLTAsMCArMSwxMDQgQEAKKyMKKyMgYXJjaC9pMzg2L2Jvb3QvTWFrZWZpbGUKKyMKKyMgVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorIyBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBDb3B5cmlnaHQgKEMpIDE5OTQgYnkgTGludXMgVG9ydmFsZHMKKyMKKworIyBST09UX0RFViBzcGVjaWZpZXMgdGhlIGRlZmF1bHQgcm9vdC1kZXZpY2Ugd2hlbiBtYWtpbmcgdGhlIGltYWdlLgorIyBUaGlzIGNhbiBiZSBlaXRoZXIgRkxPUFBZLCBDVVJSRU5ULCAvZGV2L3h4eHggb3IgZW1wdHksIGluIHdoaWNoIGNhc2UKKyMgdGhlIGRlZmF1bHQgb2YgRkxPUFBZIGlzIHVzZWQgYnkgJ2J1aWxkJy4KKworUk9PVF9ERVYgOj0gQ1VSUkVOVAorCisjIElmIHlvdSB3YW50IHRvIHByZXNldCB0aGUgU1ZHQSBtb2RlLCB1bmNvbW1lbnQgdGhlIG5leHQgbGluZSBhbmQKKyMgc2V0IFNWR0FfTU9ERSB0byB3aGF0ZXZlciBudW1iZXIgeW91IHdhbnQuCisjIFNldCBpdCB0byAtRFNWR0FfTU9ERT1OT1JNQUxfVkdBIGlmIHlvdSBqdXN0IHdhbnQgdGhlIEVHQS9WR0EgbW9kZS4KKyMgVGhlIG51bWJlciBpcyB0aGUgc2FtZSBhcyB5b3Ugd291bGQgb3JkaW5hcmlseSBwcmVzcyBhdCBib290dXAuCisKK1NWR0FfTU9ERSA6PSAtRFNWR0FfTU9ERT1OT1JNQUxfVkdBCisKKyMgSWYgeW91IHdhbnQgdGhlIFJBTSBkaXNrIGRldmljZSwgZGVmaW5lIHRoaXMgdG8gYmUgdGhlIHNpemUgaW4gYmxvY2tzLgorCisjUkFNRElTSyA6PSAtRFJBTURJU0s9NTEyCisKK3RhcmdldHMJCTo9IHZtbGludXguYmluIGJvb3RzZWN0IGJvb3RzZWN0Lm8gc2V0dXAgc2V0dXAubyBcCisJCSAgIHpJbWFnZSBiekltYWdlCitzdWJkaXItIAk6PSBjb21wcmVzc2VkCisKK2hvc3Rwcm9ncy15CTo9IHRvb2xzL2J1aWxkCisKK0hPU1RDRkxBR1NfYnVpbGQubyA6PSAkKExJTlVYSU5DTFVERSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworJChvYmopL3pJbWFnZTogIElNQUdFX09GRlNFVCA6PSAweDEwMDAKKyQob2JqKS96SW1hZ2U6ICBFWFRSQV9BRkxBR1MgOj0gLXRyYWRpdGlvbmFsICQoU1ZHQV9NT0RFKSAkKFJBTURJU0spCiskKG9iaikvYnpJbWFnZTogSU1BR0VfT0ZGU0VUIDo9IDB4MTAwMDAwCiskKG9iaikvYnpJbWFnZTogRVhUUkFfQUZMQUdTIDo9IC10cmFkaXRpb25hbCAkKFNWR0FfTU9ERSkgJChSQU1ESVNLKSAtRF9fQklHX0tFUk5FTF9fCiskKG9iaikvYnpJbWFnZTogQlVJTERGTEFHUyAgIDo9IC1iCisKK3F1aWV0X2NtZF9pbWFnZSA9IEJVSUxEICAgJEAKK2NtZF9pbWFnZSA9ICQob2JqKS90b29scy9idWlsZCAkKEJVSUxERkxBR1MpICQob2JqKS9ib290c2VjdCAkKG9iaikvc2V0dXAgXAorCSAgICAkKG9iaikvdm1saW51eC5iaW4gJChST09UX0RFVikgPiAkQAorCiskKG9iaikvekltYWdlICQob2JqKS9iekltYWdlOiAkKG9iaikvYm9vdHNlY3QgJChvYmopL3NldHVwIFwKKwkJCSAgICAgICQob2JqKS92bWxpbnV4LmJpbiAkKG9iaikvdG9vbHMvYnVpbGQgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxpbWFnZSkKKwlAZWNobyAnS2VybmVsOiAkQCBpcyByZWFkeScKKworJChvYmopL3ZtbGludXguYmluOiAkKG9iaikvY29tcHJlc3NlZC92bWxpbnV4IEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsb2JqY29weSkKKworTERGTEFHU19ib290c2VjdCA6PSAtVHRleHQgMHgwIC1zIC0tb2Zvcm1hdCBiaW5hcnkKK0xERkxBR1Nfc2V0dXAJIDo9IC1UdGV4dCAweDAgLXMgLS1vZm9ybWF0IGJpbmFyeSAtZSBiZWd0ZXh0CisKKyQob2JqKS9zZXR1cCAkKG9iaikvYm9vdHNlY3Q6ICU6ICUubyBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGxkKQorCiskKG9iaikvY29tcHJlc3NlZC92bWxpbnV4OiBGT1JDRQorCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQob2JqKS9jb21wcmVzc2VkIElNQUdFX09GRlNFVD0kKElNQUdFX09GRlNFVCkgJEAKKworIyBTZXQgdGhpcyBpZiB5b3Ugd2FudCB0byBwYXNzIGFwcGVuZCBhcmd1bWVudHMgdG8gdGhlIHpkaXNrL2ZkaW1hZ2Uga2VybmVsCitGREFSR1MgPSAKKworJChvYmopL210b29scy5jb25mOiAkKHNyYykvbXRvb2xzLmNvbmYuaW4KKwlzZWQgLWUgJ3N8QE9CSkB8JChvYmopfGcnIDwgJDwgPiAkQAorCisjIFRoaXMgcmVxdWlyZXMgd3JpdGUgYWNjZXNzIHRvIC9kZXYvZmQwCit6ZGlzazogJChCT09USU1BR0UpICQob2JqKS9tdG9vbHMuY29uZgorCU1UT09MU1JDPSQob2JqKS9tdG9vbHMuY29uZiBtZm9ybWF0IGE6CQkJOyBzeW5jCisJc3lzbGludXggL2Rldi9mZDAJCQkJCTsgc3luYworCWVjaG8gJ2RlZmF1bHQgbGludXggJChGREFSR1MpJyB8IFwKKwkJTVRPT0xTUkM9JChzcmMpL210b29scy5jb25mIG1jb3B5IC0gYTpzeXNsaW51eC5jZmcKKwlNVE9PTFNSQz0kKG9iaikvbXRvb2xzLmNvbmYgbWNvcHkgJChCT09USU1BR0UpIGE6bGludXgJOyBzeW5jCisKKyMgVGhlc2UgcmVxdWlyZSBiZWluZyByb290IG9yIGhhdmluZyBzeXNsaW51eCAyLjAyIG9yIGhpZ2hlciBpbnN0YWxsZWQKK2ZkaW1hZ2UgZmRpbWFnZTE0NDogJChCT09USU1BR0UpICQob2JqKS9tdG9vbHMuY29uZgorCWRkIGlmPS9kZXYvemVybyBvZj0kKG9iaikvZmRpbWFnZSBicz0xMDI0IGNvdW50PTE0NDAKKwlNVE9PTFNSQz0kKG9iaikvbXRvb2xzLmNvbmYgbWZvcm1hdCB2OgkJCTsgc3luYworCXN5c2xpbnV4ICQob2JqKS9mZGltYWdlCQkJCQk7IHN5bmMKKwllY2hvICdkZWZhdWx0IGxpbnV4ICQoRkRBUkdTKScgfCBcCisJCU1UT09MU1JDPSQob2JqKS9tdG9vbHMuY29uZiBtY29weSAtIHY6c3lzbGludXguY2ZnCisJTVRPT0xTUkM9JChvYmopL210b29scy5jb25mIG1jb3B5ICQoQk9PVElNQUdFKSB2OmxpbnV4CTsgc3luYworCitmZGltYWdlMjg4OiAkKEJPT1RJTUFHRSkgJChvYmopL210b29scy5jb25mCisJZGQgaWY9L2Rldi96ZXJvIG9mPSQob2JqKS9mZGltYWdlIGJzPTEwMjQgY291bnQ9Mjg4MAorCU1UT09MU1JDPSQob2JqKS9tdG9vbHMuY29uZiBtZm9ybWF0IHc6CQkJOyBzeW5jCisJc3lzbGludXggJChvYmopL2ZkaW1hZ2UJCQkJCTsgc3luYworCWVjaG8gJ2RlZmF1bHQgbGludXggJChGREFSR1MpJyB8IFwKKwkJTVRPT0xTUkM9JChvYmopL210b29scy5jb25mIG1jb3B5IC0gdzpzeXNsaW51eC5jZmcKKwlNVE9PTFNSQz0kKG9iaikvbXRvb2xzLmNvbmYgbWNvcHkgJChCT09USU1BR0UpIHc6bGludXgJOyBzeW5jCisKK3psaWxvOiAkKEJPT1RJTUFHRSkKKwlpZiBbIC1mICQoSU5TVEFMTF9QQVRIKS92bWxpbnV6IF07IHRoZW4gbXYgJChJTlNUQUxMX1BBVEgpL3ZtbGludXogJChJTlNUQUxMX1BBVEgpL3ZtbGludXoub2xkOyBmaQorCWlmIFsgLWYgJChJTlNUQUxMX1BBVEgpL1N5c3RlbS5tYXAgXTsgdGhlbiBtdiAkKElOU1RBTExfUEFUSCkvU3lzdGVtLm1hcCAkKElOU1RBTExfUEFUSCkvU3lzdGVtLm9sZDsgZmkKKwljYXQgJChCT09USU1BR0UpID4gJChJTlNUQUxMX1BBVEgpL3ZtbGludXoKKwljcCBTeXN0ZW0ubWFwICQoSU5TVEFMTF9QQVRIKS8KKwlpZiBbIC14IC9zYmluL2xpbG8gXTsgdGhlbiAvc2Jpbi9saWxvOyBlbHNlIC9ldGMvbGlsby9pbnN0YWxsOyBmaQorCitpbnN0YWxsOiAkKEJPT1RJTUFHRSkKKwlzaCAkKHNyY3RyZWUpLyQoc3JjKS9pbnN0YWxsLnNoICQoS0VSTkVMUkVMRUFTRSkgJDwgU3lzdGVtLm1hcCAiJChJTlNUQUxMX1BBVEgpIgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2Jvb3QvYm9vdHNlY3QuUyBiL2FyY2gvaTM4Ni9ib290L2Jvb3RzZWN0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE5ZmUxNGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvYm9vdC9ib290c2VjdC5TCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKglib290c2VjdC5TCQlDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgTGludXMgVG9ydmFsZHMKKyAqCisgKgltb2RpZmllZCBieSBEcmV3IEVja2hhcmR0CisgKgltb2RpZmllZCBieSBCcnVjZSBFdmFucyAoYmRlKQorICoJbW9kaWZpZWQgYnkgQ2hyaXMgTm9lIChNYXkgMTk5OSkgKGFzODYgLT4gZ2FzKQorICoJZ3V0dGVkIGJ5IEguIFBldGVyIEFudmluIChKYW4gMjAwMykKKyAqCisgKiBCSUcgRkFUIE5PVEU6IFdlJ3JlIGluIHJlYWwgbW9kZSB1c2luZyA2NGsgc2VnbWVudHMuICBUaGVyZWZvcmUgc2VnbWVudAorICogYWRkcmVzc2VzIG11c3QgYmUgbXVsdGlwbGllZCBieSAxNiB0byBvYnRhaW4gdGhlaXIgcmVzcGVjdGl2ZSBsaW5lYXIKKyAqIGFkZHJlc3Nlcy4gVG8gYXZvaWQgY29uZnVzaW9uLCBsaW5lYXIgYWRkcmVzc2VzIGFyZSB3cml0dGVuIHVzaW5nIGxlYWRpbmcKKyAqIGhleCB3aGlsZSBzZWdtZW50IGFkZHJlc3NlcyBhcmUgd3JpdHRlbiBhcyBzZWdtZW50Om9mZnNldC4KKyAqCisgKi8KKworI2luY2x1ZGUgPGFzbS9ib290Lmg+CisKK1NFVFVQU0VDVFMJPSA0CQkJLyogZGVmYXVsdCBuciBvZiBzZXR1cC1zZWN0b3JzICovCitCT09UU0VHCQk9IDB4MDdDMAkJLyogb3JpZ2luYWwgYWRkcmVzcyBvZiBib290LXNlY3RvciAqLworSU5JVFNFRwkJPSBERUZfSU5JVFNFRwkJLyogd2UgbW92ZSBib290IGhlcmUgLSBvdXQgb2YgdGhlIHdheSAqLworU0VUVVBTRUcJPSBERUZfU0VUVVBTRUcJCS8qIHNldHVwIHN0YXJ0cyBoZXJlICovCitTWVNTRUcJCT0gREVGX1NZU1NFRwkJLyogc3lzdGVtIGxvYWRlZCBhdCAweDEwMDAwICg2NTUzNikgKi8KK1NZU1NJWkUJCT0gREVGX1NZU1NJWkUJCS8qIHN5c3RlbSBzaXplOiAjIG9mIDE2LWJ5dGUgY2xpY2tzICovCisJCQkJCS8qIHRvIGJlIGxvYWRlZCAqLworUk9PVF9ERVYJPSAwIAkJCS8qIFJPT1RfREVWIGlzIG5vdyB3cml0dGVuIGJ5ICJidWlsZCIgKi8KK1NXQVBfREVWCT0gMAkJCS8qIFNXQVBfREVWIGlzIG5vdyB3cml0dGVuIGJ5ICJidWlsZCIgKi8KKworI2lmbmRlZiBTVkdBX01PREUKKyNkZWZpbmUgU1ZHQV9NT0RFIEFTS19WR0EKKyNlbmRpZgorCisjaWZuZGVmIFJBTURJU0sKKyNkZWZpbmUgUkFNRElTSyAwCisjZW5kaWYKKworI2lmbmRlZiBST09UX1JET05MWQorI2RlZmluZSBST09UX1JET05MWSAxCisjZW5kaWYKKworLmNvZGUxNgorLnRleHQKKworLmdsb2JhbCBfc3RhcnQKK19zdGFydDoKKworCSMgTm9ybWFsaXplIHRoZSBzdGFydCBhZGRyZXNzCisJam1wbAkkQk9PVFNFRywgJHN0YXJ0MgorCitzdGFydDI6CisJbW92dwklY3MsICVheAorCW1vdncJJWF4LCAlZHMKKwltb3Z3CSVheCwgJWVzCisJbW92dwklYXgsICVzcworCW1vdncJJDB4N2MwMCwgJXNwCisJc3RpCisJY2xkCisKKwltb3Z3CSRidWdnZXJfb2ZmX21zZywgJXNpCisKK21zZ19sb29wOgorCWxvZHNiCisJYW5kYgklYWwsICVhbAorCWp6CWRpZQorCW1vdmIJJDB4ZSwgJWFoCisJbW92dwkkNywgJWJ4CisJaW50CSQweDEwCisJam1wCW1zZ19sb29wCisKK2RpZToKKwkjIEFsbG93IHRoZSB1c2VyIHRvIHByZXNzIGEga2V5LCB0aGVuIHJlYm9vdAorCXhvcncJJWF4LCAlYXgKKwlpbnQJJDB4MTYKKwlpbnQJJDB4MTkKKworCSMgaW50IDB4MTkgc2hvdWxkIG5ldmVyIHJldHVybi4gIEluIGNhc2UgaXQgZG9lcyBhbnl3YXksCisJIyBpbnZva2UgdGhlIEJJT1MgcmVzZXQgY29kZS4uLgorCWxqbXAJJDB4ZjAwMCwkMHhmZmYwCisKKworYnVnZ2VyX29mZl9tc2c6CisJLmFzY2lpCSJEaXJlY3QgYm9vdGluZyBmcm9tIGZsb3BweSBpcyBubyBsb25nZXIgc3VwcG9ydGVkLlxyXG4iCisJLmFzY2lpCSJQbGVhc2UgdXNlIGEgYm9vdCBsb2FkZXIgcHJvZ3JhbSBpbnN0ZWFkLlxyXG4iCisJLmFzY2lpCSJcbiIKKwkuYXNjaWkJIlJlbW92ZSBkaXNrIGFuZCBwcmVzcyBhbnkga2V5IHRvIHJlYm9vdCAuIC4gLlxyXG4iCisJLmJ5dGUJMAorCQorCisJIyBLZXJuZWwgYXR0cmlidXRlczsgdXNlZCBieSBzZXR1cAorCisJLm9yZyA0OTcKK3NldHVwX3NlY3RzOgkuYnl0ZSBTRVRVUFNFQ1RTCityb290X2ZsYWdzOgkud29yZCBST09UX1JET05MWQorc3lzc2l6ZToJLndvcmQgU1lTU0laRQorc3dhcF9kZXY6CS53b3JkIFNXQVBfREVWCityYW1fc2l6ZToJLndvcmQgUkFNRElTSwordmlkX21vZGU6CS53b3JkIFNWR0FfTU9ERQorcm9vdF9kZXY6CS53b3JkIFJPT1RfREVWCitib290X2ZsYWc6CS53b3JkIDB4QUE1NQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZSBiL2FyY2gvaTM4Ni9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU4ZWE5NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKQEAgLTAsMCArMSwyNSBAQAorIworIyBsaW51eC9hcmNoL2kzODYvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCisjCisjIGNyZWF0ZSBhIGNvbXByZXNzZWQgdm1saW51eCBpbWFnZSBmcm9tIHRoZSBvcmlnaW5hbCB2bWxpbnV4CisjCisKK3RhcmdldHMJCTo9IHZtbGludXggdm1saW51eC5iaW4gdm1saW51eC5iaW4uZ3ogaGVhZC5vIG1pc2MubyBwaWdneS5vCitFWFRSQV9BRkxBR1MJOj0gLXRyYWRpdGlvbmFsCisKK0xERkxBR1Nfdm1saW51eCA6PSAtVHRleHQgJChJTUFHRV9PRkZTRVQpIC1lIHN0YXJ0dXBfMzIKKworJChvYmopL3ZtbGludXg6ICQob2JqKS9oZWFkLm8gJChvYmopL21pc2MubyAkKG9iaikvcGlnZ3kubyBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGxkKQorCUA6CisKKyQob2JqKS92bWxpbnV4LmJpbjogdm1saW51eCBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLG9iamNvcHkpCisKKyQob2JqKS92bWxpbnV4LmJpbi5nejogJChvYmopL3ZtbGludXguYmluIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsZ3ppcCkKKworTERGTEFHU19waWdneS5vIDo9IC1yIC0tZm9ybWF0IGJpbmFyeSAtLW9mb3JtYXQgZWxmMzItaTM4NiAtVAorCiskKG9iaikvcGlnZ3kubzogJChvYmopL3ZtbGludXguc2NyICQob2JqKS92bWxpbnV4LmJpbi5neiBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGxkKQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMgYi9hcmNoL2kzODYvYm9vdC9jb21wcmVzc2VkL2hlYWQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWU4MGI2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiAgbGludXgvYm9vdC9oZWFkLlMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzICBMaW51cyBUb3J2YWxkcworICovCisKKy8qCisgKiAgaGVhZC5TIGNvbnRhaW5zIHRoZSAzMi1iaXQgc3RhcnR1cCBjb2RlLgorICoKKyAqIE5PVEUhISEgU3RhcnR1cCBoYXBwZW5zIGF0IGFic29sdXRlIGFkZHJlc3MgMHgwMDAwMTAwMCwgd2hpY2ggaXMgYWxzbyB3aGVyZQorICogdGhlIHBhZ2UgZGlyZWN0b3J5IHdpbGwgZXhpc3QuIFRoZSBzdGFydHVwIGNvZGUgd2lsbCBiZSBvdmVyd3JpdHRlbiBieQorICogdGhlIHBhZ2UgZGlyZWN0b3J5LiBbQWNjb3JkaW5nIHRvIGNvbW1lbnRzIGV0YyBlbHNld2hlcmUgb24gYSBjb21wcmVzc2VkCisgKiBrZXJuZWwgaXQgd2lsbCBlbmQgdXAgYXQgMHgxMDAwICsgMU1iIEkgaG9wZSBzbyBhcyBJIGFzc3VtZSB0aGlzLiAtIEFDXQorICoKKyAqIFBhZ2UgMCBpcyBkZWxpYmVyYXRlbHkga2VwdCBzYWZlLCBzaW5jZSBTeXN0ZW0gTWFuYWdlbWVudCBNb2RlIGNvZGUgaW4gCisgKiBsYXB0b3BzIG1heSBuZWVkIHRvIGFjY2VzcyB0aGUgQklPUyBkYXRhIHN0b3JlZCB0aGVyZS4gIFRoaXMgaXMgYWxzbworICogdXNlZnVsIGZvciBmdXR1cmUgZGV2aWNlIGRyaXZlcnMgdGhhdCBlaXRoZXIgYWNjZXNzIHRoZSBCSU9TIHZpYSBWTTg2IAorICogbW9kZS4KKyAqLworCisvKgorICogSGlnaCBsb2FkZWQgc3R1ZmYgYnkgSGFucyBMZXJtZW4gJiBXZXJuZXIgQWxtZXNiZXJnZXIsIEZlYi4gMTk5NgorICovCisudGV4dAorCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CisKKwkuZ2xvYmwgc3RhcnR1cF8zMgorCQorc3RhcnR1cF8zMjoKKwljbGQKKwljbGkKKwltb3ZsICQoX19CT09UX0RTKSwlZWF4CisJbW92bCAlZWF4LCVkcworCW1vdmwgJWVheCwlZXMKKwltb3ZsICVlYXgsJWZzCisJbW92bCAlZWF4LCVncworCisJbHNzIHN0YWNrX3N0YXJ0LCVlc3AKKwl4b3JsICVlYXgsJWVheAorMToJaW5jbCAlZWF4CQkjIGNoZWNrIHRoYXQgQTIwIHJlYWxseSBJUyBlbmFibGVkCisJbW92bCAlZWF4LDB4MDAwMDAwCSMgbG9vcCBmb3JldmVyIGlmIGl0IGlzbid0CisJY21wbCAlZWF4LDB4MTAwMDAwCisJamUgMWIKKworLyoKKyAqIEluaXRpYWxpemUgZWZsYWdzLiAgU29tZSBCSU9TJ3MgbGVhdmUgYml0cyBsaWtlIE5UIHNldC4gIFRoaXMgd291bGQKKyAqIGNvbmZ1c2UgdGhlIGRlYnVnZ2VyIGlmIHRoaXMgY29kZSBpcyB0cmFjZWQuCisgKiBYWFggLSBiZXN0IHRvIGluaXRpYWxpemUgYmVmb3JlIHN3aXRjaGluZyB0byBwcm90ZWN0ZWQgbW9kZS4KKyAqLworCXB1c2hsICQwCisJcG9wZmwKKy8qCisgKiBDbGVhciBCU1MKKyAqLworCXhvcmwgJWVheCwlZWF4CisJbW92bCAkX2VkYXRhLCVlZGkKKwltb3ZsICRfZW5kLCVlY3gKKwlzdWJsICVlZGksJWVjeAorCWNsZAorCXJlcAorCXN0b3NiCisvKgorICogRG8gdGhlIGRlY29tcHJlc3Npb24sIGFuZCBqdW1wIHRvIHRoZSBuZXcga2VybmVsLi4KKyAqLworCXN1YmwgJDE2LCVlc3AJIyBwbGFjZSBmb3Igc3RydWN0dXJlIG9uIHRoZSBzdGFjaworCW1vdmwgJWVzcCwlZWF4CisJcHVzaGwgJWVzaQkjIHJlYWwgbW9kZSBwb2ludGVyIGFzIHNlY29uZCBhcmcKKwlwdXNobCAlZWF4CSMgYWRkcmVzcyBvZiBzdHJ1Y3R1cmUgYXMgZmlyc3QgYXJnCisJY2FsbCBkZWNvbXByZXNzX2tlcm5lbAorCW9ybCAgJWVheCwlZWF4IAorCWpueiAgM2YKKwlwb3BsICVlc2kJIyBkaXNjYXJkIGFkZHJlc3MKKwlwb3BsICVlc2kJIyByZWFsIG1vZGUgcG9pbnRlcgorCXhvcmwgJWVieCwlZWJ4CisJbGptcCAkKF9fQk9PVF9DUyksICQweDEwMDAwMAorCisvKgorICogV2UgY29tZSBoZXJlLCBpZiB3ZSB3ZXJlIGxvYWRlZCBoaWdoLgorICogV2UgbmVlZCB0byBtb3ZlIHRoZSBtb3ZlLWluLXBsYWNlIHJvdXRpbmUgZG93biB0byAweDEwMDAKKyAqIGFuZCB0aGVuIHN0YXJ0IGl0IHdpdGggdGhlIGJ1ZmZlciBhZGRyZXNzZXMgaW4gcmVnaXN0ZXJzLAorICogd2hpY2ggd2UgZ290IGZyb20gdGhlIHN0YWNrLgorICovCiszOgorCW1vdmwgJG1vdmVfcm91dGluZV9zdGFydCwlZXNpCisJbW92bCAkMHgxMDAwLCVlZGkKKwltb3ZsICRtb3ZlX3JvdXRpbmVfZW5kLCVlY3gKKwlzdWJsICVlc2ksJWVjeAorCWFkZGwgJDMsJWVjeAorCXNocmwgJDIsJWVjeAorCWNsZAorCXJlcAorCW1vdnNsCisKKwlwb3BsICVlc2kJIyBkaXNjYXJkIHRoZSBhZGRyZXNzCisJcG9wbCAlZWJ4CSMgcmVhbCBtb2RlIHBvaW50ZXIKKwlwb3BsICVlc2kJIyBsb3dfYnVmZmVyX3N0YXJ0CisJcG9wbCAlZWN4CSMgbGNvdW50CisJcG9wbCAlZWR4CSMgaGlnaF9idWZmZXJfc3RhcnQKKwlwb3BsICVlYXgJIyBoY291bnQKKwltb3ZsICQweDEwMDAwMCwlZWRpCisJY2xpCQkjIG1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgaW50ZXJydXB0ZWQKKwlsam1wICQoX19CT09UX0NTKSwgJDB4MTAwMCAjIGFuZCBqdW1wIHRvIHRoZSBtb3ZlIHJvdXRpbmUKKworLyoKKyAqIFJvdXRpbmUgKHRlbXBsYXRlKSBmb3IgbW92aW5nIHRoZSBkZWNvbXByZXNzZWQga2VybmVsIGluIHBsYWNlLAorICogaWYgd2Ugd2VyZSBoaWdoIGxvYWRlZC4gVGhpcyBfbXVzdF8gUElDLWNvZGUgIQorICovCittb3ZlX3JvdXRpbmVfc3RhcnQ6CisJbW92bCAlZWN4LCVlYnAKKwlzaHJsICQyLCVlY3gKKwlyZXAKKwltb3ZzbAorCW1vdmwgJWVicCwlZWN4CisJYW5kbCAkMywlZWN4CisJcmVwCisJbW92c2IKKwltb3ZsICVlZHgsJWVzaQorCW1vdmwgJWVheCwlZWN4CSMgTk9URTogcmVwIG1vdnNiIHdvbid0IG1vdmUgaWYgJWVjeCA9PSAwCisJYWRkbCAkMywlZWN4CisJc2hybCAkMiwlZWN4CisJcmVwCisJbW92c2wKKwltb3ZsICVlYngsJWVzaQkjIFJlc3RvcmUgc2V0dXAgcG9pbnRlcgorCXhvcmwgJWVieCwlZWJ4CisJbGptcCAkKF9fQk9PVF9DUyksICQweDEwMDAwMAorbW92ZV9yb3V0aW5lX2VuZDoKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9ib290L2NvbXByZXNzZWQvbWlzYy5jIGIvYXJjaC9pMzg2L2Jvb3QvY29tcHJlc3NlZC9taXNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE2NzA0NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9ib290L2NvbXByZXNzZWQvbWlzYy5jCkBAIC0wLDAgKzEsMzgyIEBACisvKgorICogbWlzYy5jCisgKiAKKyAqIFRoaXMgaXMgYSBjb2xsZWN0aW9uIG9mIHNldmVyYWwgcm91dGluZXMgZnJvbSBnemlwLTEuMC4zIAorICogYWRhcHRlZCBmb3IgTGludXguCisgKgorICogbWFsbG9jIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5MyBhbmQgTWF0dGhpYXMgVXJsaWNocyAxOTk0CisgKiBwdXRzIGJ5IE5pY2sgSG9sbG93YXkgMTk5MywgYmV0dGVyIHB1dHMgYnkgTWFydGluIE1hcmVzIDE5OTUKKyAqIEhpZ2ggbG9hZGVkIHN0dWZmIGJ5IEhhbnMgTGVybWVuICYgV2VybmVyIEFsbWVzYmVyZ2VyLCBGZWIuIDE5OTYKKyAqLworCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDx2aWRlby9lZGlkLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKy8qCisgKiBnemlwIGRlY2xhcmF0aW9ucworICovCisKKyNkZWZpbmUgT0YoYXJncykgIGFyZ3MKKyNkZWZpbmUgU1RBVElDIHN0YXRpYworCisjdW5kZWYgbWVtc2V0CisjdW5kZWYgbWVtY3B5CisKKy8qCisgKiBXaHkgZG8gd2UgZG8gdGhpcz8gRG9uJ3QgYXNrIG1lLi4KKyAqCisgKiBJbmNvbXByZWhlbnNpYmxlIGFyZSB0aGUgd2F5cyBvZiBib290bG9hZGVycy4KKyAqLworc3RhdGljIHZvaWQqIG1lbXNldCh2b2lkICosIGludCwgc2l6ZV90KTsKK3N0YXRpYyB2b2lkKiBtZW1jcHkodm9pZCAqLCBfX2NvbnN0IHZvaWQgKiwgc2l6ZV90KTsKKyNkZWZpbmUgbWVtemVybyhzLCBuKSAgICAgbWVtc2V0ICgocyksIDAsIChuKSkKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICB1Y2g7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVzaDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgdWxnOworCisjZGVmaW5lIFdTSVpFIDB4ODAwMAkJLyogV2luZG93IHNpemUgbXVzdCBiZSBhdCBsZWFzdCAzMmssICovCisJCQkJLyogYW5kIGEgcG93ZXIgb2YgdHdvICovCisKK3N0YXRpYyB1Y2ggKmluYnVmOwkgICAgIC8qIGlucHV0IGJ1ZmZlciAqLworc3RhdGljIHVjaCB3aW5kb3dbV1NJWkVdOyAgICAvKiBTbGlkaW5nIHdpbmRvdyBidWZmZXIgKi8KKworc3RhdGljIHVuc2lnbmVkIGluc2l6ZSA9IDA7ICAvKiB2YWxpZCBieXRlcyBpbiBpbmJ1ZiAqLworc3RhdGljIHVuc2lnbmVkIGlucHRyID0gMDsgICAvKiBpbmRleCBvZiBuZXh0IGJ5dGUgdG8gYmUgcHJvY2Vzc2VkIGluIGluYnVmICovCitzdGF0aWMgdW5zaWduZWQgb3V0Y250ID0gMDsgIC8qIGJ5dGVzIGluIG91dHB1dCBidWZmZXIgKi8KKworLyogZ3ppcCBmbGFnIGJ5dGUgKi8KKyNkZWZpbmUgQVNDSUlfRkxBRyAgIDB4MDEgLyogYml0IDAgc2V0OiBmaWxlIHByb2JhYmx5IEFTQ0lJIHRleHQgKi8KKyNkZWZpbmUgQ09OVElOVUFUSU9OIDB4MDIgLyogYml0IDEgc2V0OiBjb250aW51YXRpb24gb2YgbXVsdGktcGFydCBnemlwIGZpbGUgKi8KKyNkZWZpbmUgRVhUUkFfRklFTEQgIDB4MDQgLyogYml0IDIgc2V0OiBleHRyYSBmaWVsZCBwcmVzZW50ICovCisjZGVmaW5lIE9SSUdfTkFNRSAgICAweDA4IC8qIGJpdCAzIHNldDogb3JpZ2luYWwgZmlsZSBuYW1lIHByZXNlbnQgKi8KKyNkZWZpbmUgQ09NTUVOVCAgICAgIDB4MTAgLyogYml0IDQgc2V0OiBmaWxlIGNvbW1lbnQgcHJlc2VudCAqLworI2RlZmluZSBFTkNSWVBURUQgICAgMHgyMCAvKiBiaXQgNSBzZXQ6IGZpbGUgaXMgZW5jcnlwdGVkICovCisjZGVmaW5lIFJFU0VSVkVEICAgICAweEMwIC8qIGJpdCA2LDc6ICAgcmVzZXJ2ZWQgKi8KKworI2RlZmluZSBnZXRfYnl0ZSgpICAoaW5wdHIgPCBpbnNpemUgPyBpbmJ1ZltpbnB0cisrXSA6IGZpbGxfaW5idWYoKSkKKwkJCisvKiBEaWFnbm9zdGljIGZ1bmN0aW9ucyAqLworI2lmZGVmIERFQlVHCisjICBkZWZpbmUgQXNzZXJ0KGNvbmQsbXNnKSB7aWYoIShjb25kKSkgZXJyb3IobXNnKTt9CisjICBkZWZpbmUgVHJhY2UoeCkgZnByaW50ZiB4CisjICBkZWZpbmUgVHJhY2V2KHgpIHtpZiAodmVyYm9zZSkgZnByaW50ZiB4IDt9CisjICBkZWZpbmUgVHJhY2V2dih4KSB7aWYgKHZlcmJvc2U+MSkgZnByaW50ZiB4IDt9CisjICBkZWZpbmUgVHJhY2VjKGMseCkge2lmICh2ZXJib3NlICYmIChjKSkgZnByaW50ZiB4IDt9CisjICBkZWZpbmUgVHJhY2VjdihjLHgpIHtpZiAodmVyYm9zZT4xICYmIChjKSkgZnByaW50ZiB4IDt9CisjZWxzZQorIyAgZGVmaW5lIEFzc2VydChjb25kLG1zZykKKyMgIGRlZmluZSBUcmFjZSh4KQorIyAgZGVmaW5lIFRyYWNldih4KQorIyAgZGVmaW5lIFRyYWNldnYoeCkKKyMgIGRlZmluZSBUcmFjZWMoYyx4KQorIyAgZGVmaW5lIFRyYWNlY3YoYyx4KQorI2VuZGlmCisKK3N0YXRpYyBpbnQgIGZpbGxfaW5idWYodm9pZCk7CitzdGF0aWMgdm9pZCBmbHVzaF93aW5kb3codm9pZCk7CitzdGF0aWMgdm9pZCBlcnJvcihjaGFyICptKTsKK3N0YXRpYyB2b2lkIGd6aXBfbWFyayh2b2lkICoqKTsKK3N0YXRpYyB2b2lkIGd6aXBfcmVsZWFzZSh2b2lkICoqKTsKKyAgCisvKgorICogVGhpcyBpcyBzZXQgdXAgYnkgdGhlIHNldHVwLXJvdXRpbmUgYXQgYm9vdC10aW1lCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpyZWFsX21vZGU7IC8qIFBvaW50ZXIgdG8gcmVhbC1tb2RlIGRhdGEgKi8KKworI2RlZmluZSBSTV9FWFRfTUVNX0sgICAoKih1bnNpZ25lZCBzaG9ydCAqKShyZWFsX21vZGUgKyAweDIpKQorI2lmbmRlZiBTVEFOREFSRF9NRU1PUllfQklPU19DQUxMCisjZGVmaW5lIFJNX0FMVF9NRU1fSyAgICgqKHVuc2lnbmVkIGxvbmcgKikocmVhbF9tb2RlICsgMHgxZTApKQorI2VuZGlmCisjZGVmaW5lIFJNX1NDUkVFTl9JTkZPICgqKHN0cnVjdCBzY3JlZW5faW5mbyAqKShyZWFsX21vZGUrMCkpCisKK2V4dGVybiBjaGFyIGlucHV0X2RhdGFbXTsKK2V4dGVybiBpbnQgaW5wdXRfbGVuOworCitzdGF0aWMgbG9uZyBieXRlc19vdXQgPSAwOworc3RhdGljIHVjaCAqb3V0cHV0X2RhdGE7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBvdXRwdXRfcHRyID0gMDsKKworc3RhdGljIHZvaWQgKm1hbGxvYyhpbnQgc2l6ZSk7CitzdGF0aWMgdm9pZCBmcmVlKHZvaWQgKndoZXJlKTsKKworc3RhdGljIHZvaWQgcHV0c3RyKGNvbnN0IGNoYXIgKik7CisKK2V4dGVybiBpbnQgZW5kOworc3RhdGljIGxvbmcgZnJlZV9tZW1fcHRyID0gKGxvbmcpJmVuZDsKK3N0YXRpYyBsb25nIGZyZWVfbWVtX2VuZF9wdHI7CisKKyNkZWZpbmUgSU5QTEFDRV9NT1ZFX1JPVVRJTkUgIDB4MTAwMAorI2RlZmluZSBMT1dfQlVGRkVSX1NUQVJUICAgICAgMHgyMDAwCisjZGVmaW5lIExPV19CVUZGRVJfTUFYICAgICAgIDB4OTAwMDAKKyNkZWZpbmUgSEVBUF9TSVpFICAgICAgICAgICAgIDB4MzAwMAorc3RhdGljIHVuc2lnbmVkIGludCBsb3dfYnVmZmVyX2VuZCwgbG93X2J1ZmZlcl9zaXplOworc3RhdGljIGludCBoaWdoX2xvYWRlZCA9MDsKK3N0YXRpYyB1Y2ggKmhpZ2hfYnVmZmVyX3N0YXJ0IC8qID0gKHVjaCAqKSgoKHVsZykmZW5kKSArIEhFQVBfU0laRSkqLzsKKworc3RhdGljIGNoYXIgKnZpZG1lbSA9IChjaGFyICopMHhiODAwMDsKK3N0YXRpYyBpbnQgdmlkcG9ydDsKK3N0YXRpYyBpbnQgbGluZXMsIGNvbHM7CisKKyNpZmRlZiBDT05GSUdfWDg2X05VTUFRCitzdGF0aWMgdm9pZCAqIHhxdWFkX3BvcnRpbyA9IE5VTEw7CisjZW5kaWYKKworI2luY2x1ZGUgIi4uLy4uLy4uLy4uL2xpYi9pbmZsYXRlLmMiCisKK3N0YXRpYyB2b2lkICptYWxsb2MoaW50IHNpemUpCit7CisJdm9pZCAqcDsKKworCWlmIChzaXplIDwwKSBlcnJvcigiTWFsbG9jIGVycm9yIik7CisJaWYgKGZyZWVfbWVtX3B0ciA8PSAwKSBlcnJvcigiTWVtb3J5IGVycm9yIik7CisKKwlmcmVlX21lbV9wdHIgPSAoZnJlZV9tZW1fcHRyICsgMykgJiB+MzsJLyogQWxpZ24gKi8KKworCXAgPSAodm9pZCAqKWZyZWVfbWVtX3B0cjsKKwlmcmVlX21lbV9wdHIgKz0gc2l6ZTsKKworCWlmIChmcmVlX21lbV9wdHIgPj0gZnJlZV9tZW1fZW5kX3B0cikKKwkJZXJyb3IoIk91dCBvZiBtZW1vcnkiKTsKKworCXJldHVybiBwOworfQorCitzdGF0aWMgdm9pZCBmcmVlKHZvaWQgKndoZXJlKQorewkvKiBEb24ndCBjYXJlICovCit9CisKK3N0YXRpYyB2b2lkIGd6aXBfbWFyayh2b2lkICoqcHRyKQoreworCSpwdHIgPSAodm9pZCAqKSBmcmVlX21lbV9wdHI7Cit9CisKK3N0YXRpYyB2b2lkIGd6aXBfcmVsZWFzZSh2b2lkICoqcHRyKQoreworCWZyZWVfbWVtX3B0ciA9IChsb25nKSAqcHRyOworfQorIAorc3RhdGljIHZvaWQgc2Nyb2xsKHZvaWQpCit7CisJaW50IGk7CisKKwltZW1jcHkgKCB2aWRtZW0sIHZpZG1lbSArIGNvbHMgKiAyLCAoIGxpbmVzIC0gMSApICogY29scyAqIDIgKTsKKwlmb3IgKCBpID0gKCBsaW5lcyAtIDEgKSAqIGNvbHMgKiAyOyBpIDwgbGluZXMgKiBjb2xzICogMjsgaSArPSAyICkKKwkJdmlkbWVtW2ldID0gJyAnOworfQorCitzdGF0aWMgdm9pZCBwdXRzdHIoY29uc3QgY2hhciAqcykKK3sKKwlpbnQgeCx5LHBvczsKKwljaGFyIGM7CisKKwl4ID0gUk1fU0NSRUVOX0lORk8ub3JpZ194OworCXkgPSBSTV9TQ1JFRU5fSU5GTy5vcmlnX3k7CisKKwl3aGlsZSAoICggYyA9ICpzKysgKSAhPSAnXDAnICkgeworCQlpZiAoIGMgPT0gJ1xuJyApIHsKKwkJCXggPSAwOworCQkJaWYgKCArK3kgPj0gbGluZXMgKSB7CisJCQkJc2Nyb2xsKCk7CisJCQkJeS0tOworCQkJfQorCQl9IGVsc2UgeworCQkJdmlkbWVtIFsgKCB4ICsgY29scyAqIHkgKSAqIDIgXSA9IGM7IAorCQkJaWYgKCArK3ggPj0gY29scyApIHsKKwkJCQl4ID0gMDsKKwkJCQlpZiAoICsreSA+PSBsaW5lcyApIHsKKwkJCQkJc2Nyb2xsKCk7CisJCQkJCXktLTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlSTV9TQ1JFRU5fSU5GTy5vcmlnX3ggPSB4OworCVJNX1NDUkVFTl9JTkZPLm9yaWdfeSA9IHk7CisKKwlwb3MgPSAoeCArIGNvbHMgKiB5KSAqIDI7CS8qIFVwZGF0ZSBjdXJzb3IgcG9zaXRpb24gKi8KKwlvdXRiX3AoMTQsIHZpZHBvcnQpOworCW91dGJfcCgweGZmICYgKHBvcyA+PiA5KSwgdmlkcG9ydCsxKTsKKwlvdXRiX3AoMTUsIHZpZHBvcnQpOworCW91dGJfcCgweGZmICYgKHBvcyA+PiAxKSwgdmlkcG9ydCsxKTsKK30KKworc3RhdGljIHZvaWQqIG1lbXNldCh2b2lkKiBzLCBpbnQgYywgc2l6ZV90IG4pCit7CisJaW50IGk7CisJY2hhciAqc3MgPSAoY2hhciopczsKKworCWZvciAoaT0wO2k8bjtpKyspIHNzW2ldID0gYzsKKwlyZXR1cm4gczsKK30KKworc3RhdGljIHZvaWQqIG1lbWNweSh2b2lkKiBfX2Rlc3QsIF9fY29uc3Qgdm9pZCogX19zcmMsCisJCQkgICAgc2l6ZV90IF9fbikKK3sKKwlpbnQgaTsKKwljaGFyICpkID0gKGNoYXIgKilfX2Rlc3QsICpzID0gKGNoYXIgKilfX3NyYzsKKworCWZvciAoaT0wO2k8X19uO2krKykgZFtpXSA9IHNbaV07CisJcmV0dXJuIF9fZGVzdDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGaWxsIHRoZSBpbnB1dCBidWZmZXIuIFRoaXMgaXMgY2FsbGVkIG9ubHkgd2hlbiB0aGUgYnVmZmVyIGlzIGVtcHR5CisgKiBhbmQgYXQgbGVhc3Qgb25lIGJ5dGUgaXMgcmVhbGx5IG5lZWRlZC4KKyAqLworc3RhdGljIGludCBmaWxsX2luYnVmKHZvaWQpCit7CisJaWYgKGluc2l6ZSAhPSAwKSB7CisJCWVycm9yKCJyYW4gb3V0IG9mIGlucHV0IGRhdGEiKTsKKwl9CisKKwlpbmJ1ZiA9IGlucHV0X2RhdGE7CisJaW5zaXplID0gaW5wdXRfbGVuOworCWlucHRyID0gMTsKKwlyZXR1cm4gaW5idWZbMF07Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogV3JpdGUgdGhlIG91dHB1dCB3aW5kb3cgd2luZG93WzAuLm91dGNudC0xXSBhbmQgdXBkYXRlIGNyYyBhbmQgYnl0ZXNfb3V0LgorICogKFVzZWQgZm9yIHRoZSBkZWNvbXByZXNzZWQgZGF0YSBvbmx5LikKKyAqLworc3RhdGljIHZvaWQgZmx1c2hfd2luZG93X2xvdyh2b2lkKQoreworICAgIHVsZyBjID0gY3JjOyAgICAgICAgIC8qIHRlbXBvcmFyeSB2YXJpYWJsZSAqLworICAgIHVuc2lnbmVkIG47CisgICAgdWNoICppbiwgKm91dCwgY2g7CisgICAgCisgICAgaW4gPSB3aW5kb3c7CisgICAgb3V0ID0gJm91dHB1dF9kYXRhW291dHB1dF9wdHJdOyAKKyAgICBmb3IgKG4gPSAwOyBuIDwgb3V0Y250OyBuKyspIHsKKwkgICAgY2ggPSAqb3V0KysgPSAqaW4rKzsKKwkgICAgYyA9IGNyY18zMl90YWJbKChpbnQpYyBeIGNoKSAmIDB4ZmZdIF4gKGMgPj4gOCk7CisgICAgfQorICAgIGNyYyA9IGM7CisgICAgYnl0ZXNfb3V0ICs9ICh1bGcpb3V0Y250OworICAgIG91dHB1dF9wdHIgKz0gKHVsZylvdXRjbnQ7CisgICAgb3V0Y250ID0gMDsKK30KKworc3RhdGljIHZvaWQgZmx1c2hfd2luZG93X2hpZ2godm9pZCkKK3sKKyAgICB1bGcgYyA9IGNyYzsgICAgICAgICAvKiB0ZW1wb3JhcnkgdmFyaWFibGUgKi8KKyAgICB1bnNpZ25lZCBuOworICAgIHVjaCAqaW4sICBjaDsKKyAgICBpbiA9IHdpbmRvdzsKKyAgICBmb3IgKG4gPSAwOyBuIDwgb3V0Y250OyBuKyspIHsKKwljaCA9ICpvdXRwdXRfZGF0YSsrID0gKmluKys7CisJaWYgKCh1bGcpb3V0cHV0X2RhdGEgPT0gbG93X2J1ZmZlcl9lbmQpIG91dHB1dF9kYXRhPWhpZ2hfYnVmZmVyX3N0YXJ0OworCWMgPSBjcmNfMzJfdGFiWygoaW50KWMgXiBjaCkgJiAweGZmXSBeIChjID4+IDgpOworICAgIH0KKyAgICBjcmMgPSBjOworICAgIGJ5dGVzX291dCArPSAodWxnKW91dGNudDsKKyAgICBvdXRjbnQgPSAwOworfQorCitzdGF0aWMgdm9pZCBmbHVzaF93aW5kb3codm9pZCkKK3sKKwlpZiAoaGlnaF9sb2FkZWQpIGZsdXNoX3dpbmRvd19oaWdoKCk7CisJZWxzZSBmbHVzaF93aW5kb3dfbG93KCk7Cit9CisKK3N0YXRpYyB2b2lkIGVycm9yKGNoYXIgKngpCit7CisJcHV0c3RyKCJcblxuIik7CisJcHV0c3RyKHgpOworCXB1dHN0cigiXG5cbiAtLSBTeXN0ZW0gaGFsdGVkIik7CisKKwl3aGlsZSgxKTsJLyogSGFsdCAqLworfQorCisjZGVmaW5lIFNUQUNLX1NJWkUgKDQwOTYpCisKK2xvbmcgdXNlcl9zdGFjayBbU1RBQ0tfU0laRV07CisKK3N0cnVjdCB7CisJbG9uZyAqIGE7CisJc2hvcnQgYjsKKwl9IHN0YWNrX3N0YXJ0ID0geyAmIHVzZXJfc3RhY2sgW1NUQUNLX1NJWkVdICwgX19CT09UX0RTIH07CisKK3N0YXRpYyB2b2lkIHNldHVwX25vcm1hbF9vdXRwdXRfYnVmZmVyKHZvaWQpCit7CisjaWZkZWYgU1RBTkRBUkRfTUVNT1JZX0JJT1NfQ0FMTAorCWlmIChSTV9FWFRfTUVNX0sgPCAxMDI0KSBlcnJvcigiTGVzcyB0aGFuIDJNQiBvZiBtZW1vcnkiKTsKKyNlbHNlCisJaWYgKChSTV9BTFRfTUVNX0sgPiBSTV9FWFRfTUVNX0sgPyBSTV9BTFRfTUVNX0sgOiBSTV9FWFRfTUVNX0spIDwgMTAyNCkgZXJyb3IoIkxlc3MgdGhhbiAyTUIgb2YgbWVtb3J5Iik7CisjZW5kaWYKKwlvdXRwdXRfZGF0YSA9IChjaGFyICopMHgxMDAwMDA7IC8qIFBvaW50cyB0byAxTSAqLworCWZyZWVfbWVtX2VuZF9wdHIgPSAobG9uZylyZWFsX21vZGU7Cit9CisKK3N0cnVjdCBtb3ZlcGFyYW1zIHsKKwl1Y2ggKmxvd19idWZmZXJfc3RhcnQ7ICBpbnQgbGNvdW50OworCXVjaCAqaGlnaF9idWZmZXJfc3RhcnQ7IGludCBoY291bnQ7Cit9OworCitzdGF0aWMgdm9pZCBzZXR1cF9vdXRwdXRfYnVmZmVyX2lmX3dlX3J1bl9oaWdoKHN0cnVjdCBtb3ZlcGFyYW1zICptdikKK3sKKwloaWdoX2J1ZmZlcl9zdGFydCA9ICh1Y2ggKikoKCh1bGcpJmVuZCkgKyBIRUFQX1NJWkUpOworI2lmZGVmIFNUQU5EQVJEX01FTU9SWV9CSU9TX0NBTEwKKwlpZiAoUk1fRVhUX01FTV9LIDwgKDMqMTAyNCkpIGVycm9yKCJMZXNzIHRoYW4gNE1CIG9mIG1lbW9yeSIpOworI2Vsc2UKKwlpZiAoKFJNX0FMVF9NRU1fSyA+IFJNX0VYVF9NRU1fSyA/IFJNX0FMVF9NRU1fSyA6IFJNX0VYVF9NRU1fSykgPAorCQkJKDMqMTAyNCkpCisJCWVycm9yKCJMZXNzIHRoYW4gNE1CIG9mIG1lbW9yeSIpOworI2VuZGlmCQorCW12LT5sb3dfYnVmZmVyX3N0YXJ0ID0gb3V0cHV0X2RhdGEgPSAoY2hhciAqKUxPV19CVUZGRVJfU1RBUlQ7CisJbG93X2J1ZmZlcl9lbmQgPSAoKHVuc2lnbmVkIGludClyZWFsX21vZGUgPiBMT1dfQlVGRkVSX01BWAorCSAgPyBMT1dfQlVGRkVSX01BWCA6ICh1bnNpZ25lZCBpbnQpcmVhbF9tb2RlKSAmIH4weGZmZjsKKwlsb3dfYnVmZmVyX3NpemUgPSBsb3dfYnVmZmVyX2VuZCAtIExPV19CVUZGRVJfU1RBUlQ7CisJaGlnaF9sb2FkZWQgPSAxOworCWZyZWVfbWVtX2VuZF9wdHIgPSAobG9uZyloaWdoX2J1ZmZlcl9zdGFydDsKKwlpZiAoICgweDEwMDAwMCArIGxvd19idWZmZXJfc2l6ZSkgPiAoKHVsZyloaWdoX2J1ZmZlcl9zdGFydCkpIHsKKwkJaGlnaF9idWZmZXJfc3RhcnQgPSAodWNoICopKDB4MTAwMDAwICsgbG93X2J1ZmZlcl9zaXplKTsKKwkJbXYtPmhjb3VudCA9IDA7IC8qIHNheTogd2UgbmVlZCBub3QgdG8gbW92ZSBoaWdoX2J1ZmZlciAqLworCX0KKwllbHNlIG12LT5oY291bnQgPSAtMTsKKwltdi0+aGlnaF9idWZmZXJfc3RhcnQgPSBoaWdoX2J1ZmZlcl9zdGFydDsKK30KKworc3RhdGljIHZvaWQgY2xvc2Vfb3V0cHV0X2J1ZmZlcl9pZl93ZV9ydW5faGlnaChzdHJ1Y3QgbW92ZXBhcmFtcyAqbXYpCit7CisJaWYgKGJ5dGVzX291dCA+IGxvd19idWZmZXJfc2l6ZSkgeworCQltdi0+bGNvdW50ID0gbG93X2J1ZmZlcl9zaXplOworCQlpZiAobXYtPmhjb3VudCkKKwkJCW12LT5oY291bnQgPSBieXRlc19vdXQgLSBsb3dfYnVmZmVyX3NpemU7CisJfSBlbHNlIHsKKwkJbXYtPmxjb3VudCA9IGJ5dGVzX291dDsKKwkJbXYtPmhjb3VudCA9IDA7CisJfQorfQorCisKK2FzbWxpbmthZ2UgaW50IGRlY29tcHJlc3Nfa2VybmVsKHN0cnVjdCBtb3ZlcGFyYW1zICptdiwgdm9pZCAqcm1vZGUpCit7CisJcmVhbF9tb2RlID0gcm1vZGU7CisKKwlpZiAoUk1fU0NSRUVOX0lORk8ub3JpZ192aWRlb19tb2RlID09IDcpIHsKKwkJdmlkbWVtID0gKGNoYXIgKikgMHhiMDAwMDsKKwkJdmlkcG9ydCA9IDB4M2I0OworCX0gZWxzZSB7CisJCXZpZG1lbSA9IChjaGFyICopIDB4YjgwMDA7CisJCXZpZHBvcnQgPSAweDNkNDsKKwl9CisKKwlsaW5lcyA9IFJNX1NDUkVFTl9JTkZPLm9yaWdfdmlkZW9fbGluZXM7CisJY29scyA9IFJNX1NDUkVFTl9JTkZPLm9yaWdfdmlkZW9fY29sczsKKworCWlmIChmcmVlX21lbV9wdHIgPCAweDEwMDAwMCkgc2V0dXBfbm9ybWFsX291dHB1dF9idWZmZXIoKTsKKwllbHNlIHNldHVwX291dHB1dF9idWZmZXJfaWZfd2VfcnVuX2hpZ2gobXYpOworCisJbWFrZWNyYygpOworCXB1dHN0cigiVW5jb21wcmVzc2luZyBMaW51eC4uLiAiKTsKKwlndW56aXAoKTsKKwlwdXRzdHIoIk9rLCBib290aW5nIHRoZSBrZXJuZWwuXG4iKTsKKwlpZiAoaGlnaF9sb2FkZWQpIGNsb3NlX291dHB1dF9idWZmZXJfaWZfd2VfcnVuX2hpZ2gobXYpOworCXJldHVybiBoaWdoX2xvYWRlZDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9ib290L2NvbXByZXNzZWQvdm1saW51eC5zY3IgYi9hcmNoL2kzODYvYm9vdC9jb21wcmVzc2VkL3ZtbGludXguc2NyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZDlkNzkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvYm9vdC9jb21wcmVzc2VkL3ZtbGludXguc2NyCkBAIC0wLDAgKzEsOSBAQAorU0VDVElPTlMKK3sKKyAgLmRhdGEgOiB7IAorCWlucHV0X2xlbiA9IC47CisJTE9ORyhpbnB1dF9kYXRhX2VuZCAtIGlucHV0X2RhdGEpIGlucHV0X2RhdGEgPSAuOyAKKwkqKC5kYXRhKSAKKwlpbnB1dF9kYXRhX2VuZCA9IC47IAorCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9ib290L2VkZC5TIGIvYXJjaC9pMzg2L2Jvb3QvZWRkLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI3ZDZiMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9ib290L2VkZC5TCkBAIC0wLDAgKzEsMTc2IEBACisvKgorICogQklPUyBFbmhhbmNlZCBEaXNrIERyaXZlIHN1cHBvcnQKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCBEZWxsLCBJbmMuCisgKiBieSBNYXR0IERvbXNjaCA8TWF0dF9Eb21zY2hAZGVsbC5jb20+IE9jdG9iZXIgMjAwMgorICogY29uZm9ybWFudCB0byBUMTMgQ29tbWl0dGVlIHd3dy50MTMub3JnCisgKiAgIHByb2plY3RzIDE1NzJELCAxNDg0RCwgMTM4NkQsIDEyMjZEVAorICogZGlzayBzaWduYXR1cmUgcmVhZCBieSBNYXR0IERvbXNjaCA8TWF0dF9Eb21zY2hAZGVsbC5jb20+CisgKglhbmQgQW5kcmV3IFdpbGtzIDxBbmRyZXdfV2lsa3NAZGVsbC5jb20+IFNlcHRlbWJlciAyMDAzLCBKdW5lIDIwMDQKKyAqIGxlZ2FjeSBDSFMgcmV0cmVpdmFsIGJ5IFBhdHJpY2sgSi4gTG9QcmVzdGkgPHBhdGxAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICogICAgICBNYXJjaCAyMDA0CisgKiBDb21tYW5kIGxpbmUgb3B0aW9uIHBhcnNpbmcsIE1hdHQgRG9tc2NoLCBOb3ZlbWJlciAyMDA0CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2VkZC5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfRUREKSB8fCBkZWZpbmVkKENPTkZJR19FRERfTU9EVUxFKQorCW1vdmIJJDAsIChFRERfTUJSX1NJR19OUl9CVUYpCisJbW92YgkkMCwgKEVERE5SKQorCisjIENoZWNrIHRoZSBjb21tYW5kIGxpbmUgZm9yIHR3byBvcHRpb25zOgorIyBlZGQ9b2YgIGRpc2FibGVzIEVERCBjb21wbGV0ZWx5ICAoZWRkPW9mZikKKyMgZWRkPXNrICBza2lwcyB0aGUgTUJSIHRlc3QgICAgKGVkZD1za2lwbWJyKQorCXB1c2hsCSVlc2kKKyAgICAJY21wbAkkMCwgJWNzOmNtZF9saW5lX3B0cgorCWp6CWRvbmVfY2wKKwltb3ZsCSVjczooY21kX2xpbmVfcHRyKSwgJWVzaQorIyBkczplc2kgaGFzIHRoZSBwb2ludGVyIHRvIHRoZSBjb21tYW5kIGxpbmUgbm93CisJbW92bAkkKENPTU1BTkRfTElORV9TSVpFLTcpLCAlZWN4CisjIGxvb3AgdGhyb3VnaCBrZXJuZWwgY29tbWFuZCBsaW5lIG9uZSBieXRlIGF0IGEgdGltZQorY2xfbG9vcDoKKwljbXBsCSRFRERfQ0xfRVFVQUxTLCAoJXNpKQorCWp6CWZvdW5kX2VkZF9lcXVhbHMKKwlpbmNsCSVlc2kKKwlsb29wCWNsX2xvb3AKKwlqbXAJZG9uZV9jbAorZm91bmRfZWRkX2VxdWFsczoKKyMgb25seSBsb29raW5nIGF0IGZpcnN0IHR3byBjaGFyYWN0ZXJzIGFmdGVyIGVxdWFscworICAgIAlhZGRsCSQ0LCAlZXNpCisJY21wdwkkRUREX0NMX09GRiwgKCVzaSkJIyBlZGQ9b2YKKwlqeglkb19lZGRfb2ZmCisJY21wdwkkRUREX0NMX1NLSVAsICglc2kpCSMgZWRkPXNrCisJanoJZG9fZWRkX3NraXBtYnIKKwlqbXAJZG9uZV9jbAorZG9fZWRkX3NraXBtYnI6CisgICAgCXBvcGwJJWVzaQorCWptcAllZGRfc3RhcnQKK2RvX2VkZF9vZmY6CisJcG9wbAklZXNpCisJam1wCWVkZF9kb25lCitkb25lX2NsOgorCXBvcGwJJWVzaQorCisKKyMgUmVhZCB0aGUgZmlyc3Qgc2VjdG9yIG9mIGVhY2ggQklPUyBkaXNrIGRldmljZSBhbmQgc3RvcmUgdGhlIDQtYnl0ZSBzaWduYXR1cmUKK2VkZF9tYnJfc2lnX3N0YXJ0OgorCW1vdmIJJDB4ODAsICVkbAkJCSMgZnJvbSBkZXZpY2UgODAKKwltb3Z3CSRFRERfTUJSX1NJR19CVUYsICVieAkJIyBzdG9yZSBidWZmZXIgcHRyIGluIGJ4CitlZGRfbWJyX3NpZ19yZWFkOgorCW1vdmwJJDB4RkZGRkZGRkYsICVlYXgKKwltb3ZsCSVlYXgsICglYngpCQkJIyBhc3N1bWUgZmFpbHVyZQorCXB1c2h3CSVieAorCW1vdmIJJFJFQURfU0VDVE9SUywgJWFoCisJbW92YgkkMSwgJWFsCQkJCSMgcmVhZCAxIHNlY3RvcgorCW1vdmIJJDAsICVkaAkJCQkjIGF0IGhlYWQgMAorCW1vdncJJDEsICVjeAkJCQkjIGN5bGluZGVyIDAsIHNlY3RvciAwCisJcHVzaHcJJWVzCisJcHVzaHcJJWRzCisJcG9wdwklZXMKKyAgICAJbW92dwkkRUREQlVGLCAlYngJCQkjIGRpc2sncyBkYXRhIGdvZXMgaW50byBFRERCVUYKKwlwdXNodwklZHggICAgICAgICAgICAgIyB3b3JrIGFyb3VuZCBidWdneSBCSU9TZXMKKwlzdGMgICAgICAgICAgICAgICAgICAgICAjIHdvcmsgYXJvdW5kIGJ1Z2d5IEJJT1NlcworCWludAkkMHgxMworCXN0aSAgICAgICAgICAgICAgICAgICAgICMgd29yayBhcm91bmQgYnVnZ3kgQklPU2VzCisJcG9wdwklZHgKKwlwb3B3CSVlcworCXBvcHcJJWJ4CisJamMJZWRkX21icl9zaWdfZG9uZQkJIyBvbiBmYWlsdXJlLCB3ZSdyZSBkb25lLgorCW1vdmwJKEVEREJVRitFRERfTUJSX1NJR19PRkZTRVQpLCAlZWF4ICMgcmVhZCBzaWcgb3V0IG9mIHRoZSBNQlIKKwltb3ZsCSVlYXgsICglYngpCQkJIyBzdG9yZSBzdWNjZXNzCisJaW5jYgkoRUREX01CUl9TSUdfTlJfQlVGKQkJIyBub3RlIHRoYXQgd2Ugc3RvcmVkIHNvbWV0aGluZworCWluY2IJJWRsCQkJCSMgaW5jcmVtZW50IHRvIG5leHQgZGV2aWNlCisJYWRkdwkkNCwgJWJ4CQkJCSMgaW5jcmVtZW50IHNpZyBidWZmZXIgcHRyCisJY21wYgkkRUREX01CUl9TSUdfTUFYLCAoRUREX01CUl9TSUdfTlJfQlVGKQkjIE91dCBvZiBzcGFjZT8KKwlqYgllZGRfbWJyX3NpZ19yZWFkCQkjIGtlZXAgbG9vcGluZworZWRkX21icl9zaWdfZG9uZToKKworIyBEbyB0aGUgQklPUyBFbmhhbmNlZCBEaXNrIERyaXZlIGNhbGxzCisjIFRoaXMgY29uc2lzdHMgb2YgdHdvIGNhbGxzOgorIyAgICBpbnQgMTNoIGFoPTQxaCAiQ2hlY2sgRXh0ZW5zaW9ucyBQcmVzZW50IgorIyAgICBpbnQgMTNoIGFoPTQ4aCAiR2V0IERldmljZSBQYXJhbWV0ZXJzIgorIyAgICBpbnQgMTNoIGFoPTA4aCAiTGVnYWN5IEdldCBEZXZpY2UgUGFyYW1ldGVycyIKKyMKKyMgQSBidWZmZXIgb2Ygc2l6ZSBFRERNQVhOUiooRURERVhUU0laRStFRERQQVJNU0laRSkgaXMgcmVzZXJ2ZWQgZm9yIG91ciB1c2UKKyMgaW4gdGhlIGJvb3RfcGFyYW1zIGF0IEVEREJVRi4gIFRoZSBmaXJzdCBmb3VyIGJ5dGVzIG9mIHdoaWNoIGFyZQorIyB1c2VkIHRvIHN0b3JlIHRoZSBkZXZpY2UgbnVtYmVyLCBpbnRlcmZhY2Ugc3VwcG9ydCBtYXAgYW5kIHZlcnNpb24KKyMgcmVzdWx0cyBmcm9tIGZuNDEuICBUaGUgbmV4dCBmb3VyIGJ5dGVzIGFyZSB1c2VkIHRvIHN0b3JlIHRoZSBsZWdhY3kKKyMgY3lsaW5kZXJzLCBoZWFkcywgYW5kIHNlY3RvcnMgZnJvbSBmbjA4LiBUaGUgZm9sbG93aW5nIDc0IGJ5dGVzIGFyZSB1c2VkIHRvCisjIHN0b3JlIHRoZSByZXN1bHRzIGZyb20gZm40OC4gIFN0YXJ0aW5nIGZyb20gZGV2aWNlIDgwaCwgZm40MSwgdGhlbiBmbjQ4CisjIGFyZSBjYWxsZWQgYW5kIHRoZWlyIHJlc3VsdHMgc3RvcmVkIGluIEVEREJVRituKihFRERFWFRTSVpFK0VERFBBUk1JWkUpLgorIyBUaGVuIHRoZSBwb2ludGVyIGlzIGluY3JlbWVudGVkIHRvIHN0b3JlIHRoZSBkYXRhIGZvciB0aGUgbmV4dCBjYWxsLgorIyBUaGlzIHJlcGVhdHMgdW50aWwgZWl0aGVyIGEgZGV2aWNlIGRvZXNuJ3QgZXhpc3QsIG9yIHVudGlsIEVERE1BWE5SCisjIGRldmljZXMgaGF2ZSBiZWVuIHN0b3JlZC4KKyMgVGhlIG9uZSB0cmlja3kgcGFydCBpcyB0aGF0IGRzOnNpIGFsd2F5cyBwb2ludHMgRURERVhUU0laRSBieXRlcyBpbnRvCisjIHRoZSBzdHJ1Y3R1cmUsIGFuZCB0aGUgZm40MSBhbmQgZm4wOCByZXN1bHRzIGFyZSBzdG9yZWQgYXQgb2Zmc2V0cworIyBmcm9tIHRoZXJlLiAgVGhpcyByZW1vdmVzIHRoZSBuZWVkIHRvIGluY3JlbWVudCB0aGUgcG9pbnRlciBmb3IKKyMgZXZlcnkgc3RvcmUsIGFuZCBsZWF2ZXMgaXQgcmVhZHkgZm9yIHRoZSBmbjQ4IGNhbGwuCisjIEEgc2Vjb25kIG9uZS1ieXRlIGJ1ZmZlciwgRURETlIsIGluIHRoZSBib290X3BhcmFtcyBzdG9yZXMKKyMgdGhlIG51bWJlciBvZiBCSU9TIGRldmljZXMgd2hpY2ggZXhpc3QsIHVwIHRvIEVERE1BWE5SLgorIyBJbiBzZXR1cC5jLCBjb3B5X2VkZCgpIHN0b3JlcyBib3RoIGJvb3RfcGFyYW1zIGJ1ZmZlcnMgYXdheQorIyBmb3IgbGF0ZXIgdXNlLCBhcyB0aGV5IHdvdWxkIGdldCBvdmVyd3JpdHRlbiBvdGhlcndpc2UuCisjIFRoaXMgY29kZSBpcyBzZW5zaXRpdmUgdG8gdGhlIHNpemUgb2YgdGhlIHN0cnVjdHMgaW4gZWRkLmgKK2VkZF9zdGFydDoKKwkJCQkJCSMgJWRzIHBvaW50cyB0byB0aGUgYm9vdHNlY3RvcgorICAgICAgIAkJCQkJCSMgcmVzdWx0IGJ1ZmZlciBmb3IgZm40OAorCW1vdncJJEVEREJVRitFRERFWFRTSVpFLCAlc2kJCSMgaW4gZHM6c2ksIGZuNDEgcmVzdWx0cworCQkJCQkJIyBrZXB0IGp1c3QgYmVmb3JlIHRoYXQKKwltb3ZiCSQweDgwLCAlZGwJCQkjIEJJT1MgZGV2aWNlIDB4ODAKKworZWRkX2NoZWNrX2V4dDoKKwltb3ZiCSRDSEVDS0VYVEVOU0lPTlNQUkVTRU5ULCAlYWggICAgIyBGdW5jdGlvbiA0MQorCW1vdncJJEVERE1BR0lDMSwgJWJ4CQkJIyBtYWdpYworCWludAkkMHgxMwkJCQkjIG1ha2UgdGhlIGNhbGwKKwlqYwllZGRfZG9uZQkJCSMgbm8gbW9yZSBCSU9TIGRldmljZXMKKworCWNtcHcJJEVERE1BR0lDMiwgJWJ4CQkJIyBpcyBtYWdpYyByaWdodD8KKwlqbmUJZWRkX25leHQJCQkjIG5vcGUsIG5leHQuLi4KKworCW1vdmIJJWRsLCAlZHM6LTgoJXNpKQkJIyBzdG9yZSBkZXZpY2UgbnVtYmVyCisJbW92YgklYWgsICVkczotNyglc2kpCQkjIHN0b3JlIHZlcnNpb24KKwltb3Z3CSVjeCwgJWRzOi02KCVzaSkJCSMgc3RvcmUgZXh0ZW5zaW9ucworCWluY2IJKEVERE5SKQkJCQkjIG5vdGUgdGhhdCB3ZSBzdG9yZWQgc29tZXRoaW5nCisKK2VkZF9nZXRfZGV2aWNlX3BhcmFtczoKKwltb3Z3CSRFRERQQVJNU0laRSwgJWRzOiglc2kpCQkjIHB1dCBzaXplCisJbW92dwkkMHgwLCAlZHM6Miglc2kpCQkjIHdvcmsgYXJvdW5kIGJ1Z2d5IEJJT1NlcworCW1vdmIJJEdFVERFVklDRVBBUkFNRVRFUlMsICVhaAkjIEZ1bmN0aW9uIDQ4CisJaW50CSQweDEzCQkJCSMgbWFrZSB0aGUgY2FsbAorCQkJCQkJIyBEb24ndCBjaGVjayBmb3IgZmFpbCByZXR1cm4KKwkJCQkJCSMgaXQgZG9lc24ndCBtYXR0ZXIuCitlZGRfZ2V0X2xlZ2FjeV9jaHM6CisJeG9ydyAgICAlYXgsICVheAorCW1vdncgICAgJWF4LCAlZHM6LTQoJXNpKQorCW1vdncgICAgJWF4LCAlZHM6LTIoJXNpKQorICAgICAgICAjIFJhbGYgQnJvd24ncyBJbnRlcnJ1cHQgTGlzdCBzYXlzIHRvIHNldCBFUzpESSB0bworCSMgMDAwMGg6MDAwMGggInRvIGd1YXJkIGFnYWluc3QgQklPUyBidWdzIgorCXB1c2h3ICAgJWVzCisJbW92dyAgICAlYXgsICVlcworCW1vdncgICAgJWF4LCAlZGkKKwlwdXNodyAgICVkeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsZWdhY3kgY2FsbCBjbG9iYmVycyAlZGwKKwltb3ZiICAgICRMRUdBQ1lHRVRERVZJQ0VQQVJBTUVURVJTLCAlYWggIyBGdW5jdGlvbiAwOAorCWludCAgICAgJDB4MTMgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG1ha2UgdGhlIGNhbGwKKwlqYyAgICAgIGVkZF9sZWdhY3lfZG9uZSAgICAgICAgICAgICAgICAgIyBmYWlsZWQKKwltb3ZiICAgICVjbCwgJWFsICAgICAgICAgICAgICAgICAgICAgICAgIyBMb3cgNiBiaXRzIGFyZSBtYXgKKwlhbmRiICAgICQweDNGLCAlYWwgICAgICAgICAgICAgICAgICAgICAgIyAgIHNlY3RvciBudW1iZXIKKwltb3ZiCSVhbCwgJWRzOi0xKCVzaSkgICAgICAgICAgICAgICAgIyBSZWNvcmQgbWF4IHNlY3QKKwltb3ZiICAgICVkaCwgJWRzOi0yKCVzaSkgICAgICAgICAgICAgICAgIyBSZWNvcmQgbWF4IGhlYWQgbnVtYmVyCisJbW92YiAgICAlY2gsICVhbCAgICAgICAgICAgICAgICAgICAgICAgICMgTG93IDggYml0cyBvZiBtYXggY3lsCisJc2hyICAgICAkNiwgJWNsCisJbW92YiAgICAlY2wsICVhaCAgICAgICAgICAgICAgICAgICAgICAgICMgSGlnaCAyIGJpdHMgb2YgbWF4IGN5bAorCW1vdncgICAgJWF4LCAlZHM6LTQoJXNpKQorCitlZGRfbGVnYWN5X2RvbmU6CisJcG9wdyAgICAlZHgKKwlwb3B3ICAgICVlcworCW1vdncJJXNpLCAlYXgJCQkjIGluY3JlbWVudCBzaQorCWFkZHcJJEVERFBBUk1TSVpFK0VEREVYVFNJWkUsICVheAorCW1vdncJJWF4LCAlc2kKKworZWRkX25leHQ6CisJaW5jYgklZGwJCQkJIyBpbmNyZW1lbnQgdG8gbmV4dCBkZXZpY2UKKwljbXBiCSRFRERNQVhOUiwgKEVERE5SKSAJCSMgT3V0IG9mIHNwYWNlPworCWpiCWVkZF9jaGVja19leHQJCQkjIGtlZXAgbG9vcGluZworCitlZGRfZG9uZToKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2Jvb3QvaW5zdGFsbC5zaCBiL2FyY2gvaTM4Ni9ib290L2luc3RhbGwuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBmMjQ1MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9ib290L2luc3RhbGwuc2gKQEAgLTAsMCArMSw0MCBAQAorIyEvYmluL3NoCisjCisjIGFyY2gvaTM4Ni9ib290L2luc3RhbGwuc2gKKyMKKyMgVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorIyBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBDb3B5cmlnaHQgKEMpIDE5OTUgYnkgTGludXMgVG9ydmFsZHMKKyMKKyMgQWRhcHRlZCBmcm9tIGNvZGUgaW4gYXJjaC9pMzg2L2Jvb3QvTWFrZWZpbGUgYnkgSC4gUGV0ZXIgQW52aW4KKyMKKyMgIm1ha2UgaW5zdGFsbCIgc2NyaXB0IGZvciBpMzg2IGFyY2hpdGVjdHVyZQorIworIyBBcmd1bWVudHM6CisjICAgJDEgLSBrZXJuZWwgdmVyc2lvbgorIyAgICQyIC0ga2VybmVsIGltYWdlIGZpbGUKKyMgICAkMyAtIGtlcm5lbCBtYXAgZmlsZQorIyAgICQ0IC0gZGVmYXVsdCBpbnN0YWxsIHBhdGggKGJsYW5rIGlmIHJvb3QgZGlyZWN0b3J5KQorIworCisjIFVzZXIgbWF5IGhhdmUgYSBjdXN0b20gaW5zdGFsbCBzY3JpcHQKKworaWYgWyAteCB+L2Jpbi9pbnN0YWxsa2VybmVsIF07IHRoZW4gZXhlYyB+L2Jpbi9pbnN0YWxsa2VybmVsICIkQCI7IGZpCitpZiBbIC14IC9zYmluL2luc3RhbGxrZXJuZWwgXTsgdGhlbiBleGVjIC9zYmluL2luc3RhbGxrZXJuZWwgIiRAIjsgZmkKKworIyBEZWZhdWx0IGluc3RhbGwgLSBzYW1lIGFzIG1ha2UgemxpbG8KKworaWYgWyAtZiAkNC92bWxpbnV6IF07IHRoZW4KKwltdiAkNC92bWxpbnV6ICQ0L3ZtbGludXoub2xkCitmaQorCitpZiBbIC1mICQ0L1N5c3RlbS5tYXAgXTsgdGhlbgorCW12ICQ0L1N5c3RlbS5tYXAgJDQvU3lzdGVtLm9sZAorZmkKKworY2F0ICQyID4gJDQvdm1saW51egorY3AgJDMgJDQvU3lzdGVtLm1hcAorCitpZiBbIC14IC9zYmluL2xpbG8gXTsgdGhlbiAvc2Jpbi9saWxvOyBlbHNlIC9ldGMvbGlsby9pbnN0YWxsOyBmaQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2Jvb3QvbXRvb2xzLmNvbmYuaW4gYi9hcmNoL2kzODYvYm9vdC9tdG9vbHMuY29uZi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmQ2ZDI0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2Jvb3QvbXRvb2xzLmNvbmYuaW4KQEAgLTAsMCArMSwxNyBAQAorIworIyBtdG9vbHMgY29uZmlndXJhdGlvbiBmaWxlIGZvciAibWFrZSAoYil6ZGlzayIKKyMKKworIyBBY3R1YWwgZmxvcHB5IGRyaXZlCitkcml2ZSBhOgorICBmaWxlPSIvZGV2L2ZkMCIKKworIyAxLjQ0IE1CIGZsb3BweSBkaXNrIGltYWdlCitkcml2ZSB2OgorICBmaWxlPSJAT0JKQC9mZGltYWdlIiBjeWxpbmRlcnM9ODAgaGVhZHM9MiBzZWN0b3JzPTE4IGZpbHRlcgorCisjIDIuODggTUIgZmxvcHB5IGRpc2sgaW1hZ2UgKG1vc3RseSBmb3IgdmlydHVhbCB1c2VzKQorZHJpdmUgdzoKKyAgZmlsZT0iQE9CSkAvZmRpbWFnZSIgY3lsaW5kZXJzPTgwIGhlYWRzPTIgc2VjdG9ycz0zNiBmaWx0ZXIKKworCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvYm9vdC9zZXR1cC5TIGIvYXJjaC9pMzg2L2Jvb3Qvc2V0dXAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTM0YWIzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2Jvb3Qvc2V0dXAuUwpAQCAtMCwwICsxLDEwMjggQEAKKy8qCisgKglzZXR1cC5TCQlDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgTGludXMgVG9ydmFsZHMKKyAqCisgKiBzZXR1cC5zIGlzIHJlc3BvbnNpYmxlIGZvciBnZXR0aW5nIHRoZSBzeXN0ZW0gZGF0YSBmcm9tIHRoZSBCSU9TLAorICogYW5kIHB1dHRpbmcgdGhlbSBpbnRvIHRoZSBhcHByb3ByaWF0ZSBwbGFjZXMgaW4gc3lzdGVtIG1lbW9yeS4KKyAqIGJvdGggc2V0dXAucyBhbmQgc3lzdGVtIGhhcyBiZWVuIGxvYWRlZCBieSB0aGUgYm9vdGJsb2NrLgorICoKKyAqIFRoaXMgY29kZSBhc2tzIHRoZSBiaW9zIGZvciBtZW1vcnkvZGlzay9vdGhlciBwYXJhbWV0ZXJzLCBhbmQKKyAqIHB1dHMgdGhlbSBpbiBhICJzYWZlIiBwbGFjZTogMHg5MDAwMC0weDkwMUZGLCBpZSB3aGVyZSB0aGUKKyAqIGJvb3QtYmxvY2sgdXNlZCB0byBiZS4gSXQgaXMgdGhlbiB1cCB0byB0aGUgcHJvdGVjdGVkIG1vZGUKKyAqIHN5c3RlbSB0byByZWFkIHRoZW0gZnJvbSB0aGVyZSBiZWZvcmUgdGhlIGFyZWEgaXMgb3ZlcndyaXR0ZW4KKyAqIGZvciBidWZmZXItYmxvY2tzLgorICoKKyAqIE1vdmUgUFMvMiBhdXggaW5pdCBjb2RlIHRvIHBzYXV4LmMKKyAqICh0cm95ZXJAc2FpZnIwMC5jZnNhdC5Ib25leXdlbGwuQ09NKSAwM09jdDkyCisgKgorICogc29tZSBjaGFuZ2VzIGFuZCBhZGRpdGlvbmFsIGZlYXR1cmVzIGJ5IENocmlzdG9waCBOaWVtYW5uLAorICogTWFyY2ggMTk5My9KdW5lIDE5OTQgKENocmlzdG9waC5OaWVtYW5uQGxpbnV4Lm9yZykKKyAqCisgKiBhZGQgQVBNIEJJT1MgY2hlY2tpbmcgYnkgU3RlcGhlbiBSb3Rod2VsbCwgTWF5IDE5OTQKKyAqIChzZnJAY2FuYi5hdXVnLm9yZy5hdSkKKyAqCisgKiBIaWdoIGxvYWQgc3R1ZmYsIGluaXRyZCBzdXBwb3J0IGFuZCBwb3NpdGlvbiBpbmRlcGVuZGVuY3kKKyAqIGJ5IEhhbnMgTGVybWVuICYgV2VybmVyIEFsbWVzYmVyZ2VyLCBGZWJydWFyeSAxOTk2CisgKiA8bGVybWVuQGVsc2Vydi5mZm0uZmdhbi5kZT4sIDxhbG1lc2JlckBscmMuZXBmbC5jaD4KKyAqCisgKiBWaWRlbyBoYW5kbGluZyBtb3ZlZCB0byB2aWRlby5TIGJ5IE1hcnRpbiBNYXJlcywgTWFyY2ggMTk5NgorICogPG1qQGszMzIuZmVsZC5jdnV0LmN6PgorICoKKyAqIEV4dGVuZGVkIG1lbW9yeSBkZXRlY3Rpb24gc2NoZW1lIHJldHdpZGRsZWQgYnkgb3JjQHBlbGwuY2hpLmlsLnVzIChkYXZpZAorICogcGFyc29ucykgdG8gYXZvaWQgbG9hZGxpbiBjb25mdXNpb24sIEp1bHkgMTk5NworICoKKyAqIFRyYW5zY3JpYmVkIGZyb20gSW50ZWwgKGFzODYpIC0+IEFUJlQgKGdhcykgYnkgQ2hyaXMgTm9lLCBNYXkgMTk5OS4KKyAqIDxzdGlrZXJAbm9ydGhsaW5rLmNvbT4KKyAqCisgKiBGaXggdG8gd29yayBhcm91bmQgYnVnZ3kgQklPU2VzIHdoaWNoIGRvbnQgdXNlIGNhcnJ5IGJpdCBjb3JyZWN0bHkKKyAqIGFuZC9vciByZXBvcnQgZXh0ZW5kZWQgbWVtb3J5IGluIENYL0RYIGZvciBlODAxaCBtZW1vcnkgc2l6ZSBkZXRlY3Rpb24gCisgKiBjYWxsLiAgQXMgYSByZXN1bHQgdGhlIGtlcm5lbCBnb3Qgd3JvbmcgZmlndXJlcy4gIFRoZSBpbnQxNS9lODAxaCBkb2NzCisgKiBmcm9tIFJhbGYgQnJvd24gaW50ZXJydXB0IGxpc3Qgc2VlbSB0byBpbmRpY2F0ZSBBWC9CWCBzaG91bGQgYmUgdXNlZAorICogYW55d2F5LiAgU28gdG8gYXZvaWQgYnJlYWtpbmcgbWFueSBtYWNoaW5lcyAocHJlc3VtYWJseSB0aGVyZSB3YXMgYSByZWFzb24KKyAqIHRvIG9yZ2luYWxseSB1c2UgQ1gvRFggaW5zdGVhZCBvZiBBWC9CWCksIHdlIGRvIGEga2x1ZGdlIHRvIHNlZQorICogaWYgQ1gvRFggaGF2ZSBiZWVuIGNoYW5nZWQgaW4gdGhlIGU4MDEgY2FsbCBhbmQgaWYgc28gdXNlIEFYL0JYIC4KKyAqIE1pY2hhZWwgTWlsbGVyLCBBcHJpbCAyMDAxIDxtaWNoYWVsbUBtam1tLm9yZz4KKyAqCisgKiBOZXcgQTIwIGNvZGUgcG9ydGVkIGZyb20gU1lTTElOVVggYnkgSC4gUGV0ZXIgQW52aW4uIEFNRCBFbGFuIGJ1Z2ZpeGVzCisgKiBieSBSb2JlcnQgU2Nod2ViZWwsIERlY2VtYmVyIDIwMDEgPHJvYmVydEBzY2h3ZWJlbC5kZT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZS5oPgorI2luY2x1ZGUgPGFzbS9ib290Lmg+CisjaW5jbHVkZSA8YXNtL2U4MjAuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCQorLyogU2lnbmF0dXJlIHdvcmRzIHRvIGVuc3VyZSBMSUxPIGxvYWRlZCB1cyByaWdodCAqLworI2RlZmluZSBTSUcxCTB4QUE1NQorI2RlZmluZSBTSUcyCTB4NUE1QQorCitJTklUU0VHICA9IERFRl9JTklUU0VHCQkjIDB4OTAwMCwgd2UgbW92ZSBib290IGhlcmUsIG91dCBvZiB0aGUgd2F5CitTWVNTRUcgICA9IERFRl9TWVNTRUcJCSMgMHgxMDAwLCBzeXN0ZW0gbG9hZGVkIGF0IDB4MTAwMDAgKDY1NTM2KS4KK1NFVFVQU0VHID0gREVGX1NFVFVQU0VHCQkjIDB4OTAyMCwgdGhpcyBpcyB0aGUgY3VycmVudCBzZWdtZW50CisJCQkJIyAuLi4gYW5kIHRoZSBmb3JtZXIgY29udGVudHMgb2YgQ1MKKworREVMVEFfSU5JVFNFRyA9IFNFVFVQU0VHIC0gSU5JVFNFRwkjIDB4MDAyMAorCisuY29kZTE2CisuZ2xvYmwgYmVndGV4dCwgYmVnZGF0YSwgYmVnYnNzLCBlbmR0ZXh0LCBlbmRkYXRhLCBlbmRic3MKKworLnRleHQKK2JlZ3RleHQ6CisuZGF0YQorYmVnZGF0YToKKy5ic3MKK2JlZ2JzczoKKy50ZXh0CisKK3N0YXJ0OgorCWptcAl0cmFtcG9saW5lCisKKyMgVGhpcyBpcyB0aGUgc2V0dXAgaGVhZGVyLCBhbmQgaXQgbXVzdCBzdGFydCBhdCAlY3M6MiAob2xkIDB4OTAyMDoyKQorCisJCS5hc2NpaQkiSGRyUyIJCSMgaGVhZGVyIHNpZ25hdHVyZQorCQkud29yZAkweDAyMDMJCSMgaGVhZGVyIHZlcnNpb24gbnVtYmVyICg+PSAweDAxMDUpCisJCQkJCSMgb3IgZWxzZSBvbGQgbG9hZGxpbi0xLjUgd2lsbCBmYWlsKQorcmVhbG1vZGVfc3d0Y2g6CS53b3JkCTAsIDAJCSMgZGVmYXVsdF9zd2l0Y2gsIFNFVFVQU0VHCitzdGFydF9zeXNfc2VnOgkud29yZAlTWVNTRUcKKwkJLndvcmQJa2VybmVsX3ZlcnNpb24JIyBwb2ludGluZyB0byBrZXJuZWwgdmVyc2lvbiBzdHJpbmcKKwkJCQkJIyBhYm92ZSBzZWN0aW9uIG9mIGhlYWRlciBpcyBjb21wYXRpYmxlCisJCQkJCSMgd2l0aCBsb2FkbGluLTEuNSAoaGVhZGVyIHYxLjUpLiBEb24ndAorCQkJCQkjIGNoYW5nZSBpdC4KKwordHlwZV9vZl9sb2FkZXI6CS5ieXRlCTAJCSMgPSAwLCBvbGQgb25lIChMSUxPLCBMb2FkbGluLAorCQkJCQkjICAgICAgQm9vdGxpbiwgU1lTTFgsIGJvb3RzZWN0Li4uKQorCQkJCQkjIFNlZSBEb2N1bWVudGF0aW9uL2kzODYvYm9vdC50eHQgZm9yCisJCQkJCSMgYXNzaWduZWQgaWRzCisJCisjIGZsYWdzLCB1bnVzZWQgYml0cyBtdXN0IGJlIHplcm8gKFJGVSkgYml0IHdpdGhpbiBsb2FkZmxhZ3MKK2xvYWRmbGFnczoKK0xPQURFRF9ISUdICT0gMQkJCSMgSWYgc2V0LCB0aGUga2VybmVsIGlzIGxvYWRlZCBoaWdoCitDQU5fVVNFX0hFQVAJPSAweDgwCQkJIyBJZiBzZXQsIHRoZSBsb2FkZXIgYWxzbyBoYXMgc2V0CisJCQkJCSMgaGVhcF9lbmRfcHRyIHRvIHRlbGwgaG93IG11Y2gKKwkJCQkJIyBzcGFjZSBiZWhpbmQgc2V0dXAuUyBjYW4gYmUgdXNlZCBmb3IKKwkJCQkJIyBoZWFwIHB1cnBvc2VzLgorCQkJCQkjIE9ubHkgdGhlIGxvYWRlciBrbm93cyB3aGF0IGlzIGZyZWUKKyNpZm5kZWYgX19CSUdfS0VSTkVMX18KKwkJLmJ5dGUJMAorI2Vsc2UKKwkJLmJ5dGUJTE9BREVEX0hJR0gKKyNlbmRpZgorCitzZXR1cF9tb3ZlX3NpemU6IC53b3JkICAweDgwMDAJCSMgc2l6ZSB0byBtb3ZlLCB3aGVuIHNldHVwIGlzIG5vdAorCQkJCQkjIGxvYWRlZCBhdCAweDkwMDAwLiBXZSB3aWxsIG1vdmUgc2V0dXAgCisJCQkJCSMgdG8gMHg5MDAwMCB0aGVuIGp1c3QgYmVmb3JlIGp1bXBpbmcKKwkJCQkJIyBpbnRvIHRoZSBrZXJuZWwuIEhvd2V2ZXIsIG9ubHkgdGhlCisJCQkJCSMgbG9hZGVyIGtub3dzIGhvdyBtdWNoIGRhdGEgYmVoaW5kCisJCQkJCSMgdXMgYWxzbyBuZWVkcyB0byBiZSBsb2FkZWQuCisKK2NvZGUzMl9zdGFydDoJCQkJIyBoZXJlIGxvYWRlcnMgY2FuIHB1dCBhIGRpZmZlcmVudAorCQkJCQkjIHN0YXJ0IGFkZHJlc3MgZm9yIDMyLWJpdCBjb2RlLgorI2lmbmRlZiBfX0JJR19LRVJORUxfXworCQkubG9uZwkweDEwMDAJCSMgICAweDEwMDAgPSBkZWZhdWx0IGZvciB6SW1hZ2UKKyNlbHNlCisJCS5sb25nCTB4MTAwMDAwCSMgMHgxMDAwMDAgPSBkZWZhdWx0IGZvciBiaWcga2VybmVsCisjZW5kaWYKKworcmFtZGlza19pbWFnZToJLmxvbmcJMAkJIyBhZGRyZXNzIG9mIGxvYWRlZCByYW1kaXNrIGltYWdlCisJCQkJCSMgSGVyZSB0aGUgbG9hZGVyIHB1dHMgdGhlIDMyLWJpdAorCQkJCQkjIGFkZHJlc3Mgd2hlcmUgaXQgbG9hZGVkIHRoZSBpbWFnZS4KKwkJCQkJIyBUaGlzIG9ubHkgd2lsbCBiZSByZWFkIGJ5IHRoZSBrZXJuZWwuCisKK3JhbWRpc2tfc2l6ZToJLmxvbmcJMAkJIyBpdHMgc2l6ZSBpbiBieXRlcworCitib290c2VjdF9rbHVkZ2U6CisJCS5sb25nCTAJCSMgb2Jzb2xldGUKKworaGVhcF9lbmRfcHRyOgkud29yZAltb2RlbGlzdCsxMDI0CSMgKEhlYWRlciB2ZXJzaW9uIDB4MDIwMSBvciBsYXRlcikKKwkJCQkJIyBzcGFjZSBmcm9tIGhlcmUgKGV4Y2x1c2l2ZSkgZG93biB0bworCQkJCQkjIGVuZCBvZiBzZXR1cCBjb2RlIGNhbiBiZSB1c2VkIGJ5IHNldHVwCisJCQkJCSMgZm9yIGxvY2FsIGhlYXAgcHVycG9zZXMuCisKK3BhZDE6CQkud29yZAkwCitjbWRfbGluZV9wdHI6CS5sb25nIDAJCQkjIChIZWFkZXIgdmVyc2lvbiAweDAyMDIgb3IgbGF0ZXIpCisJCQkJCSMgSWYgbm9uemVybywgYSAzMi1iaXQgcG9pbnRlcgorCQkJCQkjIHRvIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLgorCQkJCQkjIFRoZSBjb21tYW5kIGxpbmUgc2hvdWxkIGJlCisJCQkJCSMgbG9jYXRlZCBiZXR3ZWVuIHRoZSBzdGFydCBvZgorCQkJCQkjIHNldHVwIGFuZCB0aGUgZW5kIG9mIGxvdworCQkJCQkjIG1lbW9yeSAoMHhhMDAwMCksIG9yIGl0IG1heQorCQkJCQkjIGdldCBvdmVyd3JpdHRlbiBiZWZvcmUgaXQKKwkJCQkJIyBnZXRzIHJlYWQuICBJZiB0aGlzIGZpZWxkIGlzCisJCQkJCSMgdXNlZCwgdGhlcmUgaXMgbm8gbG9uZ2VyCisJCQkJCSMgYW55dGhpbmcgbWFnaWNhbCBhYm91dCB0aGUKKwkJCQkJIyAweDkwMDAwIHNlZ21lbnQ7IHRoZSBzZXR1cAorCQkJCQkjIGNhbiBiZSBsb2NhdGVkIGFueXdoZXJlIGluCisJCQkJCSMgbG93IG1lbW9yeSAweDEwMDAwIG9yIGhpZ2hlci4KKworcmFtZGlza19tYXg6CS5sb25nICgtX19QQUdFX09GRlNFVC0oNTEyIDw8IDIwKS0xKSAmIDB4N2ZmZmZmZmYKKwkJCQkJIyAoSGVhZGVyIHZlcnNpb24gMHgwMjAzIG9yIGxhdGVyKQorCQkJCQkjIFRoZSBoaWdoZXN0IHNhZmUgYWRkcmVzcyBmb3IKKwkJCQkJIyB0aGUgY29udGVudHMgb2YgYW4gaW5pdHJkCisKK3RyYW1wb2xpbmU6CWNhbGwJc3RhcnRfb2Zfc2V0dXAKKwkJLmFsaWduIDE2CisJCQkJCSMgVGhlIG9mZnNldCBhdCB0aGlzIHBvaW50IGlzIDB4MjQwCisJCS5zcGFjZQkoMHg3ZmYtMHgyNDArMSkgIyBFODIwICYgRUREIHNwYWNlIChlbmRpbmcgYXQgMHg3ZmYpCisjIEVuZCBvZiBzZXR1cCBoZWFkZXIgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworc3RhcnRfb2Zfc2V0dXA6CisjIEJvb3RsaW4gZGVwZW5kcyBvbiB0aGlzIGJlaW5nIGRvbmUgZWFybHkKKwltb3Z3CSQweDAxNTAwLCAlYXgKKwltb3ZiCSQweDgxLCAlZGwKKwlpbnQJJDB4MTMKKworI2lmZGVmIFNBRkVfUkVTRVRfRElTS19DT05UUk9MTEVSCisjIFJlc2V0IHRoZSBkaXNrIGNvbnRyb2xsZXIuCisJbW92dwkkMHgwMDAwLCAlYXgKKwltb3ZiCSQweDgwLCAlZGwKKwlpbnQJJDB4MTMKKyNlbmRpZgorCisjIFNldCAlZHMgPSAlY3MsIHdlIGtub3cgdGhhdCBTRVRVUFNFRyA9ICVjcyBhdCB0aGlzIHBvaW50CisJbW92dwklY3MsICVheAkJIyBha2EgU0VUVVBTRUcKKwltb3Z3CSVheCwgJWRzCisjIENoZWNrIHNpZ25hdHVyZSBhdCBlbmQgb2Ygc2V0dXAKKwljbXB3CSRTSUcxLCBzZXR1cF9zaWcxCisJam5lCWJhZF9zaWcKKworCWNtcHcJJFNJRzIsIHNldHVwX3NpZzIKKwlqbmUJYmFkX3NpZworCisJam1wCWdvb2Rfc2lnMQorCisjIFJvdXRpbmUgdG8gcHJpbnQgYXNjaWl6IHN0cmluZyBhdCBkczpzaQorcHJ0c3RyOgorCWxvZHNiCisJYW5kYgklYWwsICVhbAorCWp6CWZpbgorCisJY2FsbAlwcnRjaHIKKwlqbXAJcHJ0c3RyCisKK2ZpbjoJcmV0CisKKyMgU3BhY2UgcHJpbnRpbmcKK3BydHNwMjoJY2FsbAlwcnRzcGMJCSMgUHJpbnQgZG91YmxlIHNwYWNlCitwcnRzcGM6CW1vdmIJJDB4MjAsICVhbAkjIFByaW50IHNpbmdsZSBzcGFjZSAobm90ZTogZmFsbC10aHJ1KQorCisjIFBhcnQgb2YgYWJvdmUgcm91dGluZSwgdGhpcyBvbmUganVzdCBwcmludHMgYXNjaWkgYWwKK3BydGNocjoJcHVzaHcJJWF4CisJcHVzaHcJJWN4CisJbW92dwkkNywlYngKKwltb3Z3CSQweDAxLCAlY3gKKwltb3ZiCSQweDBlLCAlYWgKKwlpbnQJJDB4MTAKKwlwb3B3CSVjeAorCXBvcHcJJWF4CisJcmV0CisKK2JlZXA6CW1vdmIJJDB4MDcsICVhbAorCWptcAlwcnRjaHIKKwkKK25vX3NpZ19tZXNzOiAuc3RyaW5nCSJObyBzZXR1cCBzaWduYXR1cmUgZm91bmQgLi4uIgorCitnb29kX3NpZzE6CisJam1wCWdvb2Rfc2lnCisKKyMgV2Ugbm93IGhhdmUgdG8gZmluZCB0aGUgcmVzdCBvZiB0aGUgc2V0dXAgY29kZS9kYXRhCitiYWRfc2lnOgorCW1vdncJJWNzLCAlYXgJCQkjIFNFVFVQU0VHCisJc3VidwkkREVMVEFfSU5JVFNFRywgJWF4CQkjIElOSVRTRUcKKwltb3Z3CSVheCwgJWRzCisJeG9yYgklYmgsICViaAorCW1vdmIJKDQ5NyksICVibAkJCSMgZ2V0IHNldHVwIHNlY3QgZnJvbSBib290c2VjdAorCXN1YncJJDQsICVieAkJCQkjIExJTE8gbG9hZHMgNCBzZWN0b3JzIG9mIHNldHVwCisJc2hsdwkkOCwgJWJ4CQkJCSMgY29udmVydCB0byB3b3JkcyAoMXNlY3Q9Ml44IHdvcmRzKQorCW1vdncJJWJ4LCAlY3gKKwlzaHJ3CSQzLCAlYngJCQkJIyBjb252ZXJ0IHRvIHNlZ21lbnQKKwlhZGR3CSRTWVNTRUcsICVieAorCW1vdncJJWJ4LCAlY3M6c3RhcnRfc3lzX3NlZworIyBNb3ZlIHJlc3Qgb2Ygc2V0dXAgY29kZS9kYXRhIHRvIGhlcmUKKwltb3Z3CSQyMDQ4LCAlZGkJCQkjIGZvdXIgc2VjdG9ycyBsb2FkZWQgYnkgTElMTworCXN1YncJJXNpLCAlc2kKKwlwdXNodwklY3MKKwlwb3B3CSVlcworCW1vdncJJFNZU1NFRywgJWF4CisJbW92dwklYXgsICVkcworCXJlcAorCW1vdnN3CisJbW92dwklY3MsICVheAkJCSMgYWthIFNFVFVQU0VHCisJbW92dwklYXgsICVkcworCWNtcHcJJFNJRzEsIHNldHVwX3NpZzEKKwlqbmUJbm9fc2lnCisKKwljbXB3CSRTSUcyLCBzZXR1cF9zaWcyCisJam5lCW5vX3NpZworCisJam1wCWdvb2Rfc2lnCisKK25vX3NpZzoKKwlsZWEJbm9fc2lnX21lc3MsICVzaQorCWNhbGwJcHJ0c3RyCisKK25vX3NpZ19sb29wOgorCWhsdAorCWptcAlub19zaWdfbG9vcAorCitnb29kX3NpZzoKKwltb3Z3CSVjcywgJWF4CQkJIyBha2EgU0VUVVBTRUcKKwlzdWJ3CSRERUxUQV9JTklUU0VHLCAlYXggCQkjIGFrYSBJTklUU0VHCisJbW92dwklYXgsICVkcworIyBDaGVjayBpZiBhbiBvbGQgbG9hZGVyIHRyaWVzIHRvIGxvYWQgYSBiaWcta2VybmVsCisJdGVzdGIJJExPQURFRF9ISUdILCAlY3M6bG9hZGZsYWdzCSMgRG8gd2UgaGF2ZSBhIGJpZyBrZXJuZWw/CisJanoJbG9hZGVyX29rCQkJIyBObywgbm8gZGFuZ2VyIGZvciBvbGQgbG9hZGVycy4KKworCWNtcGIJJDAsICVjczp0eXBlX29mX2xvYWRlciAJCSMgRG8gd2UgaGF2ZSBhIGxvYWRlciB0aGF0CisJCQkJCQkjIGNhbiBkZWFsIHdpdGggdXM/CisJam56CWxvYWRlcl9vawkJCSMgWWVzLCBjb250aW51ZS4KKworCXB1c2h3CSVjcwkJCQkjIE5vLCB3ZSBoYXZlIGFuIG9sZCBsb2FkZXIsCisJcG9wdwklZHMJCQkJIyBkaWUuIAorCWxlYQlsb2FkZXJfcGFuaWNfbWVzcywgJXNpCisJY2FsbAlwcnRzdHIKKworCWptcAlub19zaWdfbG9vcAorCitsb2FkZXJfcGFuaWNfbWVzczogLnN0cmluZyAiV3JvbmcgbG9hZGVyLCBnaXZpbmcgdXAuLi4iCisKK2xvYWRlcl9vazoKKyMgR2V0IG1lbW9yeSBzaXplIChleHRlbmRlZCBtZW0sIGtCKQorCisJeG9ybAklZWF4LCAlZWF4CisJbW92bAklZWF4LCAoMHgxZTApCisjaWZuZGVmIFNUQU5EQVJEX01FTU9SWV9CSU9TX0NBTEwKKwltb3ZiCSVhbCwgKEU4MjBOUikKKyMgVHJ5IHRocmVlIGRpZmZlcmVudCBtZW1vcnkgZGV0ZWN0aW9uIHNjaGVtZXMuICBGaXJzdCwgdHJ5CisjIGU4MjBoLCB3aGljaCBsZXRzIHVzIGFzc2VtYmxlIGEgbWVtb3J5IG1hcCwgdGhlbiB0cnkgZTgwMWgsCisjIHdoaWNoIHJldHVybnMgYSAzMi1iaXQgbWVtb3J5IHNpemUsIGFuZCBmaW5hbGx5IDg4aCwgd2hpY2gKKyMgcmV0dXJucyAwLTY0bQorCisjIG1ldGhvZCBFODIwSDoKKyMgdGhlIG1lbW9yeSBtYXAgZnJvbSBoZWxsLiAgZTgyMGggcmV0dXJucyBtZW1vcnkgY2xhc3NpZmllZCBpbnRvCisjIGEgd2hvbGUgYnVuY2ggb2YgZGlmZmVyZW50IHR5cGVzLCBhbmQgYWxsb3dzIG1lbW9yeSBob2xlcyBhbmQKKyMgZXZlcnl0aGluZy4gIFdlIHNjYW4gdGhyb3VnaCB0aGlzIG1lbW9yeSBtYXAgYW5kIGJ1aWxkIGEgbGlzdAorIyBvZiB0aGUgZmlyc3QgMzIgbWVtb3J5IGFyZWFzLCB3aGljaCB3ZSByZXR1cm4gYXQgW0U4MjBNQVBdLgorIyBUaGlzIGlzIGRvY3VtZW50ZWQgYXQgaHR0cDovL3d3dy5hY3BpLmluZm8vLCBpbiB0aGUgQUNQSSAyLjAgc3BlY2lmaWNhdGlvbi4KKworI2RlZmluZSBTTUFQICAweDUzNGQ0MTUwCisKK21lbWU4MjA6CisJeG9ybAklZWJ4LCAlZWJ4CQkJIyBjb250aW51YXRpb24gY291bnRlcgorCW1vdncJJEU4MjBNQVAsICVkaQkJCSMgcG9pbnQgaW50byB0aGUgd2hpdGVsaXN0CisJCQkJCQkjIHNvIHdlIGNhbiBoYXZlIHRoZSBiaW9zCisJCQkJCQkjIGRpcmVjdGx5IHdyaXRlIGludG8gaXQuCisKK2ptcGU4MjA6CisJbW92bAkkMHgwMDAwZTgyMCwgJWVheAkJIyBlODIwLCB1cHBlciB3b3JkIHplcm9lZAorCW1vdmwJJFNNQVAsICVlZHgJCQkjIGFzY2lpICdTTUFQJworCW1vdmwJJDIwLCAlZWN4CQkJIyBzaXplIG9mIHRoZSBlODIwcmVjCisJcHVzaHcJJWRzCQkJCSMgZGF0YSByZWNvcmQuCisJcG9wdwklZXMKKwlpbnQJJDB4MTUJCQkJIyBtYWtlIHRoZSBjYWxsCisJamMJYmFpbDgyMAkJCQkjIGZhbGwgdG8gZTgwMSBpZiBpdCBmYWlscworCisJY21wbAkkU01BUCwgJWVheAkJCSMgY2hlY2sgdGhlIHJldHVybiBpcyBgU01BUCcKKwlqbmUJYmFpbDgyMAkJCQkjIGZhbGwgdG8gZTgwMSBpZiBpdCBmYWlscworCisjCWNtcGwJJDEsIDE2KCVkaSkJCQkjIGlzIHRoaXMgdXNhYmxlIG1lbW9yeT8KKyMJam5lCWFnYWluODIwCisKKwkjIElmIHRoaXMgaXMgdXNhYmxlIG1lbW9yeSwgd2Ugc2F2ZSBpdCBieSBzaW1wbHkgYWR2YW5jaW5nICVkaSBieQorCSMgc2l6ZW9mKGU4MjByZWMpLgorCSMKK2dvb2Q4MjA6CisJbW92YgkoRTgyME5SKSwgJWFsCQkJIyB1cCB0byAzMiBlbnRyaWVzCisJY21wYgkkRTgyME1BWCwgJWFsCisJam5sCWJhaWw4MjAKKworCWluY2IJKEU4MjBOUikKKwltb3Z3CSVkaSwgJWF4CisJYWRkdwkkMjAsICVheAorCW1vdncJJWF4LCAlZGkKK2FnYWluODIwOgorCWNtcGwJJDAsICVlYngJCQkjIGNoZWNrIHRvIHNlZSBpZgorCWpuZQlqbXBlODIwCQkJCSMgJWVieCBpcyBzZXQgdG8gRU9GCitiYWlsODIwOgorCisKKyMgbWV0aG9kIEU4MDFIOgorIyBtZW1vcnkgc2l6ZSBpcyBpbiAxayBjaHVua3NpemVzLCB0byBhdm9pZCBjb25mdXNpbmcgbG9hZGxpbi4KKyMgd2Ugc3RvcmUgdGhlIDB4ZTgwMSBtZW1vcnkgc2l6ZSBpbiBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHBsYWNlLAorIyBiZWNhdXNlIGl0IHdpbGwgbW9zdCBsaWtlbHkgYmUgbG9uZ2VyIHRoYW4gMTYgYml0cy4KKyMgKHVzZSAxZTAgYmVjYXVzZSB0aGF0J3Mgd2hhdCBMYXJyeSBBdWd1c3RpbmUgdXNlcyBpbiBoaXMKKyMgYWx0ZXJuYXRpdmUgbmV3IG1lbW9yeSBkZXRlY3Rpb24gc2NoZW1lLCBhbmQgaXQncyBzZW5zaWJsZQorIyB0byB3cml0ZSBldmVyeXRoaW5nIGludG8gdGhlIHNhbWUgcGxhY2UuKQorCittZW1lODAxOgorCXN0YwkJCQkJIyBmaXggdG8gd29yayBhcm91bmQgYnVnZ3kKKwl4b3J3CSVjeCwlY3gJCQkJIyBCSU9TZXMgd2hpY2ggZG9udCBjbGVhci9zZXQKKwl4b3J3CSVkeCwlZHgJCQkJIyBjYXJyeSBvbiBwYXNzL2Vycm9yIG9mCisJCQkJCQkjIGU4MDFoIG1lbW9yeSBzaXplIGNhbGwKKwkJCQkJCSMgb3IgbWVyZWx5IHBhc3MgY3gsZHggdGhvdWdoCisJCQkJCQkjIHdpdGhvdXQgY2hhbmdpbmcgdGhlbS4KKwltb3Z3CSQweGU4MDEsICVheAorCWludAkkMHgxNQorCWpjCW1lbTg4CisKKwljbXB3CSQweDAsICVjeAkJCSMgS2x1ZGdlIHRvIGhhbmRsZSBCSU9TZXMKKwlqbmUJZTgwMXVzZWN4ZHgJCQkjIHdoaWNoIHJlcG9ydCB0aGVpciBleHRlbmRlZAorCWNtcHcJJDB4MCwgJWR4CQkJIyBtZW1vcnkgaW4gQVgvQlggcmF0aGVyIHRoYW4KKwlqbmUJZTgwMXVzZWN4ZHgJCQkjIENYL0RYLiAgVGhlIHNwZWMgSSBoYXZlIHJlYWQKKwltb3Z3CSVheCwgJWN4CQkJIyBzZWVtcyB0byBpbmRpY2F0ZSBBWC9CWCAKKwltb3Z3CSVieCwgJWR4CQkJIyBhcmUgbW9yZSByZWFzb25hYmxlIGFueXdheS4uLgorCitlODAxdXNlY3hkeDoKKwlhbmRsCSQweGZmZmYsICVlZHgJCQkjIGNsZWFyIHNpZ24gZXh0ZW5kCisJc2hsbAkkNiwgJWVkeAkJCSMgYW5kIGdvIGZyb20gNjRrIHRvIDFrIGNodW5rcworCW1vdmwJJWVkeCwgKDB4MWUwKQkJCSMgc3RvcmUgZXh0ZW5kZWQgbWVtb3J5IHNpemUKKwlhbmRsCSQweGZmZmYsICVlY3gJCQkjIGNsZWFyIHNpZ24gZXh0ZW5kCisgCWFkZGwJJWVjeCwgKDB4MWUwKQkJCSMgYW5kIGFkZCBsb3dlciBtZW1vcnkgaW50bworCQkJCQkJIyB0b3RhbCBzaXplLgorCisjIFllIE9sZGUgVHJhZGl0aW9uYWwgTWV0aG9kZS4gIFJldHVybnMgdGhlIG1lbW9yeSBzaXplICh1cCB0byAxNm1iIG9yCisjIDY0bWIsIGRlcGVuZGluZyBvbiB0aGUgYmlvcykgaW4gYXguCittZW04ODoKKworI2VuZGlmCisJbW92YgkkMHg4OCwgJWFoCisJaW50CSQweDE1CisJbW92dwklYXgsICgyKQorCisjIFNldCB0aGUga2V5Ym9hcmQgcmVwZWF0IHJhdGUgdG8gdGhlIG1heAorCW1vdncJJDB4MDMwNSwgJWF4CisJeG9ydwklYngsICVieAorCWludAkkMHgxNgorCisjIENoZWNrIGZvciB2aWRlbyBhZGFwdGVyIGFuZCBpdHMgcGFyYW1ldGVycyBhbmQgYWxsb3cgdGhlCisjIHVzZXIgdG8gYnJvd3NlIHZpZGVvIG1vZGVzLgorCWNhbGwJdmlkZW8JCQkJIyBOT1RFOiB3ZSBuZWVkICVkcyBwb2ludGluZworCQkJCQkJIyB0byBib290c2VjdG9yCisKKyMgR2V0IGhkMCBkYXRhLi4uCisJeG9ydwklYXgsICVheAorCW1vdncJJWF4LCAlZHMKKwlsZHN3CSg0ICogMHg0MSksICVzaQorCW1vdncJJWNzLCAlYXgJCQkjIGFrYSBTRVRVUFNFRworCXN1YncJJERFTFRBX0lOSVRTRUcsICVheAkJIyBha2EgSU5JVFNFRworCXB1c2h3CSVheAorCW1vdncJJWF4LCAlZXMKKwltb3Z3CSQweDAwODAsICVkaQorCW1vdncJJDB4MTAsICVjeAorCXB1c2h3CSVjeAorCWNsZAorCXJlcAorIAltb3ZzYgorIyBHZXQgaGQxIGRhdGEuLi4KKwl4b3J3CSVheCwgJWF4CisJbW92dwklYXgsICVkcworCWxkc3cJKDQgKiAweDQ2KSwgJXNpCisJcG9wdwklY3gKKwlwb3B3CSVlcworCW1vdncJJDB4MDA5MCwgJWRpCisJcmVwCisJbW92c2IKKyMgQ2hlY2sgdGhhdCB0aGVyZSBJUyBhIGhkMSA6LSkKKwltb3Z3CSQweDAxNTAwLCAlYXgKKwltb3ZiCSQweDgxLCAlZGwKKwlpbnQJJDB4MTMKKwlqYwlub19kaXNrMQorCQorCWNtcGIJJDMsICVhaAorCWplCWlzX2Rpc2sxCisKK25vX2Rpc2sxOgorCW1vdncJJWNzLCAlYXgJCQkjIGFrYSBTRVRVUFNFRworCXN1YncJJERFTFRBX0lOSVRTRUcsICVheCAJCSMgYWthIElOSVRTRUcKKwltb3Z3CSVheCwgJWVzCisJbW92dwkkMHgwMDkwLCAlZGkKKwltb3Z3CSQweDEwLCAlY3gKKwl4b3J3CSVheCwgJWF4CisJY2xkCisJcmVwCisJc3Rvc2IKK2lzX2Rpc2sxOgorIyBjaGVjayBmb3IgTWljcm8gQ2hhbm5lbCAoTUNBKSBidXMKKwltb3Z3CSVjcywgJWF4CQkJIyBha2EgU0VUVVBTRUcKKwlzdWJ3CSRERUxUQV9JTklUU0VHLCAlYXgJCSMgYWthIElOSVRTRUcKKwltb3Z3CSVheCwgJWRzCisJeG9ydwklYXgsICVheAorCW1vdncJJWF4LCAoMHhhMCkJCQkjIHNldCB0YWJsZSBsZW5ndGggdG8gMAorCW1vdmIJJDB4YzAsICVhaAorCXN0YworCWludAkkMHgxNQkJCQkjIG1vdmVzIGZlYXR1cmUgdGFibGUgdG8gZXM6YngKKwlqYwlub19tY2EKKworCXB1c2h3CSVkcworCW1vdncJJWVzLCAlYXgKKwltb3Z3CSVheCwgJWRzCisJbW92dwklY3MsICVheAkJCSMgYWthIFNFVFVQU0VHCisJc3VidwkkREVMVEFfSU5JVFNFRywgJWF4CQkjIGFrYSBJTklUU0VHCisJbW92dwklYXgsICVlcworCW1vdncJJWJ4LCAlc2kKKwltb3Z3CSQweGEwLCAlZGkKKwltb3Z3CSglc2kpLCAlY3gKKwlhZGR3CSQyLCAlY3gJCQkJIyB0YWJsZSBsZW5ndGggaXMgYSBzaG9ydAorCWNtcHcJJDB4MTAsICVjeAorCWpjCXN5c2Rlc2Nfb2sKKworCW1vdncJJDB4MTAsICVjeAkJCSMgd2Uga2VlcCBvbmx5IGZpcnN0IDE2IGJ5dGVzCitzeXNkZXNjX29rOgorCXJlcAorCW1vdnNiCisJcG9wdwklZHMKK25vX21jYToKKyNpZmRlZiBDT05GSUdfWDg2X1ZPWUFHRVIKKwltb3ZiCSQweGZmLCAweDQwCSMgZmxhZyBvbiBjb25maWcgZm91bmQKKwltb3ZiCSQweGMwLCAlYWwKKwltb3YJJDB4ZmYsICVhaAorCWludAkkMHgxNQkJIyBwdXQgdm95YWdlciBjb25maWcgaW5mbyBhdCBlczpkaQorCWpjCW5vX3ZveWFnZXIKKwltb3Z3CSQweDQwLCAlc2kJIyBwbGFjZSB2b3lhZ2VyIGluZm8gaW4gYXBtIHRhYmxlCisJY2xkCisJbW92dwkkNywgJWN4Cit2b3lhZ2VyX3JlcDoKKwltb3ZiCSVlczooJWRpKSwgJWFsCisJbW92YgklYWwsKCVzaSkKKwlpbmN3CSVkaQorCWluY3cJJXNpCisJZGVjdwklY3gKKwlqbnoJdm95YWdlcl9yZXAKK25vX3ZveWFnZXI6CQorI2VuZGlmCisjIENoZWNrIGZvciBQUy8yIHBvaW50aW5nIGRldmljZQorCW1vdncJJWNzLCAlYXgJCQkjIGFrYSBTRVRVUFNFRworCXN1YncJJERFTFRBX0lOSVRTRUcsICVheAkJIyBha2EgSU5JVFNFRworCW1vdncJJWF4LCAlZHMKKwltb3Z3CSQwLCAoMHgxZmYpCQkJIyBkZWZhdWx0IGlzIG5vIHBvaW50aW5nIGRldmljZQorCWludAkkMHgxMQkJCQkjIGludCAweDExOiBlcXVpcG1lbnQgbGlzdAorCXRlc3RiCSQweDA0LCAlYWwJCQkjIGNoZWNrIGlmIG1vdXNlIGluc3RhbGxlZAorCWp6CW5vX3BzbW91c2UKKworCW1vdncJJDB4QUEsICgweDFmZikJCQkjIGRldmljZSBwcmVzZW50Citub19wc21vdXNlOgorCisjaWYgZGVmaW5lZChDT05GSUdfWDg2X1NQRUVEU1RFUF9TTUkpIHx8IGRlZmluZWQoQ09ORklHX1g4Nl9TUEVFRFNURVBfU01JX01PRFVMRSkKKwltb3ZsCSQweDAwMDBFOTgwLCAlZWF4CQkjIElTVCBTdXBwb3J0IAorCW1vdmwJJDB4NDc1MzQ5NDMsICVlZHgJCSMgUmVxdWVzdCB2YWx1ZQorCWludAkkMHgxNQorCisJbW92bAklZWF4LCAoOTYpCisJbW92bAklZWJ4LCAoMTAwKQorCW1vdmwJJWVjeCwgKDEwNCkKKwltb3ZsCSVlZHgsICgxMDgpCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0FQTSkgfHwgZGVmaW5lZChDT05GSUdfQVBNX01PRFVMRSkKKyMgVGhlbiBjaGVjayBmb3IgYW4gQVBNIEJJT1MuLi4KKwkJCQkJCSMgJWRzIHBvaW50cyB0byB0aGUgYm9vdHNlY3RvcgorCW1vdncJJDAsIDB4NDAJCQkjIHZlcnNpb24gPSAwIG1lYW5zIG5vIEFQTSBCSU9TCisJbW92dwkkMHgwNTMwMCwgJWF4CQkJIyBBUE0gQklPUyBpbnN0YWxsYXRpb24gY2hlY2sKKwl4b3J3CSVieCwgJWJ4CisJaW50CSQweDE1CisJamMJZG9uZV9hcG1fYmlvcwkJCSMgTm9wZSwgbm8gQVBNIEJJT1MKKwkKKwljbXB3CSQweDA1MDRkLCAlYngJCQkjIENoZWNrIGZvciAiUE0iIHNpZ25hdHVyZQorCWpuZQlkb25lX2FwbV9iaW9zCQkJIyBObyBzaWduYXR1cmUsIG5vIEFQTSBCSU9TCisKKwlhbmR3CSQweDAyLCAlY3gJCQkjIElzIDMyIGJpdCBzdXBwb3J0ZWQ/CisJamUJZG9uZV9hcG1fYmlvcwkJCSMgTm8gMzItYml0LCBubyAoZ29vZCkgQVBNIEJJT1MKKworCW1vdncJJDB4MDUzMDQsICVheAkJCSMgRGlzY29ubmVjdCBmaXJzdCBqdXN0IGluIGNhc2UKKwl4b3J3CSVieCwgJWJ4CisJaW50CSQweDE1CQkJCSMgaWdub3JlIHJldHVybiBjb2RlCisJbW92dwkkMHgwNTMwMywgJWF4CQkJIyAzMiBiaXQgY29ubmVjdAorCXhvcmwJJWVieCwgJWVieAorCXhvcncJJWN4LCAlY3gJCQkjIHBhcmFub2lhIDotKQorCXhvcncJJWR4LCAlZHgJCQkjICAgLi4uCisJeG9ybAklZXNpLCAlZXNpCQkJIyAgIC4uLgorCXhvcncJJWRpLCAlZGkJCQkjICAgLi4uCisJaW50CSQweDE1CisJamMJbm9fMzJfYXBtX2Jpb3MJCQkjIEFjaywgZXJyb3IuIAorCisJbW92dwklYXgsICAoNjYpCQkJIyBCSU9TIGNvZGUgc2VnbWVudAorCW1vdmwJJWVieCwgKDY4KQkJCSMgQklPUyBlbnRyeSBwb2ludCBvZmZzZXQKKwltb3Z3CSVjeCwgICg3MikJCQkjIEJJT1MgMTYgYml0IGNvZGUgc2VnbWVudAorCW1vdncJJWR4LCAgKDc0KQkJCSMgQklPUyBkYXRhIHNlZ21lbnQKKwltb3ZsCSVlc2ksICg3OCkJCQkjIEJJT1MgY29kZSBzZWdtZW50IGxlbmd0aHMKKwltb3Z3CSVkaSwgICg4MikJCQkjIEJJT1MgZGF0YSBzZWdtZW50IGxlbmd0aAorIyBSZWRvIHRoZSBpbnN0YWxsYXRpb24gY2hlY2sgYXMgdGhlIDMyIGJpdCBjb25uZWN0CisjIG1vZGlmaWVzIHRoZSBmbGFncyByZXR1cm5lZCBvbiBzb21lIEJJT1NzCisJbW92dwkkMHgwNTMwMCwgJWF4CQkJIyBBUE0gQklPUyBpbnN0YWxsYXRpb24gY2hlY2sKKwl4b3J3CSVieCwgJWJ4CisJeG9ydwklY3gsICVjeAkJCSMgcGFyYW5vaWEKKwlpbnQJJDB4MTUKKwlqYwlhcG1fZGlzY29ubmVjdAkJCSMgZXJyb3IgLT4gc2hvdWxkbid0IGhhcHBlbgorCisJY21wdwkkMHgwNTA0ZCwgJWJ4CQkJIyBjaGVjayBmb3IgIlBNIiBzaWduYXR1cmUKKwlqbmUJYXBtX2Rpc2Nvbm5lY3QJCQkjIG5vIHNpZyAtPiBzaG91bGRuJ3QgaGFwcGVuCisKKwltb3Z3CSVheCwgKDY0KQkJCSMgcmVjb3JkIHRoZSBBUE0gQklPUyB2ZXJzaW9uCisJbW92dwklY3gsICg3NikJCQkjIGFuZCBmbGFncworCWptcAlkb25lX2FwbV9iaW9zCisKK2FwbV9kaXNjb25uZWN0OgkJCQkJIyBUaWR5IHVwCisJbW92dwkkMHgwNTMwNCwgJWF4CQkJIyBEaXNjb25uZWN0CisJeG9ydwklYngsICVieAorCWludAkkMHgxNQkJCQkjIGlnbm9yZSByZXR1cm4gY29kZQorCisJam1wCWRvbmVfYXBtX2Jpb3MKKworbm9fMzJfYXBtX2Jpb3M6CisJYW5kdwkkMHhmZmZkLCAoNzYpCQkJIyByZW1vdmUgMzIgYml0IHN1cHBvcnQgYml0Citkb25lX2FwbV9iaW9zOgorI2VuZGlmCisKKyNpbmNsdWRlICJlZGQuUyIKKworIyBOb3cgd2Ugd2FudCB0byBtb3ZlIHRvIHByb3RlY3RlZCBtb2RlIC4uLgorCWNtcHcJJDAsICVjczpyZWFsbW9kZV9zd3RjaAorCWp6CXJtb2Rlc3d0Y2hfbm9ybWFsCisKKwlsY2FsbAkqJWNzOnJlYWxtb2RlX3N3dGNoCisKKwlqbXAJcm1vZGVzd3RjaF9lbmQKKworcm1vZGVzd3RjaF9ub3JtYWw6CisgICAgICAgIHB1c2h3CSVjcworCWNhbGwJZGVmYXVsdF9zd2l0Y2gKKworcm1vZGVzd3RjaF9lbmQ6CisjIHdlIGdldCB0aGUgY29kZTMyIHN0YXJ0IGFkZHJlc3MgYW5kIG1vZGlmeSB0aGUgYmVsb3cgJ2ptcGknCisjIChsb2FkZXIgbWF5IGhhdmUgY2hhbmdlZCBpdCkKKwltb3ZsCSVjczpjb2RlMzJfc3RhcnQsICVlYXgKKwltb3ZsCSVlYXgsICVjczpjb2RlMzIKKworIyBOb3cgd2UgbW92ZSB0aGUgc3lzdGVtIHRvIGl0cyByaWdodGZ1bCBwbGFjZSAuLi4gYnV0IHdlIGNoZWNrIGlmIHdlIGhhdmUgYQorIyBiaWcta2VybmVsLiBJbiB0aGF0IGNhc2Ugd2UgKm11c3QqIG5vdCBtb3ZlIGl0IC4uLgorCXRlc3RiCSRMT0FERURfSElHSCwgJWNzOmxvYWRmbGFncworCWp6CWRvX21vdmUwCQkJIyAuLiB0aGVuIHdlIGhhdmUgYSBub3JtYWwgbG93CisJCQkJCQkjIGxvYWRlZCB6SW1hZ2UKKwkJCQkJCSMgLi4gb3IgZWxzZSB3ZSBoYXZlIGEgaGlnaAorCQkJCQkJIyBsb2FkZWQgYnpJbWFnZQorCWptcAllbmRfbW92ZQkJCSMgLi4uIGFuZCB3ZSBza2lwIG1vdmluZworCitkb19tb3ZlMDoKKwltb3Z3CSQweDEwMCwgJWF4CQkJIyBzdGFydCBvZiBkZXN0aW5hdGlvbiBzZWdtZW50CisJbW92dwklY3MsICVicAkJCSMgYWthIFNFVFVQU0VHCisJc3VidwkkREVMVEFfSU5JVFNFRywgJWJwCQkjIGFrYSBJTklUU0VHCisJbW92dwklY3M6c3RhcnRfc3lzX3NlZywgJWJ4CQkjIHN0YXJ0IG9mIHNvdXJjZSBzZWdtZW50CisJY2xkCitkb19tb3ZlOgorCW1vdncJJWF4LCAlZXMJCQkjIGRlc3RpbmF0aW9uIHNlZ21lbnQKKwlpbmNiCSVhaAkJCQkjIGluc3RlYWQgb2YgYWRkIGF4LCMweDEwMAorCW1vdncJJWJ4LCAlZHMJCQkjIHNvdXJjZSBzZWdtZW50CisJYWRkdwkkMHgxMDAsICVieAorCXN1YncJJWRpLCAlZGkKKwlzdWJ3CSVzaSwgJXNpCisJbW92dyAJJDB4ODAwLCAlY3gKKwlyZXAKKwltb3ZzdworCWNtcHcJJWJwLCAlYngJCQkjIGFzc3VtZSBzdGFydF9zeXNfc2VnID4gMHgyMDAsCisJCQkJCQkjIHNvIHdlIHdpbGwgcGVyaGFwcyByZWFkIG9uZQorCQkJCQkJIyBwYWdlIG1vcmUgdGhhbiBuZWVkZWQsIGJ1dAorCQkJCQkJIyBuZXZlciBvdmVyd3JpdGUgSU5JVFNFRworCQkJCQkJIyBiZWNhdXNlIGRlc3RpbmF0aW9uIGlzIGEKKwkJCQkJCSMgbWluaW11bSBvbmUgcGFnZSBiZWxvdyBzb3VyY2UKKwlqYglkb19tb3ZlCisKK2VuZF9tb3ZlOgorIyB0aGVuIHdlIGxvYWQgdGhlIHNlZ21lbnQgZGVzY3JpcHRvcnMKKwltb3Z3CSVjcywgJWF4CQkJIyBha2EgU0VUVVBTRUcKKwltb3Z3CSVheCwgJWRzCisJCQorIyBDaGVjayB3aGV0aGVyIHdlIG5lZWQgdG8gYmUgZG93bndhcmQgY29tcGF0aWJsZSB3aXRoIHZlcnNpb24gPD0yMDEKKwljbXBsCSQwLCBjbWRfbGluZV9wdHIKKwlqbmUJZW5kX21vdmVfc2VsZgkJIyBsb2FkZXIgdXNlcyB2ZXJzaW9uID49MjAyIGZlYXR1cmVzCisJY21wYgkkMHgyMCwgdHlwZV9vZl9sb2FkZXIKKwlqZQllbmRfbW92ZV9zZWxmCQkjIGJvb3RzZWN0IGxvYWRlciwgd2Uga25vdyBvZiBpdAorCisjIEJvb3QgbG9hZGVyIGRvZXNudCBzdXBwb3J0IGJvb3QgcHJvdG9jb2wgdmVyc2lvbiAyLjAyLgorIyBJZiB3ZSBoYXZlIG91ciBjb2RlIG5vdCBhdCAweDkwMDAwLCB3ZSBuZWVkIHRvIG1vdmUgaXQgdGhlcmUgbm93LgorIyBXZSBhbHNvIHRoZW4gbmVlZCB0byBtb3ZlIHRoZSBwYXJhbXMgYmVoaW5kIGl0IChjb21tYW5kbGluZSkKKyMgQmVjYXVzZSB3ZSB3b3VsZCBvdmVyd3JpdGUgdGhlIGNvZGUgb24gdGhlIGN1cnJlbnQgSVAsIHdlIG1vdmUKKyMgaXQgaW4gdHdvIHN0ZXBzLCBqdW1waW5nIGhpZ2ggYWZ0ZXIgdGhlIGZpcnN0IG9uZS4KKwltb3Z3CSVjcywgJWF4CisJY21wdwkkU0VUVVBTRUcsICVheAorCWplCWVuZF9tb3ZlX3NlbGYKKworCWNsaQkJCQkJIyBtYWtlIHN1cmUgd2UgcmVhbGx5IGhhdmUKKwkJCQkJCSMgaW50ZXJydXB0cyBkaXNhYmxlZCAhCisJCQkJCQkjIGJlY2F1c2UgYWZ0ZXIgdGhpcyB0aGUgc3RhY2sKKwkJCQkJCSMgc2hvdWxkIG5vdCBiZSB1c2VkCisJc3VidwkkREVMVEFfSU5JVFNFRywgJWF4CQkjIGFrYSBJTklUU0VHCisJbW92dwklc3MsICVkeAorCWNtcHcJJWF4LCAlZHgKKwlqYgltb3ZlX3NlbGZfMQorCisJYWRkdwkkSU5JVFNFRywgJWR4CisJc3VidwklYXgsICVkeAkJCSMgdGhpcyB3aWxsIGdvIGludG8gJXNzIGFmdGVyCisJCQkJCQkjIHRoZSBtb3ZlCittb3ZlX3NlbGZfMToKKwltb3Z3CSVheCwgJWRzCisJbW92dwkkSU5JVFNFRywgJWF4CQkJIyByZWFsIElOSVRTRUcKKwltb3Z3CSVheCwgJWVzCisJbW92dwklY3M6c2V0dXBfbW92ZV9zaXplLCAlY3gKKwlzdGQJCQkJCSMgd2UgaGF2ZSB0byBtb3ZlIHVwLCBzbyB3ZSB1c2UKKwkJCQkJCSMgZGlyZWN0aW9uIGRvd24gYmVjYXVzZSB0aGUKKwkJCQkJCSMgYXJlYXMgbWF5IG92ZXJsYXAKKwltb3Z3CSVjeCwgJWRpCisJZGVjdwklZGkKKwltb3Z3CSVkaSwgJXNpCisJc3VidwkkbW92ZV9zZWxmX2hlcmUrMHgyMDAsICVjeAorCXJlcAorCW1vdnNiCisJbGptcAkkU0VUVVBTRUcsICRtb3ZlX3NlbGZfaGVyZQorCittb3ZlX3NlbGZfaGVyZToKKwltb3Z3CSRtb3ZlX3NlbGZfaGVyZSsweDIwMCwgJWN4CisJcmVwCisJbW92c2IKKwltb3Z3CSRTRVRVUFNFRywgJWF4CisJbW92dwklYXgsICVkcworCW1vdncJJWR4LCAlc3MKK2VuZF9tb3ZlX3NlbGY6CQkJCQkjIG5vdyB3ZSBhcmUgYXQgdGhlIHJpZ2h0IHBsYWNlCisKKyMKKyMgRW5hYmxlIEEyMC4gIFRoaXMgaXMgYXQgdGhlIHZlcnkgYmVzdCBhbiBhbm5veWluZyBwcm9jZWR1cmUuCisjIEEyMCBjb2RlIHBvcnRlZCBmcm9tIFNZU0xJTlVYIDEuNTItMS42MyBieSBILiBQZXRlciBBbnZpbi4KKyMgQU1EIEVsYW4gYnVnIGZpeCBieSBSb2JlcnQgU2Nod2ViZWwuCisjCisKKyNpZiBkZWZpbmVkKENPTkZJR19YODZfRUxBTikKKwltb3ZiICQweDAyLCAlYWwJCQkjIGFsdGVybmF0ZSBBMjAgZ2F0ZQorCW91dGIgJWFsLCAkMHg5MgkJCSMgdGhpcyB3b3JrcyBvbiBTQzQxMC9TQzUyMAorYTIwX2VsYW5fd2FpdDoKKwljYWxsIGEyMF90ZXN0CisJanogYTIwX2VsYW5fd2FpdAorCWptcCBhMjBfZG9uZQorI2VuZGlmCisKKworQTIwX1RFU1RfTE9PUFMJCT0gIDMyCQkjIEl0ZXJhdGlvbnMgcGVyIHdhaXQKK0EyMF9FTkFCTEVfTE9PUFMJPSAyNTUJCSMgVG90YWwgbG9vcHMgdG8gdHJ5CQkKKworCisjaWZuZGVmIENPTkZJR19YODZfVk9ZQUdFUgorYTIwX3RyeV9sb29wOgorCisJIyBGaXJzdCwgc2VlIGlmIHdlIGFyZSBvbiBhIHN5c3RlbSB3aXRoIG5vIEEyMCBnYXRlLgorYTIwX25vbmU6CisJY2FsbAlhMjBfdGVzdAorCWpueglhMjBfZG9uZQorCisJIyBOZXh0LCB0cnkgdGhlIEJJT1MgKElOVCAweDE1LCBBWD0weDI0MDEpCithMjBfYmlvczoKKwltb3Z3CSQweDI0MDEsICVheAorCXB1c2hmbAkJCQkJIyBCZSBwYXJhbm9pZCBhYm91dCBmbGFncworCWludAkkMHgxNQorCXBvcGZsCisKKwljYWxsCWEyMF90ZXN0CisJam56CWEyMF9kb25lCisKKwkjIFRyeSBlbmFibGluZyBBMjAgdGhyb3VnaCB0aGUga2V5Ym9hcmQgY29udHJvbGxlcgorI2VuZGlmIC8qIENPTkZJR19YODZfVk9ZQUdFUiAqLworYTIwX2tiYzoKKwljYWxsCWVtcHR5XzgwNDIKKworI2lmbmRlZiBDT05GSUdfWDg2X1ZPWUFHRVIKKwljYWxsCWEyMF90ZXN0CQkJIyBKdXN0IGluIGNhc2UgdGhlIEJJT1Mgd29ya2VkCisJam56CWEyMF9kb25lCQkJIyBidXQgaGFkIGEgZGVsYXllZCByZWFjdGlvbi4KKyNlbmRpZgorCisJbW92YgkkMHhEMSwgJWFsCQkJIyBjb21tYW5kIHdyaXRlCisJb3V0YgklYWwsICQweDY0CisJY2FsbAllbXB0eV84MDQyCisKKwltb3ZiCSQweERGLCAlYWwJCQkjIEEyMCBvbgorCW91dGIJJWFsLCAkMHg2MAorCWNhbGwJZW1wdHlfODA0MgorCisjaWZuZGVmIENPTkZJR19YODZfVk9ZQUdFUgorCSMgV2FpdCB1bnRpbCBhMjAgcmVhbGx5ICppcyogZW5hYmxlZDsgaXQgY2FuIHRha2UgYSBmYWlyIGFtb3VudCBvZgorCSMgdGltZSBvbiBjZXJ0YWluIHN5c3RlbXM7IFRvc2hpYmEgVGVjcmFzIGFyZSBrbm93biB0byBoYXZlIHRoaXMKKwkjIHByb2JsZW0uCithMjBfa2JjX3dhaXQ6CisJeG9ydwklY3gsICVjeAorYTIwX2tiY193YWl0X2xvb3A6CisJY2FsbAlhMjBfdGVzdAorCWpueglhMjBfZG9uZQorCWxvb3AJYTIwX2tiY193YWl0X2xvb3AKKworCSMgRmluYWwgYXR0ZW1wdDogdXNlICJjb25maWd1cmF0aW9uIHBvcnQgQSIKK2EyMF9mYXN0OgorCWluYgkkMHg5MiwgJWFsCQkJIyBDb25maWd1cmF0aW9uIFBvcnQgQQorCW9yYgkkMHgwMiwgJWFsCQkJIyAiZmFzdCBBMjAiIHZlcnNpb24KKwlhbmRiCSQweEZFLCAlYWwJCQkjIGRvbid0IGFjY2lkZW50YWxseSByZXNldAorCW91dGIJJWFsLCAkMHg5MgorCisJIyBXYWl0IGZvciBjb25maWd1cmF0aW9uIHBvcnQgQSB0byB0YWtlIGVmZmVjdAorYTIwX2Zhc3Rfd2FpdDoKKwl4b3J3CSVjeCwgJWN4CithMjBfZmFzdF93YWl0X2xvb3A6CisJY2FsbAlhMjBfdGVzdAorCWpueglhMjBfZG9uZQorCWxvb3AJYTIwX2Zhc3Rfd2FpdF9sb29wCisKKwkjIEEyMCBpcyBzdGlsbCBub3QgcmVzcG9uZGluZy4gIFRyeSBmcm9iYmluZyBpdCBhZ2Fpbi4KKwkjIAorCWRlY2IJKGEyMF90cmllcykKKwlqbnoJYTIwX3RyeV9sb29wCisJCisJbW92dwkkYTIwX2Vycl9tc2csICVzaQorCWNhbGwJcHJ0c3RyCisKK2EyMF9kaWU6CisJaGx0CisJam1wCWEyMF9kaWUKKworYTIwX3RyaWVzOgorCS5ieXRlCUEyMF9FTkFCTEVfTE9PUFMKKworYTIwX2Vycl9tc2c6CisJLmFzY2lpCSJsaW51eDogZmF0YWwgZXJyb3I6IEEyMCBnYXRlIG5vdCByZXNwb25kaW5nISIKKwkuYnl0ZQkxMywgMTAsIDAKKworCSMgSWYgd2UgZ2V0IGhlcmUsIGFsbCBpcyBnb29kCithMjBfZG9uZToKKworI2VuZGlmIC8qIENPTkZJR19YODZfVk9ZQUdFUiAqLworIyBzZXQgdXAgZ2R0IGFuZCBpZHQKKwlsaWR0CWlkdF80OAkJCQkjIGxvYWQgaWR0IHdpdGggMCwwCisJeG9ybAklZWF4LCAlZWF4CQkJIyBDb21wdXRlIGdkdF9iYXNlCisJbW92dwklZHMsICVheAkJCSMgKENvbnZlcnQgJWRzOmdkdCB0byBhIGxpbmVhciBwdHIpCisJc2hsbAkkNCwgJWVheAorCWFkZGwJJGdkdCwgJWVheAorCW1vdmwJJWVheCwgKGdkdF80OCsyKQorCWxnZHQJZ2R0XzQ4CQkJCSMgbG9hZCBnZHQgd2l0aCB3aGF0ZXZlciBpcworCQkJCQkJIyBhcHByb3ByaWF0ZQorCisjIG1ha2Ugc3VyZSBhbnkgcG9zc2libGUgY29wcm9jZXNzb3IgaXMgcHJvcGVybHkgcmVzZXQuLgorCXhvcncJJWF4LCAlYXgKKwlvdXRiCSVhbCwgJDB4ZjAKKwljYWxsCWRlbGF5CisKKwlvdXRiCSVhbCwgJDB4ZjEKKwljYWxsCWRlbGF5CisKKyMgd2VsbCwgdGhhdCB3ZW50IG9rLCBJIGhvcGUuIE5vdyB3ZSBtYXNrIGFsbCBpbnRlcnJ1cHRzIC0gdGhlIHJlc3QKKyMgaXMgZG9uZSBpbiBpbml0X0lSUSgpLgorCW1vdmIJJDB4RkYsICVhbAkJCSMgbWFzayBhbGwgaW50ZXJydXB0cyBmb3Igbm93CisJb3V0YgklYWwsICQweEExCisJY2FsbAlkZWxheQorCQorCW1vdmIJJDB4RkIsICVhbAkJCSMgbWFzayBhbGwgaXJxJ3MgYnV0IGlycTIgd2hpY2gKKwlvdXRiCSVhbCwgJDB4MjEJCQkjIGlzIGNhc2NhZGVkCisKKyMgV2VsbCwgdGhhdCBjZXJ0YWlubHkgd2Fzbid0IGZ1biA6LSguIEhvcGVmdWxseSBpdCB3b3JrcywgYW5kIHdlIGRvbid0CisjIG5lZWQgbm8gc3RlZW5raW5nIEJJT1MgYW55d2F5IChleGNlcHQgZm9yIHRoZSBpbml0aWFsIGxvYWRpbmcgOi0pLgorIyBUaGUgQklPUy1yb3V0aW5lIHdhbnRzIGxvdHMgb2YgdW5uZWNlc3NhcnkgZGF0YSwgYW5kIGl0J3MgbGVzcworIyAiaW50ZXJlc3RpbmciIGFueXdheS4gVGhpcyBpcyBob3cgUkVBTCBwcm9ncmFtbWVycyBkbyBpdC4KKyMKKyMgV2VsbCwgbm93J3MgdGhlIHRpbWUgdG8gYWN0dWFsbHkgbW92ZSBpbnRvIHByb3RlY3RlZCBtb2RlLiBUbyBtYWtlCisjIHRoaW5ncyBhcyBzaW1wbGUgYXMgcG9zc2libGUsIHdlIGRvIG5vIHJlZ2lzdGVyIHNldC11cCBvciBhbnl0aGluZywKKyMgd2UgbGV0IHRoZSBnbnUtY29tcGlsZWQgMzItYml0IHByb2dyYW1zIGRvIHRoYXQuIFdlIGp1c3QganVtcCB0bworIyBhYnNvbHV0ZSBhZGRyZXNzIDB4MTAwMCAob3IgdGhlIGxvYWRlciBzdXBwbGllZCBvbmUpLAorIyBpbiAzMi1iaXQgcHJvdGVjdGVkIG1vZGUuCisjCisjIE5vdGUgdGhhdCB0aGUgc2hvcnQganVtcCBpc24ndCBzdHJpY3RseSBuZWVkZWQsIGFsdGhvdWdoIHRoZXJlIGFyZQorIyByZWFzb25zIHdoeSBpdCBtaWdodCBiZSBhIGdvb2QgaWRlYS4gSXQgd29uJ3QgaHVydCBpbiBhbnkgY2FzZS4KKwltb3Z3CSQxLCAlYXgJCQkJIyBwcm90ZWN0ZWQgbW9kZSAoUEUpIGJpdAorCWxtc3cJJWF4CQkJCSMgVGhpcyBpcyBpdCEKKwlqbXAJZmx1c2hfaW5zdHIKKworZmx1c2hfaW5zdHI6CisJeG9ydwklYngsICVieAkJCSMgRmxhZyB0byBpbmRpY2F0ZSBhIGJvb3QKKwl4b3JsCSVlc2ksICVlc2kJCQkjIFBvaW50ZXIgdG8gcmVhbC1tb2RlIGNvZGUKKwltb3Z3CSVjcywgJXNpCisJc3VidwkkREVMVEFfSU5JVFNFRywgJXNpCisJc2hsbAkkNCwgJWVzaQkJCSMgQ29udmVydCB0byAzMi1iaXQgcG9pbnRlcgorCisjIGp1bXAgdG8gc3RhcnR1cF8zMiBpbiBhcmNoL2kzODYvYm9vdC9jb21wcmVzc2VkL2hlYWQuUworIwkKKyMgTk9URTogRm9yIGhpZ2ggbG9hZGVkIGJpZyBrZXJuZWxzIHdlIG5lZWQgYQorIwlqbXBpICAgIDB4MTAwMDAwLF9fQk9PVF9DUworIworIwlidXQgd2UgeWV0IGhhdmVuJ3QgcmVsb2FkZWQgdGhlIENTIHJlZ2lzdGVyLCBzbyB0aGUgZGVmYXVsdCBzaXplIAorIwlvZiB0aGUgdGFyZ2V0IG9mZnNldCBzdGlsbCBpcyAxNiBiaXQuCisjICAgICAgIEhvd2V2ZXIsIHVzaW5nIGFuIG9wZXJhbmQgcHJlZml4ICgweDY2KSwgdGhlIENQVSB3aWxsIHByb3Blcmx5CisjCXRha2Ugb3VyIDQ4IGJpdCBmYXIgcG9pbnRlci4gKElOVGVMIDgwMzg2IFByb2dyYW1tZXIncyBSZWZlcmVuY2UKKyMJTWFudWFsLCBNaXhpbmcgMTYtYml0IGFuZCAzMi1iaXQgY29kZSwgcGFnZSAxNi02KQorCisJLmJ5dGUgMHg2NiwgMHhlYQkJCSMgcHJlZml4ICsgam1waS1vcGNvZGUKK2NvZGUzMjoJLmxvbmcJMHgxMDAwCQkJCSMgd2lsbCBiZSBzZXQgdG8gMHgxMDAwMDAKKwkJCQkJCSMgZm9yIGJpZyBrZXJuZWxzCisJLndvcmQJX19CT09UX0NTCisKKyMgSGVyZSdzIGEgYnVuY2ggb2YgaW5mb3JtYXRpb24gYWJvdXQgeW91ciBjdXJyZW50IGtlcm5lbC4uCitrZXJuZWxfdmVyc2lvbjoJLmFzY2lpCVVUU19SRUxFQVNFCisJCS5hc2NpaQkiICgiCisJCS5hc2NpaQlMSU5VWF9DT01QSUxFX0JZCisJCS5hc2NpaQkiQCIKKwkJLmFzY2lpCUxJTlVYX0NPTVBJTEVfSE9TVAorCQkuYXNjaWkJIikgIgorCQkuYXNjaWkJVVRTX1ZFUlNJT04KKwkJLmJ5dGUJMAorCisjIFRoaXMgaXMgdGhlIGRlZmF1bHQgcmVhbCBtb2RlIHN3aXRjaCByb3V0aW5lLgorIyB0byBiZSBjYWxsZWQganVzdCBiZWZvcmUgcHJvdGVjdGVkIG1vZGUgdHJhbnNpdGlvbgorZGVmYXVsdF9zd2l0Y2g6CisJY2xpCQkJCQkjIG5vIGludGVycnVwdHMgYWxsb3dlZCAhCisJbW92YgkkMHg4MCwgJWFsCQkJIyBkaXNhYmxlIE5NSSBmb3IgYm9vdHVwCisJCQkJCQkjIHNlcXVlbmNlCisJb3V0YgklYWwsICQweDcwCisJbHJldAorCisKKyNpZm5kZWYgQ09ORklHX1g4Nl9WT1lBR0VSCisjIFRoaXMgcm91dGluZSB0ZXN0cyB3aGV0aGVyIG9yIG5vdCBBMjAgaXMgZW5hYmxlZC4gIElmIHNvLCBpdAorIyBleGl0cyB3aXRoIHpmID0gMC4KKyMKKyMgVGhlIG1lbW9yeSBhZGRyZXNzIHVzZWQsIDB4MjAwLCBpcyB0aGUgaW50ICQweDgwIHZlY3Rvciwgd2hpY2gKKyMgc2hvdWxkIGJlIHNhZmUuCisKK0EyMF9URVNUX0FERFIgPSA0KjB4ODAKKworYTIwX3Rlc3Q6CisJcHVzaHcJJWN4CisJcHVzaHcJJWF4CisJeG9ydwklY3gsICVjeAorCW1vdncJJWN4LCAlZnMJCQkjIExvdyBtZW1vcnkKKwlkZWN3CSVjeAorCW1vdncJJWN4LCAlZ3MJCQkjIEhpZ2ggbWVtb3J5IGFyZWEKKwltb3Z3CSRBMjBfVEVTVF9MT09QUywgJWN4CisJbW92dwklZnM6KEEyMF9URVNUX0FERFIpLCAlYXgKKwlwdXNodwklYXgKK2EyMF90ZXN0X3dhaXQ6CisJaW5jdwklYXgKKwltb3Z3CSVheCwgJWZzOihBMjBfVEVTVF9BRERSKQorCWNhbGwJZGVsYXkJCQkJIyBTZXJpYWxpemUgYW5kIG1ha2UgZGVsYXkgY29uc3RhbnQKKwljbXB3CSVnczooQTIwX1RFU1RfQUREUisweDEwKSwgJWF4CisJbG9vcGUJYTIwX3Rlc3Rfd2FpdAorCisJcG9wdwklZnM6KEEyMF9URVNUX0FERFIpCisJcG9wdwklYXgKKwlwb3B3CSVjeAorCXJldAkKKworI2VuZGlmIC8qIENPTkZJR19YODZfVk9ZQUdFUiAqLworCisjIFRoaXMgcm91dGluZSBjaGVja3MgdGhhdCB0aGUga2V5Ym9hcmQgY29tbWFuZCBxdWV1ZSBpcyBlbXB0eQorIyAoYWZ0ZXIgZW1wdHlpbmcgdGhlIG91dHB1dCBidWZmZXJzKQorIworIyBTb21lIG1hY2hpbmVzIGhhdmUgZGVsdXNpb25zIHRoYXQgdGhlIGtleWJvYXJkIGJ1ZmZlciBpcyBhbHdheXMgZnVsbAorIyB3aXRoIG5vIGtleWJvYXJkIGF0dGFjaGVkLi4uCisjCisjIElmIHRoZXJlIGlzIG5vIGtleWJvYXJkIGNvbnRyb2xsZXIsIHdlIHdpbGwgdXN1YWxseSBnZXQgMHhmZgorIyB0byBhbGwgdGhlIHJlYWRzLiAgV2l0aCBlYWNoIElPIHRha2luZyBhIG1pY3Jvc2Vjb25kIGFuZAorIyBhIHRpbWVvdXQgb2YgMTAwLDAwMCBpdGVyYXRpb25zLCB0aGlzIGNhbiB0YWtlIGFib3V0IGhhbGYgYQorIyBzZWNvbmQgKCJkZWxheSIgPT0gb3V0YiB0byBwb3J0IDB4ODApLiBUaGF0IHNob3VsZCBiZSBvaywKKyMgYW5kIHNob3VsZCBhbHNvIGJlIHBsZW50eSBvZiB0aW1lIGZvciBhIHJlYWwga2V5Ym9hcmQgY29udHJvbGxlcgorIyB0byBlbXB0eS4KKyMKKworZW1wdHlfODA0MjoKKwlwdXNobAklZWN4CisJbW92bAkkMTAwMDAwLCAlZWN4CisKK2VtcHR5XzgwNDJfbG9vcDoKKwlkZWNsCSVlY3gKKwlqegllbXB0eV84MDQyX2VuZF9sb29wCisKKwljYWxsCWRlbGF5CisKKwlpbmIJJDB4NjQsICVhbAkJCSMgODA0MiBzdGF0dXMgcG9ydAorCXRlc3RiCSQxLCAlYWwJCQkJIyBvdXRwdXQgYnVmZmVyPworCWp6CW5vX291dHB1dAorCisJY2FsbAlkZWxheQorCWluYgkkMHg2MCwgJWFsCQkJIyByZWFkIGl0CisJam1wCWVtcHR5XzgwNDJfbG9vcAorCitub19vdXRwdXQ6CisJdGVzdGIJJDIsICVhbAkJCQkjIGlzIGlucHV0IGJ1ZmZlciBmdWxsPworCWpuegllbXB0eV84MDQyX2xvb3AJCQkjIHllcyAtIGxvb3AKK2VtcHR5XzgwNDJfZW5kX2xvb3A6CisJcG9wbAklZWN4CisJcmV0CisKKyMgUmVhZCB0aGUgY21vcyBjbG9jay4gUmV0dXJuIHRoZSBzZWNvbmRzIGluIGFsCitnZXR0aW1lOgorCXB1c2h3CSVjeAorCW1vdmIJJDB4MDIsICVhaAorCWludAkkMHgxYQorCW1vdmIJJWRoLCAlYWwJCQkjICVkaCBjb250YWlucyB0aGUgc2Vjb25kcworCWFuZGIJJDB4MGYsICVhbAorCW1vdmIJJWRoLCAlYWgKKwltb3ZiCSQweDA0LCAlY2wKKwlzaHJiCSVjbCwgJWFoCisJYWFkCisJcG9wdwklY3gKKwlyZXQKKworIyBEZWxheSBpcyBuZWVkZWQgYWZ0ZXIgZG9pbmcgSS9PCitkZWxheToKKwlvdXRiCSVhbCwkMHg4MAorCXJldAorCisjIERlc2NyaXB0b3IgdGFibGVzCisjCisjIE5PVEU6IFRoZSBpbnRlbCBtYW51YWwgc2F5cyBnZHQgc2hvdWxkIGJlIHNpeHRlZW4gYnl0ZXMgYWxpZ25lZCBmb3IKKyMgZWZmaWNpZW5jeSByZWFzb25zLiAgSG93ZXZlciwgdGhlcmUgYXJlIG1hY2hpbmVzIHdoaWNoIGFyZSBrbm93biBub3QKKyMgdG8gYm9vdCB3aXRoIG1pc2FsaWduZWQgR0RUcywgc28gYWx0ZXIgdGhpcyBhdCB5b3VyIHBlcmlsISAgSWYgeW91IGFsdGVyCisjIEdEVF9FTlRSWV9CT09UX0NTIChpbiBhc20vc2VnbWVudC5oKSByZW1lbWJlciB0byBsZWF2ZSBhdCBsZWFzdCB0d28KKyMgZW1wdHkgR0RUIGVudHJpZXMgKG9uZSBmb3IgTlVMTCBhbmQgb25lIHJlc2VydmVkKS4KKyMKKyMgTk9URToJT24gc29tZSBDUFVzLCB0aGUgR0RUIG11c3QgYmUgOCBieXRlIGFsaWduZWQuICBUaGlzIGlzCisjIHRydWUgZm9yIHRoZSBWb3lhZ2VyIFF1YWQgQ1BVIGNhcmQgd2hpY2ggd2lsbCBub3QgYm9vdCB3aXRob3V0CisjIFRoaXMgZGlyZWN0aXZlLiAgMTYgYnl0ZSBhbGlnbWVudCBpcyByZWNvbW1lbmRlZCBieSBpbnRlbC4KKyMKKwkuYWxpZ24gMTYKK2dkdDoKKwkuZmlsbCBHRFRfRU5UUllfQk9PVF9DUyw4LDAKKworCS53b3JkCTB4RkZGRgkJCQkjIDRHYiAtICgweDEwMDAwMCoweDEwMDAgPSA0R2IpCisJLndvcmQJMAkJCQkjIGJhc2UgYWRkcmVzcyA9IDAKKwkud29yZAkweDlBMDAJCQkJIyBjb2RlIHJlYWQvZXhlYworCS53b3JkCTB4MDBDRgkJCQkjIGdyYW51bGFyaXR5ID0gNDA5NiwgMzg2CisJCQkJCQkjICAoKzV0aCBuaWJibGUgb2YgbGltaXQpCisKKwkud29yZAkweEZGRkYJCQkJIyA0R2IgLSAoMHgxMDAwMDAqMHgxMDAwID0gNEdiKQorCS53b3JkCTAJCQkJIyBiYXNlIGFkZHJlc3MgPSAwCisJLndvcmQJMHg5MjAwCQkJCSMgZGF0YSByZWFkL3dyaXRlCisJLndvcmQJMHgwMENGCQkJCSMgZ3JhbnVsYXJpdHkgPSA0MDk2LCAzODYKKwkJCQkJCSMgICgrNXRoIG5pYmJsZSBvZiBsaW1pdCkKK2dkdF9lbmQ6CisJLmFsaWduCTQKKwkKKwkud29yZAkwCQkJCSMgYWxpZ25tZW50IGJ5dGUKK2lkdF80ODoKKwkud29yZAkwCQkJCSMgaWR0IGxpbWl0ID0gMAorCS53b3JkCTAsIDAJCQkJIyBpZHQgYmFzZSA9IDBMCisKKwkud29yZAkwCQkJCSMgYWxpZ25tZW50IGJ5dGUKK2dkdF80ODoKKwkud29yZAlnZHRfZW5kIC0gZ2R0IC0gMQkJIyBnZHQgbGltaXQKKwkud29yZAkwLCAwCQkJCSMgZ2R0IGJhc2UgKGZpbGxlZCBpbiBsYXRlcikKKworIyBJbmNsdWRlIHZpZGVvIHNldHVwICYgZGV0ZWN0aW9uIGNvZGUKKworI2luY2x1ZGUgInZpZGVvLlMiCisKKyMgU2V0dXAgc2lnbmF0dXJlIC0tIG11c3QgYmUgbGFzdAorc2V0dXBfc2lnMToJLndvcmQJU0lHMQorc2V0dXBfc2lnMjoJLndvcmQJU0lHMgorCisjIEFmdGVyIHRoaXMgcG9pbnQsIHRoZXJlIGlzIHNvbWUgZnJlZSBzcGFjZSB3aGljaCBpcyB1c2VkIGJ5IHRoZSB2aWRlbyBtb2RlCisjIGhhbmRsaW5nIGNvZGUgdG8gc3RvcmUgdGhlIHRlbXBvcmFyeSBtb2RlIHRhYmxlIChub3QgdXNlZCBieSB0aGUga2VybmVsKS4KKworbW9kZWxpc3Q6CisKKy50ZXh0CitlbmR0ZXh0OgorLmRhdGEKK2VuZGRhdGE6CisuYnNzCitlbmRic3M6CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvYm9vdC90b29scy9idWlsZC5jIGIvYXJjaC9pMzg2L2Jvb3QvdG9vbHMvYnVpbGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjUwOWI4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2Jvb3QvdG9vbHMvYnVpbGQuYwpAQCAtMCwwICsxLDE4NCBAQAorLyoKKyAqICAkSWQ6IGJ1aWxkLmMsdiAxLjUgMTk5Ny8wNS8xOSAxMjoyOTo1OCBtaiBFeHAgJAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3IE1hcnRpbiBNYXJlcworICovCisKKy8qCisgKiBUaGlzIGZpbGUgYnVpbGRzIGEgZGlzay1pbWFnZSBmcm9tIHRocmVlIGRpZmZlcmVudCBmaWxlczoKKyAqCisgKiAtIGJvb3RzZWN0OiBleGFjdGx5IDUxMiBieXRlcyBvZiA4MDg2IG1hY2hpbmUgY29kZSwgbG9hZHMgdGhlIHJlc3QKKyAqIC0gc2V0dXA6IDgwODYgbWFjaGluZSBjb2RlLCBzZXRzIHVwIHN5c3RlbSBwYXJtCisgKiAtIHN5c3RlbTogODAzODYgY29kZSBmb3IgYWN0dWFsIHN5c3RlbQorICoKKyAqIEl0IGRvZXMgc29tZSBjaGVja2luZyB0aGF0IGFsbCBmaWxlcyBhcmUgb2YgdGhlIGNvcnJlY3QgdHlwZSwgYW5kCisgKiBqdXN0IHdyaXRlcyB0aGUgcmVzdWx0IHRvIHN0ZG91dCwgcmVtb3ZpbmcgaGVhZGVycyBhbmQgcGFkZGluZyB0bworICogdGhlIHJpZ2h0IGFtb3VudC4gSXQgYWxzbyB3cml0ZXMgc29tZSBzeXN0ZW0gZGF0YSB0byBzdGRlcnIuCisgKi8KKworLyoKKyAqIENoYW5nZXMgYnkgdHl0c28gdG8gYWxsb3cgcm9vdCBkZXZpY2Ugc3BlY2lmaWNhdGlvbgorICogSGlnaCBsb2FkZWQgc3R1ZmYgYnkgSGFucyBMZXJtZW4gJiBXZXJuZXIgQWxtZXNiZXJnZXIsIEZlYi4gMTk5NgorICogQ3Jvc3MgY29tcGlsaW5nIGZpeGVzIGJ5IEdlcnRqYW4gdmFuIFdpbmdlcmRlLCBKdWx5IDE5OTYKKyAqIFJld3JpdHRlbiBieSBNYXJ0aW4gTWFyZXMsIEFwcmlsIDE5OTcKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9zeXNtYWNyb3MuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGFzbS9ib290Lmg+CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBieXRlOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB3b3JkOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHUzMjsKKworI2RlZmluZSBERUZBVUxUX01BSk9SX1JPT1QgMAorI2RlZmluZSBERUZBVUxUX01JTk9SX1JPT1QgMAorCisvKiBNaW5pbWFsIG51bWJlciBvZiBzZXR1cCBzZWN0b3JzIChzZWUgYWxzbyBib290c2VjdC5TKSAqLworI2RlZmluZSBTRVRVUF9TRUNUUyA0CisKK2J5dGUgYnVmWzEwMjRdOworaW50IGZkOworaW50IGlzX2JpZ19rZXJuZWw7CisKK3ZvaWQgZGllKGNvbnN0IGNoYXIgKiBzdHIsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJdmFfc3RhcnQoYXJncywgc3RyKTsKKwl2ZnByaW50ZihzdGRlcnIsIHN0ciwgYXJncyk7CisJZnB1dGMoJ1xuJywgc3RkZXJyKTsKKwlleGl0KDEpOworfQorCit2b2lkIGZpbGVfb3Blbihjb25zdCBjaGFyICpuYW1lKQoreworCWlmICgoZmQgPSBvcGVuKG5hbWUsIE9fUkRPTkxZLCAwKSkgPCAwKQorCQlkaWUoIlVuYWJsZSB0byBvcGVuIGAlcyc6ICVtIiwgbmFtZSk7Cit9CisKK3ZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlkaWUoIlVzYWdlOiBidWlsZCBbLWJdIGJvb3RzZWN0IHNldHVwIHN5c3RlbSBbcm9vdGRldl0gWz4gaW1hZ2VdIik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqIGFyZ3YpCit7CisJdW5zaWduZWQgaW50IGksIGMsIHN6LCBzZXR1cF9zZWN0b3JzOworCXUzMiBzeXNfc2l6ZTsKKwlieXRlIG1ham9yX3Jvb3QsIG1pbm9yX3Jvb3Q7CisJc3RydWN0IHN0YXQgc2I7CisKKwlpZiAoYXJnYyA+IDIgJiYgIXN0cmNtcChhcmd2WzFdLCAiLWIiKSkKKwkgIHsKKwkgICAgaXNfYmlnX2tlcm5lbCA9IDE7CisJICAgIGFyZ2MtLSwgYXJndisrOworCSAgfQorCWlmICgoYXJnYyA8IDQpIHx8IChhcmdjID4gNSkpCisJCXVzYWdlKCk7CisJaWYgKGFyZ2MgPiA0KSB7CisJCWlmICghc3RyY21wKGFyZ3ZbNF0sICJDVVJSRU5UIikpIHsKKwkJCWlmIChzdGF0KCIvIiwgJnNiKSkgeworCQkJCXBlcnJvcigiLyIpOworCQkJCWRpZSgiQ291bGRuJ3Qgc3RhdCAvIik7CisJCQl9CisJCQltYWpvcl9yb290ID0gbWFqb3Ioc2Iuc3RfZGV2KTsKKwkJCW1pbm9yX3Jvb3QgPSBtaW5vcihzYi5zdF9kZXYpOworCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzRdLCAiRkxPUFBZIikpIHsKKwkJCWlmIChzdGF0KGFyZ3ZbNF0sICZzYikpIHsKKwkJCQlwZXJyb3IoYXJndls0XSk7CisJCQkJZGllKCJDb3VsZG4ndCBzdGF0IHJvb3QgZGV2aWNlLiIpOworCQkJfQorCQkJbWFqb3Jfcm9vdCA9IG1ham9yKHNiLnN0X3JkZXYpOworCQkJbWlub3Jfcm9vdCA9IG1pbm9yKHNiLnN0X3JkZXYpOworCQl9IGVsc2UgeworCQkJbWFqb3Jfcm9vdCA9IDA7CisJCQltaW5vcl9yb290ID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCW1ham9yX3Jvb3QgPSBERUZBVUxUX01BSk9SX1JPT1Q7CisJCW1pbm9yX3Jvb3QgPSBERUZBVUxUX01JTk9SX1JPT1Q7CisJfQorCWZwcmludGYoc3RkZXJyLCAiUm9vdCBkZXZpY2UgaXMgKCVkLCAlZClcbiIsIG1ham9yX3Jvb3QsIG1pbm9yX3Jvb3QpOworCisJZmlsZV9vcGVuKGFyZ3ZbMV0pOworCWkgPSByZWFkKGZkLCBidWYsIHNpemVvZihidWYpKTsKKwlmcHJpbnRmKHN0ZGVyciwiQm9vdCBzZWN0b3IgJWQgYnl0ZXMuXG4iLGkpOworCWlmIChpICE9IDUxMikKKwkJZGllKCJCb290IGJsb2NrIG11c3QgYmUgZXhhY3RseSA1MTIgYnl0ZXMiKTsKKwlpZiAoYnVmWzUxMF0gIT0gMHg1NSB8fCBidWZbNTExXSAhPSAweGFhKQorCQlkaWUoIkJvb3QgYmxvY2sgaGFzbid0IGdvdCBib290IGZsYWcgKDB4QUE1NSkiKTsKKwlidWZbNTA4XSA9IG1pbm9yX3Jvb3Q7CisJYnVmWzUwOV0gPSBtYWpvcl9yb290OworCWlmICh3cml0ZSgxLCBidWYsIDUxMikgIT0gNTEyKQorCQlkaWUoIldyaXRlIGNhbGwgZmFpbGVkIik7CisJY2xvc2UgKGZkKTsKKworCWZpbGVfb3Blbihhcmd2WzJdKTsJCQkJICAgIC8qIENvcHkgdGhlIHNldHVwIGNvZGUgKi8KKwlmb3IgKGk9MCA7IChjPXJlYWQoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKT4wIDsgaSs9YyApCisJCWlmICh3cml0ZSgxLCBidWYsIGMpICE9IGMpCisJCQlkaWUoIldyaXRlIGNhbGwgZmFpbGVkIik7CisJaWYgKGMgIT0gMCkKKwkJZGllKCJyZWFkLWVycm9yIG9uIGBzZXR1cCciKTsKKwljbG9zZSAoZmQpOworCisJc2V0dXBfc2VjdG9ycyA9IChpICsgNTExKSAvIDUxMjsJLyogUGFkIHVudXNlZCBzcGFjZSB3aXRoIHplcm9zICovCisJLyogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBhbmNpZW50IHZlcnNpb25zIG9mIExJTE8uICovCisJaWYgKHNldHVwX3NlY3RvcnMgPCBTRVRVUF9TRUNUUykKKwkJc2V0dXBfc2VjdG9ycyA9IFNFVFVQX1NFQ1RTOworCWZwcmludGYoc3RkZXJyLCAiU2V0dXAgaXMgJWQgYnl0ZXMuXG4iLCBpKTsKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJd2hpbGUgKGkgPCBzZXR1cF9zZWN0b3JzICogNTEyKSB7CisJCWMgPSBzZXR1cF9zZWN0b3JzICogNTEyIC0gaTsKKwkJaWYgKGMgPiBzaXplb2YoYnVmKSkKKwkJCWMgPSBzaXplb2YoYnVmKTsKKwkJaWYgKHdyaXRlKDEsIGJ1ZiwgYykgIT0gYykKKwkJCWRpZSgiV3JpdGUgY2FsbCBmYWlsZWQiKTsKKwkJaSArPSBjOworCX0KKworCWZpbGVfb3Blbihhcmd2WzNdKTsKKwlpZiAoZnN0YXQgKGZkLCAmc2IpKQorCQlkaWUoIlVuYWJsZSB0byBzdGF0IGAlcyc6ICVtIiwgYXJndlszXSk7CisJc3ogPSBzYi5zdF9zaXplOworCWZwcmludGYgKHN0ZGVyciwgIlN5c3RlbSBpcyAlZCBrQlxuIiwgc3ovMTAyNCk7CisJc3lzX3NpemUgPSAoc3ogKyAxNSkgLyAxNjsKKwlpZiAoIWlzX2JpZ19rZXJuZWwgJiYgc3lzX3NpemUgPiBERUZfU1lTU0laRSkKKwkJZGllKCJTeXN0ZW0gaXMgdG9vIGJpZy4gVHJ5IHVzaW5nIGJ6SW1hZ2Ugb3IgbW9kdWxlcy4iKTsKKwl3aGlsZSAoc3ogPiAwKSB7CisJCWludCBsLCBuOworCisJCWwgPSAoc3ogPiBzaXplb2YoYnVmKSkgPyBzaXplb2YoYnVmKSA6IHN6OworCQlpZiAoKG49cmVhZChmZCwgYnVmLCBsKSkgIT0gbCkgeworCQkJaWYgKG4gPCAwKQorCQkJCWRpZSgiRXJyb3IgcmVhZGluZyAlczogJW0iLCBhcmd2WzNdKTsKKwkJCWVsc2UKKwkJCQlkaWUoIiVzOiBVbmV4cGVjdGVkIEVPRiIsIGFyZ3ZbM10pOworCQl9CisJCWlmICh3cml0ZSgxLCBidWYsIGwpICE9IGwpCisJCQlkaWUoIldyaXRlIGZhaWxlZCIpOworCQlzeiAtPSBsOworCX0KKwljbG9zZShmZCk7CisKKwlpZiAobHNlZWsoMSwgNDk3LCBTRUVLX1NFVCkgIT0gNDk3KQkJICAgIC8qIFdyaXRlIHNpemVzIHRvIHRoZSBib290c2VjdG9yICovCisJCWRpZSgiT3V0cHV0OiBzZWVrIGZhaWxlZCIpOworCWJ1ZlswXSA9IHNldHVwX3NlY3RvcnM7CisJaWYgKHdyaXRlKDEsIGJ1ZiwgMSkgIT0gMSkKKwkJZGllKCJXcml0ZSBvZiBzZXR1cCBzZWN0b3IgY291bnQgZmFpbGVkIik7CisJaWYgKGxzZWVrKDEsIDUwMCwgU0VFS19TRVQpICE9IDUwMCkKKwkJZGllKCJPdXRwdXQ6IHNlZWsgZmFpbGVkIik7CisJYnVmWzBdID0gKHN5c19zaXplICYgMHhmZik7CisJYnVmWzFdID0gKChzeXNfc2l6ZSA+PiA4KSAmIDB4ZmYpOworCWlmICh3cml0ZSgxLCBidWYsIDIpICE9IDIpCisJCWRpZSgiV3JpdGUgb2YgaW1hZ2UgbGVuZ3RoIGZhaWxlZCIpOworCisJcmV0dXJuIDA7CQkJCQkgICAgLyogRXZlcnl0aGluZyBpcyBPSyAqLworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2Jvb3QvdmlkZW8uUyBiL2FyY2gvaTM4Ni9ib290L3ZpZGVvLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI1ZDNmNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9ib290L3ZpZGVvLlMKQEAgLTAsMCArMSwyMDA3IEBACisvKgl2aWRlby5TCisgKgorICoJRGlzcGxheSBhZGFwdGVyICYgdmlkZW8gbW9kZSBzZXR1cCwgdmVyc2lvbiAyLjEzICgxNC1NYXktOTkpCisgKgorICoJQ29weXJpZ2h0IChDKSAxOTk1IC0tIDE5OTggTWFydGluIE1hcmVzIDxtakB1Y3cuY3o+CisgKglCYXNlZCBvbiB0aGUgb3JpZ2luYWwgc2V0dXAuUyBjb2RlIChDKSBMaW51cyBUb3J2YWxkcyBhbmQgTWF0cyBBbmRlcnNvbgorICoKKyAqCVJld3JpdHRlbiB0byB1c2UgR05VICdhcycgYnkgQ2hyaXMgTm9lIDxzdGlrZXJAbm9ydGhsaW5rLmNvbT4gTWF5IDE5OTkKKyAqCisgKglGb3IgZnVydGhlciBpbmZvcm1hdGlvbiwgbG9vayBhdCBEb2N1bWVudGF0aW9uL3N2Z2EudHh0LgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+IC8qIGZvciBDT05GSUdfVklERU9fKiAqLworCisvKiBFbmFibGUgYXV0b2RldGVjdGlvbiBvZiBTVkdBIGFkYXB0ZXJzIGFuZCBtb2Rlcy4gKi8KKyN1bmRlZiBDT05GSUdfVklERU9fU1ZHQQorCisvKiBFbmFibGUgYXV0b2RldGVjdGlvbiBvZiBWRVNBIG1vZGVzICovCisjZGVmaW5lIENPTkZJR19WSURFT19WRVNBCisKKy8qIEVuYWJsZSBjb21wYWN0aW5nIG9mIG1vZGUgdGFibGUgKi8KKyNkZWZpbmUgQ09ORklHX1ZJREVPX0NPTVBBQ1QKKworLyogUmV0YWluIHNjcmVlbiBjb250ZW50cyB3aGVuIHN3aXRjaGluZyBtb2RlcyAqLworI2RlZmluZSBDT05GSUdfVklERU9fUkVUQUlOCisKKy8qIEVuYWJsZSBsb2NhbCBtb2RlIGxpc3QgKi8KKyN1bmRlZiBDT05GSUdfVklERU9fTE9DQUwKKworLyogRm9yY2UgNDAwIHNjYW4gbGluZXMgZm9yIHN0YW5kYXJkIG1vZGVzIChoYWNrIHRvIGZpeCBiYWQgQklPUyBiZWhhdmlvdXIgKi8KKyN1bmRlZiBDT05GSUdfVklERU9fNDAwX0hBQ0sKKworLyogSGFjayB0aGF0IGxldHMgeW91IGZvcmNlIHNwZWNpZmljIEJJT1MgbW9kZSBJRCBhbmQgc3BlY2lmaWMgZGltZW5zaW9ucyAqLworI3VuZGVmIENPTkZJR19WSURFT19HRlhfSEFDSworI2RlZmluZSBWSURFT19HRlhfQklPU19BWCAweDRmMDIJLyogODAweDYwMCBvbiBUaGlua1BhZCAqLworI2RlZmluZSBWSURFT19HRlhfQklPU19CWCAweDAxMDIKKyNkZWZpbmUgVklERU9fR0ZYX0RVTU1ZX1JFU09MVVRJT04gMHg2NDI1CS8qIDEwMHgzNyAqLworCisvKiBUaGlzIGNvZGUgdXNlcyBhbiBleHRlbmRlZCBzZXQgb2YgdmlkZW8gbW9kZSBudW1iZXJzLiBUaGVzZSBpbmNsdWRlOgorICogQWxpYXNlcyBmb3Igc3RhbmRhcmQgbW9kZXMKKyAqCU5PUk1BTF9WR0EgKC0xKQorICoJRVhURU5ERURfVkdBICgtMikKKyAqCUFTS19WR0EgKC0zKQorICogVmlkZW8gbW9kZXMgbnVtYmVyZWQgYnkgbWVudSBwb3NpdGlvbiAtLSBOT1QgUkVDT01NRU5ERUQgYmVjYXVzZSBvZiBsYWNrCisgKiBvZiBjb21wYXRpYmlsaXR5IHdoZW4gZXh0ZW5kaW5nIHRoZSB0YWJsZS4gVGhlc2UgYXJlIGJldHdlZW4gMHgwMCBhbmQgMHhmZi4KKyAqLworI2RlZmluZSBWSURFT19GSVJTVF9NRU5VIDB4MDAwMAorCisvKiBTdGFuZGFyZCBCSU9TIHZpZGVvIG1vZGVzIChCSU9TIG51bWJlciArIDB4MDEwMCkgKi8KKyNkZWZpbmUgVklERU9fRklSU1RfQklPUyAweDAxMDAKKworLyogVkVTQSBCSU9TIHZpZGVvIG1vZGVzIChWRVNBIG51bWJlciArIDB4MDIwMCkgKi8KKyNkZWZpbmUgVklERU9fRklSU1RfVkVTQSAweDAyMDAKKworLyogVmlkZW83IHNwZWNpYWwgbW9kZXMgKEJJT1MgbnVtYmVyICsgMHgwOTAwKSAqLworI2RlZmluZSBWSURFT19GSVJTVF9WNyAweDA5MDAKKworLyogU3BlY2lhbCB2aWRlbyBtb2RlcyAqLworI2RlZmluZSBWSURFT19GSVJTVF9TUEVDSUFMIDB4MGYwMAorI2RlZmluZSBWSURFT184MHgyNSAweDBmMDAKKyNkZWZpbmUgVklERU9fOFBPSU5UIDB4MGYwMQorI2RlZmluZSBWSURFT184MHg0MyAweDBmMDIKKyNkZWZpbmUgVklERU9fODB4MjggMHgwZjAzCisjZGVmaW5lIFZJREVPX0NVUlJFTlRfTU9ERSAweDBmMDQKKyNkZWZpbmUgVklERU9fODB4MzAgMHgwZjA1CisjZGVmaW5lIFZJREVPXzgweDM0IDB4MGYwNgorI2RlZmluZSBWSURFT184MHg2MCAweDBmMDcKKyNkZWZpbmUgVklERU9fR0ZYX0hBQ0sgMHgwZjA4CisjZGVmaW5lIFZJREVPX0xBU1RfU1BFQ0lBTCAweDBmMDkKKworLyogVmlkZW8gbW9kZXMgZ2l2ZW4gYnkgcmVzb2x1dGlvbiAqLworI2RlZmluZSBWSURFT19GSVJTVF9SRVNPTFVUSU9OIDB4MTAwMAorCisvKiBUaGUgInJlY2FsY3VsYXRlIHRpbWluZ3MiIGZsYWcgKi8KKyNkZWZpbmUgVklERU9fUkVDQUxDIDB4ODAwMAorCisvKiBQb3NpdGlvbnMgb2YgdmFyaW91cyB2aWRlbyBwYXJhbWV0ZXJzIHBhc3NlZCB0byB0aGUga2VybmVsICovCisvKiAoc2VlIGFsc28gaW5jbHVkZS9saW51eC90dHkuaCkgKi8KKyNkZWZpbmUgUEFSQU1fQ1VSU09SX1BPUwkweDAwCisjZGVmaW5lIFBBUkFNX1ZJREVPX1BBR0UJMHgwNAorI2RlZmluZSBQQVJBTV9WSURFT19NT0RFCTB4MDYKKyNkZWZpbmUgUEFSQU1fVklERU9fQ09MUwkweDA3CisjZGVmaW5lIFBBUkFNX1ZJREVPX0VHQV9CWAkweDBhCisjZGVmaW5lIFBBUkFNX1ZJREVPX0xJTkVTCTB4MGUKKyNkZWZpbmUgUEFSQU1fSEFWRV9WR0EJCTB4MGYKKyNkZWZpbmUgUEFSQU1fRk9OVF9QT0lOVFMJMHgxMAorCisjZGVmaW5lIFBBUkFNX0xGQl9XSURUSAkJMHgxMgorI2RlZmluZSBQQVJBTV9MRkJfSEVJR0hUCTB4MTQKKyNkZWZpbmUgUEFSQU1fTEZCX0RFUFRICQkweDE2CisjZGVmaW5lIFBBUkFNX0xGQl9CQVNFCQkweDE4CisjZGVmaW5lIFBBUkFNX0xGQl9TSVpFCQkweDFjCisjZGVmaW5lIFBBUkFNX0xGQl9MSU5FTEVOR1RICTB4MjQKKyNkZWZpbmUgUEFSQU1fTEZCX0NPTE9SUwkweDI2CisjZGVmaW5lIFBBUkFNX1ZFU0FQTV9TRUcJMHgyZQorI2RlZmluZSBQQVJBTV9WRVNBUE1fT0ZGCTB4MzAKKyNkZWZpbmUgUEFSQU1fTEZCX1BBR0VTCQkweDMyCisjZGVmaW5lIFBBUkFNX1ZFU0FfQVRUUklCCTB4MzQKKworLyogRGVmaW5lIERPX1NUT1JFIGFjY29yZGluZyB0byBDT05GSUdfVklERU9fUkVUQUlOICovCisjaWZkZWYgQ09ORklHX1ZJREVPX1JFVEFJTgorI2RlZmluZSBET19TVE9SRSBjYWxsIHN0b3JlX3NjcmVlbgorI2Vsc2UKKyNkZWZpbmUgRE9fU1RPUkUKKyNlbmRpZiAvKiBDT05GSUdfVklERU9fUkVUQUlOICovCisKKyMgVGhpcyBpcyB0aGUgbWFpbiBlbnRyeSBwb2ludCBjYWxsZWQgYnkgc2V0dXAuUworIyAlZHMgKm11c3QqIGJlIHBvaW50aW5nIHRvIHRoZSBib290c2VjdG9yCit2aWRlbzoJcHVzaHcJJWRzCQkjIFdlIHVzZSBkaWZmZXJlbnQgc2VnbWVudHMKKwlwdXNodwklZHMJCSMgRlMgY29udGFpbnMgb3JpZ2luYWwgRFMKKwlwb3B3CSVmcworCXB1c2h3CSVjcwkJIyBEUyBpcyBlcXVhbCB0byBDUworCXBvcHcJJWRzCisJcHVzaHcJJWNzCQkjIEVTIGlzIGVxdWFsIHRvIENTCisJcG9wdwklZXMKKwl4b3J3CSVheCwgJWF4CisJbW92dwklYXgsICVncwkjIEdTIGlzIHplcm8KKwljbGQKKwljYWxsCWJhc2ljX2RldGVjdAkjIEJhc2ljIGFkYXB0ZXIgdHlwZSB0ZXN0aW5nIChFR0EvVkdBL01EQS9DR0EpCisjaWZkZWYgQ09ORklHX1ZJREVPX1NFTEVDVAorCW1vdncJJWZzOigweDAxZmEpLCAlYXgJCSMgVXNlciBzZWxlY3RlZCB2aWRlbyBtb2RlCisJY21wdwkkQVNLX1ZHQSwgJWF4CQkJIyBCcmluZyB1cCB0aGUgbWVudQorCWp6CXZpZDIKKworCWNhbGwJbW9kZV9zZXQJCQkjIFNldCB0aGUgbW9kZQorCWpjCXZpZDEKKworCWxlYXcJYmFkbWR0LCAlc2kJCQkjIEludmFsaWQgbW9kZSBJRAorCWNhbGwJcHJ0c3RyCit2aWQyOgljYWxsCW1vZGVfbWVudQordmlkMToKKyNpZmRlZiBDT05GSUdfVklERU9fUkVUQUlOCisJY2FsbAlyZXN0b3JlX3NjcmVlbgkJCSMgUmVzdG9yZSBzY3JlZW4gY29udGVudHMKKyNlbmRpZiAvKiBDT05GSUdfVklERU9fUkVUQUlOICovCisJY2FsbAlzdG9yZV9lZGlkCisjZW5kaWYgLyogQ09ORklHX1ZJREVPX1NFTEVDVCAqLworCWNhbGwJbW9kZV9wYXJhbXMJCQkjIFN0b3JlIG1vZGUgcGFyYW1ldGVycworCXBvcHcJJWRzCQkJCSMgUmVzdG9yZSBvcmlnaW5hbCBEUworCXJldAorCisjIERldGVjdCBpZiB3ZSBoYXZlIENHQSwgTURBLCBFR0Egb3IgVkdBIGFuZCBwYXNzIGl0IHRvIHRoZSBrZXJuZWwuCitiYXNpY19kZXRlY3Q6CisJbW92YgkkMCwgJWZzOihQQVJBTV9IQVZFX1ZHQSkKKwltb3ZiCSQweDEyLCAlYWgJIyBDaGVjayBFR0EvVkdBCisJbW92YgkkMHgxMCwgJWJsCisJaW50CSQweDEwCisJbW92dwklYngsICVmczooUEFSQU1fVklERU9fRUdBX0JYKQkjIElkZW50aWZpZXMgRUdBIHRvIHRoZSBrZXJuZWwKKwljbXBiCSQweDEwLCAlYmwJCQkjIE5vLCBpdCdzIGEgQ0dBL01EQS9IR0EgY2FyZC4KKwlqZQliYXNyZXQKKworCWluY2IJYWRhcHRlcgorCW1vdncJJDB4MWEwMCwgJWF4CQkJIyBDaGVjayBFR0Egb3IgVkdBPworCWludAkkMHgxMAorCWNtcGIJJDB4MWEsICVhbAkJCSMgMWEgbWVhbnMgVkdBLi4uCisJam5lCWJhc3JldAkJCQkjIGFueXRoaW5nIGVsc2UgaXMgRUdBLgorCQorCWluY2IJJWZzOihQQVJBTV9IQVZFX1ZHQSkJCSMgV2UndmUgZGV0ZWN0ZWQgYSBWR0EKKwlpbmNiCWFkYXB0ZXIKK2Jhc3JldDoJcmV0CisKKyMgU3RvcmUgdGhlIHZpZGVvIG1vZGUgcGFyYW1ldGVycyBmb3IgbGF0ZXIgdXNhZ2UgYnkgdGhlIGtlcm5lbC4KKyMgVGhpcyBpcyBkb25lIGJ5IGFza2luZyB0aGUgQklPUyBleGNlcHQgZm9yIHRoZSByb3dzL2NvbHVtbnMKKyMgcGFyYW1ldGVycyBpbiB0aGUgZGVmYXVsdCA4MHgyNSBtb2RlIC0tIHRoZXNlIGFyZSBzZXQgZGlyZWN0bHksCisjIGJlY2F1c2Ugc29tZSB2ZXJ5IG9ic2N1cmUgQklPU2VzIHN1cHBseSBpbnNhbmUgdmFsdWVzLgorbW9kZV9wYXJhbXM6CisjaWZkZWYgQ09ORklHX1ZJREVPX1NFTEVDVAorCWNtcGIJJDAsIGdyYXBoaWNfbW9kZQorCWpuegltb3Bhcl9ncgorI2VuZGlmCisJbW92YgkkMHgwMywgJWFoCQkJIyBSZWFkIGN1cnNvciBwb3NpdGlvbgorCXhvcmIJJWJoLCAlYmgKKwlpbnQJJDB4MTAKKwltb3Z3CSVkeCwgJWZzOihQQVJBTV9DVVJTT1JfUE9TKQorCW1vdmIJJDB4MGYsICVhaAkJCSMgUmVhZCBwYWdlL21vZGUvd2lkdGgKKwlpbnQJJDB4MTAKKwltb3Z3CSVieCwgJWZzOihQQVJBTV9WSURFT19QQUdFKQorCW1vdncJJWF4LCAlZnM6KFBBUkFNX1ZJREVPX01PREUpCSMgVmlkZW8gbW9kZSBhbmQgc2NyZWVuIHdpZHRoCisJY21wYgkkMHg3LCAlYWwJCQkjIE1EQS9IR0EgPT4gc2VnbWVudCBkaWZmZXJzCisJam56CW1vcGFyMAorCisJbW92dwkkMHhiMDAwLCB2aWRlb19zZWdtZW50Cittb3BhcjA6IG1vdncJJWdzOigweDQ4NSksICVheAkJIyBGb250IHNpemUKKwltb3Z3CSVheCwgJWZzOihQQVJBTV9GT05UX1BPSU5UUykJIyAodmFsaWQgb25seSBvbiBFR0EvVkdBKQorCW1vdncJZm9yY2Vfc2l6ZSwgJWF4CQkJIyBGb3JjZWQgc2l6ZT8KKwlvcncJJWF4LCAlYXgKKwlqegltb3BhcjEKKworCW1vdmIJJWFoLCAlZnM6KFBBUkFNX1ZJREVPX0NPTFMpCisJbW92YgklYWwsICVmczooUEFSQU1fVklERU9fTElORVMpCisJcmV0CisKK21vcGFyMToJbW92YgkkMjUsICVhbAorCWNtcGIJJDAsIGFkYXB0ZXIJCQkjIElmIHdlIGFyZSBvbiBDR0EvTURBL0hHQSwgdGhlCisJanoJbW9wYXIyCQkJCSMgc2NyZWVuIG11c3QgaGF2ZSAyNSBsaW5lcy4KKworCW1vdmIJJWdzOigweDQ4NCksICVhbAkJIyBPbiBFR0EvVkdBLCB1c2UgdGhlIEVHQSsgQklPUworCWluY2IJJWFsCQkJCSMgbG9jYXRpb24gb2YgbWF4IGxpbmVzLgorbW9wYXIyOiBtb3ZiCSVhbCwgJWZzOihQQVJBTV9WSURFT19MSU5FUykKKwlyZXQKKworI2lmZGVmIENPTkZJR19WSURFT19TRUxFQ1QKKyMgRmV0Y2hpbmcgb2YgVkVTQSBmcmFtZSBidWZmZXIgcGFyYW1ldGVycworbW9wYXJfZ3I6CisJbGVhdwltb2RlbGlzdCsxMDI0LCAlZGkKKwltb3ZiCSQweDIzLCAlZnM6KFBBUkFNX0hBVkVfVkdBKQorCW1vdncJMTYoJWRpKSwgJWF4CisJbW92dwklYXgsICVmczooUEFSQU1fTEZCX0xJTkVMRU5HVEgpCisJbW92dwkxOCglZGkpLCAlYXgKKwltb3Z3CSVheCwgJWZzOihQQVJBTV9MRkJfV0lEVEgpCisJbW92dwkyMCglZGkpLCAlYXgKKwltb3Z3CSVheCwgJWZzOihQQVJBTV9MRkJfSEVJR0hUKQorCW1vdmIJMjUoJWRpKSwgJWFsCisJbW92YgkkMCwgJWFoCisJbW92dwklYXgsICVmczooUEFSQU1fTEZCX0RFUFRIKQorCW1vdmIJMjkoJWRpKSwgJWFsCQorCW1vdmIJJDAsICVhaAorCW1vdncJJWF4LCAlZnM6KFBBUkFNX0xGQl9QQUdFUykKKwltb3ZsCTQwKCVkaSksICVlYXgKKwltb3ZsCSVlYXgsICVmczooUEFSQU1fTEZCX0JBU0UpCisJbW92bAkzMSglZGkpLCAlZWF4CisJbW92bAklZWF4LCAlZnM6KFBBUkFNX0xGQl9DT0xPUlMpCisJbW92bAkzNSglZGkpLCAlZWF4CisJbW92bAklZWF4LCAlZnM6KFBBUkFNX0xGQl9DT0xPUlMrNCkKKwltb3Z3CTAoJWRpKSwgJWF4CisJbW92dwklYXgsICVmczooUEFSQU1fVkVTQV9BVFRSSUIpCisKKyMgZ2V0IHZpZGVvIG1lbSBzaXplCisJbGVhdwltb2RlbGlzdCsxMDI0LCAlZGkKKwltb3Z3CSQweDRmMDAsICVheAorCWludAkkMHgxMAorCXhvcmwJJWVheCwgJWVheAorCW1vdncJMTgoJWRpKSwgJWF4CisJbW92bAklZWF4LCAlZnM6KFBBUkFNX0xGQl9TSVpFKQorCisjIHN3aXRjaGluZyB0aGUgREFDIHRvIDgtYml0IGlzIGZvciA8PSA4IGJwcCBvbmx5CisJbW92dwklZnM6KFBBUkFNX0xGQl9ERVBUSCksICVheAorCWNtcHcJJDgsICVheAorCWpnCWRhY19kb25lCisKKyMgZ2V0IERBQyBzd2l0Y2hpbmcgY2FwYWJpbGl0eQorCXhvcmwJJWVheCwgJWVheAorCW1vdmIJMTAoJWRpKSwgJWFsCisJdGVzdGIJJDEsICVhbAorCWp6CWRhY19zZXQKKworIyBhdHRlbXB0IHRvIHN3aXRjaCBEQUMgdG8gOC1iaXQKKwltb3Z3CSQweDRmMDgsICVheAorCW1vdncJJDB4MDgwMCwgJWJ4CisJaW50CSQweDEwCisJY21wdwkkMHgwMDRmLCAlYXgKKwlqbmUgICAgIGRhY19zZXQKKwltb3ZiICAgICViaCwgZGFjX3NpemUJCSMgc3RvcmUgYWN0dWFsIERBQyBzaXplCisKK2RhY19zZXQ6CisjIHNldCBjb2xvciBzaXplIHRvIERBQyBzaXplCisJbW92YglkYWNfc2l6ZSwgJWFsCisJbW92YgklYWwsICVmczooUEFSQU1fTEZCX0NPTE9SUyswKQorCW1vdmIJJWFsLCAlZnM6KFBBUkFNX0xGQl9DT0xPUlMrMikKKwltb3ZiCSVhbCwgJWZzOihQQVJBTV9MRkJfQ09MT1JTKzQpCisJbW92YgklYWwsICVmczooUEFSQU1fTEZCX0NPTE9SUys2KQorCisjIHNldCBjb2xvciBvZmZzZXRzIHRvIDAKKwltb3ZiCSQwLCAlZnM6KFBBUkFNX0xGQl9DT0xPUlMrMSkKKwltb3ZiCSQwLCAlZnM6KFBBUkFNX0xGQl9DT0xPUlMrMykKKwltb3ZiCSQwLCAlZnM6KFBBUkFNX0xGQl9DT0xPUlMrNSkKKwltb3ZiCSQwLCAlZnM6KFBBUkFNX0xGQl9DT0xPUlMrNykKKworZGFjX2RvbmU6CisjIGdldCBwcm90ZWN0ZWQgbW9kZSBpbnRlcmZhY2UgaW5mb3JtYXRpb25zCisJbW92dwkkMHg0ZjBhLCAlYXgKKwl4b3J3CSVieCwgJWJ4CisJeG9ydwklZGksICVkaQorCWludAkkMHgxMAorCWNtcAkkMHgwMDRmLCAlYXgKKwlqbnoJbm9fcG0KKworCW1vdncJJWVzLCAlZnM6KFBBUkFNX1ZFU0FQTV9TRUcpCisJbW92dwklZGksICVmczooUEFSQU1fVkVTQVBNX09GRikKK25vX3BtOglyZXQKKworIyBUaGUgdmlkZW8gbW9kZSBtZW51Cittb2RlX21lbnU6CisJbGVhdwlrZXltc2csICVzaQkJCSMgIlJldHVybi9TcGFjZS9UaW1lb3V0IiBtZXNzYWdlCisJY2FsbAlwcnRzdHIKKwljYWxsCWZsdXNoCitub2tleToJY2FsbAlnZXRrdAorCisJY21wYgkkMHgwZCwgJWFsCQkJIyBFTlRFUiA/CisJamUJbGlzdG0JCQkJIyB5ZXMgLSBtYW51YWwgbW9kZSBzZWxlY3Rpb24KKworCWNtcGIJJDB4MjAsICVhbAkJCSMgU1BBQ0UgPworCWplCWRlZm1kMQkJCQkjIG5vIC0gcmVwZWF0CisKKwljYWxsIAliZWVwCisJam1wCW5va2V5CisKK2RlZm1kMToJcmV0CQkJCQkjIE5vIG1vZGUgY2hvc2VuPyBEZWZhdWx0IDgweDI1CisKK2xpc3RtOgljYWxsCW1vZGVfdGFibGUJCQkjIExpc3QgbW9kZSB0YWJsZQorbGlzdG0wOglsZWF3CW5hbWVfYmFubiwgJXNpCQkJIyBQcmludCBhZGFwdGVyIG5hbWUKKwljYWxsCXBydHN0cgorCW1vdncJY2FyZF9uYW1lLCAlc2kKKwlvcncJJXNpLCAlc2kKKwlqbnoJYW4yCisKKwltb3ZiCWFkYXB0ZXIsICVhbAorCWxlYXcJb2xkX25hbWUsICVzaQorCW9yYgklYWwsICVhbAorCWp6CWFuMQorCisJbGVhdwllZ2FfbmFtZSwgJXNpCisJZGVjYgklYWwKKwlqeglhbjEKKworCWxlYXcJdmdhX25hbWUsICVzaQorCWptcAlhbjEKKworYW4yOgljYWxsCXBydHN0cgorCWxlYXcJc3ZnYV9uYW1lLCAlc2kKK2FuMToJY2FsbAlwcnRzdHIKKwlsZWF3CWxpc3RoZHIsICVzaQkJCSMgVGFibGUgaGVhZGVyCisJY2FsbAlwcnRzdHIKKwltb3ZiCSQweDMwLCAlZGwJCQkjIERMIGhvbGRzIG1vZGUgbnVtYmVyCisJbGVhdwltb2RlbGlzdCwgJXNpCitsbTE6CWNtcHcJJEFTS19WR0EsICglc2kpCQkJIyBFbmQ/CisJanoJbG0yCisKKwltb3ZiCSVkbCwgJWFsCQkJIyBNZW51IHNlbGVjdGlvbiBudW1iZXIKKwljYWxsCXBydGNocgorCWNhbGwJcHJ0c3AyCisJbG9kc3cKKwljYWxsCXBydGh3CQkJCSMgTW9kZSBJRAorCWNhbGwJcHJ0c3AyCisJbW92YgkweDEoJXNpKSwgJWFsCisJY2FsbAlwcnRkZWMJCQkJIyBSb3dzCisJbW92YgkkMHg3OCwgJWFsCQkJIyB0aGUgbGV0dGVyICd4JworCWNhbGwJcHJ0Y2hyCisJbG9kc3cKKwljYWxsCXBydGRlYwkJCQkjIENvbHVtbnMKKwltb3ZiCSQweDBkLCAlYWwJCQkjIE5ldyBsaW5lCisJY2FsbAlwcnRjaHIKKwltb3ZiCSQweDBhLCAlYWwKKwljYWxsCXBydGNocgorCWluY2IJJWRsCQkJCSMgTmV4dCBjaGFyYWN0ZXIKKwljbXBiCSQweDNhLCAlZGwKKwlqbnoJbG0xCisKKwltb3ZiCSQweDYxLCAlZGwKKwlqbXAJbG0xCisKK2xtMjoJbGVhdwlwcm9tcHQsICVzaQkJCSMgTW9kZSBwcm9tcHQKKwljYWxsCXBydHN0cgorCWxlYXcJZWRpdF9idWYsICVkaQkJCSMgRWRpdG9yIGJ1ZmZlcgorbG0zOgljYWxsCWdldGtleQorCWNtcGIJJDB4MGQsICVhbAkJCSMgRW50ZXI/CisJanoJbG1lbnQKKworCWNtcGIJJDB4MDgsICVhbAkJCSMgQmFja3NwYWNlPworCWp6CWxtYnMKKworCWNtcGIJJDB4MjAsICVhbAkJCSMgUHJpbnRhYmxlPworCWpjCWxtMworCisJY21wdwkkZWRpdF9idWYrNCwgJWRpCQkjIEVub3VnaCBzcGFjZT8KKwlqeglsbTMKKworCXN0b3NiCisJY2FsbAlwcnRjaHIKKwlqbXAJbG0zCisKK2xtYnM6CWNtcHcJJGVkaXRfYnVmLCAlZGkJCQkjIEJhY2tzcGFjZQorCWp6CWxtMworCisJZGVjdwklZGkKKwltb3ZiCSQweDA4LCAlYWwKKwljYWxsCXBydGNocgorCWNhbGwJcHJ0c3BjCisJbW92YgkkMHgwOCwgJWFsCisJY2FsbAlwcnRjaHIKKwlqbXAJbG0zCisJCitsbWVudDoJbW92YgkkMCwgKCVkaSkKKwlsZWF3CWNybGZ0LCAlc2kKKwljYWxsCXBydHN0cgorCWxlYXcJZWRpdF9idWYsICVzaQorCWNtcGIJJDAsICglc2kpCQkJIyBFbXB0eSBzdHJpbmcgPSBkZWZhdWx0IG1vZGUKKwlqeglsbWRlZgorCisJY21wYgkkMCwgMSglc2kpCQkJIyBPbmUgY2hhcmFjdGVyID0gbWVudSBzZWxlY3Rpb24KKwlqegltbnVzZWwKKworCWNtcHcJJDB4NjM3MywgKCVzaSkJCQkjICJzY2FuIiA9PiBtb2RlIHNjYW5uaW5nCisJam56CWxtaHgKKworCWNtcHcJJDB4NmU2MSwgMiglc2kpCisJanoJbG1zY2FuCisKK2xtaHg6CXhvcncJJWJ4LCAlYngJCQkjIEVsc2UgPT4gbW9kZSBJRCBpbiBoZXgKK2xtaGV4Oglsb2RzYgorCW9yYgklYWwsICVhbAorCWp6CWxtdXNlMQorCisJc3ViYgkkMHgzMCwgJWFsCisJamMJbG1iYWQKKworCWNtcGIJJDEwLCAlYWwKKwlqYwlsbWh4MQorCisJc3ViYgkkNywgJWFsCisJYW5kYgkkMHhkZiwgJWFsCisJY21wYgkkMTAsICVhbAorCWpjCWxtYmFkCisKKwljbXBiCSQxNiwgJWFsCisJam5jCWxtYmFkCisKK2xtaHgxOglzaGx3CSQ0LCAlYngKKwlvcmIJJWFsLCAlYmwKKwlqbXAJbG1oZXgKKworbG11c2UxOgltb3Z3CSVieCwgJWF4CisJam1wCWxtdXNlCisKK21udXNlbDoJbG9kc2IJCQkJCSMgTWVudSBzZWxlY3Rpb24KKwl4b3JiCSVhaCwgJWFoCisJc3ViYgkkMHgzMCwgJWFsCisJamMJbG1iYWQKKworCWNtcGIJJDEwLCAlYWwKKwlqYwlsbXVzZQorCQorCWNtcGIJJDB4NjEtMHgzMCwgJWFsCisJamMJbG1iYWQKKwkKKwlzdWJiCSQweDYxLTB4MzAtMTAsICVhbAorCWNtcGIJJDM2LCAlYWwKKwlqbmMJbG1iYWQKKworbG11c2U6CWNhbGwJbW9kZV9zZXQKKwlqYwlsbWRlZgorCitsbWJhZDoJbGVhdwl1bmtudCwgJXNpCisJY2FsbAlwcnRzdHIKKwlqbXAJbG0yCitsbXNjYW46CWNtcGIJJDAsIGFkYXB0ZXIJCQkjIFNjYW5uaW5nIG9ubHkgb24gRUdBL1ZHQQorCWp6CWxtYmFkCisKKwltb3Z3CSQwLCBtdF9lbmQJCQkjIFNjYW5uaW5nIG9mIG1vZGVzIGlzCisJbW92YgkkMSwgc2Nhbm5pbmcJCQkjIGRvbmUgYXMgbmV3IGF1dG9kZXRlY3Rpb24uCisJY2FsbAltb2RlX3RhYmxlCisJam1wCWxpc3RtMAorbG1kZWY6CXJldAorCisjIEFkZGl0aW9uYWwgcGFydHMgb2YgbW9kZV9zZXQuLi4gKHJlbGF0aXZlIGp1bXBzLCB5b3Uga25vdykKK3NldHY3OgkJCQkJCSMgVmlkZW83IGV4dGVuZGVkIG1vZGVzCisJRE9fU1RPUkUKKwlzdWJiCSRWSURFT19GSVJTVF9WNz4+OCwgJWJoCisJbW92dwkkMHg2ZjA1LCAlYXgKKwlpbnQJJDB4MTAKKwlzdGMKKwlyZXQKKworX3NldHJlYzoJam1wCXNldHJlYwkJCSMgVWdseS4uLgorX3NldF84MHgyNToJam1wCXNldF84MHgyNQorCisjIEFsaWFzZXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCitzZXRhbGlhczoKKwltb3Z3CSRWSURFT184MHgyNSwgJWF4CisJaW5jdwklYngKKwlqegltb2RlX3NldAorCisJbW92YgkkVklERU9fOFBPSU5ULVZJREVPX0ZJUlNUX1NQRUNJQUwsICVhbAorCWluY3cJJWJ4CisJam56CXNldGJhZAkJCQkjIEZhbGwtdGhyb3VnaCEKKworIyBTZXR0aW5nIG9mIHVzZXIgbW9kZSAoQVg9bW9kZSBJRCkgPT4gQ0Y9c3VjY2VzcworbW9kZV9zZXQ6CisJbW92dwklYXgsICVmczooMHgwMWZhKQkJIyBTdG9yZSBtb2RlIGZvciB1c2UgaW4gYWNwaV93YWtldXAuUworCW1vdncJJWF4LCAlYngKKwljbXBiCSQweGZmLCAlYWgKKwlqeglzZXRhbGlhcworCisJdGVzdGIJJFZJREVPX1JFQ0FMQz4+OCwgJWFoCisJam56CV9zZXRyZWMKKworCWNtcGIJJFZJREVPX0ZJUlNUX1JFU09MVVRJT04+PjgsICVhaAorCWpuYwlzZXRyZXMKKwkKKwljbXBiCSRWSURFT19GSVJTVF9TUEVDSUFMPj44LCAlYWgKKwlqeglzZXRzcGMKKwkKKwljbXBiCSRWSURFT19GSVJTVF9WNz4+OCwgJWFoCisJanoJc2V0djcKKwkKKwljbXBiCSRWSURFT19GSVJTVF9WRVNBPj44LCAlYWgKKwlqbmMJY2hlY2tfdmVzYQorCQorCW9yYgklYWgsICVhaAorCWp6CXNldG1lbnUKKwkKKwlkZWNiCSVhaAorCWp6CXNldGJpb3MKKworc2V0YmFkOgljbGMKKwltb3ZiCSQwLCBkb19yZXN0b3JlCQkJIyBUaGUgc2NyZWVuIG5lZWRuJ3QgYmUgcmVzdG9yZWQKKwlyZXQKKworc2V0dmVzYToKKwlET19TVE9SRQorCXN1YmIJJFZJREVPX0ZJUlNUX1ZFU0E+PjgsICViaAorCW1vdncJJDB4NGYwMiwgJWF4CQkJIyBWRVNBIEJJT1MgbW9kZSBzZXQgY2FsbAorCWludAkkMHgxMAorCWNtcHcJJDB4MDA0ZiwgJWF4CQkJIyBBTD00ZiBpZiBpbXBsZW1lbnRlZAorCWpueglzZXRiYWQJCQkJIyBBSD0wIGlmIE9LCisKKwlzdGMKKwlyZXQKKworc2V0YmlvczoKKwlET19TVE9SRQorCWludAkkMHgxMAkJCQkjIFN0YW5kYXJkIEJJT1MgbW9kZSBzZXQgY2FsbAorCXB1c2h3CSVieAorCW1vdmIJJDB4MGYsICVhaAkJCSMgQ2hlY2sgaWYgcmVhbGx5IHNldAorCWludAkkMHgxMAorCXBvcHcJJWJ4CisJY21wYgklYmwsICVhbAorCWpueglzZXRiYWQKKwkKKwlzdGMKKwlyZXQKKworc2V0c3BjOgl4b3JiCSViaCwgJWJoCQkJIyBTZXQgc3BlY2lhbCBtb2RlCisJY21wYgkkVklERU9fTEFTVF9TUEVDSUFMLVZJREVPX0ZJUlNUX1NQRUNJQUwsICVibAorCWpuYwlzZXRiYWQKKwkKKwlhZGR3CSVieCwgJWJ4CisJam1wCSpzcGVjX2luaXRzKCVieCkKKworc2V0bWVudToKKwlvcmIJJWFsLCAlYWwJCQkjIDgweDI1IGlzIGFuIGV4Y2VwdGlvbgorCWp6CV9zZXRfODB4MjUKKwkKKwlwdXNodwklYngJCQkJIyBTZXQgbW9kZSBjaG9zZW4gZnJvbSBtZW51CisJY2FsbAltb2RlX3RhYmxlCQkJIyBCdWlsZCB0aGUgbW9kZSB0YWJsZQorCXBvcHcJJWF4CisJc2hsdwkkMiwgJWF4CisJYWRkdwklYXgsICVzaQorCWNtcHcJJWRpLCAlc2kKKwlqbmMJc2V0YmFkCisJCisJbW92dwkoJXNpKSwgJWF4CQkJIyBGZXRjaCBtb2RlIElECitfbV9zOglqbXAJbW9kZV9zZXQKKworc2V0cmVzOglwdXNodwklYngJCQkJIyBTZXQgbW9kZSBjaG9zZW4gYnkgcmVzb2x1dGlvbgorCWNhbGwJbW9kZV90YWJsZQorCXBvcHcJJWJ4CisJeGNoZ2IJJWJsLCAlYmgKK3NldHIxOglsb2RzdworCWNtcHcJJEFTS19WR0EsICVheAkJCSMgRW5kIG9mIHRoZSBsaXN0PworCWp6CXNldGJhZAorCQorCWxvZHN3CisJY21wdwklYngsICVheAorCWpueglzZXRyMQorCQorCW1vdncJLTQoJXNpKSwgJWF4CQkJIyBGZXRjaCBtb2RlIElECisJam1wCV9tX3MKKworY2hlY2tfdmVzYToKKwlsZWF3CW1vZGVsaXN0KzEwMjQsICVkaQorCXN1YmIJJFZJREVPX0ZJUlNUX1ZFU0E+PjgsICViaAorCW1vdncJJWJ4LCAlY3gJCQkjIEdldCBtb2RlIGluZm9ybWF0aW9uIHN0cnVjdHVyZQorCW1vdncJJDB4NGYwMSwgJWF4CisJaW50CSQweDEwCisJYWRkYgkkVklERU9fRklSU1RfVkVTQT4+OCwgJWJoCisJY21wdwkkMHgwMDRmLCAlYXgKKwlqbnoJc2V0YmFkCisKKwltb3ZiCSglZGkpLCAlYWwJCQkjIENoZWNrIGNhcGFiaWxpdGllcy4KKwlhbmRiCSQweDE5LCAlYWwKKwljbXBiCSQweDA5LCAlYWwKKwlqeglzZXR2ZXNhCQkJCSMgVGhpcyBpcyBhIHRleHQgbW9kZQorCisJbW92YgkoJWRpKSwgJWFsCQkJIyBDaGVjayBjYXBhYmlsaXRpZXMuCisJYW5kYgkkMHg5OSwgJWFsCisJY21wYgkkMHg5OSwgJWFsCisJam56CV9zZXRiYWQJCQkJIyBEb2ghIE5vIGxpbmVhciBmcmFtZSBidWZmZXIuCisKKwlzdWJiCSRWSURFT19GSVJTVF9WRVNBPj44LCAlYmgKKwlvcncJJDB4NDAwMCwgJWJ4CQkJIyBVc2UgbGluZWFyIGZyYW1lIGJ1ZmZlcgorCW1vdncJJDB4NGYwMiwgJWF4CQkJIyBWRVNBIEJJT1MgbW9kZSBzZXQgY2FsbAorCWludAkkMHgxMAorCWNtcHcJJDB4MDA0ZiwgJWF4CQkJIyBBTD00ZiBpZiBpbXBsZW1lbnRlZAorCWpueglfc2V0YmFkCQkJCSMgQUg9MCBpZiBPSworCisJbW92YgkkMSwgZ3JhcGhpY19tb2RlCQkjIGZsYWcgZ3JhcGhpYyBtb2RlCisJbW92YgkkMCwgZG9fcmVzdG9yZQkJCSMgbm8gc2NyZWVuIHJlc3RvcmUKKwlzdGMKKwlyZXQKKworX3NldGJhZDoJam1wCXNldGJhZCAgICAgICAgICAJIyBVZ2x5Li4uCisKKyMgUmVjYWxjdWxhdGUgdmVydGljYWwgZGlzcGxheSBlbmQgcmVnaXN0ZXJzIC0tIHRoaXMgZml4ZXMgdmFyaW91cworIyBpbmNvbnNpc3RlbmNpZXMgb2YgZXh0ZW5kZWQgbW9kZXMgb24gbWFueSBhZGFwdGVycy4gQ2FsbGVkIHdoZW4KKyMgdGhlIFZJREVPX1JFQ0FMQyBmbGFnIGlzIHNldCBpbiB0aGUgbW9kZSBJRC4KKworc2V0cmVjOglzdWJiCSRWSURFT19SRUNBTEM+PjgsICVhaAkJIyBTZXQgdGhlIGJhc2UgbW9kZQorCWNhbGwJbW9kZV9zZXQKKwlqbmMJcmN0MworCisJbW92dwklZ3M6KDB4NDg1KSwgJWF4CQkjIEZvbnQgc2l6ZSBpbiBwaXhlbHMKKwltb3ZiCSVnczooMHg0ODQpLCAlYmwJCSMgTnVtYmVyIG9mIHJvd3MKKwlpbmNiCSVibAorCW11bGIJJWJsCQkJCSMgTnVtYmVyIG9mIHZpc2libGUKKwlkZWN3CSVheAkJCQkjIHNjYW4gbGluZXMgLSAxCisJbW92dwkkMHgzZDQsICVkeAorCW1vdncJJWF4LCAlYngKKwltb3ZiCSQweDEyLCAlYWwJCQkjIExvd2VyIDggYml0cworCW1vdmIJJWJsLCAlYWgKKwlvdXR3CSVheCwgJWR4CisJbW92YgkkMHgwNywgJWFsCQkjIEJpdHMgOCBhbmQgOSBpbiB0aGUgb3ZlcmZsb3cgcmVnaXN0ZXIKKwljYWxsCWluaWR4CisJeGNoZ2IJJWFsLCAlYWgKKwlhbmRiCSQweGJkLCAlYWgKKwlzaHJiCSViaAorCWpuYwlyY3QxCisJb3JiCSQweDAyLCAlYWgKK3JjdDE6CXNocmIJJWJoCisJam5jCXJjdDIKKwlvcmIJJDB4NDAsICVhaAorcmN0MjoJbW92YgkkMHgwNywgJWFsCisJb3V0dwklYXgsICVkeAorCXN0YworcmN0MzoJcmV0CisKKyMgVGFibGUgb2Ygcm91dGluZXMgZm9yIHNldHRpbmcgb2YgdGhlIHNwZWNpYWwgbW9kZXMuCitzcGVjX2luaXRzOgorCS53b3JkCXNldF84MHgyNQorCS53b3JkCXNldF84cGl4ZWwKKwkud29yZAlzZXRfODB4NDMKKwkud29yZAlzZXRfODB4MjgKKwkud29yZAlzZXRfY3VycmVudAorCS53b3JkCXNldF84MHgzMAorCS53b3JkCXNldF84MHgzNAorCS53b3JkCXNldF84MHg2MAorCS53b3JkCXNldF9nZngKKworIyBTZXQgdGhlIDgweDI1IG1vZGUuIElmIGFscmVhZHkgc2V0LCBkbyBub3RoaW5nLgorc2V0XzgweDI1OgorCW1vdncJJDB4NTAxOSwgZm9yY2Vfc2l6ZQkJIyBPdmVycmlkZSBwb3NzaWJseSBicm9rZW4gQklPUwordXNlXzgweDI1OgorI2lmZGVmIENPTkZJR19WSURFT180MDBfSEFDSworCW1vdncJJDB4MTIwMiwgJWF4CQkJIyBGb3JjZSA0MDAgc2NhbiBsaW5lcworCW1vdmIJJDB4MzAsICVibAorCWludAkkMHgxMAorI2Vsc2UKKwltb3ZiCSQweDBmLCAlYWgJCQkjIEdldCBjdXJyZW50IG1vZGUgSUQKKwlpbnQJJDB4MTAKKwljbXB3CSQweDUwMDcsICVheAkjIE1vZGUgNyAoODB4MjUgbW9ubykgaXMgdGhlIG9ubHkgb25lIGF2YWlsYWJsZQorCWp6CXN0ODAJCSMgb24gQ0dBL01EQS9IR0EgYW5kIGlzIGFsc28gYXZhaWxhYmxlIG9uIEVHQU0KKworCWNtcHcJJDB4NTAwMywgJWF4CSMgVW5rbm93biBtb2RlLCBmb3JjZSA4MHgyNSBjb2xvcgorCWpueglmb3JjZTMKKworc3Q4MDoJY21wYgkkMCwgYWRhcHRlcgkjIENHQS9NREEvSEdBID0+IG1vZGUgMy83IGlzIGFsd2F5cyA4MHgyNQorCWp6CXNldDgwCisKKwltb3ZiCSVnczooMHgwNDg0KSwgJWFsCSMgVGhpcyBpcyBFR0ErIC0tIGJld2FyZSBvZiA4MHg1MCBldGMuCisJb3JiCSVhbCwgJWFsCQkjIFNvbWUgYnVnZ3kgQklPUydlcyBzZXQgMCByb3dzCisJanoJc2V0ODAKKwkKKwljbXBiCSQyNCwgJWFsCQkjIEl0J3MgaG9wZWZ1bGx5IGNvcnJlY3QKKwlqeglzZXQ4MAorI2VuZGlmIC8qIENPTkZJR19WSURFT180MDBfSEFDSyAqLworZm9yY2UzOglET19TVE9SRQorCW1vdncJJDB4MDAwMywgJWF4CQkJIyBGb3JjZWQgc2V0CisJaW50CSQweDEwCitzZXQ4MDoJc3RjCisJcmV0CisKKyMgU2V0IHRoZSA4MHg1MC84MHg0MyA4LXBpeGVsIG1vZGUuIFNpbXBsZSBCSU9TIGNhbGxzLgorc2V0XzhwaXhlbDoKKwlET19TVE9SRQorCWNhbGwJdXNlXzgweDI1CQkJIyBUaGUgYmFzZSBpcyA4MHgyNQorc2V0XzhwdDoKKwltb3Z3CSQweDExMTIsICVheAkJCSMgVXNlIDh4OCBmb250CisJeG9yYgklYmwsICVibAorCWludAkkMHgxMAorCW1vdncJJDB4MTIwMCwgJWF4CQkJIyBVc2UgYWx0ZXJuYXRlIHByaW50IHNjcmVlbgorCW1vdmIJJDB4MjAsICVibAorCWludAkkMHgxMAorCW1vdncJJDB4MTIwMSwgJWF4CQkJIyBUdXJuIG9mZiBjdXJzb3IgZW11bGF0aW9uCisJbW92YgkkMHgzNCwgJWJsCisJaW50CSQweDEwCisJbW92YgkkMHgwMSwgJWFoCQkJIyBEZWZpbmUgY3Vyc29yIHNjYW4gbGluZXMgNi03CisJbW92dwkkMHgwNjA3LCAlY3gKKwlpbnQJJDB4MTAKK3NldF9jdXJyZW50OgorCXN0YworCXJldAorCisjIFNldCB0aGUgODB4MjggbW9kZS4gVGhpcyBtb2RlIHdvcmtzIG9uIGFsbCBWR0EncywgYmVjYXVzZSBpdCdzIGEgc3RhbmRhcmQKKyMgODB4MjUgbW9kZSB3aXRoIDE0LXBvaW50IGZvbnRzIGluc3RlYWQgb2YgMTYtcG9pbnQuCitzZXRfODB4Mjg6CisJRE9fU1RPUkUKKwljYWxsCXVzZV84MHgyNQkJCSMgVGhlIGJhc2UgaXMgODB4MjUKK3NldDE0Ogltb3Z3CSQweDExMTEsICVheAkJCSMgVXNlIDl4MTQgZm9udAorCXhvcmIJJWJsLCAlYmwKKwlpbnQJJDB4MTAKKwltb3ZiCSQweDAxLCAlYWgJCQkjIERlZmluZSBjdXJzb3Igc2NhbiBsaW5lcyAxMS0xMgorCW1vdncJJDB4MGIwYywgJWN4CisJaW50CSQweDEwCisJc3RjCisJcmV0CisKKyMgU2V0IHRoZSA4MHg0MyBtb2RlLiBUaGlzIG1vZGUgaXMgd29ya3Mgb24gYWxsIFZHQSdzLgorIyBJdCdzIGEgMzUwLXNjYW5saW5lIG1vZGUgd2l0aCA4LXBpeGVsIGZvbnQuCitzZXRfODB4NDM6CisJRE9fU1RPUkUKKwltb3Z3CSQweDEyMDEsICVheAkJCSMgU2V0IDM1MCBzY2FucworCW1vdmIJJDB4MzAsICVibAorCWludAkkMHgxMAorCW1vdncJJDB4MDAwMywgJWF4CQkJIyBSZXNldCB2aWRlbyBtb2RlCisJaW50CSQweDEwCisJam1wCXNldF84cHQJCQkJIyBVc2UgOC1waXhlbCBmb250CisKKyMgU2V0IHRoZSA4MHgzMCBtb2RlIChhbGwgVkdBJ3MpLiA0ODAgc2NhbmxpbmVzLCAxNi1waXhlbCBmb250Lgorc2V0XzgweDMwOgorCWNhbGwJdXNlXzgweDI1CQkJIyBTdGFydCB3aXRoIHJlYWwgODB4MjUKKwlET19TVE9SRQorCW1vdncJJDB4M2NjLCAlZHgJCQkjIEdldCBDUlRDIHBvcnQKKwlpbmIJJWR4LCAlYWwKKwltb3ZiCSQweGQ0LCAlZGwKKwlyb3JiCSVhbAkJCQkjIE1vbm8gb3IgY29sb3I/CisJamMJc2V0NDhhCisKKwltb3ZiCSQweGI0LCAlZGwKK3NldDQ4YToJbW92dwkkMHgwYzExLCAlYXgJCSMgVmVydGljYWwgc3luYyBlbmQgKGFsc28gdW5sb2NrcyBDUjAtNykKKyAJY2FsbAlvdXRpZHgKKwltb3Z3CSQweDBiMDYsICVheAkJCSMgVmVydGljYWwgdG90YWwKKyAJY2FsbAlvdXRpZHgKKwltb3Z3CSQweDNlMDcsICVheAkJCSMgKFZlcnRpY2FsKSBvdmVyZmxvdworIAljYWxsCW91dGlkeAorCW1vdncJJDB4ZWExMCwgJWF4CQkJIyBWZXJ0aWNhbCBzeW5jIHN0YXJ0CisgCWNhbGwJb3V0aWR4CisJbW92dwkkMHhkZjEyLCAlYXgJCQkjIFZlcnRpY2FsIGRpc3BsYXkgZW5kCisJY2FsbAlvdXRpZHgKKwltb3Z3CSQweGU3MTUsICVheAkJCSMgVmVydGljYWwgYmxhbmsgc3RhcnQKKyAJY2FsbAlvdXRpZHgKKwltb3Z3CSQweDA0MTYsICVheAkJCSMgVmVydGljYWwgYmxhbmsgZW5kCisgCWNhbGwJb3V0aWR4CisJcHVzaHcJJWR4CisJbW92YgkkMHhjYywgJWRsCQkJIyBNaXNjIG91dHB1dCByZWdpc3RlciAocmVhZCkKKyAJaW5iCSVkeCwgJWFsCisgCW1vdmIJJDB4YzIsICVkbAkJCSMgKHdyaXRlKQorIAlhbmRiCSQweDBkLCAlYWwJIyBQcmVzZXJ2ZSBjbG9jayBzZWxlY3QgYml0cyBhbmQgY29sb3IgYml0CisgCW9yYgkkMHhlMiwgJWFsCQkJIyBTZXQgY29ycmVjdCBzeW5jIHBvbGFyaXR5CisgCW91dGIJJWFsLCAlZHgKKwlwb3B3CSVkeAorCW1vdncJJDB4NTAxZSwgZm9yY2Vfc2l6ZQorCXN0YwkJCQkJIyBUaGF0J3MgYWxsLgorCXJldAorCisjIFNldCB0aGUgODB4MzQgbW9kZSAoYWxsIFZHQSdzKS4gNDgwIHNjYW5zLCAxNC1waXhlbCBmb250Lgorc2V0XzgweDM0OgorCWNhbGwJc2V0XzgweDMwCQkJIyBTZXQgNDgwIHNjYW5zCisJY2FsbAlzZXQxNAkJCQkjIEFuZCAxNC1wdCBmb250CisJbW92dwkkMHhkYjEyLCAlYXgJCQkjIFZHQSB2ZXJ0aWNhbCBkaXNwbGF5IGVuZAorCW1vdncJJDB4NTAyMiwgZm9yY2Vfc2l6ZQorc2V0dmRlOgljYWxsCW91dGlkeAorCXN0YworCXJldAorCisjIFNldCB0aGUgODB4NjAgbW9kZSAoYWxsIFZHQSdzKS4gNDgwIHNjYW5zLCA4LXBpeGVsIGZvbnQuCitzZXRfODB4NjA6CisJY2FsbAlzZXRfODB4MzAJCQkjIFNldCA0ODAgc2NhbnMKKwljYWxsCXNldF84cHQJCQkJIyBBbmQgOC1wdCBmb250CisJbW92dwkkMHhkZjEyLCAlYXgJCQkjIFZHQSB2ZXJ0aWNhbCBkaXNwbGF5IGVuZAorCW1vdncJJDB4NTAzYywgZm9yY2Vfc2l6ZQorCWptcAlzZXR2ZGUKKworIyBTcGVjaWFsIGhhY2sgZm9yIFRoaW5rUGFkIGdyYXBoaWNzCitzZXRfZ2Z4OgorI2lmZGVmIENPTkZJR19WSURFT19HRlhfSEFDSworCW1vdncJJFZJREVPX0dGWF9CSU9TX0FYLCAlYXgKKwltb3Z3CSRWSURFT19HRlhfQklPU19CWCwgJWJ4CisJaW50CSQweDEwCisJbW92dwkkVklERU9fR0ZYX0RVTU1ZX1JFU09MVVRJT04sIGZvcmNlX3NpemUKKwlzdGMKKyNlbmRpZgorCXJldAorCisjaWZkZWYgQ09ORklHX1ZJREVPX1JFVEFJTgorCisjIFN0b3JlIHNjcmVlbiBjb250ZW50cyB0byB0ZW1wb3JhcnkgYnVmZmVyLgorc3RvcmVfc2NyZWVuOgorCWNtcGIJJDAsIGRvX3Jlc3RvcmUJCQkjIEFscmVhZHkgc3RvcmVkPworCWpueglzdHNyCisKKwl0ZXN0YgkkQ0FOX1VTRV9IRUFQLCBsb2FkZmxhZ3MJIyBIYXZlIHdlIHNwYWNlIGZvciBzdG9yaW5nPworCWp6CXN0c3IKKwkKKwlwdXNodwklYXgKKwlwdXNodwklYngKKwlwdXNodwlmb3JjZV9zaXplCQkJIyBEb24ndCBmb3JjZSBzcGVjaWZpYyBzaXplCisJbW92dwkkMCwgZm9yY2Vfc2l6ZQorCWNhbGwJbW9kZV9wYXJhbXMJCQkjIE9idGFpbiBwYXJhbXMgb2YgY3VycmVudCBtb2RlCisJcG9wdwlmb3JjZV9zaXplCisJbW92YgklZnM6KFBBUkFNX1ZJREVPX0xJTkVTKSwgJWFoCisJbW92YgklZnM6KFBBUkFNX1ZJREVPX0NPTFMpLCAlYWwKKwltb3Z3CSVheCwgJWJ4CQkJIyBCWD1kaW1lbnNpb25zCisJbXVsYgklYWgKKwltb3Z3CSVheCwgJWN4CQkJIyBDWD1udW1iZXIgb2YgY2hhcmFjdGVycworCWFkZHcJJWF4LCAlYXgJCQkjIENhbGN1bGF0ZSBpbWFnZSBzaXplCisJYWRkdwkkbW9kZWxpc3QrMTAyNCs0LCAlYXgKKwljbXB3CWhlYXBfZW5kX3B0ciwgJWF4CisJam5jCXN0czEJCQkJIyBVbmZvcnR1bmF0ZWx5LCBvdXQgb2YgbWVtb3J5CisKKwltb3Z3CSVmczooUEFSQU1fQ1VSU09SX1BPUyksICVheAkjIFN0b3JlIG1vZGUgcGFyYW1zCisJbGVhdwltb2RlbGlzdCsxMDI0LCAlZGkKKwlzdG9zdworCW1vdncJJWJ4LCAlYXgKKwlzdG9zdworCXB1c2h3CSVkcwkJCQkjIFN0b3JlIHRoZSBzY3JlZW4KKwltb3Z3CXZpZGVvX3NlZ21lbnQsICVkcworCXhvcncJJXNpLCAlc2kKKwlyZXAKKwltb3ZzdworCXBvcHcJJWRzCisJaW5jYglkb19yZXN0b3JlCQkJIyBTY3JlZW4gd2lsbCBiZSByZXN0b3JlZCBsYXRlcgorc3RzMToJcG9wdwklYngKKwlwb3B3CSVheAorc3RzcjoJcmV0CisKKyMgUmVzdG9yZSBzY3JlZW4gY29udGVudHMgZnJvbSB0ZW1wb3JhcnkgYnVmZmVyLgorcmVzdG9yZV9zY3JlZW46CisJY21wYgkkMCwgZG9fcmVzdG9yZQkJCSMgSGFzIHRoZSBzY3JlZW4gYmVlbiBzdG9yZWQ/CisJanoJcmVzMQorCisJY2FsbAltb2RlX3BhcmFtcwkJCSMgR2V0IHBhcmFtZXRlcnMgb2YgY3VycmVudCBtb2RlCisJbW92YgklZnM6KFBBUkFNX1ZJREVPX0xJTkVTKSwgJWNsCisJbW92YgklZnM6KFBBUkFNX1ZJREVPX0NPTFMpLCAlY2gKKwlsZWF3CW1vZGVsaXN0KzEwMjQsICVzaQkJIyBTY3JlZW4gYnVmZmVyCisJbG9kc3cJCQkJCSMgU2V0IGN1cnNvciBwb3NpdGlvbgorCW1vdncJJWF4LCAlZHgKKwljbXBiCSVjbCwgJWRoCisJamMJcmVzMgorCQorCW1vdmIJJWNsLCAlZGgKKwlkZWNiCSVkaAorcmVzMjoJY21wYgklY2gsICVkbAorCWpjCXJlczMKKwkKKwltb3ZiCSVjaCwgJWRsCisJZGVjYgklZGwKK3JlczM6CW1vdmIJJDB4MDIsICVhaAorCW1vdmIJJDB4MDAsICViaAorCWludAkkMHgxMAorCWxvZHN3CQkJCQkjIERpc3BsYXkgc2l6ZQorCW1vdmIJJWFoLCAlZGwJCQkjIERMPW51bWJlciBvZiBsaW5lcworCW1vdmIJJDAsICVhaAkJCQkjIEJYPXBoeXMuIGxlbmd0aCBvZiBvcmlnLiBsaW5lCisJbW92dwklYXgsICVieAorCWNtcGIJJWNsLCAlZGwJCQkjIFRvbyBtYW55PworCWpjCXJlczQKKworCXB1c2h3CSVheAorCW1vdmIJJWRsLCAlYWwKKwlzdWJiCSVjbCwgJWFsCisJbXVsYgklYmwKKwlhZGR3CSVheCwgJXNpCisJYWRkdwklYXgsICVzaQorCXBvcHcJJWF4CisJbW92YgklY2wsICVkbAorcmVzNDoJY21wYgklY2gsICVhbAkJCSMgVG9vIHdpZGU/CisJamMJcmVzNQorCQorCW1vdmIJJWNoLCAlYWwJCQkjIEFYPXdpZHRoIG9mIHNyYy4gbGluZQorcmVzNToJbW92YgkkMCwgJWNsCisJeGNoZ2IJJWNoLCAlY2wKKwltb3Z3CSVjeCwgJWJwCQkJIyBCUD13aWR0aCBvZiBkZXN0LiBsaW5lCisJcHVzaHcJJWVzCisJbW92dwl2aWRlb19zZWdtZW50LCAlZXMKKwl4b3J3CSVkaSwgJWRpCQkJIyBNb3ZlIHRoZSBkYXRhCisJYWRkdwklYngsICVieAkJCSMgQ29udmVydCBCWCBhbmQgQlAgdG8gX2J5dGVzXworCWFkZHcJJWJwLCAlYnAKK3JlczY6CXB1c2h3CSVzaQorCXB1c2h3CSVkaQorCW1vdncJJWF4LCAlY3gKKwlyZXAKKwltb3ZzdworCXBvcHcJJWRpCisJcG9wdwklc2kKKwlhZGR3CSVicCwgJWRpCisJYWRkdwklYngsICVzaQorCWRlY2IJJWRsCisJam56CXJlczYKKwkKKwlwb3B3CSVlcwkJCQkjIERvbmUKK3JlczE6CXJldAorI2VuZGlmIC8qIENPTkZJR19WSURFT19SRVRBSU4gKi8KKworIyBXcml0ZSB0byBpbmRleGVkIFZHQSByZWdpc3RlciAoQUw9aW5kZXgsIEFIPWRhdGEsIERYPWluZGV4IHJlZy4gcG9ydCkKK291dGlkeDoJb3V0YgklYWwsICVkeAorCXB1c2h3CSVheAorCW1vdmIJJWFoLCAlYWwKKwlpbmN3CSVkeAorCW91dGIJJWFsLCAlZHgKKwlkZWN3CSVkeAorCXBvcHcJJWF4CisJcmV0CisKKyMgQnVpbGQgdGhlIHRhYmxlIG9mIHZpZGVvIG1vZGVzIChzdG9yZWQgYWZ0ZXIgdGhlIHNldHVwLlMgY29kZSBhdCB0aGUKKyMgYG1vZGVsaXN0JyBsYWJlbC4gRWFjaCB2aWRlbyBtb2RlIHJlY29yZCBsb29rcyBsaWtlOgorIwkud29yZAlNT0RFLUlECQkob3VyIHNwZWNpYWwgbW9kZSBJRCAoc2VlIGFib3ZlKSkKKyMJLmJ5dGUJcm93cwkJKG51bWJlciBvZiByb3dzKQorIwkuYnl0ZQljb2x1bW5zCQkobnVtYmVyIG9mIGNvbHVtbnMpCisjIFJldHVybnMgYWRkcmVzcyBvZiB0aGUgZW5kIG9mIHRoZSB0YWJsZSBpbiBESSwgdGhlIGVuZCBpcyBtYXJrZWQKKyMgd2l0aCBhIEFTS19WR0EgSUQuCittb2RlX3RhYmxlOgorCW1vdncJbXRfZW5kLCAlZGkJCQkjIEFscmVhZHkgZmlsbGVkPworCW9ydwklZGksICVkaQorCWpuegltdGFiMXgKKwkKKwlsZWF3CW1vZGVsaXN0LCAlZGkJCQkjIFN0b3JlIHN0YW5kYXJkIG1vZGVzOgorCW1vdmwJJFZJREVPXzgweDI1ICsgMHg1MDE5MDAwMCwgJWVheAkjIFRoZSA4MHgyNSBtb2RlIChBTEwpCisJc3Rvc2wKKwltb3ZiCWFkYXB0ZXIsICVhbAkJCSMgQ0dBL01EQS9IR0EgLS0gbm8gbW9yZSBtb2RlcworCW9yYgklYWwsICVhbAorCWp6CW10YWJlCisJCisJZGVjYgklYWwKKwlqbnoJbXRhYnYKKwkKKwltb3ZsCSRWSURFT184UE9JTlQgKyAweDUwMmIwMDAwLCAlZWF4CSMgVGhlIDgweDQzIEVHQSBtb2RlCisJc3Rvc2wKKwlqbXAJbXRhYmUKKworbXRhYjF4OglqbXAJbXRhYjEKKworbXRhYnY6CWxlYXcJdmdhX21vZGVzLCAlc2kJCQkjIEFsbCBtb2RlcyBmb3Igc3RkIFZHQQorCW1vdncJJHZnYV9tb2Rlc19lbmQtdmdhX21vZGVzLCAlY3gKKwlyZXAJIyBJJ20gdW5hYmxlIHRvIHVzZSBtb3ZzdyBhcyBJIGRvbid0IGtub3cgaG93IHRvIHN0b3JlIGEgaGFsZgorCW1vdnNiCSMgb2YgdGhlIGV4cHJlc3Npb24gYWJvdmUgdG8gY3ggd2l0aG91dCB1c2luZyBleHBsaWNpdCBzaHIuCisKKwljbXBiCSQwLCBzY2FubmluZwkJCSMgTW9kZSBzY2FuIHJlcXVlc3RlZD8KKwlqegltc2NhbjEKKwkKKwljYWxsCW1vZGVfc2NhbgorbXNjYW4xOgorCisjaWZkZWYgQ09ORklHX1ZJREVPX0xPQ0FMCisJY2FsbAlsb2NhbF9tb2RlcworI2VuZGlmIC8qIENPTkZJR19WSURFT19MT0NBTCAqLworCisjaWZkZWYgQ09ORklHX1ZJREVPX1ZFU0EKKwljYWxsCXZlc2FfbW9kZXMJCQkjIERldGVjdCBWRVNBIFZHQSBtb2RlcworI2VuZGlmIC8qIENPTkZJR19WSURFT19WRVNBICovCisKKyNpZmRlZiBDT05GSUdfVklERU9fU1ZHQQorCWNtcGIJJDAsIHNjYW5uaW5nCQkJIyBCeXBhc3Mgd2hlbiBzY2FubmluZworCWpuegltc2NhbjIKKwkKKwljYWxsCXN2Z2FfbW9kZXMJCQkjIERldGVjdCBTVkdBIGNhcmRzICYgbW9kZXMKK21zY2FuMjoKKyNlbmRpZiAvKiBDT05GSUdfVklERU9fU1ZHQSAqLworCittdGFiZToKKworI2lmZGVmIENPTkZJR19WSURFT19DT01QQUNUCisJbGVhdwltb2RlbGlzdCwgJXNpCisJbW92dwklZGksICVkeAorCW1vdncJJXNpLCAlZGkKK2NtdDE6CWNtcHcJJWR4LCAlc2kJCQkjIFNjYW4gYWxsIG1vZGVzCisJanoJY210MgorCisJbGVhdwltb2RlbGlzdCwgJWJ4CQkJIyBGaW5kIGluIHByZXZpb3VzIGVudHJpZXMKKwltb3Z3CTIoJXNpKSwgJWN4CitjbXQzOgljbXB3CSVieCwgJXNpCisJanoJY210NAorCisJY21wdwkyKCVieCksICVjeAkJCSMgRm91bmQgPT4gZG9uJ3QgY29weSB0aGlzIGVudHJ5CisJanoJY210NQorCisJYWRkdwkkNCwgJWJ4CisJam1wCWNtdDMKKworY210NDoJbW92c2wJCQkJCSMgQ29weSBlbnRyeQorCWptcAljbXQxCisKK2NtdDU6CWFkZHcJJDQsICVzaQkJCQkjIFNraXAgZW50cnkKKwlqbXAJY210MQorCitjbXQyOgorI2VuZGlmCS8qIENPTkZJR19WSURFT19DT01QQUNUICovCisKKwltb3Z3CSRBU0tfVkdBLCAoJWRpKQkJCSMgRW5kIG1hcmtlcgorCW1vdncJJWRpLCBtdF9lbmQKK210YWIxOglsZWF3CW1vZGVsaXN0LCAlc2kJCQkjIFNJPW1vZGUgbGlzdCwgREk9bGlzdCBlbmQKK3JldDA6CXJldAorCisjIE1vZGVzIHVzYWJsZSBvbiBhbGwgc3RhbmRhcmQgVkdBcwordmdhX21vZGVzOgorCS53b3JkCVZJREVPXzhQT0lOVAorCS53b3JkCTB4NTAzMgkJCQkjIDgweDUwCisJLndvcmQJVklERU9fODB4NDMKKwkud29yZAkweDUwMmIJCQkJIyA4MHg0MworCS53b3JkCVZJREVPXzgweDI4CisJLndvcmQJMHg1MDFjCQkJCSMgODB4MjgKKwkud29yZAlWSURFT184MHgzMAorCS53b3JkCTB4NTAxZQkJCQkjIDgweDMwCisJLndvcmQJVklERU9fODB4MzQKKwkud29yZAkweDUwMjIJCQkJIyA4MHgzNAorCS53b3JkCVZJREVPXzgweDYwCisJLndvcmQJMHg1MDNjCQkJCSMgODB4NjAKKyNpZmRlZiBDT05GSUdfVklERU9fR0ZYX0hBQ0sKKwkud29yZAlWSURFT19HRlhfSEFDSworCS53b3JkCVZJREVPX0dGWF9EVU1NWV9SRVNPTFVUSU9OCisjZW5kaWYKKwordmdhX21vZGVzX2VuZDoKKyMgRGV0ZWN0IFZFU0EgbW9kZXMuCisKKyNpZmRlZiBDT05GSUdfVklERU9fVkVTQQordmVzYV9tb2RlczoKKwljbXBiCSQyLCBhZGFwdGVyCQkJIyBWR0Egb25seQorCWpueglyZXQwCisKKwltb3Z3CSVkaSwgJWJwCQkJIyBCUD1vcmlnaW5hbCBtb2RlIHRhYmxlIGVuZAorCWFkZHcJJDB4MjAwLCAlZGkJCQkjIEJ1ZmZlciBzcGFjZQorCW1vdncJJDB4NGYwMCwgJWF4CQkJIyBWRVNBIEdldCBjYXJkIGluZm8gY2FsbAorCWludAkkMHgxMAorCW1vdncJJWJwLCAlZGkKKwljbXB3CSQweDAwNGYsICVheAkJCSMgU3VjY2Vzc2Z1bD8KKwlqbnoJcmV0MAorCQorCWNtcHcJJDB4NDU1NiwgMHgyMDAoJWRpKQorCWpueglyZXQwCisJCisJY21wdwkkMHg0MTUzLCAweDIwMiglZGkpCisJam56CXJldDAKKwkKKwltb3Z3CSR2ZXNhX25hbWUsIGNhcmRfbmFtZQkJIyBTZXQgbmFtZSB0byAiVkVTQSBWR0EiCisJcHVzaHcJJWdzCisJbGdzdwkweDIwZSglZGkpLCAlc2kJCQkjIEdTOlNJPW1vZGUgbGlzdAorCW1vdncJJDEyOCwgJWN4CQkJIyBJdGVyYXRpb24gbGltaXQKK3Zlc2ExOgorIyBnYXMgdmVyc2lvbiAyLjkuMSwgdXNpbmcgQkZEIHZlcnNpb24gMi45LjEuMC4yMyBidWdnZXJzIHRoZSBuZXh0IGluc3QuCisjIFhYWDoJbG9kc3cJJWdzOiglc2kpLCAlYXgJCQkjIEdldCBuZXh0IG1vZGUgaW4gdGhlIGxpc3QKKwlnczsgbG9kc3cKKwljbXB3CSQweGZmZmYsICVheAkJCSMgRW5kIG9mIHRoZSB0YWJsZT8KKwlqegl2ZXNhcgorCQorCWNtcHcJJDB4MDA4MCwgJWF4CQkJIyBDaGVjayB2YWxpZGl0eSBvZiBtb2RlIElECisJamMJdmVzYTIKKwkKKwlvcmIJJWFoLCAlYWgJCSMgVmFsaWQgSURzOiAweDAwMDAtMHgwMDdmLzB4MDEwMC0weDA3ZmYKKwlqegl2ZXNhbgkJCSMgQ2VydGFpbiBCSU9TZXMgcmVwb3J0IDB4ODAtMHhmZiEKKworCWNtcHcJJDB4MDgwMCwgJWF4CisJam5jCXZlc2FlCisKK3Zlc2EyOglwdXNodwklY3gKKwltb3Z3CSVheCwgJWN4CQkJIyBHZXQgbW9kZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKKwltb3Z3CSQweDRmMDEsICVheAorCWludAkkMHgxMAorCW1vdncJJWN4LCAlYngJCQkjIEJYPW1vZGUgbnVtYmVyCisJYWRkYgkkVklERU9fRklSU1RfVkVTQT4+OCwgJWJoCisJcG9wdwklY3gKKwljbXB3CSQweDAwNGYsICVheAorCWpuegl2ZXNhbgkJCSMgRG9uJ3QgcmVwb3J0IGVycm9ycyAoYnVnZ3kgQklPU0VTKQorCisJbW92YgkoJWRpKSwgJWFsCQkJIyBDaGVjayBjYXBhYmlsaXRpZXMuIFdlIHJlcXVpcmUKKwlhbmRiCSQweDE5LCAlYWwJCQkjIGEgY29sb3IgdGV4dCBtb2RlLgorCWNtcGIJJDB4MDksICVhbAorCWpuegl2ZXNhbgorCQorCWNtcHcJJDB4YjgwMCwgOCglZGkpCQkjIFN0YW5kYXJkIHZpZGVvIG1lbW9yeSBhZGRyZXNzIHJlcXVpcmVkCisJam56CXZlc2FuCisKKwl0ZXN0YgkkMiwgKCVkaSkJCQkjIE1vZGUgY2hhcmFjdGVyaXN0aWNzIHN1cHBsaWVkPworCW1vdncJJWJ4LCAoJWRpKQkJCSMgU3RvcmUgbW9kZSBudW1iZXIKKwlqegl2ZXNhMworCQorCXhvcncJJWR4LCAlZHgKKwltb3Z3CTB4MTIoJWRpKSwgJWJ4CQkJIyBXaWR0aAorCW9yYgklYmgsICViaAorCWpuegl2ZXNhbgorCQorCW1vdmIJJWJsLCAweDMoJWRpKQorCW1vdncJMHgxNCglZGkpLCAlYXgJCQkjIEhlaWdodAorCW9yYgklYWgsICVhaAorCWpuegl2ZXNhbgorCQorCW1vdmIJJWFsLCAyKCVkaSkKKwltdWxiCSVibAorCWNtcHcJJDgxOTMsICVheAkJIyBTbWFsbCBlbm91Z2ggZm9yIExpbnV4IGNvbnNvbGUgZHJpdmVyPworCWpuYwl2ZXNhbgorCisJam1wCXZlc2FvaworCit2ZXNhMzoJc3VidwkkMHg4MTA4LCAlYngJIyBUaGlzIG1vZGUgaGFzIG5vIGRldGFpbGVkIGluZm8gc3BlY2lmaWVkLAorCWpjCXZlc2FuCQkjIHNvIGl0IG11c3QgYmUgYSBzdGFuZGFyZCBWRVNBIG1vZGUuCisKKwljbXB3CSQ1LCAlYngKKwlqbmMJdmVzYW4KKworCW1vdncJdmVzYV90ZXh0X21vZGVfdGFibGUoJWJ4KSwgJWF4CisJbW92dwklYXgsIDIoJWRpKQordmVzYW9rOglhZGR3CSQ0LCAlZGkJCQkJIyBUaGUgbW9kZSBpcyB2YWxpZC4gU3RvcmUgaXQuCit2ZXNhbjoJbG9vcAl2ZXNhMQkJCSMgTmV4dCBtb2RlLiBMaW1pdCBleGNlZWRlZCA9PiBlcnJvcgordmVzYWU6CWxlYXcJdmVzYWVyLCAlc2kKKwljYWxsCXBydHN0cgorCW1vdncJJWJwLCAlZGkJCQkjIERpc2NhcmQgYWxyZWFkeSBmb3VuZCBtb2Rlcy4KK3Zlc2FyOglwb3B3CSVncworCXJldAorCisjIERpbWVuc2lvbnMgb2Ygc3RhbmRhcmQgVkVTQSB0ZXh0IG1vZGVzCit2ZXNhX3RleHRfbW9kZV90YWJsZToKKwkuYnl0ZQk2MCwgODAJCQkJIyAwMTA4CisJLmJ5dGUJMjUsIDEzMgkJCQkjIDAxMDkKKwkuYnl0ZQk0MywgMTMyCQkJCSMgMDEwQQorCS5ieXRlCTUwLCAxMzIJCQkJIyAwMTBCCisJLmJ5dGUJNjAsIDEzMgkJCQkjIDAxMEMKKyNlbmRpZgkvKiBDT05GSUdfVklERU9fVkVTQSAqLworCisjIFNjYW4gZm9yIHZpZGVvIG1vZGVzLiBBIGJpdCBkaXJ0eSwgYnV0IHNob3VsZCB3b3JrLgorbW9kZV9zY2FuOgorCW1vdncJJDB4MDEwMCwgJWN4CQkJIyBTdGFydCB3aXRoIG1vZGUgMAorc2NtMToJbW92YgkkMCwgJWFoCQkJCSMgVGVzdCB0aGUgbW9kZQorCW1vdmIJJWNsLCAlYWwKKwlpbnQJJDB4MTAKKwltb3ZiCSQweDBmLCAlYWgKKwlpbnQJJDB4MTAKKwljbXBiCSVjbCwgJWFsCisJam56CXNjbTIJCQkJIyBNb2RlIG5vdCBzZXQKKworCW1vdncJJDB4M2MwLCAlZHgJCQkjIFRlc3QgaWYgaXQncyBhIHRleHQgbW9kZQorCW1vdmIJJDB4MTAsICVhbAkJCSMgTW9kZSBiaXRzCisJY2FsbAlpbmlkeAorCWFuZGIJJDB4MDMsICVhbAorCWpueglzY20yCisJCisJbW92YgkkMHhjZSwgJWRsCQkJIyBBbm90aGVyIHNldCBvZiBtb2RlIGJpdHMKKwltb3ZiCSQweDA2LCAlYWwKKwljYWxsCWluaWR4CisJc2hyYgklYWwKKwlqYwlzY20yCisJCisJbW92YgkkMHhkNCwgJWRsCQkJIyBDdXJzb3IgbG9jYXRpb24KKwltb3ZiCSQweDBmLCAlYWwKKwljYWxsCWluaWR4CisJb3JiCSVhbCwgJWFsCisJam56CXNjbTIKKwkKKwltb3Z3CSVjeCwgJWF4CQkJIyBPaywgc3RvcmUgdGhlIG1vZGUKKwlzdG9zdworCW1vdmIJJWdzOigweDQ4NCksICVhbAkJIyBOdW1iZXIgb2Ygcm93cworCWluY2IJJWFsCisJc3Rvc2IKKwltb3Z3CSVnczooMHg0NGEpLCAlYXgJCSMgTnVtYmVyIG9mIGNvbHVtbnMKKwlzdG9zYgorc2NtMjoJaW5jYgklY2wKKwlqbnMJc2NtMQorCQorCW1vdncJJDB4MDAwMywgJWF4CQkJIyBSZXR1cm4gYmFjayB0byBtb2RlIDMKKwlpbnQJJDB4MTAKKwlyZXQKKwordHN0aWR4OglvdXR3CSVheCwgJWR4CQkJIyBPVVQgRFgsQVggYW5kIGluaWR4CitpbmlkeDoJb3V0YgklYWwsICVkeAkJCSMgUmVhZCBmcm9tIGluZGV4ZWQgVkdBIHJlZ2lzdGVyCisJaW5jdwklZHgJCQkjIEFMPWluZGV4LCBEWD1pbmRleCByZWcgcG9ydCAtPiBBTD1kYXRhCisJaW5iCSVkeCwgJWFsCisJZGVjdwklZHgKKwlyZXQKKworIyBUcnkgdG8gZGV0ZWN0IHR5cGUgb2YgU1ZHQSBjYXJkIGFuZCBzdXBwbHkgKHVzdWFsbHkgYXBwcm94aW1hdGUpIHZpZGVvCisjIG1vZGUgdGFibGUgZm9yIGl0LgorCisjaWZkZWYgQ09ORklHX1ZJREVPX1NWR0EKK3N2Z2FfbW9kZXM6CisJbGVhdwlzdmdhX3RhYmxlLCAlc2kJCQkjIFRlc3QgYWxsIGtub3duIFNWR0EgYWRhcHRlcnMKK2Rvc3ZnYToJbG9kc3cKKwltb3Z3CSVheCwgJWJwCQkJIyBEZWZhdWx0IG1vZGUgdGFibGUKKwlvcncJJWF4LCAlYXgKKwlqeglkaWRzdjEKKworCWxvZHN3CQkJCQkjIFBvaW50ZXIgdG8gdGVzdCByb3V0aW5lCisJcHVzaHcJJXNpCisJcHVzaHcJJWRpCisJcHVzaHcJJWVzCisJbW92dwkkMHhjMDAwLCAlYngKKwltb3Z3CSVieCwgJWVzCisJY2FsbAkqJWF4CQkJCSMgQ2FsbCB0ZXN0IHJvdXRpbmUKKwlwb3B3CSVlcworCXBvcHcJJWRpCisJcG9wdwklc2kKKwlvcncJJWJwLCAlYnAKKwlqeglkb3N2Z2EKKwkKKwltb3Z3CSVicCwgJXNpCQkJIyBGb3VuZCwgY29weSB0aGUgbW9kZXMKKwltb3ZiCXN2Z2FfcHJlZml4LCAlYWgKK2Nwc3ZnYToJbG9kc2IKKwlvcmIJJWFsLCAlYWwKKwlqeglkaWRzdgorCQorCXN0b3N3CisJbW92c3cKKwlqbXAJY3BzdmdhCisKK2RpZHN2Ogltb3Z3CSVzaSwgY2FyZF9uYW1lCQkJIyBTdG9yZSBwb2ludGVyIHRvIGNhcmQgbmFtZQorZGlkc3YxOglyZXQKKworIyBUYWJsZSBvZiBhbGwga25vd24gU1ZHQSBjYXJkcy4gRm9yIGVhY2ggY2FyZCwgd2Ugc3RvcmUgYSBwb2ludGVyIHRvCisjIGEgdGFibGUgb2YgdmlkZW8gbW9kZXMgc3VwcG9ydGVkIGJ5IHRoZSBjYXJkIGFuZCBhIHBvaW50ZXIgdG8gYSByb3V0aW5lCisjIHVzZWQgZm9yIHRlc3Rpbmcgb2YgcHJlc2VuY2Ugb2YgdGhlIGNhcmQuIFRoZSB2aWRlbyBtb2RlIHRhYmxlIGlzIGFsd2F5cworIyBmb2xsb3dlZCBieSB0aGUgbmFtZSBvZiB0aGUgY2FyZCBvciB0aGUgY2hpcHNldC4KK3N2Z2FfdGFibGU6CisJLndvcmQJYXRpX21kLCBhdGlfdGVzdAorCS53b3JkCW9ha19tZCwgb2FrX3Rlc3QKKwkud29yZAlwYXJhZGlzZV9tZCwgcGFyYWRpc2VfdGVzdAorCS53b3JkCXJlYWx0ZWtfbWQsIHJlYWx0ZWtfdGVzdAorCS53b3JkCXMzX21kLCBzM190ZXN0CisJLndvcmQJY2hpcHNfbWQsIGNoaXBzX3Rlc3QKKwkud29yZAl2aWRlbzdfbWQsIHZpZGVvN190ZXN0CisJLndvcmQJY2lycnVzNV9tZCwgY2lycnVzNV90ZXN0CisJLndvcmQJY2lycnVzNl9tZCwgY2lycnVzNl90ZXN0CisJLndvcmQJY2lycnVzMV9tZCwgY2lycnVzMV90ZXN0CisJLndvcmQJYWhlYWRfbWQsIGFoZWFkX3Rlc3QKKwkud29yZAlldmVyZXhfbWQsIGV2ZXJleF90ZXN0CisJLndvcmQJZ2Vub2FfbWQsIGdlbm9hX3Rlc3QKKwkud29yZAl0cmlkZW50X21kLCB0cmlkZW50X3Rlc3QKKwkud29yZAl0c2VuZ19tZCwgdHNlbmdfdGVzdAorCS53b3JkCTAKKworIyBUZXN0IHJvdXRpbmVzIGFuZCBtb2RlIHRhYmxlczoKKworIyBTMyAtIFRoZSB0ZXN0IGFsZ29yaXRobSB3YXMgdGFrZW4gZnJvbSB0aGUgU3VwZXJQcm9iZSBwYWNrYWdlCisjIGZvciBYRnJlZTg2IDEuMi4xLiBSZXBvcnQgYnVncyB0byBDaHJpc3RvcGguTmllbWFubkBsaW51eC5vcmcKK3MzX3Rlc3Q6CisJbW92dwkkMHgwZjM1LCAlY3gJIyB3ZSBzdG9yZSBzb21lIGNvbnN0YW50cyBpbiBjbC9jaAorCW1vdncJJDB4MDNkNCwgJWR4CisJbW92YgkkMHgzOCwgJWFsCisJY2FsbAlpbmlkeAorCW1vdmIJJWFsLCAlYmgJIyBzdG9yZSBjdXJyZW50IENSVC1yZWdpc3RlciAweDM4CisJbW92dwkkMHgwMDM4LCAlYXgKKwljYWxsCW91dGlkeAkJIyBkaXNhYmxlIHdyaXRpbmcgdG8gc3BlY2lhbCByZWdzCisJbW92YgklY2wsICVhbAkjIGNoZWNrIHdoZXRoZXIgd2UgY2FuIHdyaXRlIHNwZWNpYWwgcmVnIDB4MzUKKwljYWxsCWluaWR4CisJbW92YgklYWwsICVibAkjIHNhdmUgdGhlIGN1cnJlbnQgdmFsdWUgb2YgQ1JUIHJlZyAweDM1CisJYW5kYgkkMHhmMCwgJWFsCSMgY2xlYXIgYml0cyAwLTMKKwltb3ZiCSVhbCwgJWFoCisJbW92YgklY2wsICVhbAkjIGFuZCB3cml0ZSBpdCB0byBDUlQgcmVnIDB4MzUKKwljYWxsCW91dGlkeAorCWNhbGwJaW5pZHgJCSMgbm93IHJlYWQgaXQgYmFjaworCWFuZGIJJWNoLCAlYWwJIyBjbGVhciB0aGUgdXBwZXIgNCBiaXRzCisJanoJczNfMgkJIyB0aGUgZmlyc3QgdGVzdCBmYWlsZWQuIEJ1dCB3ZSBoYXZlIGEKKworCW1vdmIJJWJsLCAlYWgJIyBzZWNvbmQgY2hhbmNlCisJbW92YgklY2wsICVhbAorCWNhbGwJb3V0aWR4CisJam1wCXMzXzEJCSMgZG8gdGhlIG90aGVyIHRlc3RzCisKK3MzXzI6CW1vdncJJWN4LCAlYXgJIyBsb2FkIGFoIHdpdGggMHhmIGFuZCBhbCB3aXRoIDB4MzUKKwlvcmIJJWJsLCAlYWgJIyBzZXQgdGhlIHVwcGVyIDQgYml0cyBvZiBhaCB3aXRoIHRoZSBvcmlnIHZhbHVlCisJY2FsbAlvdXRpZHgJCSMgd3JpdGUgLi4uCisJY2FsbAlpbmlkeAkJIyAuLi4gYW5kIHJlcmVhZCAKKwlhbmRiCSVjbCwgJWFsCSMgdHVybiBvZmYgdGhlIHVwcGVyIDQgYml0cworCXB1c2h3CSVheAorCW1vdmIJJWJsLCAlYWgJIyByZXN0b3JlIG9sZCB2YWx1ZSBpbiByZWdpc3RlciAweDM1CisJbW92YgklY2wsICVhbAorCWNhbGwJb3V0aWR4CisJcG9wdwklYXgKKwljbXBiCSVjaCwgJWFsCSMgc2V0dGluZyBsb3dlciA0IGJpdHMgd2FzIHN1Y2Nlc3NmdWwgPT4gYmFkCisJamUJbm9fczMJCSMgd3JpdGluZyBpcyBhbGxvd2VkID0+IHRoaXMgaXMgbm90IGFuIFMzCisKK3MzXzE6CW1vdncJJDB4NDgzOCwgJWF4CSMgYWxsb3cgd3JpdGluZyB0byBzcGVjaWFsIHJlZ3MgYnkgcHV0dGluZworCWNhbGwJb3V0aWR4CQkjIG1hZ2ljIG51bWJlciBpbnRvIENSVC1yZWdpc3RlciAweDM4CisJbW92YgklY2wsICVhbAkjIGNoZWNrIHdoZXRoZXIgd2UgY2FuIHdyaXRlIHNwZWNpYWwgcmVnIDB4MzUKKwljYWxsCWluaWR4CisJbW92YgklYWwsICVibAorCWFuZGIJJDB4ZjAsICVhbAorCW1vdmIJJWFsLCAlYWgKKwltb3ZiCSVjbCwgJWFsCisJY2FsbAlvdXRpZHgKKwljYWxsCWluaWR4CisJYW5kYgklY2gsICVhbAorCWpueglub19zMwkJIyBubywgd2UgY2FuJ3Qgd3JpdGUgPT4gbm8gUzMKKworCW1vdncJJWN4LCAlYXgKKwlvcmIJJWJsLCAlYWgKKwljYWxsCW91dGlkeAorCWNhbGwJaW5pZHgKKwlhbmRiCSVjaCwgJWFsCisJcHVzaHcJJWF4CisJbW92YgklYmwsICVhaAkjIHJlc3RvcmUgb2xkIHZhbHVlIGluIHJlZ2lzdGVyIDB4MzUKKwltb3ZiCSVjbCwgJWFsCisJY2FsbAlvdXRpZHgKKwlwb3B3CSVheAorCWNtcGIJJWNoLCAlYWwKKwlqbmUJbm9fczMxCQkjIHdyaXRpbmcgbm90IHBvc3NpYmxlID0+IG5vIFMzCisJbW92YgkkMHgzMCwgJWFsCisJY2FsbAlpbmlkeAkJIyBub3cgZ2V0IHRoZSBTMyBpZCAuLi4KKwlsZWF3CWlkUzMsICVkaQorCW1vdncJJDB4MTAsICVjeAorCXJlcG5lCisJc2Nhc2IKKwlqZQlub19zMzEKKworCW1vdmIJJWJoLCAlYWgKKwltb3ZiCSQweDM4LCAlYWwKKwlqbXAJczNyZXN0CisKK25vX3MzOgltb3ZiCSQweDM1LCAlYWwJIyByZXN0b3JlIENSVCByZWdpc3RlciAweDM1CisJbW92YgklYmwsICVhaAorCWNhbGwJb3V0aWR4Citub19zMzE6CXhvcncJJWJwLCAlYnAJIyBEZXRlY3Rpb24gZmFpbGVkCitzM3Jlc3Q6CW1vdmIJJWJoLCAlYWgKKwltb3ZiCSQweDM4LCAlYWwJIyByZXN0b3JlIG9sZCB2YWx1ZSBvZiBDUlQgcmVnaXN0ZXIgMHgzOAorCWptcAlvdXRpZHgKKworaWRTMzoJLmJ5dGUJMHg4MSwgMHg4MiwgMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NQorCS5ieXRlCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTgsIDB4YjAKKworczNfbWQ6CS5ieXRlCTB4NTQsIDB4MmIsIDB4ODQKKwkuYnl0ZQkweDU1LCAweDE5LCAweDg0CisJLmJ5dGUJMAorCS5hc2NpaQkiUzMiCisJLmJ5dGUJMAorCisjIEFUSSBjYXJkcy4KK2F0aV90ZXN0OgorCWxlYXcgCWlkYXRpLCAlc2kKKwltb3Z3CSQweDMxLCAlZGkKKwltb3Z3CSQweDA5LCAlY3gKKwlyZXBlCisJY21wc2IKKwlqZQlhdGlvaworCisJeG9ydwklYnAsICVicAorYXRpb2s6CXJldAorCitpZGF0aToJLmFzY2lpCSI3NjEyOTU1MjAiCisKK2F0aV9tZDoJLmJ5dGUJMHgyMywgMHgxOSwgMHg4NAorCS5ieXRlCTB4MzMsIDB4MmMsIDB4ODQKKwkuYnl0ZQkweDIyLCAweDFlLCAweDY0CisJLmJ5dGUJMHgyMSwgMHgxOSwgMHg2NAorCS5ieXRlCTB4NTgsIDB4MjEsIDB4NTAKKwkuYnl0ZQkweDViLCAweDFlLCAweDUwCisJLmJ5dGUJMAorCS5hc2NpaQkiQVRJIgorCS5ieXRlCTAKKworIyBBSEVBRAorYWhlYWRfdGVzdDoKKwltb3Z3CSQweDIwMGYsICVheAorCW1vdncJJDB4M2NlLCAlZHgKKwlvdXR3CSVheCwgJWR4CisJaW5jdwklZHgKKwlpbmIJJWR4LCAlYWwKKwljbXBiCSQweDIwLCAlYWwKKwlqZQlpc2FoZWQKKworCWNtcGIJJDB4MjEsICVhbAorCWplCWlzYWhlZAorCQorCXhvcncJJWJwLCAlYnAKK2lzYWhlZDoJcmV0CisKK2FoZWFkX21kOgorCS5ieXRlCTB4MjIsIDB4MmMsIDB4ODQKKwkuYnl0ZQkweDIzLCAweDE5LCAweDg0CisJLmJ5dGUJMHgyNCwgMHgxYywgMHg4NAorCS5ieXRlCTB4MmYsIDB4MzIsIDB4YTAKKwkuYnl0ZQkweDMyLCAweDIyLCAweDUwCisJLmJ5dGUJMHgzNCwgMHg0MiwgMHg1MAorCS5ieXRlCTAKKwkuYXNjaWkJIkFoZWFkIgorCS5ieXRlCTAKKworIyBDaGlwcyAmIFRlY2guCitjaGlwc190ZXN0OgorCW1vdncJJDB4M2MzLCAlZHgKKwlpbmIJJWR4LCAlYWwKKwlvcmIJJDB4MTAsICVhbAorCW91dGIJJWFsLCAlZHgKKwltb3Z3CSQweDEwNCwgJWR4CisJaW5iCSVkeCwgJWFsCisJbW92YgklYWwsICVibAorCW1vdncJJDB4M2MzLCAlZHgKKwlpbmIJJWR4LCAlYWwKKwlhbmRiCSQweGVmLCAlYWwKKwlvdXRiCSVhbCwgJWR4CisJY21wYgkkMHhhNSwgJWJsCisJamUJY2FudG9rCisJCisJeG9ydwklYnAsICVicAorY2FudG9rOglyZXQKKworY2hpcHNfbWQ6CisJLmJ5dGUJMHg2MCwgMHgxOSwgMHg4NAorCS5ieXRlCTB4NjEsIDB4MzIsIDB4ODQKKwkuYnl0ZQkwCisJLmFzY2lpCSJDaGlwcyAmIFRlY2hub2xvZ2llcyIKKwkuYnl0ZQkwCisKKyMgQ2lycnVzIExvZ2ljIDVYMAorY2lycnVzMV90ZXN0OgorCW1vdncJJDB4M2Q0LCAlZHgKKwltb3ZiCSQweDBjLCAlYWwKKwlvdXRiCSVhbCwgJWR4CisJaW5jdwklZHgKKwlpbmIJJWR4LCAlYWwKKwltb3ZiCSVhbCwgJWJsCisJeG9yYgklYWwsICVhbAorCW91dGIJJWFsLCAlZHgKKwlkZWN3CSVkeAorCW1vdmIJJDB4MWYsICVhbAorCW91dGIJJWFsLCAlZHgKKwlpbmN3CSVkeAorCWluYgklZHgsICVhbAorCW1vdmIJJWFsLCAlYmgKKwl4b3JiCSVhaCwgJWFoCisJc2hsYgkkNCwgJWFsCisJbW92dwklYXgsICVjeAorCW1vdmIJJWJoLCAlYWwKKwlzaHJiCSQ0LCAlYWwKKwlhZGR3CSVheCwgJWN4CisJc2hsdwkkOCwgJWN4CisJYWRkdwkkNiwgJWN4CisJbW92dwklY3gsICVheAorCW1vdncJJDB4M2M0LCAlZHgKKwlvdXR3CSVheCwgJWR4CisJaW5jdwklZHgKKwlpbmIJJWR4LCAlYWwKKwlhbmRiCSVhbCwgJWFsCisJam56CW5vY2lycgorCQorCW1vdmIJJWJoLCAlYWwKKwlvdXRiCSVhbCwgJWR4CisJaW5iCSVkeCwgJWFsCisJY21wYgkkMHgwMSwgJWFsCisJamUJaXNjaXJyCisKK25vY2lycjoJeG9ydwklYnAsICVicAoraXNjaXJyOiBtb3Z3CSQweDNkNCwgJWR4CisJbW92YgklYmwsICVhbAorCXhvcmIJJWFoLCAlYWgKKwlzaGx3CSQ4LCAlYXgKKwlhZGR3CSQweDBjLCAlYXgKKwlvdXR3CSVheCwgJWR4CisJcmV0CisKK2NpcnJ1czFfbWQ6CisJLmJ5dGUJMHgxZiwgMHgxOSwgMHg4NAorCS5ieXRlCTB4MjAsIDB4MmMsIDB4ODQKKwkuYnl0ZQkweDIyLCAweDFlLCAweDg0CisJLmJ5dGUJMHgzMSwgMHgyNSwgMHg2NAorCS5ieXRlCTAKKwkuYXNjaWkJIkNpcnJ1cyBMb2dpYyA1WDAiCisJLmJ5dGUJMAorCisjIENpcnJ1cyBMb2dpYyA1NFhYCitjaXJydXM1X3Rlc3Q6CisJbW92dwkkMHgzYzQsICVkeAorCW1vdmIJJDYsICVhbAorCWNhbGwJaW5pZHgKKwltb3ZiCSVhbCwgJWJsCQkJIyBCTD1iYWNrdXAKKwltb3Z3CSQ2LCAlYXgKKwljYWxsCXRzdGlkeAorCWNtcGIJJDB4MGYsICVhbAorCWpuZQljNWZhaWwKKwkKKwltb3Z3CSQweDEyMDYsICVheAorCWNhbGwJdHN0aWR4CisJY21wYgkkMHgxMiwgJWFsCisJam5lCWM1ZmFpbAorCQorCW1vdmIJJDB4MWUsICVhbAorCWNhbGwJaW5pZHgKKwltb3ZiCSVhbCwgJWJoCisJbW92YgklYmgsICVhaAorCWFuZGIJJDB4YzAsICVhaAorCW1vdmIJJDB4MWUsICVhbAorCWNhbGwJdHN0aWR4CisJYW5kYgkkMHgzZiwgJWFsCisJam5lCWM1eHgKKwkKKwltb3ZiCSQweDFlLCAlYWwKKwltb3ZiCSViaCwgJWFoCisJb3JiCSQweDNmLCAlYWgKKwljYWxsCXRzdGlkeAorCXhvcmIJJDB4M2YsICVhbAorCWFuZGIJJDB4M2YsICVhbAorYzV4eDoJcHVzaGYKKwltb3ZiCSQweDFlLCAlYWwKKwltb3ZiCSViaCwgJWFoCisJb3V0dwklYXgsICVkeAorCXBvcGYKKwlqZQljNWRvbmUKKworYzVmYWlsOgl4b3J3CSVicCwgJWJwCitjNWRvbmU6CW1vdmIJJDYsICVhbAorCW1vdmIJJWJsLCAlYWgKKwlvdXR3CSVheCwgJWR4CisJcmV0CisKK2NpcnJ1czVfbWQ6CisJLmJ5dGUJMHgxNCwgMHgxOSwgMHg4NAorCS5ieXRlCTB4NTQsIDB4MmIsIDB4ODQKKwkuYnl0ZQkwCisJLmFzY2lpCSJDaXJydXMgTG9naWMgNTRYWCIKKwkuYnl0ZQkwCisKKyMgQ2lycnVzIExvZ2ljIDY0WFggLS0gbm8ga25vd24gZXh0cmEgbW9kZXMsIGJ1dCBtdXN0IGJlIGlkZW50aWZpZWQsIGJlY2F1c2UKKyMgaXQncyBtaXNpZGVudGlmaWVkIGJ5IHRoZSBBaGVhZCB0ZXN0LgorY2lycnVzNl90ZXN0OgorCW1vdncJJDB4M2NlLCAlZHgKKwltb3ZiCSQweDBhLCAlYWwKKwljYWxsCWluaWR4CisJbW92YgklYWwsICVibAkjIEJMPWJhY2t1cAorCW1vdncJJDB4Y2UwYSwgJWF4CisJY2FsbAl0c3RpZHgKKwlvcmIJJWFsLCAlYWwKKwlqbmUJYzJmYWlsCisJCisJbW92dwkkMHhlYzBhLCAlYXgKKwljYWxsCXRzdGlkeAorCWNtcGIJJDB4MDEsICVhbAorCWpuZQljMmZhaWwKKwkKKwltb3ZiCSQweGFhLCAlYWwKKwljYWxsCWluaWR4CQkjIDRYLCA1WCwgN1ggYW5kIDhYIGFyZSB2YWxpZCA2NFhYIGNoaXAgSUQncy4gCisJc2hyYgkkNCwgJWFsCisJc3ViYgkkNCwgJWFsCisJanoJYzZkb25lCisJCisJZGVjYgklYWwKKwlqegljNmRvbmUKKwkKKwlzdWJiCSQyLCAlYWwKKwlqegljNmRvbmUKKwkKKwlkZWNiCSVhbAorCWp6CWM2ZG9uZQorCQorYzJmYWlsOgl4b3J3CSVicCwgJWJwCitjNmRvbmU6CW1vdmIJJDB4MGEsICVhbAorCW1vdmIJJWJsLCAlYWgKKwlvdXR3CSVheCwgJWR4CisJcmV0CisKK2NpcnJ1czZfbWQ6CisJLmJ5dGUJMAorCS5hc2NpaQkiQ2lycnVzIExvZ2ljIDY0WFgiCisJLmJ5dGUJMAorCisjIEV2ZXJleCAvIFRyaWRlbnQKK2V2ZXJleF90ZXN0OgorCW1vdncJJDB4NzAwMCwgJWF4CisJeG9ydwklYngsICVieAorCWludAkkMHgxMAorCWNtcGIJJDB4NzAsICVhbAorCWpuZQlub2V2cngKKwkKKwlzaHJ3CSQ0LCAlZHgKKwljbXB3CSQweDY3OCwgJWR4CisJamUJZXZ0cmlkCisJCisJY21wdwkkMHgyMzYsICVkeAorCWpuZQlldnJ4b2sKKworZXZ0cmlkOglsZWF3CXRyaWRlbnRfbWQsICVicAorZXZyeG9rOglyZXQKKworbm9ldnJ4Ogl4b3J3CSVicCwgJWJwCisJcmV0CisKK2V2ZXJleF9tZDoKKwkuYnl0ZQkweDAzLCAweDIyLCAweDUwCisJLmJ5dGUJMHgwNCwgMHgzYywgMHg1MAorCS5ieXRlCTB4MDcsIDB4MmIsIDB4NjQKKwkuYnl0ZQkweDA4LCAweDRiLCAweDY0CisJLmJ5dGUJMHgwYSwgMHgxOSwgMHg4NAorCS5ieXRlCTB4MGIsIDB4MmMsIDB4ODQKKwkuYnl0ZQkweDE2LCAweDFlLCAweDUwCisJLmJ5dGUJMHgxOCwgMHgxYiwgMHg2NAorCS5ieXRlCTB4MjEsIDB4NDAsIDB4YTAKKwkuYnl0ZQkweDQwLCAweDFlLCAweDg0CisJLmJ5dGUJMAorCS5hc2NpaQkiRXZlcmV4L1RyaWRlbnQiCisJLmJ5dGUJMAorCisjIEdlbm9hLgorZ2Vub2FfdGVzdDoKKwlsZWF3CWlkZ2Vub2EsICVzaQkJCSMgQ2hlY2sgR2Vub2EgJ2NsdWVzJworCXhvcncJJWF4LCAlYXgKKwltb3ZiCSVlczooMHgzNyksICVhbAorCW1vdncJJWF4LCAlZGkKKwltb3Z3CSQweDA0LCAlY3gKKwlkZWN3CSVzaQorCWRlY3cJJWRpCitsMToJaW5jdwklc2kKKwlpbmN3CSVkaQorCW1vdmIJKCVzaSksICVhbAorCXRlc3RiCSVhbCwgJWFsCisJanoJbDIKKworCWNtcGIJJWVzOiglZGkpLCAlYWwKK2wyOglsb29wZSAJbDEKKwlvcncJJWN4LCAlY3gKKwlqZQlpc2dlbgorCQorCXhvcncJJWJwLCAlYnAKK2lzZ2VuOglyZXQKKworaWRnZW5vYTogLmJ5dGUJMHg3NywgMHgwMCwgMHg5OSwgMHg2NgorCitnZW5vYV9tZDoKKwkuYnl0ZQkweDU4LCAweDIwLCAweDUwCisJLmJ5dGUJMHg1YSwgMHgyYSwgMHg2NAorCS5ieXRlCTB4NjAsIDB4MTksIDB4ODQKKwkuYnl0ZQkweDYxLCAweDFkLCAweDg0CisJLmJ5dGUJMHg2MiwgMHgyMCwgMHg4NAorCS5ieXRlCTB4NjMsIDB4MmMsIDB4ODQKKwkuYnl0ZQkweDY0LCAweDNjLCAweDg0CisJLmJ5dGUJMHg2YiwgMHg0ZiwgMHg2NAorCS5ieXRlCTB4NzIsIDB4M2MsIDB4NTAKKwkuYnl0ZQkweDc0LCAweDQyLCAweDUwCisJLmJ5dGUJMHg3OCwgMHg0YiwgMHg2NAorCS5ieXRlCTAKKwkuYXNjaWkJIkdlbm9hIgorCS5ieXRlCTAKKworIyBPQUsKK29ha190ZXN0OgorCWxlYXcJaWRvYWt2Z2EsICVzaQorCW1vdncJJDB4MDgsICVkaQorCW1vdncJJDB4MDgsICVjeAorCXJlcGUKKwljbXBzYgorCWplCWlzb2FrCisJCisJeG9ydwklYnAsICVicAoraXNvYWs6CXJldAorCitpZG9ha3ZnYTogLmFzY2lpICAiT0FLIFZHQSAiCisKK29ha19tZDogLmJ5dGUJMHg0ZSwgMHgzYywgMHg1MAorCS5ieXRlCTB4NGYsIDB4M2MsIDB4ODQKKwkuYnl0ZQkweDUwLCAweDE5LCAweDg0CisJLmJ5dGUJMHg1MSwgMHgyYiwgMHg4NAorCS5ieXRlCTAKKwkuYXNjaWkJIk9BSyIKKwkuYnl0ZQkwCisKKyMgV0QgUGFyYWRpc2UuCitwYXJhZGlzZV90ZXN0OgorCWxlYXcJaWRwYXJhZGlzZSwgJXNpCisJbW92dwkkMHg3ZCwgJWRpCisJbW92dwkkMHgwNCwgJWN4CisJcmVwZQorCWNtcHNiCisJamUJaXNwYXJhCisJCisJeG9ydwklYnAsICVicAoraXNwYXJhOglyZXQKKworaWRwYXJhZGlzZToJLmFzY2lpCSJWR0E9IgorCitwYXJhZGlzZV9tZDoKKwkuYnl0ZQkweDQxLCAweDIyLCAweDUwCisJLmJ5dGUJMHg0NywgMHgxYywgMHg4NAorCS5ieXRlCTB4NTUsIDB4MTksIDB4ODQKKwkuYnl0ZQkweDU0LCAweDJjLCAweDg0CisJLmJ5dGUJMAorCS5hc2NpaQkiUGFyYWRpc2UiCisJLmJ5dGUJMAorCisjIFRyaWRlbnQuCit0cmlkZW50X3Rlc3Q6CisJbW92dwkkMHgzYzQsICVkeAorCW1vdmIJJDB4MGUsICVhbAorCW91dGIJJWFsLCAlZHgKKwlpbmN3CSVkeAorCWluYgklZHgsICVhbAorCXhjaGdiCSVhbCwgJWFoCisJeG9yYgklYWwsICVhbAorCW91dGIJJWFsLCAlZHgKKwlpbmIJJWR4LCAlYWwKKwl4Y2hnYgklYWgsICVhbAorCW1vdmIJJWFsLCAlYmwJIyBTdHJhbmdlIHRoaW5nIC4uLiBpbiB0aGUgYm9vayB0aGlzIHdhc24ndAorCWFuZGIJJDB4MDIsICVibAkjIG5lY2Vzc2FyeSBidXQgaXQgd29ya2VkIG9uIG15IGNhcmQgd2hpY2gKKwlqeglzZXRiMgkJIyBpcyBhIHRyaWRlbnQuIFdpdGhvdXQgaXQgdGhlIHNjcmVlbiBnb2VzCisJCQkJIyBibHVycmVkIC4uLgorCWFuZGIJJDB4ZmQsICVhbAorCWptcAljbHJiMgkJCisKK3NldGIyOglvcmIJJDB4MDIsICVhbAkKK2NscmIyOglvdXRiCSVhbCwgJWR4CisJYW5kYgkkMHgwZiwgJWFoCisJY21wYgkkMHgwMiwgJWFoCisJamUJaXN0cmlkCisKKwl4b3J3CSVicCwgJWJwCitpc3RyaWQ6CXJldAorCit0cmlkZW50X21kOgorCS5ieXRlCTB4NTAsIDB4MWUsIDB4NTAKKwkuYnl0ZQkweDUxLCAweDJiLCAweDUwCisJLmJ5dGUJMHg1MiwgMHgzYywgMHg1MAorCS5ieXRlCTB4NTcsIDB4MTksIDB4ODQKKwkuYnl0ZQkweDU4LCAweDFlLCAweDg0CisJLmJ5dGUJMHg1OSwgMHgyYiwgMHg4NAorCS5ieXRlCTB4NWEsIDB4M2MsIDB4ODQKKwkuYnl0ZQkwCisJLmFzY2lpCSJUcmlkZW50IgorCS5ieXRlCTAKKworIyBUc2VuZy4KK3RzZW5nX3Rlc3Q6CisJbW92dwkkMHgzY2QsICVkeAorCWluYgklZHgsICVhbAkjIENvdWxkIHRoaW5ncyBiZSB0aGlzIHNpbXBsZSAhIDotKQorCW1vdmIJJWFsLCAlYmwKKwltb3ZiCSQweDU1LCAlYWwKKwlvdXRiCSVhbCwgJWR4CisJaW5iCSVkeCwgJWFsCisJbW92YgklYWwsICVhaAorCW1vdmIJJWJsLCAlYWwKKwlvdXRiCSVhbCwgJWR4CisJY21wYgkkMHg1NSwgJWFoCisgCWplCWlzdHNlbgorCitpc25vdDoJeG9ydwklYnAsICVicAoraXN0c2VuOglyZXQKKwordHNlbmdfbWQ6CisJLmJ5dGUJMHgyNiwgMHgzYywgMHg1MAorCS5ieXRlCTB4MmEsIDB4MjgsIDB4NjQKKwkuYnl0ZQkweDIzLCAweDE5LCAweDg0CisJLmJ5dGUJMHgyNCwgMHgxYywgMHg4NAorCS5ieXRlCTB4MjIsIDB4MmMsIDB4ODQKKwkuYnl0ZQkweDIxLCAweDNjLCAweDg0CisJLmJ5dGUJMAorCS5hc2NpaQkiVHNlbmciCisJLmJ5dGUJMAorCisjIFZpZGVvNy4KK3ZpZGVvN190ZXN0OgorCW1vdncJJDB4M2NjLCAlZHgKKwlpbmIJJWR4LCAlYWwKKwltb3Z3CSQweDNiNCwgJWR4CisJYW5kYgkkMHgwMSwgJWFsCisJanoJZXZlbjcKKworCW1vdncJJDB4M2Q0LCAlZHgKK2V2ZW43Ogltb3ZiCSQweDBjLCAlYWwKKwlvdXRiCSVhbCwgJWR4CisJaW5jdwklZHgKKwlpbmIJJWR4LCAlYWwKKwltb3ZiCSVhbCwgJWJsCisJbW92YgkkMHg1NSwgJWFsCisJb3V0YgklYWwsICVkeAorCWluYgklZHgsICVhbAorCWRlY3cJJWR4CisJbW92YgkkMHgxZiwgJWFsCisJb3V0YgklYWwsICVkeAorCWluY3cJJWR4CisJaW5iCSVkeCwgJWFsCisJbW92YgklYWwsICViaAorCWRlY3cJJWR4CisJbW92YgkkMHgwYywgJWFsCisJb3V0YgklYWwsICVkeAorCWluY3cJJWR4CisJbW92YgklYmwsICVhbAorCW91dGIJJWFsLCAlZHgKKwltb3ZiCSQweDU1LCAlYWwKKwl4b3JiCSQweGVhLCAlYWwKKwljbXBiCSViaCwgJWFsCisJam5lCWlzbm90CisJCisJbW92YgkkVklERU9fRklSU1RfVjc+PjgsIHN2Z2FfcHJlZml4ICMgVXNlIHNwZWNpYWwgbW9kZSBzd2l0Y2hpbmcKKwlyZXQKKwordmlkZW83X21kOgorCS5ieXRlCTB4NDAsIDB4MmIsIDB4NTAKKwkuYnl0ZQkweDQzLCAweDNjLCAweDUwCisJLmJ5dGUJMHg0NCwgMHgzYywgMHg2NAorCS5ieXRlCTB4NDEsIDB4MTksIDB4ODQKKwkuYnl0ZQkweDQyLCAweDJjLCAweDg0CisJLmJ5dGUJMHg0NSwgMHgxYywgMHg4NAorCS5ieXRlCTAKKwkuYXNjaWkJIlZpZGVvIDciCisJLmJ5dGUJMAorCisjIFJlYWx0ZWsgVkdBCityZWFsdGVrX3Rlc3Q6CisJbGVhdwlpZHJ0dmdhLCAlc2kKKwltb3Z3CSQweDQ1LCAlZGkKKwltb3Z3CSQweDBiLCAlY3gKKwlyZXBlCisJY21wc2IKKwlqZQlpc3J0CisJCisJeG9ydwklYnAsICVicAoraXNydDoJcmV0CisKK2lkcnR2Z2E6CS5hc2NpaQkiUkVBTFRFSyBWR0EiCisKK3JlYWx0ZWtfbWQ6CisJLmJ5dGUJMHgxYSwgMHgzYywgMHg1MAorCS5ieXRlCTB4MWIsIDB4MTksIDB4ODQKKwkuYnl0ZQkweDFjLCAweDFlLCAweDg0CisJLmJ5dGUJMHgxZCwgMHgyYiwgMHg4NAorCS5ieXRlCTB4MWUsIDB4M2MsIDB4ODQKKwkuYnl0ZQkwCisJLmFzY2lpCSJSRUFMVEVLIgorCS5ieXRlCTAKKworI2VuZGlmCS8qIENPTkZJR19WSURFT19TVkdBICovCisKKyMgVXNlci1kZWZpbmVkIGxvY2FsIG1vZGUgdGFibGUgKFZHQSBvbmx5KQorI2lmZGVmIENPTkZJR19WSURFT19MT0NBTAorbG9jYWxfbW9kZXM6CisJbGVhdwlsb2NhbF9tb2RlX3RhYmxlLCAlc2kKK2xvY20xOglsb2RzdworCW9ydwklYXgsICVheAorCWp6CWxvY20yCisJCisJc3Rvc3cKKwltb3ZzdworCWptcAlsb2NtMQorCitsb2NtMjoJcmV0CisKKyMgVGhpcyBpcyB0aGUgdGFibGUgb2YgbG9jYWwgdmlkZW8gbW9kZXMgd2hpY2ggY2FuIGJlIHN1cHBsaWVkIG1hbnVhbGx5CisjIGJ5IHRoZSB1c2VyLiBFYWNoIGVudHJ5IGNvbnNpc3RzIG9mIG1vZGUgSUQgKHdvcmQpIGFuZCBkaW1lbnNpb25zCisjIChieXRlIGZvciBjb2x1bW4gY291bnQgYW5kIGFub3RoZXIgYnl0ZSBmb3Igcm93IGNvdW50KS4gVGhlc2UgbW9kZXMKKyMgYXJlIHBsYWNlZCBiZWZvcmUgYWxsIFNWR0EgYW5kIFZFU0EgbW9kZXMgYW5kIG92ZXJyaWRlIHRoZW0gaWYgdGFibGUKKyMgY29tcGFjdGluZyBpcyBlbmFibGVkLiBUaGUgdGFibGUgbXVzdCBlbmQgd2l0aCBhIHplcm8gd29yZCBmb2xsb3dlZAorIyBieSBOVUwtdGVybWluYXRlZCB2aWRlbyBhZGFwdGVyIG5hbWUuCitsb2NhbF9tb2RlX3RhYmxlOgorCS53b3JkCTB4MDEwMAkJCQkjIEV4YW1wbGU6IDQweDI1CisJLmJ5dGUJMjUsNDAKKwkud29yZAkwCisJLmFzY2lpCSJMb2NhbCIKKwkuYnl0ZQkwCisjZW5kaWYJLyogQ09ORklHX1ZJREVPX0xPQ0FMICovCisKKyMgUmVhZCBhIGtleSBhbmQgcmV0dXJuIHRoZSBBU0NJSSBjb2RlIGluIGFsLCBzY2FuIGNvZGUgaW4gYWgKK2dldGtleToJeG9yYgklYWgsICVhaAorCWludAkkMHgxNgorCXJldAorCisjIFJlYWQgYSBrZXkgd2l0aCBhIHRpbWVvdXQgb2YgMzAgc2Vjb25kcy4KKyMgVGhlIGhhcmR3YXJlIGNsb2NrIGlzIHVzZWQgdG8gZ2V0IHRoZSB0aW1lLgorZ2V0a3Q6CWNhbGwJZ2V0dGltZQorCWFkZGIJJDMwLCAlYWwJCQkjIFdhaXQgMzAgc2Vjb25kcworCWNtcGIJJDYwLCAlYWwKKwlqbAlsbWludXRlCisKKwlzdWJiCSQ2MCwgJWFsCitsbWludXRlOgorCW1vdmIJJWFsLCAlY2wKK2FnYWluOgltb3ZiCSQweDAxLCAlYWgKKwlpbnQJJDB4MTYKKwlqbnoJZ2V0a2V5CQkJCSMga2V5IHByZXNzZWQsIHNvIGdldCBpdAorCisJY2FsbAlnZXR0aW1lCisJY21wYgklY2wsICVhbAorCWpuZQlhZ2FpbgorCisJbW92YgkkMHgyMCwgJWFsCQkJIyB0aW1lb3V0LCByZXR1cm4gYHNwYWNlJworCXJldAorCisjIEZsdXNoIHRoZSBrZXlib2FyZCBidWZmZXIKK2ZsdXNoOgltb3ZiCSQweDAxLCAlYWgKKwlpbnQJJDB4MTYKKwlqegllbXB0eQorCQorCXhvcmIJJWFoLCAlYWgKKwlpbnQJJDB4MTYKKwlqbXAJZmx1c2gKKworZW1wdHk6CXJldAorCisjIFByaW50IGhleGFkZWNpbWFsIG51bWJlci4KK3BydGh3OglwdXNodwklYXgKKwltb3ZiCSVhaCwgJWFsCisJY2FsbAlwcnRoYgorCXBvcHcJJWF4CitwcnRoYjoJcHVzaHcJJWF4CisJc2hyYgkkNCwgJWFsCisJY2FsbAlwcnRobgorCXBvcHcJJWF4CisJYW5kYgkkMHgwZiwgJWFsCitwcnRobjoJY21wYgkkMHgwYSwgJWFsCisJamMJcHJ0aDEKKworCWFkZGIJJDB4MDcsICVhbAorcHJ0aDE6CWFkZGIJJDB4MzAsICVhbAorCWptcAlwcnRjaHIKKworIyBQcmludCBkZWNpbWFsIG51bWJlciBpbiBhbAorcHJ0ZGVjOglwdXNodwklYXgKKwlwdXNodwklY3gKKwl4b3JiCSVhaCwgJWFoCisJbW92YgkkMHgwYSwgJWNsCisJaWRpdmIJJWNsCisJY21wYgkkMHgwOSwgJWFsCisJamJlCWx0MTAwCisKKwljYWxsCXBydGRlYworCWptcAlza2lwMTAKKworbHQxMDA6CWFkZGIJJDB4MzAsICVhbAorCWNhbGwJcHJ0Y2hyCitza2lwMTA6CW1vdmIJJWFoLCAlYWwKKwlhZGRiCSQweDMwLCAlYWwKKwljYWxsCXBydGNocgkKKwlwb3B3CSVjeAorCXBvcHcJJWF4CisJcmV0CisKK3N0b3JlX2VkaWQ6CisJcHVzaHcJJWVzCQkJCSMganVzdCBzYXZlIGFsbCByZWdpc3RlcnMgCisJcHVzaHcJJWF4CQkJCQorCXB1c2h3CSVieAorCXB1c2h3ICAgJWN4CisJcHVzaHcJJWR4CisJcHVzaHcgICAlZGkKKworCXB1c2h3CSVmcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJcG9wdyAgICAlZXMKKworCW1vdmwJJDB4MTMxMzEzMTMsICVlYXgJCSMgbWVtc2V0IGJsb2NrIHdpdGggMHgxMworCW1vdncgICAgJDMyLCAlY3gKKwltb3Z3CSQweDE0MCwgJWRpCisJY2xkCisJcmVwIAorCXN0b3NsICAKKworCW1vdncJJDB4NGYxNSwgJWF4ICAgICAgICAgICAgICAgICAgICAjIGRvIFZCRS9EREMgCisJbW92dwkkMHgwMSwgJWJ4CisJbW92dwkkMHgwMCwgJWN4CisJbW92dyAgICAkMHgwMSwgJWR4CisJbW92dwkkMHgxNDAsICVkaQorCWludAkkMHgxMAkKKworCXBvcHcJJWRpCQkJCSMgcmVzdG9yZSBhbGwgcmVnaXN0ZXJzICAgICAgICAKKwlwb3B3CSVkeAorCXBvcHcJJWN4CisJcG9wdwklYngKKwlwb3B3CSVheAorCXBvcHcJJWVzCQorCXJldAorCisjIFZJREVPX1NFTEVDVC1vbmx5IHZhcmlhYmxlcworbXRfZW5kOgkJLndvcmQJMAkjIEVuZCBvZiB2aWRlbyBtb2RlIHRhYmxlIGlmIGJ1aWx0CitlZGl0X2J1ZjoJLnNwYWNlCTYJIyBMaW5lIGVkaXRvciBidWZmZXIKK2NhcmRfbmFtZToJLndvcmQJMAkjIFBvaW50ZXIgdG8gYWRhcHRlciBuYW1lCitzY2FubmluZzoJLmJ5dGUJMAkjIFBlcmZvcm1pbmcgbW9kZSBzY2FuCitkb19yZXN0b3JlOgkuYnl0ZQkwCSMgU2NyZWVuIGNvbnRlbnRzIGFsdGVyZWQgZHVyaW5nIG1vZGUgY2hhbmdlCitzdmdhX3ByZWZpeDoJLmJ5dGUJVklERU9fRklSU1RfQklPUz4+OAkjIERlZmF1bHQgcHJlZml4IGZvciBCSU9TIG1vZGVzCitncmFwaGljX21vZGU6CS5ieXRlCTAJIyBHcmFwaGljIG1vZGUgd2l0aCBhIGxpbmVhciBmcmFtZSBidWZmZXIKK2RhY19zaXplOgkuYnl0ZQk2CSMgREFDIGJpdCBkZXB0aAorCisjIFN0YXR1cyBtZXNzYWdlcwora2V5bXNnOgkJLmFzY2lpCSJQcmVzcyA8UkVUVVJOPiB0byBzZWUgdmlkZW8gbW9kZXMgYXZhaWxhYmxlLCAiCisJCS5hc2NpaQkiPFNQQUNFPiB0byBjb250aW51ZSBvciB3YWl0IDMwIHNlY3MiCisJCS5ieXRlCTB4MGQsIDB4MGEsIDAKKworbGlzdGhkcjoJLmJ5dGUJMHgwZCwgMHgwYQorCQkuYXNjaWkJIk1vZGU6ICAgIENPTFN4Uk9XUzoiCisKK2NybGZ0OgkJLmJ5dGUJMHgwZCwgMHgwYSwgMAorCitwcm9tcHQ6CQkuYnl0ZQkweDBkLCAweDBhCisJCS5hc2NpegkiRW50ZXIgbW9kZSBudW1iZXIgb3IgYHNjYW4nOiAiCisKK3Vua250OgkJLmFzY2l6CSJVbmtub3duIG1vZGUgSUQuIFRyeSBhZ2Fpbi4iCisKK2JhZG1kdDoJCS5hc2NpaQkiWW91IHBhc3NlZCBhbiB1bmRlZmluZWQgbW9kZSBudW1iZXIuIgorCQkuYnl0ZQkweDBkLCAweDBhLCAwCisKK3Zlc2FlcjoJCS5hc2NpaQkiRXJyb3I6IFNjYW5uaW5nIG9mIFZFU0EgbW9kZXMgZmFpbGVkLiBQbGVhc2UgIgorCQkuYXNjaWkJInJlcG9ydCB0byA8bWpAdWN3LmN6Pi4iCisJCS5ieXRlCTB4MGQsIDB4MGEsIDAKKworb2xkX25hbWU6CS5hc2NpegkiQ0dBL01EQS9IR0EiCisKK2VnYV9uYW1lOgkuYXNjaXoJIkVHQSIKKworc3ZnYV9uYW1lOgkuYXNjaWkJIiAiCisKK3ZnYV9uYW1lOgkuYXNjaXoJIlZHQSIKKwordmVzYV9uYW1lOgkuYXNjaXoJIlZFU0EiCisKK25hbWVfYmFubjoJLmFzY2l6CSJWaWRlbyBhZGFwdGVyOiAiCisjZW5kaWYgLyogQ09ORklHX1ZJREVPX1NFTEVDVCAqLworCisjIE90aGVyIHZhcmlhYmxlczoKK2FkYXB0ZXI6CS5ieXRlCTAJIyBWaWRlbyBhZGFwdGVyOiAwPUNHQS9NREEvSEdBLDE9RUdBLDI9VkdBCit2aWRlb19zZWdtZW50Ogkud29yZAkweGI4MDAJIyBWaWRlbyBtZW1vcnkgc2VnbWVudAorZm9yY2Vfc2l6ZToJLndvcmQJMAkjIFVzZSB0aGlzIHNpemUgaW5zdGVhZCBvZiB0aGUgb25lIGluIEJJT1MgdmFycwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2NyeXB0by9NYWtlZmlsZSBiL2FyY2gvaTM4Ni9jcnlwdG8vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAzYzM1MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9jcnlwdG8vTWFrZWZpbGUKQEAgLTAsMCArMSw5IEBACisjIAorIyBpMzg2L2NyeXB0by9NYWtlZmlsZSAKKyMgCisjIEFyY2gtc3BlY2lmaWMgQ3J5cHRvQVBJIG1vZHVsZXMuCisjIAorCitvYmotJChDT05GSUdfQ1JZUFRPX0FFU181ODYpICs9IGFlcy1pNTg2Lm8KKworYWVzLWk1ODYteSA6PSBhZXMtaTU4Ni1hc20ubyBhZXMubwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2NyeXB0by9hZXMtaTU4Ni1hc20uUyBiL2FyY2gvaTM4Ni9jcnlwdG8vYWVzLWk1ODYtYXNtLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I3M2M2NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9jcnlwdG8vYWVzLWk1ODYtYXNtLlMKQEAgLTAsMCArMSwzNzYgQEAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvcHlyaWdodCAoYykgMjAwMSwgRHIgQnJpYW4gR2xhZG1hbiA8ICAgICAgICAgICAgICAgICA+LCBXb3JjZXN0ZXIsIFVLLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBMSUNFTlNFIFRFUk1TCisvLworLy8gVGhlIGZyZWUgZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBib3RoIHNvdXJjZSBhbmQgYmluYXJ5IAorLy8gZm9ybSBpcyBhbGxvd2VkICh3aXRoIG9yIHdpdGhvdXQgY2hhbmdlcykgcHJvdmlkZWQgdGhhdDoKKy8vCisvLyAgIDEuIGRpc3RyaWJ1dGlvbnMgb2YgdGhpcyBzb3VyY2UgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgCisvLyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci8vCisvLworLy8gICAyLiBkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vICAgICAgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIGFzc29jaWF0ZWQgbWF0ZXJpYWxzLy8KKy8vCisvLyAgIDMuIHRoZSBjb3B5cmlnaHQgaG9sZGVyJ3MgbmFtZSBpcyBub3QgdXNlZCB0byBlbmRvcnNlIHByb2R1Y3RzIAorLy8gICAgICBidWlsdCB1c2luZyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vCisvLyBBTFRFUk5BVElWRUxZLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIGlzIHJldGFpbmVkIGluIGZ1bGwsIHRoaXMgcHJvZHVjdAorLy8gbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksCisvLyBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgYXBwbHkgSU5TVEVBRCBPRiB0aG9zZSBnaXZlbiBhYm92ZS4KKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDQgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorLy8gQ29weXJpZ2h0IChjKSAyMDA0IFJlZCBIYXQsIEluYy4sIEphbWVzIE1vcnJpcyA8am1vcnJpc0ByZWRoYXQuY29tPgorCisvLyBESVNDTEFJTUVSCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMgaXMnIHdpdGggbm8gZXhwbGljaXQgb3IgaW1wbGllZCB3YXJyYW50aWVzCisvLyBpbiByZXNwZWN0IG9mIGl0cyBwcm9wZXJ0aWVzIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBjb3JyZWN0bmVzcyAKKy8vIGFuZCBmaXRuZXNzIGZvciBwdXJwb3NlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSXNzdWUgRGF0ZTogMjkvMDcvMjAwMgorCisuZmlsZSAiYWVzLWk1ODYtYXNtLlMiCisudGV4dAorCisvLyBhZXNfcnZhbCBhZXNfZW5jX2Jsayhjb25zdCB1bnNpZ25lZCBjaGFyIGluX2Jsa1tdLCB1bnNpZ25lZCBjaGFyIG91dF9ibGtbXSwgY29uc3QgYWVzX2N0eCBjeFsxXSkvLworLy8gYWVzX3J2YWwgYWVzX2RlY19ibGsoY29uc3QgdW5zaWduZWQgY2hhciBpbl9ibGtbXSwgdW5zaWduZWQgY2hhciBvdXRfYmxrW10sIGNvbnN0IGFlc19jdHggY3hbMV0pLy8KKwkKKyNkZWZpbmUgdGxlbiAxMDI0ICAgLy8gbGVuZ3RoIG9mIGVhY2ggb2YgNCAneG9yJyBhcnJheXMgKDI1NiAzMi1iaXQgd29yZHMpCisKKy8vIG9mZnNldHMgdG8gcGFyYW1ldGVycyB3aXRoIG9uZSByZWdpc3RlciBwdXNoZWQgb250byBzdGFjaworCisjZGVmaW5lIGluX2JsayAgICA4ICAvLyBpbnB1dCBieXRlIGFycmF5IGFkZHJlc3MgcGFyYW1ldGVyCisjZGVmaW5lIG91dF9ibGsgIDEyICAvLyBvdXRwdXQgYnl0ZSBhcnJheSBhZGRyZXNzIHBhcmFtZXRlcgorI2RlZmluZSBjdHggICAgICAxNiAgLy8gQUVTIGNvbnRleHQgc3RydWN0dXJlCisKKy8vIG9mZnNldHMgaW4gY29udGV4dCBzdHJ1Y3R1cmUKKworI2RlZmluZSBla2V5ICAgICAwICAgLy8gZW5jcnlwdGlvbiBrZXkgc2NoZWR1bGUgYmFzZSBhZGRyZXNzCisjZGVmaW5lIG5ybmQgICAyNTYgICAvLyBudW1iZXIgb2Ygcm91bmRzCisjZGVmaW5lIGRrZXkgICAyNjAgICAvLyBkZWNyeXB0aW9uIGtleSBzY2hlZHVsZSBiYXNlIGFkZHJlc3MKKworLy8gcmVnaXN0ZXIgbWFwcGluZyBmb3IgZW5jcnlwdCBhbmQgZGVjcnlwdCBzdWJyb3V0aW5lcworCisjZGVmaW5lIHIwICBlYXgKKyNkZWZpbmUgcjEgIGVieAorI2RlZmluZSByMiAgZWN4CisjZGVmaW5lIHIzICBlZHgKKyNkZWZpbmUgcjQgIGVzaQorI2RlZmluZSByNSAgZWRpCisKKyNkZWZpbmUgZWF4bCAgYWwKKyNkZWZpbmUgZWF4aCAgYWgKKyNkZWZpbmUgZWJ4bCAgYmwKKyNkZWZpbmUgZWJ4aCAgYmgKKyNkZWZpbmUgZWN4bCAgY2wKKyNkZWZpbmUgZWN4aCAgY2gKKyNkZWZpbmUgZWR4bCAgZGwKKyNkZWZpbmUgZWR4aCAgZGgKKworI2RlZmluZSBfaChyZWcpIHJlZyMjaAorI2RlZmluZSBoKHJlZykgX2gocmVnKQorCisjZGVmaW5lIF9sKHJlZykgcmVnIyNsCisjZGVmaW5lIGwocmVnKSBfbChyZWcpCisKKy8vIFRoaXMgbWFjcm8gdGFrZXMgYSAzMi1iaXQgd29yZCByZXByZXNlbnRpbmcgYSBjb2x1bW4gYW5kIHVzZXMKKy8vIGVhY2ggb2YgaXRzIGZvdXIgYnl0ZXMgdG8gaW5kZXggaW50byBmb3VyIHRhYmxlcyBvZiAyNTYgMzItYml0CisvLyB3b3JkcyB0byBvYnRhaW4gdmFsdWVzIHRoYXQgYXJlIHRoZW4geG9yZWQgaW50byB0aGUgYXBwcm9wcmlhdGUKKy8vIG91dHB1dCByZWdpc3RlcnMgcjAsIHIxLCByNCBvciByNS4gIAorCisvLyBQYXJhbWV0ZXJzOgorLy8gdGFibGUgdGFibGUgYmFzZSBhZGRyZXNzCisvLyAgICUxICBvdXRfc3RhdGVbMF0KKy8vICAgJTIgIG91dF9zdGF0ZVsxXQorLy8gICAlMyAgb3V0X3N0YXRlWzJdCisvLyAgICU0ICBvdXRfc3RhdGVbM10KKy8vICAgaWR4IGlucHV0IHJlZ2lzdGVyIGZvciB0aGUgcm91bmQgKGRlc3Ryb3llZCkKKy8vICAgdG1wIHNjcmF0Y2ggcmVnaXN0ZXIgZm9yIHRoZSByb3VuZAorLy8gc2NoZWQga2V5IHNjaGVkdWxlCisKKyNkZWZpbmUgZG9fY29sKHRhYmxlLCBhMSxhMixhMyxhNCwgaWR4LCB0bXApCVwKKwltb3Z6eCAgICVsKGlkeCksJXRtcDsJCQlcCisJeG9yICAgICB0YWJsZSgsJXRtcCw0KSwlYTE7CQlcCisJbW92enggICAlaChpZHgpLCV0bXA7CQkJXAorCXNociAgICAgJDE2LCVpZHg7CQkJXAorCXhvciAgICAgdGFibGUrdGxlbigsJXRtcCw0KSwlYTI7CVwKKwltb3Z6eCAgICVsKGlkeCksJXRtcDsJCQlcCisJbW92enggICAlaChpZHgpLCVpZHg7CQkJXAorCXhvciAgICAgdGFibGUrMip0bGVuKCwldG1wLDQpLCVhMzsJXAorCXhvciAgICAgdGFibGUrMyp0bGVuKCwlaWR4LDQpLCVhNDsKKworLy8gaW5pdGlhbGlzZSBvdXRwdXQgcmVnaXN0ZXJzIGZyb20gdGhlIGtleSBzY2hlZHVsZQorLy8gTkIxOiBvcmlnaW5hbCB2YWx1ZSBvZiBhMyBpcyBpbiBpZHggb24gZXhpdAorLy8gTkIyOiBvcmlnaW5hbCB2YWx1ZXMgb2YgYTEsYTIsYTQgYXJlbid0IHVzZWQKKyNkZWZpbmUgZG9fZmNvbCh0YWJsZSwgYTEsYTIsYTMsYTQsIGlkeCwgdG1wLCBzY2hlZCkgXAorCW1vdiAgICAgMCBzY2hlZCwlYTE7CQkJXAorCW1vdnp4ICAgJWwoaWR4KSwldG1wOwkJCVwKKwltb3YgICAgIDEyIHNjaGVkLCVhMjsJCQlcCisJeG9yICAgICB0YWJsZSgsJXRtcCw0KSwlYTE7CQlcCisJbW92ICAgICA0IHNjaGVkLCVhNDsJCQlcCisJbW92enggICAlaChpZHgpLCV0bXA7CQkJXAorCXNociAgICAgJDE2LCVpZHg7CQkJXAorCXhvciAgICAgdGFibGUrdGxlbigsJXRtcCw0KSwlYTI7CVwKKwltb3Z6eCAgICVsKGlkeCksJXRtcDsJCQlcCisJbW92enggICAlaChpZHgpLCVpZHg7CQkJXAorCXhvciAgICAgdGFibGUrMyp0bGVuKCwlaWR4LDQpLCVhNDsJXAorCW1vdiAgICAgJWEzLCVpZHg7CQkJXAorCW1vdiAgICAgOCBzY2hlZCwlYTM7CQkJXAorCXhvciAgICAgdGFibGUrMip0bGVuKCwldG1wLDQpLCVhMzsKKworLy8gaW5pdGlhbGlzZSBvdXRwdXQgcmVnaXN0ZXJzIGZyb20gdGhlIGtleSBzY2hlZHVsZQorLy8gTkIxOiBvcmlnaW5hbCB2YWx1ZSBvZiBhMyBpcyBpbiBpZHggb24gZXhpdAorLy8gTkIyOiBvcmlnaW5hbCB2YWx1ZXMgb2YgYTEsYTIsYTQgYXJlbid0IHVzZWQKKyNkZWZpbmUgZG9faWNvbCh0YWJsZSwgYTEsYTIsYTMsYTQsIGlkeCwgdG1wLCBzY2hlZCkgXAorCW1vdiAgICAgMCBzY2hlZCwlYTE7CQkJXAorCW1vdnp4ICAgJWwoaWR4KSwldG1wOwkJCVwKKwltb3YgICAgIDQgc2NoZWQsJWEyOwkJCVwKKwl4b3IgICAgIHRhYmxlKCwldG1wLDQpLCVhMTsJCVwKKwltb3YgICAgIDEyIHNjaGVkLCVhNDsJCQlcCisJbW92enggICAlaChpZHgpLCV0bXA7CQkJXAorCXNociAgICAgJDE2LCVpZHg7CQkJXAorCXhvciAgICAgdGFibGUrdGxlbigsJXRtcCw0KSwlYTI7CVwKKwltb3Z6eCAgICVsKGlkeCksJXRtcDsJCQlcCisJbW92enggICAlaChpZHgpLCVpZHg7CQkJXAorCXhvciAgICAgdGFibGUrMyp0bGVuKCwlaWR4LDQpLCVhNDsJXAorCW1vdiAgICAgJWEzLCVpZHg7CQkJXAorCW1vdiAgICAgOCBzY2hlZCwlYTM7CQkJXAorCXhvciAgICAgdGFibGUrMip0bGVuKCwldG1wLDQpLCVhMzsKKworCisvLyBvcmlnaW5hbCBHbGFkbWFuIGhhZCBjb25kaXRpb25hbCBzYXZlcyB0byBNTVggcmVncy4KKyNkZWZpbmUgc2F2ZShhMSwgYTIpCQlcCisJbW92ICAgICAlYTIsNCphMSglZXNwKQorCisjZGVmaW5lIHJlc3RvcmUoYTEsIGEyKQkJXAorCW1vdiAgICAgNCphMiglZXNwKSwlYTEKKworLy8gVGhlc2UgbWFjcm9zIHBlcmZvcm0gYSBmb3J3YXJkIGVuY3J5cHRpb24gY3ljbGUuIFRoZXkgYXJlIGVudGVyZWQgd2l0aAorLy8gdGhlIGZpcnN0IHByZXZpb3VzIHJvdW5kIGNvbHVtbiB2YWx1ZXMgaW4gcjAscjEscjQscjUgYW5kCisvLyBleGl0IHdpdGggdGhlIGZpbmFsIHZhbHVlcyBpbiB0aGUgc2FtZSByZWdpc3RlcnMsIHVzaW5nIHN0YWNrCisvLyBmb3IgdGVtcG9yYXJ5IHN0b3JhZ2UuCisKKy8vIHJvdW5kIGNvbHVtbiB2YWx1ZXMKKy8vIG9uIGVudHJ5OiByMCxyMSxyNCxyNQorLy8gb24gZXhpdDogIHIyLHIxLHI0LHI1CisjZGVmaW5lIGZ3ZF9ybmQxKGFyZywgdGFibGUpCQkJCQkJXAorCXNhdmUgICAoMCxyMSk7CQkJCQkJCVwKKwlzYXZlICAgKDEscjUpOwkJCQkJCQlcCisJCQkJCQkJCQlcCisJLyogY29tcHV0ZSBuZXcgY29sdW1uIHZhbHVlcyAqLwkJCQkJXAorCWRvX2Zjb2wodGFibGUsIHIyLHI1LHI0LHIxLCByMCxyMywgYXJnKTsJLyogaWR4PXIwICovCVwKKwlkb19jb2wgKHRhYmxlLCByNCxyMSxyMixyNSwgcjAscjMpOwkJLyogaWR4PXI0ICovCVwKKwlyZXN0b3JlKHIwLDApOwkJCQkJCQlcCisJZG9fY29sICh0YWJsZSwgcjEscjIscjUscjQsIHIwLHIzKTsJCS8qIGlkeD1yMSAqLwlcCisJcmVzdG9yZShyMCwxKTsJCQkJCQkJXAorCWRvX2NvbCAodGFibGUsIHI1LHI0LHIxLHIyLCByMCxyMyk7CQkvKiBpZHg9cjUgKi8KKworLy8gcm91bmQgY29sdW1uIHZhbHVlcworLy8gb24gZW50cnk6IHIyLHIxLHI0LHI1CisvLyBvbiBleGl0OiAgcjAscjEscjQscjUKKyNkZWZpbmUgZndkX3JuZDIoYXJnLCB0YWJsZSkJCQkJCQlcCisJc2F2ZSAgICgwLHIxKTsJCQkJCQkJXAorCXNhdmUgICAoMSxyNSk7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwkvKiBjb21wdXRlIG5ldyBjb2x1bW4gdmFsdWVzICovCQkJCQlcCisJZG9fZmNvbCh0YWJsZSwgcjAscjUscjQscjEsIHIyLHIzLCBhcmcpOwkvKiBpZHg9cjIgKi8JXAorCWRvX2NvbCAodGFibGUsIHI0LHIxLHIwLHI1LCByMixyMyk7CQkvKiBpZHg9cjQgKi8JXAorCXJlc3RvcmUocjIsMCk7CQkJCQkJCVwKKwlkb19jb2wgKHRhYmxlLCByMSxyMCxyNSxyNCwgcjIscjMpOwkJLyogaWR4PXIxICovCVwKKwlyZXN0b3JlKHIyLDEpOwkJCQkJCQlcCisJZG9fY29sICh0YWJsZSwgcjUscjQscjEscjAsIHIyLHIzKTsJCS8qIGlkeD1yNSAqLworCisvLyBUaGVzZSBtYWNyb3MgcGVyZm9ybXMgYW4gaW52ZXJzZSBlbmNyeXB0aW9uIGN5Y2xlLiBUaGV5IGFyZSBlbnRlcmVkIHdpdGgKKy8vIHRoZSBmaXJzdCBwcmV2aW91cyByb3VuZCBjb2x1bW4gdmFsdWVzIGluIHIwLHIxLHI0LHI1IGFuZAorLy8gZXhpdCB3aXRoIHRoZSBmaW5hbCB2YWx1ZXMgaW4gdGhlIHNhbWUgcmVnaXN0ZXJzLCB1c2luZyBzdGFjaworLy8gZm9yIHRlbXBvcmFyeSBzdG9yYWdlCisKKy8vIHJvdW5kIGNvbHVtbiB2YWx1ZXMKKy8vIG9uIGVudHJ5OiByMCxyMSxyNCxyNQorLy8gb24gZXhpdDogIHIyLHIxLHI0LHI1CisjZGVmaW5lIGludl9ybmQxKGFyZywgdGFibGUpCQkJCQkJXAorCXNhdmUgICAgKDAscjEpOwkJCQkJCQlcCisJc2F2ZSAgICAoMSxyNSk7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwkvKiBjb21wdXRlIG5ldyBjb2x1bW4gdmFsdWVzICovCQkJCQlcCisJZG9faWNvbCh0YWJsZSwgcjIscjEscjQscjUsIHIwLHIzLCBhcmcpOwkvKiBpZHg9cjAgKi8JXAorCWRvX2NvbCAodGFibGUsIHI0LHI1LHIyLHIxLCByMCxyMyk7CQkvKiBpZHg9cjQgKi8JXAorCXJlc3RvcmUocjAsMCk7CQkJCQkJCVwKKwlkb19jb2wgKHRhYmxlLCByMSxyNCxyNSxyMiwgcjAscjMpOwkJLyogaWR4PXIxICovCVwKKwlyZXN0b3JlKHIwLDEpOwkJCQkJCQlcCisJZG9fY29sICh0YWJsZSwgcjUscjIscjEscjQsIHIwLHIzKTsJCS8qIGlkeD1yNSAqLworCisvLyByb3VuZCBjb2x1bW4gdmFsdWVzCisvLyBvbiBlbnRyeTogcjIscjEscjQscjUKKy8vIG9uIGV4aXQ6ICByMCxyMSxyNCxyNQorI2RlZmluZSBpbnZfcm5kMihhcmcsIHRhYmxlKQkJCQkJCVwKKwlzYXZlICAgICgwLHIxKTsJCQkJCQkJXAorCXNhdmUgICAgKDEscjUpOwkJCQkJCQlcCisJCQkJCQkJCQlcCisJLyogY29tcHV0ZSBuZXcgY29sdW1uIHZhbHVlcyAqLwkJCQkJXAorCWRvX2ljb2wodGFibGUsIHIwLHIxLHI0LHI1LCByMixyMywgYXJnKTsJLyogaWR4PXIyICovCVwKKwlkb19jb2wgKHRhYmxlLCByNCxyNSxyMCxyMSwgcjIscjMpOwkJLyogaWR4PXI0ICovCVwKKwlyZXN0b3JlKHIyLDApOwkJCQkJCQlcCisJZG9fY29sICh0YWJsZSwgcjEscjQscjUscjAsIHIyLHIzKTsJCS8qIGlkeD1yMSAqLwlcCisJcmVzdG9yZShyMiwxKTsJCQkJCQkJXAorCWRvX2NvbCAodGFibGUsIHI1LHIwLHIxLHI0LCByMixyMyk7CQkvKiBpZHg9cjUgKi8KKworLy8gQUVTIChSaWpuZGFlbCkgRW5jcnlwdGlvbiBTdWJyb3V0aW5lCisKKy5nbG9iYWwgIGFlc19lbmNfYmxrCisKKy5leHRlcm4gIGZ0X3RhYgorLmV4dGVybiAgZmxfdGFiCisKKy5hbGlnbiA0CisKK2Flc19lbmNfYmxrOgorCXB1c2ggICAgJWVicAorCW1vdiAgICAgY3R4KCVlc3ApLCVlYnAgICAgICAvLyBwb2ludGVyIHRvIGNvbnRleHQKKworLy8gQ0FVVElPTjogdGhlIG9yZGVyIGFuZCB0aGUgdmFsdWVzIHVzZWQgaW4gdGhlc2UgYXNzaWducyAKKy8vIHJlbHkgb24gdGhlIHJlZ2lzdGVyIG1hcHBpbmdzCisKKzE6CXB1c2ggICAgJWVieAorCW1vdiAgICAgaW5fYmxrKzQoJWVzcCksJXIyCisJcHVzaCAgICAlZXNpCisJbW92ICAgICBucm5kKCVlYnApLCVyMyAgIC8vIG51bWJlciBvZiByb3VuZHMKKwlwdXNoICAgICVlZGkKKyNpZiBla2V5ICE9IDAKKwlsZWEgICAgIGVrZXkoJWVicCksJWVicCAgLy8ga2V5IHBvaW50ZXIKKyNlbmRpZgorCisvLyBpbnB1dCBmb3VyIGNvbHVtbnMgYW5kIHhvciBpbiBmaXJzdCByb3VuZCBrZXkKKworCW1vdiAgICAgKCVyMiksJXIwCisJbW92ICAgICA0KCVyMiksJXIxCisJbW92ICAgICA4KCVyMiksJXI0CisJbW92ICAgICAxMiglcjIpLCVyNQorCXhvciAgICAgKCVlYnApLCVyMAorCXhvciAgICAgNCglZWJwKSwlcjEKKwl4b3IgICAgIDgoJWVicCksJXI0CisJeG9yICAgICAxMiglZWJwKSwlcjUKKworCXN1YiAgICAgJDgsJWVzcCAgICAgICAgICAgLy8gc3BhY2UgZm9yIHJlZ2lzdGVyIHNhdmVzIG9uIHN0YWNrCisJYWRkICAgICAkMTYsJWVicCAgICAgICAgICAvLyBpbmNyZW1lbnQgdG8gbmV4dCByb3VuZCBrZXkKKwlzdWIgICAgICQxMCwlcjMgICAgICAgICAgCisJamUgICAgICA0ZiAgICAgICAgICAgICAgLy8gMTAgcm91bmRzIGZvciAxMjgtYml0IGtleQorCWFkZCAgICAgJDMyLCVlYnAKKwlzdWIgICAgICQyLCVyMworCWplICAgICAgM2YgICAgICAgICAgICAgIC8vIDEyIHJvdW5kcyBmb3IgMTI4LWJpdCBrZXkKKwlhZGQgICAgICQzMiwlZWJwCisKKzI6CWZ3ZF9ybmQxKCAtNjQoJWVicCkgLGZ0X3RhYikJLy8gMTQgcm91bmRzIGZvciAxMjgtYml0IGtleQorCWZ3ZF9ybmQyKCAtNDgoJWVicCkgLGZ0X3RhYikKKzM6CWZ3ZF9ybmQxKCAtMzIoJWVicCkgLGZ0X3RhYikJLy8gMTIgcm91bmRzIGZvciAxMjgtYml0IGtleQorCWZ3ZF9ybmQyKCAtMTYoJWVicCkgLGZ0X3RhYikKKzQ6CWZ3ZF9ybmQxKCAgICAoJWVicCkgLGZ0X3RhYikJLy8gMTAgcm91bmRzIGZvciAxMjgtYml0IGtleQorCWZ3ZF9ybmQyKCArMTYoJWVicCkgLGZ0X3RhYikKKwlmd2Rfcm5kMSggKzMyKCVlYnApICxmdF90YWIpCisJZndkX3JuZDIoICs0OCglZWJwKSAsZnRfdGFiKQorCWZ3ZF9ybmQxKCArNjQoJWVicCkgLGZ0X3RhYikKKwlmd2Rfcm5kMiggKzgwKCVlYnApICxmdF90YWIpCisJZndkX3JuZDEoICs5NiglZWJwKSAsZnRfdGFiKQorCWZ3ZF9ybmQyKCsxMTIoJWVicCkgLGZ0X3RhYikKKwlmd2Rfcm5kMSgrMTI4KCVlYnApICxmdF90YWIpCisJZndkX3JuZDIoKzE0NCglZWJwKSAsZmxfdGFiKQkvLyBsYXN0IHJvdW5kIHVzZXMgYSBkaWZmZXJlbnQgdGFibGUKKworLy8gbW92ZSBmaW5hbCB2YWx1ZXMgdG8gdGhlIG91dHB1dCBhcnJheS4gIENBVVRJT046IHRoZSAKKy8vIG9yZGVyIG9mIHRoZXNlIGFzc2lnbnMgcmVseSBvbiB0aGUgcmVnaXN0ZXIgbWFwcGluZ3MKKworCWFkZCAgICAgJDgsJWVzcAorCW1vdiAgICAgb3V0X2JsaysxMiglZXNwKSwlZWJwCisJbW92ICAgICAlcjUsMTIoJWVicCkKKwlwb3AgICAgICVlZGkKKwltb3YgICAgICVyNCw4KCVlYnApCisJcG9wICAgICAlZXNpCisJbW92ICAgICAlcjEsNCglZWJwKQorCXBvcCAgICAgJWVieAorCW1vdiAgICAgJXIwLCglZWJwKQorCXBvcCAgICAgJWVicAorCW1vdiAgICAgJDEsJWVheAorCXJldAorCisvLyBBRVMgKFJpam5kYWVsKSBEZWNyeXB0aW9uIFN1YnJvdXRpbmUKKworLmdsb2JhbCAgYWVzX2RlY19ibGsKKworLmV4dGVybiAgaXRfdGFiCisuZXh0ZXJuICBpbF90YWIKKworLmFsaWduIDQKKworYWVzX2RlY19ibGs6CisJcHVzaCAgICAlZWJwCisJbW92ICAgICBjdHgoJWVzcCksJWVicCAgICAgICAvLyBwb2ludGVyIHRvIGNvbnRleHQKKworLy8gQ0FVVElPTjogdGhlIG9yZGVyIGFuZCB0aGUgdmFsdWVzIHVzZWQgaW4gdGhlc2UgYXNzaWducyAKKy8vIHJlbHkgb24gdGhlIHJlZ2lzdGVyIG1hcHBpbmdzCisKKzE6CXB1c2ggICAgJWVieAorCW1vdiAgICAgaW5fYmxrKzQoJWVzcCksJXIyCisJcHVzaCAgICAlZXNpCisJbW92ICAgICBucm5kKCVlYnApLCVyMyAgIC8vIG51bWJlciBvZiByb3VuZHMKKwlwdXNoICAgICVlZGkKKyNpZiBka2V5ICE9IDAKKwlsZWEgICAgIGRrZXkoJWVicCksJWVicCAgLy8ga2V5IHBvaW50ZXIKKyNlbmRpZgorCW1vdiAgICAgJXIzLCVyMAorCXNobCAgICAgJDQsJXIwCisJYWRkICAgICAlcjAsJWVicAorCQorLy8gaW5wdXQgZm91ciBjb2x1bW5zIGFuZCB4b3IgaW4gZmlyc3Qgcm91bmQga2V5CisKKwltb3YgICAgICglcjIpLCVyMAorCW1vdiAgICAgNCglcjIpLCVyMQorCW1vdiAgICAgOCglcjIpLCVyNAorCW1vdiAgICAgMTIoJXIyKSwlcjUKKwl4b3IgICAgICglZWJwKSwlcjAKKwl4b3IgICAgIDQoJWVicCksJXIxCisJeG9yICAgICA4KCVlYnApLCVyNAorCXhvciAgICAgMTIoJWVicCksJXI1CisKKwlzdWIgICAgICQ4LCVlc3AgICAgICAgICAvLyBzcGFjZSBmb3IgcmVnaXN0ZXIgc2F2ZXMgb24gc3RhY2sKKwlzdWIgICAgICQxNiwlZWJwICAgICAgICAvLyBpbmNyZW1lbnQgdG8gbmV4dCByb3VuZCBrZXkKKwlzdWIgICAgICQxMCwlcjMgICAgICAgICAgCisJamUgICAgICA0ZiAgICAgICAgICAgICAgLy8gMTAgcm91bmRzIGZvciAxMjgtYml0IGtleQorCXN1YiAgICAgJDMyLCVlYnAKKwlzdWIgICAgICQyLCVyMworCWplICAgICAgM2YgICAgICAgICAgICAgIC8vIDEyIHJvdW5kcyBmb3IgMTI4LWJpdCBrZXkKKwlzdWIgICAgICQzMiwlZWJwCisKKzI6CWludl9ybmQxKCArNjQoJWVicCksIGl0X3RhYikJLy8gMTQgcm91bmRzIGZvciAxMjgtYml0IGtleQorCWludl9ybmQyKCArNDgoJWVicCksIGl0X3RhYikKKzM6CWludl9ybmQxKCArMzIoJWVicCksIGl0X3RhYikJLy8gMTIgcm91bmRzIGZvciAxMjgtYml0IGtleQorCWludl9ybmQyKCArMTYoJWVicCksIGl0X3RhYikKKzQ6CWludl9ybmQxKCAgICAoJWVicCksIGl0X3RhYikJLy8gMTAgcm91bmRzIGZvciAxMjgtYml0IGtleQorCWludl9ybmQyKCAtMTYoJWVicCksIGl0X3RhYikKKwlpbnZfcm5kMSggLTMyKCVlYnApLCBpdF90YWIpCisJaW52X3JuZDIoIC00OCglZWJwKSwgaXRfdGFiKQorCWludl9ybmQxKCAtNjQoJWVicCksIGl0X3RhYikKKwlpbnZfcm5kMiggLTgwKCVlYnApLCBpdF90YWIpCisJaW52X3JuZDEoIC05NiglZWJwKSwgaXRfdGFiKQorCWludl9ybmQyKC0xMTIoJWVicCksIGl0X3RhYikKKwlpbnZfcm5kMSgtMTI4KCVlYnApLCBpdF90YWIpCisJaW52X3JuZDIoLTE0NCglZWJwKSwgaWxfdGFiKQkvLyBsYXN0IHJvdW5kIHVzZXMgYSBkaWZmZXJlbnQgdGFibGUKKworLy8gbW92ZSBmaW5hbCB2YWx1ZXMgdG8gdGhlIG91dHB1dCBhcnJheS4gIENBVVRJT046IHRoZSAKKy8vIG9yZGVyIG9mIHRoZXNlIGFzc2lnbnMgcmVseSBvbiB0aGUgcmVnaXN0ZXIgbWFwcGluZ3MKKworCWFkZCAgICAgJDgsJWVzcAorCW1vdiAgICAgb3V0X2JsaysxMiglZXNwKSwlZWJwCisJbW92ICAgICAlcjUsMTIoJWVicCkKKwlwb3AgICAgICVlZGkKKwltb3YgICAgICVyNCw4KCVlYnApCisJcG9wICAgICAlZXNpCisJbW92ICAgICAlcjEsNCglZWJwKQorCXBvcCAgICAgJWVieAorCW1vdiAgICAgJXIwLCglZWJwKQorCXBvcCAgICAgJWVicAorCW1vdiAgICAgJDEsJWVheAorCXJldAorCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvY3J5cHRvL2Flcy5jIGIvYXJjaC9pMzg2L2NyeXB0by9hZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDE5NDMwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2NyeXB0by9hZXMuYwpAQCAtMCwwICsxLDUyMCBAQAorLyogCisgKiAKKyAqIEdsdWUgQ29kZSBmb3Igb3B0aW1pemVkIDU4NiBhc3NlbWJsZXIgdmVyc2lvbiBvZiBBRVMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIERyIEJyaWFuIEdsYWRtYW4gPD4sIFdvcmNlc3RlciwgVUsuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIExJQ0VOU0UgVEVSTVMKKyAqCisgKiBUaGUgZnJlZSBkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIGJvdGggc291cmNlIGFuZCBiaW5hcnkKKyAqIGZvcm0gaXMgYWxsb3dlZCAod2l0aCBvciB3aXRob3V0IGNoYW5nZXMpIHByb3ZpZGVkIHRoYXQ6CisgKgorICogICAxLiBkaXN0cmlidXRpb25zIG9mIHRoaXMgc291cmNlIGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcjsKKyAqCisgKiAgIDIuIGRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogICAgICBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgYXNzb2NpYXRlZCBtYXRlcmlhbHM7CisgKgorICogICAzLiB0aGUgY29weXJpZ2h0IGhvbGRlcidzIG5hbWUgaXMgbm90IHVzZWQgdG8gZW5kb3JzZSBwcm9kdWN0cworICogICAgICBidWlsdCB1c2luZyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgaXMgcmV0YWluZWQgaW4gZnVsbCwgdGhpcyBwcm9kdWN0CisgKiBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwKKyAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcHBseSBJTlNURUFEIE9GIHRob3NlIGdpdmVuIGFib3ZlLgorICoKKyAqIERJU0NMQUlNRVIKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcyBpcycgd2l0aCBubyBleHBsaWNpdCBvciBpbXBsaWVkIHdhcnJhbnRpZXMKKyAqIGluIHJlc3BlY3Qgb2YgaXRzIHByb3BlcnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBjb3JyZWN0bmVzcworICogYW5kL29yIGZpdG5lc3MgZm9yIHB1cnBvc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCBBZGFtIEouIFJpY2h0ZXIgPGFkYW1AeWdnZHJhc2lsLmNvbT4gKGNvbnZlcnNpb24gdG8KKyAqIDIuNSBBUEkpLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IEZydWh3aXJ0aCBDbGVtZW5zIDxjbGVtZW5zQGVuZG9ycGhpbi5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgUmVkIEhhdCwgSW5jLiwgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQHJlZGhhdC5jb20+CisgKgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorCithc21saW5rYWdlIHZvaWQgYWVzX2VuY19ibGsoY29uc3QgdTggKnNyYywgdTggKmRzdCwgdm9pZCAqY3R4KTsKK2FzbWxpbmthZ2Ugdm9pZCBhZXNfZGVjX2Jsayhjb25zdCB1OCAqc3JjLCB1OCAqZHN0LCB2b2lkICpjdHgpOworCisjZGVmaW5lIEFFU19NSU5fS0VZX1NJWkUJMTYKKyNkZWZpbmUgQUVTX01BWF9LRVlfU0laRQkzMgorI2RlZmluZSBBRVNfQkxPQ0tfU0laRQkJMTYKKyNkZWZpbmUgQUVTX0tTX0xFTkdUSAkJNCAqIEFFU19CTE9DS19TSVpFCisjZGVmaW5lIFJDX0xFTkdUSAkJMjkKKworc3RydWN0IGFlc19jdHggeworCXUzMiBla2V5W0FFU19LU19MRU5HVEhdOworCXUzMiByb3VuZHM7CisJdTMyIGRrZXlbQUVTX0tTX0xFTkdUSF07Cit9OworCisjZGVmaW5lIFdQT0xZIDB4MDExYgorI2RlZmluZSB1MzJfaW4oeCkgbGUzMl90b19jcHUoKihjb25zdCB1MzIgKikoeCkpCisjZGVmaW5lIGJ5dGVzMndvcmQoYjAsIGIxLCBiMiwgYjMpICBcCisJKCgodTMyKShiMykgPDwgMjQpIHwgKCh1MzIpKGIyKSA8PCAxNikgfCAoKHUzMikoYjEpIDw8IDgpIHwgKGIwKSkKKworLyogZGVmaW5lIHRoZSBmaW5pdGUgZmllbGQgbXVsdGlwbGllcyByZXF1aXJlZCBmb3IgUmlqbmRhZWwgKi8KKyNkZWZpbmUgZjIoeCkgKCh4KSA/IHBvd1tsb2dbeF0gKyAweDE5XSA6IDApCisjZGVmaW5lIGYzKHgpICgoeCkgPyBwb3dbbG9nW3hdICsgMHgwMV0gOiAwKQorI2RlZmluZSBmOSh4KSAoKHgpID8gcG93W2xvZ1t4XSArIDB4YzddIDogMCkKKyNkZWZpbmUgZmIoeCkgKCh4KSA/IHBvd1tsb2dbeF0gKyAweDY4XSA6IDApCisjZGVmaW5lIGZkKHgpICgoeCkgPyBwb3dbbG9nW3hdICsgMHhlZV0gOiAwKQorI2RlZmluZSBmZSh4KSAoKHgpID8gcG93W2xvZ1t4XSArIDB4ZGZdIDogMCkKKyNkZWZpbmUgZmkoeCkgKCh4KSA/ICAgcG93WzI1NSAtIGxvZ1t4XV06IDApCisKK3N0YXRpYyBpbmxpbmUgdTMyIHVwcih1MzIgeCwgaW50IG4pCit7CisJcmV0dXJuICh4IDw8IDggKiBuKSB8ICh4ID4+ICgzMiAtIDggKiBuKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggYnZhbCh1MzIgeCwgaW50IG4pCit7CisJcmV0dXJuIHggPj4gOCAqIG47Cit9CisKKy8qIFRoZSBmb3J3YXJkIGFuZCBpbnZlcnNlIGFmZmluZSB0cmFuc2Zvcm1hdGlvbnMgdXNlZCBpbiB0aGUgUy1ib3ggKi8KKyNkZWZpbmUgZndkX2FmZmluZSh4KSBcCisJKHcgPSAodTMyKXgsIHcgXj0gKHc8PDEpXih3PDwyKV4odzw8MyleKHc8PDQpLCAweDYzXih1OCkod14odz4+OCkpKQorCisjZGVmaW5lIGludl9hZmZpbmUoeCkgXAorCSh3ID0gKHUzMil4LCB3ID0gKHc8PDEpXih3PDwzKV4odzw8NiksIDB4MDVeKHU4KSh3Xih3Pj44KSkpCisKK3N0YXRpYyB1MzIgcmNvbl90YWJbUkNfTEVOR1RIXTsKKwordTMyIGZ0X3RhYls0XVsyNTZdOwordTMyIGZsX3RhYls0XVsyNTZdOworc3RhdGljIHUzMiBsc190YWJbNF1bMjU2XTsKK3N0YXRpYyB1MzIgaW1fdGFiWzRdWzI1Nl07Cit1MzIgaWxfdGFiWzRdWzI1Nl07Cit1MzIgaXRfdGFiWzRdWzI1Nl07CisKK3N0YXRpYyB2b2lkIGdlbl90YWJzKHZvaWQpCit7CisJdTMyIGksIHc7CisJdTggcG93WzUxMl0sIGxvZ1syNTZdOworCisJLyoKKwkgKiBsb2cgYW5kIHBvd2VyIHRhYmxlcyBmb3IgR0YoMl44KSBmaW5pdGUgZmllbGQgd2l0aAorCSAqIFdQT0xZIGFzIG1vZHVsYXIgcG9seW5vbWlhbCAtIHRoZSBzaW1wbGVzdCBwcmltaXRpdmUKKwkgKiByb290IGlzIDB4MDMsIHVzZWQgaGVyZSB0byBnZW5lcmF0ZSB0aGUgdGFibGVzLgorCSAqLworCWkgPSAwOyB3ID0gMTsgCisJCisJZG8geworCQlwb3dbaV0gPSAodTgpdzsKKwkJcG93W2kgKyAyNTVdID0gKHU4KXc7CisJCWxvZ1t3XSA9ICh1OClpKys7CisJCXcgXj0gICh3IDw8IDEpIF4gKHcgJiAweDgwID8gV1BPTFkgOiAwKTsKKwl9IHdoaWxlICh3ICE9IDEpOworCQorCWZvcihpID0gMCwgdyA9IDE7IGkgPCBSQ19MRU5HVEg7ICsraSkgeworCQlyY29uX3RhYltpXSA9IGJ5dGVzMndvcmQodywgMCwgMCwgMCk7CisJCXcgPSBmMih3KTsKKwl9CisKKwlmb3IoaSA9IDA7IGkgPCAyNTY7ICsraSkgeworCQl1OCBiOworCQkKKwkJYiA9IGZ3ZF9hZmZpbmUoZmkoKHU4KWkpKTsKKwkJdyA9IGJ5dGVzMndvcmQoZjIoYiksIGIsIGIsIGYzKGIpKTsKKworCQkvKiB0YWJsZXMgZm9yIGEgbm9ybWFsIGVuY3J5cHRpb24gcm91bmQgKi8KKwkJZnRfdGFiWzBdW2ldID0gdzsKKwkJZnRfdGFiWzFdW2ldID0gdXByKHcsIDEpOworCQlmdF90YWJbMl1baV0gPSB1cHIodywgMik7CisJCWZ0X3RhYlszXVtpXSA9IHVwcih3LCAzKTsKKwkJdyA9IGJ5dGVzMndvcmQoYiwgMCwgMCwgMCk7CisJCQorCQkvKgorCQkgKiB0YWJsZXMgZm9yIGxhc3QgZW5jcnlwdGlvbiByb3VuZAorCQkgKiAobWF5IGFsc28gYmUgdXNlZCBpbiB0aGUga2V5IHNjaGVkdWxlKQorCQkgKi8KKwkJZmxfdGFiWzBdW2ldID0gdzsKKwkJZmxfdGFiWzFdW2ldID0gdXByKHcsIDEpOworCQlmbF90YWJbMl1baV0gPSB1cHIodywgMik7CisJCWZsX3RhYlszXVtpXSA9IHVwcih3LCAzKTsKKwkJCisJCS8qCisJCSAqIHRhYmxlIGZvciBrZXkgc2NoZWR1bGUgaWYgZmxfdGFiIGFib3ZlIGlzCisJCSAqIG5vdCBvZiB0aGUgcmVxdWlyZWQgZm9ybQorCQkgKi8KKwkJbHNfdGFiWzBdW2ldID0gdzsKKwkJbHNfdGFiWzFdW2ldID0gdXByKHcsIDEpOworCQlsc190YWJbMl1baV0gPSB1cHIodywgMik7CisJCWxzX3RhYlszXVtpXSA9IHVwcih3LCAzKTsKKwkJCisJCWIgPSBmaShpbnZfYWZmaW5lKCh1OClpKSk7CisJCXcgPSBieXRlczJ3b3JkKGZlKGIpLCBmOShiKSwgZmQoYiksIGZiKGIpKTsKKworCQkvKiB0YWJsZXMgZm9yIHRoZSBpbnZlcnNlIG1peCBjb2x1bW4gb3BlcmF0aW9uICAqLworCQlpbV90YWJbMF1bYl0gPSB3OworCQlpbV90YWJbMV1bYl0gPSB1cHIodywgMSk7CisJCWltX3RhYlsyXVtiXSA9IHVwcih3LCAyKTsKKwkJaW1fdGFiWzNdW2JdID0gdXByKHcsIDMpOworCisJCS8qIHRhYmxlcyBmb3IgYSBub3JtYWwgZGVjcnlwdGlvbiByb3VuZCAqLworCQlpdF90YWJbMF1baV0gPSB3OworCQlpdF90YWJbMV1baV0gPSB1cHIodywxKTsKKwkJaXRfdGFiWzJdW2ldID0gdXByKHcsMik7CisJCWl0X3RhYlszXVtpXSA9IHVwcih3LDMpOworCisJCXcgPSBieXRlczJ3b3JkKGIsIDAsIDAsIDApOworCQkKKwkJLyogdGFibGVzIGZvciBsYXN0IGRlY3J5cHRpb24gcm91bmQgKi8KKwkJaWxfdGFiWzBdW2ldID0gdzsKKwkJaWxfdGFiWzFdW2ldID0gdXByKHcsMSk7CisJCWlsX3RhYlsyXVtpXSA9IHVwcih3LDIpOworCQlpbF90YWJbM11baV0gPSB1cHIodywzKTsKKyAgICB9Cit9CisKKyNkZWZpbmUgZm91cl90YWJsZXMoeCx0YWIsdmYscmYsYykJCVwKKygJdGFiWzBdW2J2YWwodmYoeCwwLGMpLHJmKDAsYykpXQleCVwKKwl0YWJbMV1bYnZhbCh2Zih4LDEsYykscmYoMSxjKSldIF4JXAorCXRhYlsyXVtidmFsKHZmKHgsMixjKSxyZigyLGMpKV0gXglcCisJdGFiWzNdW2J2YWwodmYoeCwzLGMpLHJmKDMsYykpXQkJXAorKQorCisjZGVmaW5lIHZmMSh4LHIsYykgICh4KQorI2RlZmluZSByZjEocixjKSAgICAocikKKyNkZWZpbmUgcmYyKHIsYykgICAgKChyLWMpJjMpCisKKyNkZWZpbmUgaW52X21jb2woeCkgZm91cl90YWJsZXMoeCxpbV90YWIsdmYxLHJmMSwwKQorI2RlZmluZSBsc19ib3goeCxjKSBmb3VyX3RhYmxlcyh4LGZsX3RhYix2ZjEscmYyLGMpCisKKyNkZWZpbmUgZmYoeCkgaW52X21jb2woeCkKKworI2RlZmluZSBrZTQoayxpKQkJCQkJCQlcCit7CQkJCQkJCQkJXAorCWtbNCooaSkrNF0gPSBzc1swXSBePSBsc19ib3goc3NbM10sMykgXiByY29uX3RhYltpXTsJCVwKKwlrWzQqKGkpKzVdID0gc3NbMV0gXj0gc3NbMF07CQkJCQlcCisJa1s0KihpKSs2XSA9IHNzWzJdIF49IHNzWzFdOwkJCQkJXAorCWtbNCooaSkrN10gPSBzc1szXSBePSBzc1syXTsJCQkJCVwKK30KKworI2RlZmluZSBrZWw0KGssaSkJCQkJCQkJXAorewkJCQkJCQkJCVwKKwlrWzQqKGkpKzRdID0gc3NbMF0gXj0gbHNfYm94KHNzWzNdLDMpIF4gcmNvbl90YWJbaV07CQlcCisJa1s0KihpKSs1XSA9IHNzWzFdIF49IHNzWzBdOwkJCQkJXAorCWtbNCooaSkrNl0gPSBzc1syXSBePSBzc1sxXTsga1s0KihpKSs3XSA9IHNzWzNdIF49IHNzWzJdOwlcCit9CisKKyNkZWZpbmUga2U2KGssaSkJCQkJCQkJXAorewkJCQkJCQkJCVwKKwlrWzYqKGkpKyA2XSA9IHNzWzBdIF49IGxzX2JveChzc1s1XSwzKSBeIHJjb25fdGFiW2ldOwkJXAorCWtbNiooaSkrIDddID0gc3NbMV0gXj0gc3NbMF07CQkJCQlcCisJa1s2KihpKSsgOF0gPSBzc1syXSBePSBzc1sxXTsJCQkJCVwKKwlrWzYqKGkpKyA5XSA9IHNzWzNdIF49IHNzWzJdOwkJCQkJXAorCWtbNiooaSkrMTBdID0gc3NbNF0gXj0gc3NbM107CQkJCQlcCisJa1s2KihpKSsxMV0gPSBzc1s1XSBePSBzc1s0XTsJCQkJCVwKK30KKworI2RlZmluZSBrZWw2KGssaSkJCQkJCQkJXAorewkJCQkJCQkJCVwKKwlrWzYqKGkpKyA2XSA9IHNzWzBdIF49IGxzX2JveChzc1s1XSwzKSBeIHJjb25fdGFiW2ldOwkJXAorCWtbNiooaSkrIDddID0gc3NbMV0gXj0gc3NbMF07CQkJCQlcCisJa1s2KihpKSsgOF0gPSBzc1syXSBePSBzc1sxXTsJCQkJCVwKKwlrWzYqKGkpKyA5XSA9IHNzWzNdIF49IHNzWzJdOwkJCQkJXAorfQorCisjZGVmaW5lIGtlOChrLGkpCQkJCQkJCVwKK3sJCQkJCQkJCQlcCisJa1s4KihpKSsgOF0gPSBzc1swXSBePSBsc19ib3goc3NbN10sMykgXiByY29uX3RhYltpXTsJCVwKKwlrWzgqKGkpKyA5XSA9IHNzWzFdIF49IHNzWzBdOwkJCQkJXAorCWtbOCooaSkrMTBdID0gc3NbMl0gXj0gc3NbMV07CQkJCQlcCisJa1s4KihpKSsxMV0gPSBzc1szXSBePSBzc1syXTsJCQkJCVwKKwlrWzgqKGkpKzEyXSA9IHNzWzRdIF49IGxzX2JveChzc1szXSwwKTsJCQkJXAorCWtbOCooaSkrMTNdID0gc3NbNV0gXj0gc3NbNF07CQkJCQlcCisJa1s4KihpKSsxNF0gPSBzc1s2XSBePSBzc1s1XTsJCQkJCVwKKwlrWzgqKGkpKzE1XSA9IHNzWzddIF49IHNzWzZdOwkJCQkJXAorfQorCisjZGVmaW5lIGtlbDgoayxpKQkJCQkJCQlcCit7CQkJCQkJCQkJXAorCWtbOCooaSkrIDhdID0gc3NbMF0gXj0gbHNfYm94KHNzWzddLDMpIF4gcmNvbl90YWJbaV07CQlcCisJa1s4KihpKSsgOV0gPSBzc1sxXSBePSBzc1swXTsJCQkJCVwKKwlrWzgqKGkpKzEwXSA9IHNzWzJdIF49IHNzWzFdOwkJCQkJXAorCWtbOCooaSkrMTFdID0gc3NbM10gXj0gc3NbMl07CQkJCQlcCit9CisKKyNkZWZpbmUga2RmNChrLGkpCQkJCQkJCVwKK3sJCQkJCQkJCQlcCisJc3NbMF0gPSBzc1swXSBeIHNzWzJdIF4gc3NbMV0gXiBzc1szXTsJCQkJXAorCXNzWzFdID0gc3NbMV0gXiBzc1szXTsJCQkJCQlcCisJc3NbMl0gPSBzc1syXSBeIHNzWzNdOwkJCQkJCVwKKwlzc1szXSA9IHNzWzNdOwkJCQkJCQlcCisJc3NbNF0gPSBsc19ib3goc3NbKGkrMykgJSA0XSwgMykgXiByY29uX3RhYltpXTsJCQlcCisJc3NbaSAlIDRdIF49IHNzWzRdOwkJCQkJCVwKKwlzc1s0XSBePSBrWzQqKGkpXTsJCQkJCQlcCisJa1s0KihpKSs0XSA9IGZmKHNzWzRdKTsJCQkJCQlcCisJc3NbNF0gXj0ga1s0KihpKSsxXTsJCQkJCQlcCisJa1s0KihpKSs1XSA9IGZmKHNzWzRdKTsJCQkJCQlcCisJc3NbNF0gXj0ga1s0KihpKSsyXTsJCQkJCQlcCisJa1s0KihpKSs2XSA9IGZmKHNzWzRdKTsJCQkJCQlcCisJc3NbNF0gXj0ga1s0KihpKSszXTsJCQkJCQlcCisJa1s0KihpKSs3XSA9IGZmKHNzWzRdKTsJCQkJCQlcCit9CisKKyNkZWZpbmUga2Q0KGssaSkJCQkJCQkJXAorewkJCQkJCQkJCVwKKwlzc1s0XSA9IGxzX2JveChzc1soaSszKSAlIDRdLCAzKSBeIHJjb25fdGFiW2ldOwkJCVwKKwlzc1tpICUgNF0gXj0gc3NbNF07CQkJCQkJXAorCXNzWzRdID0gZmYoc3NbNF0pOwkJCQkJCVwKKwlrWzQqKGkpKzRdID0gc3NbNF0gXj0ga1s0KihpKV07CQkJCQlcCisJa1s0KihpKSs1XSA9IHNzWzRdIF49IGtbNCooaSkrMV07CQkJCVwKKwlrWzQqKGkpKzZdID0gc3NbNF0gXj0ga1s0KihpKSsyXTsJCQkJXAorCWtbNCooaSkrN10gPSBzc1s0XSBePSBrWzQqKGkpKzNdOwkJCQlcCit9CisKKyNkZWZpbmUga2RsNChrLGkpCQkJCQkJCVwKK3sJCQkJCQkJCQlcCisJc3NbNF0gPSBsc19ib3goc3NbKGkrMykgJSA0XSwgMykgXiByY29uX3RhYltpXTsJCQlcCisJc3NbaSAlIDRdIF49IHNzWzRdOwkJCQkJCVwKKwlrWzQqKGkpKzRdID0gKHNzWzBdIF49IHNzWzFdKSBeIHNzWzJdIF4gc3NbM107CQkJXAorCWtbNCooaSkrNV0gPSBzc1sxXSBeIHNzWzNdOwkJCQkJXAorCWtbNCooaSkrNl0gPSBzc1swXTsJCQkJCQlcCisJa1s0KihpKSs3XSA9IHNzWzFdOwkJCQkJCVwKK30KKworI2RlZmluZSBrZGY2KGssaSkJCQkJCQkJXAorewkJCQkJCQkJCVwKKwlzc1swXSBePSBsc19ib3goc3NbNV0sMykgXiByY29uX3RhYltpXTsJCQkJXAorCWtbNiooaSkrIDZdID0gZmYoc3NbMF0pOwkJCQkJXAorCXNzWzFdIF49IHNzWzBdOwkJCQkJCQlcCisJa1s2KihpKSsgN10gPSBmZihzc1sxXSk7CQkJCQlcCisJc3NbMl0gXj0gc3NbMV07CQkJCQkJCVwKKwlrWzYqKGkpKyA4XSA9IGZmKHNzWzJdKTsJCQkJCVwKKwlzc1szXSBePSBzc1syXTsJCQkJCQkJXAorCWtbNiooaSkrIDldID0gZmYoc3NbM10pOwkJCQkJXAorCXNzWzRdIF49IHNzWzNdOwkJCQkJCQlcCisJa1s2KihpKSsxMF0gPSBmZihzc1s0XSk7CQkJCQlcCisJc3NbNV0gXj0gc3NbNF07CQkJCQkJCVwKKwlrWzYqKGkpKzExXSA9IGZmKHNzWzVdKTsJCQkJCVwKK30KKworI2RlZmluZSBrZDYoayxpKQkJCQkJCQlcCit7CQkJCQkJCQkJXAorCXNzWzZdID0gbHNfYm94KHNzWzVdLDMpIF4gcmNvbl90YWJbaV07CQkJCVwKKwlzc1swXSBePSBzc1s2XTsgc3NbNl0gPSBmZihzc1s2XSk7CQkJCVwKKwlrWzYqKGkpKyA2XSA9IHNzWzZdIF49IGtbNiooaSldOwkJCQlcCisJc3NbMV0gXj0gc3NbMF07CQkJCQkJCVwKKwlrWzYqKGkpKyA3XSA9IHNzWzZdIF49IGtbNiooaSkrIDFdOwkJCQlcCisJc3NbMl0gXj0gc3NbMV07CQkJCQkJCVwKKwlrWzYqKGkpKyA4XSA9IHNzWzZdIF49IGtbNiooaSkrIDJdOwkJCQlcCisJc3NbM10gXj0gc3NbMl07CQkJCQkJCVwKKwlrWzYqKGkpKyA5XSA9IHNzWzZdIF49IGtbNiooaSkrIDNdOwkJCQlcCisJc3NbNF0gXj0gc3NbM107CQkJCQkJCVwKKwlrWzYqKGkpKzEwXSA9IHNzWzZdIF49IGtbNiooaSkrIDRdOwkJCQlcCisJc3NbNV0gXj0gc3NbNF07CQkJCQkJCVwKKwlrWzYqKGkpKzExXSA9IHNzWzZdIF49IGtbNiooaSkrIDVdOwkJCQlcCit9CisKKyNkZWZpbmUga2RsNihrLGkpCQkJCQkJCVwKK3sJCQkJCQkJCQlcCisJc3NbMF0gXj0gbHNfYm94KHNzWzVdLDMpIF4gcmNvbl90YWJbaV07CQkJCVwKKwlrWzYqKGkpKyA2XSA9IHNzWzBdOwkJCQkJCVwKKwlzc1sxXSBePSBzc1swXTsJCQkJCQkJXAorCWtbNiooaSkrIDddID0gc3NbMV07CQkJCQkJXAorCXNzWzJdIF49IHNzWzFdOwkJCQkJCQlcCisJa1s2KihpKSsgOF0gPSBzc1syXTsJCQkJCQlcCisJc3NbM10gXj0gc3NbMl07CQkJCQkJCVwKKwlrWzYqKGkpKyA5XSA9IHNzWzNdOwkJCQkJCVwKK30KKworI2RlZmluZSBrZGY4KGssaSkJCQkJCQkJXAorewkJCQkJCQkJCVwKKwlzc1swXSBePSBsc19ib3goc3NbN10sMykgXiByY29uX3RhYltpXTsJCQkJXAorCWtbOCooaSkrIDhdID0gZmYoc3NbMF0pOwkJCQkJXAorCXNzWzFdIF49IHNzWzBdOwkJCQkJCQlcCisJa1s4KihpKSsgOV0gPSBmZihzc1sxXSk7CQkJCQlcCisJc3NbMl0gXj0gc3NbMV07CQkJCQkJCVwKKwlrWzgqKGkpKzEwXSA9IGZmKHNzWzJdKTsJCQkJCVwKKwlzc1szXSBePSBzc1syXTsJCQkJCQkJXAorCWtbOCooaSkrMTFdID0gZmYoc3NbM10pOwkJCQkJXAorCXNzWzRdIF49IGxzX2JveChzc1szXSwwKTsJCQkJCVwKKwlrWzgqKGkpKzEyXSA9IGZmKHNzWzRdKTsJCQkJCVwKKwlzc1s1XSBePSBzc1s0XTsJCQkJCQkJXAorCWtbOCooaSkrMTNdID0gZmYoc3NbNV0pOwkJCQkJXAorCXNzWzZdIF49IHNzWzVdOwkJCQkJCQlcCisJa1s4KihpKSsxNF0gPSBmZihzc1s2XSk7CQkJCQlcCisJc3NbN10gXj0gc3NbNl07CQkJCQkJCVwKKwlrWzgqKGkpKzE1XSA9IGZmKHNzWzddKTsJCQkJCVwKK30KKworI2RlZmluZSBrZDgoayxpKQkJCQkJCQlcCit7CQkJCQkJCQkJXAorCXUzMiBfX2cgPSBsc19ib3goc3NbN10sMykgXiByY29uX3RhYltpXTsJCQlcCisJc3NbMF0gXj0gX19nOwkJCQkJCQlcCisJX19nID0gZmYoX19nKTsJCQkJCQkJXAorCWtbOCooaSkrIDhdID0gX19nIF49IGtbOCooaSldOwkJCQkJXAorCXNzWzFdIF49IHNzWzBdOwkJCQkJCQlcCisJa1s4KihpKSsgOV0gPSBfX2cgXj0ga1s4KihpKSsgMV07CQkJCVwKKwlzc1syXSBePSBzc1sxXTsJCQkJCQkJXAorCWtbOCooaSkrMTBdID0gX19nIF49IGtbOCooaSkrIDJdOwkJCQlcCisJc3NbM10gXj0gc3NbMl07CQkJCQkJCVwKKwlrWzgqKGkpKzExXSA9IF9fZyBePSBrWzgqKGkpKyAzXTsJCQkJXAorCV9fZyA9IGxzX2JveChzc1szXSwwKTsJCQkJCQlcCisJc3NbNF0gXj0gX19nOwkJCQkJCQlcCisJX19nID0gZmYoX19nKTsJCQkJCQkJXAorCWtbOCooaSkrMTJdID0gX19nIF49IGtbOCooaSkrIDRdOwkJCQlcCisJc3NbNV0gXj0gc3NbNF07CQkJCQkJCVwKKwlrWzgqKGkpKzEzXSA9IF9fZyBePSBrWzgqKGkpKyA1XTsJCQkJXAorCXNzWzZdIF49IHNzWzVdOwkJCQkJCQlcCisJa1s4KihpKSsxNF0gPSBfX2cgXj0ga1s4KihpKSsgNl07CQkJCVwKKwlzc1s3XSBePSBzc1s2XTsJCQkJCQkJXAorCWtbOCooaSkrMTVdID0gX19nIF49IGtbOCooaSkrIDddOwkJCQlcCit9CisKKyNkZWZpbmUga2RsOChrLGkpCQkJCQkJCVwKK3sJCQkJCQkJCQlcCisJc3NbMF0gXj0gbHNfYm94KHNzWzddLDMpIF4gcmNvbl90YWJbaV07CQkJCVwKKwlrWzgqKGkpKyA4XSA9IHNzWzBdOwkJCQkJCVwKKwlzc1sxXSBePSBzc1swXTsJCQkJCQkJXAorCWtbOCooaSkrIDldID0gc3NbMV07CQkJCQkJXAorCXNzWzJdIF49IHNzWzFdOwkJCQkJCQlcCisJa1s4KihpKSsxMF0gPSBzc1syXTsJCQkJCQlcCisJc3NbM10gXj0gc3NbMl07CQkJCQkJCVwKKwlrWzgqKGkpKzExXSA9IHNzWzNdOwkJCQkJCVwKK30KKworc3RhdGljIGludAorYWVzX3NldF9rZXkodm9pZCAqY3R4X2FyZywgY29uc3QgdTggKmluX2tleSwgdW5zaWduZWQgaW50IGtleV9sZW4sIHUzMiAqZmxhZ3MpCit7CisJaW50IGk7CisJdTMyIHNzWzhdOworCXN0cnVjdCBhZXNfY3R4ICpjdHggPSBjdHhfYXJnOworCisJLyogZW5jcnlwdGlvbiBzY2hlZHVsZSAqLworCQorCWN0eC0+ZWtleVswXSA9IHNzWzBdID0gdTMyX2luKGluX2tleSk7CisJY3R4LT5la2V5WzFdID0gc3NbMV0gPSB1MzJfaW4oaW5fa2V5ICsgNCk7CisJY3R4LT5la2V5WzJdID0gc3NbMl0gPSB1MzJfaW4oaW5fa2V5ICsgOCk7CisJY3R4LT5la2V5WzNdID0gc3NbM10gPSB1MzJfaW4oaW5fa2V5ICsgMTIpOworCisJc3dpdGNoKGtleV9sZW4pIHsKKwljYXNlIDE2OgorCQlmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKQorCQkJa2U0KGN0eC0+ZWtleSwgaSk7CisJCWtlbDQoY3R4LT5la2V5LCA5KTsKKwkJY3R4LT5yb3VuZHMgPSAxMDsKKwkJYnJlYWs7CisJCQorCWNhc2UgMjQ6CisJCWN0eC0+ZWtleVs0XSA9IHNzWzRdID0gdTMyX2luKGluX2tleSArIDE2KTsKKwkJY3R4LT5la2V5WzVdID0gc3NbNV0gPSB1MzJfaW4oaW5fa2V5ICsgMjApOworCQlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQorCQkJa2U2KGN0eC0+ZWtleSwgaSk7CisJCWtlbDYoY3R4LT5la2V5LCA3KTsgCisJCWN0eC0+cm91bmRzID0gMTI7CisJCWJyZWFrOworCisJY2FzZSAzMjoKKwkJY3R4LT5la2V5WzRdID0gc3NbNF0gPSB1MzJfaW4oaW5fa2V5ICsgMTYpOworCQljdHgtPmVrZXlbNV0gPSBzc1s1XSA9IHUzMl9pbihpbl9rZXkgKyAyMCk7CisJCWN0eC0+ZWtleVs2XSA9IHNzWzZdID0gdTMyX2luKGluX2tleSArIDI0KTsKKwkJY3R4LT5la2V5WzddID0gc3NbN10gPSB1MzJfaW4oaW5fa2V5ICsgMjgpOworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJa2U4KGN0eC0+ZWtleSwgaSk7CisJCWtlbDgoY3R4LT5la2V5LCA2KTsKKwkJY3R4LT5yb3VuZHMgPSAxNDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkqZmxhZ3MgfD0gQ1JZUFRPX1RGTV9SRVNfQkFEX0tFWV9MRU47CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkKKwkvKiBkZWNyeXB0aW9uIHNjaGVkdWxlICovCisJCisJY3R4LT5ka2V5WzBdID0gc3NbMF0gPSB1MzJfaW4oaW5fa2V5KTsKKwljdHgtPmRrZXlbMV0gPSBzc1sxXSA9IHUzMl9pbihpbl9rZXkgKyA0KTsKKwljdHgtPmRrZXlbMl0gPSBzc1syXSA9IHUzMl9pbihpbl9rZXkgKyA4KTsKKwljdHgtPmRrZXlbM10gPSBzc1szXSA9IHUzMl9pbihpbl9rZXkgKyAxMik7CisKKwlzd2l0Y2ggKGtleV9sZW4pIHsKKwljYXNlIDE2OgorCQlrZGY0KGN0eC0+ZGtleSwgMCk7CisJCWZvciAoaSA9IDE7IGkgPCA5OyBpKyspCisJCQlrZDQoY3R4LT5ka2V5LCBpKTsKKwkJa2RsNChjdHgtPmRrZXksIDkpOworCQlicmVhazsKKwkJCisJY2FzZSAyNDoKKwkJY3R4LT5ka2V5WzRdID0gZmYoc3NbNF0gPSB1MzJfaW4oaW5fa2V5ICsgMTYpKTsKKwkJY3R4LT5ka2V5WzVdID0gZmYoc3NbNV0gPSB1MzJfaW4oaW5fa2V5ICsgMjApKTsKKwkJa2RmNihjdHgtPmRrZXksIDApOworCQlmb3IgKGkgPSAxOyBpIDwgNzsgaSsrKQorCQkJa2Q2KGN0eC0+ZGtleSwgaSk7CisJCWtkbDYoY3R4LT5ka2V5LCA3KTsKKwkJYnJlYWs7CisKKwljYXNlIDMyOgorCQljdHgtPmRrZXlbNF0gPSBmZihzc1s0XSA9IHUzMl9pbihpbl9rZXkgKyAxNikpOworCQljdHgtPmRrZXlbNV0gPSBmZihzc1s1XSA9IHUzMl9pbihpbl9rZXkgKyAyMCkpOworCQljdHgtPmRrZXlbNl0gPSBmZihzc1s2XSA9IHUzMl9pbihpbl9rZXkgKyAyNCkpOworCQljdHgtPmRrZXlbN10gPSBmZihzc1s3XSA9IHUzMl9pbihpbl9rZXkgKyAyOCkpOworCQlrZGY4KGN0eC0+ZGtleSwgMCk7CisJCWZvciAoaSA9IDE7IGkgPCA2OyBpKyspCisJCQlrZDgoY3R4LT5ka2V5LCBpKTsKKwkJa2RsOChjdHgtPmRrZXksIDYpOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZXNfZW5jcnlwdCh2b2lkICpjdHgsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCit7CisJYWVzX2VuY19ibGsoc3JjLCBkc3QsIGN0eCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYWVzX2RlY3J5cHQodm9pZCAqY3R4LCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQoreworCWFlc19kZWNfYmxrKHNyYywgZHN0LCBjdHgpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBhZXNfYWxnID0geworCS5jcmFfbmFtZQkJPQkiYWVzIiwKKwkuY3JhX2ZsYWdzCQk9CUNSWVBUT19BTEdfVFlQRV9DSVBIRVIsCisJLmNyYV9ibG9ja3NpemUJCT0JQUVTX0JMT0NLX1NJWkUsCisJLmNyYV9jdHhzaXplCQk9CXNpemVvZihzdHJ1Y3QgYWVzX2N0eCksCisJLmNyYV9tb2R1bGUJCT0JVEhJU19NT0RVTEUsCisJLmNyYV9saXN0CQk9CUxJU1RfSEVBRF9JTklUKGFlc19hbGcuY3JhX2xpc3QpLAorCS5jcmFfdQkJCT0JeworCQkuY2lwaGVyID0geworCQkJLmNpYV9taW5fa2V5c2l6ZQk9CUFFU19NSU5fS0VZX1NJWkUsCisJCQkuY2lhX21heF9rZXlzaXplCT0JQUVTX01BWF9LRVlfU0laRSwKKwkJCS5jaWFfc2V0a2V5CSAgIAk9IAlhZXNfc2V0X2tleSwKKwkJCS5jaWFfZW5jcnlwdAkgCT0JYWVzX2VuY3J5cHQsCisJCQkuY2lhX2RlY3J5cHQJICAJPQlhZXNfZGVjcnlwdAorCQl9CisJfQorfTsKKworc3RhdGljIGludCBfX2luaXQgYWVzX2luaXQodm9pZCkKK3sKKwlnZW5fdGFicygpOworCXJldHVybiBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZhZXNfYWxnKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFlc19maW5pKHZvaWQpCit7CisJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZhZXNfYWxnKTsKK30KKworbW9kdWxlX2luaXQoYWVzX2luaXQpOworbW9kdWxlX2V4aXQoYWVzX2ZpbmkpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlJpam5kYWVsIChBRVMpIENpcGhlciBBbGdvcml0aG0sIGk1ODYgYXNtIG9wdGltaXplZCIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworTU9EVUxFX0FVVEhPUigiRnJ1aHdpcnRoIENsZW1lbnMsIEphbWVzIE1vcnJpcywgQnJpYW4gR2xhZG1hbiwgQWRhbSBSaWNodGVyIik7CitNT0RVTEVfQUxJQVMoImFlcyIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2RlZmNvbmZpZyBiL2FyY2gvaTM4Ni9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhlNjIwMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9kZWZjb25maWcKQEAgLTAsMCArMSwxMjQ3IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjCitDT05GSUdfWDg2PXkKK0NPTkZJR19NTVU9eQorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19HRU5FUklDX0lTQV9ETUE9eQorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQ0xFQU5fQ09NUElMRT15CitDT05GSUdfU1RBTkRBTE9ORT15CisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1BPU0lYX01RVUVVRT15CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorQ09ORklHX0FVRElUPXkKK0NPTkZJR19BVURJVFNZU0NBTEw9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTUKK0NPTkZJR19IT1RQTFVHPXkKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKK0NPTkZJR19LQUxMU1lNUz15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorQ09ORklHX0lPU0NIRURfQ0ZRPXkKKyMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX1VOTE9BRCBpcyBub3Qgc2V0CitDT05GSUdfT0JTT0xFVEVfTU9EUEFSTT15CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfS01PRD15CisKKyMKKyMgUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzCisjCitDT05GSUdfWDg2X1BDPXkKKyMgQ09ORklHX1g4Nl9FTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1g4Nl9WT1lBR0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1g4Nl9OVU1BUSBpcyBub3Qgc2V0CisjIENPTkZJR19YODZfU1VNTUlUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1g4Nl9CSUdTTVAgaXMgbm90IHNldAorIyBDT05GSUdfWDg2X1ZJU1dTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1g4Nl9HRU5FUklDQVJDSCBpcyBub3Qgc2V0CisjIENPTkZJR19YODZfRVM3MDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX00zODYgaXMgbm90IHNldAorIyBDT05GSUdfTTQ4NiBpcyBub3Qgc2V0CisjIENPTkZJR19NNTg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX001ODZUU0MgaXMgbm90IHNldAorIyBDT05GSUdfTTU4Nk1NWCBpcyBub3Qgc2V0CisjIENPTkZJR19NNjg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01QRU5USVVNSUkgaXMgbm90IHNldAorIyBDT05GSUdfTVBFTlRJVU1JSUkgaXMgbm90IHNldAorIyBDT05GSUdfTVBFTlRJVU1NIGlzIG5vdCBzZXQKK0NPTkZJR19NUEVOVElVTTQ9eQorIyBDT05GSUdfTUs2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01LNyBpcyBub3Qgc2V0CisjIENPTkZJR19NSzggaXMgbm90IHNldAorIyBDT05GSUdfTUNSVVNPRSBpcyBub3Qgc2V0CisjIENPTkZJR19NRUZGSUNFT04gaXMgbm90IHNldAorIyBDT05GSUdfTVdJTkNISVBDNiBpcyBub3Qgc2V0CisjIENPTkZJR19NV0lOQ0hJUDIgaXMgbm90IHNldAorIyBDT05GSUdfTVdJTkNISVAzRCBpcyBub3Qgc2V0CisjIENPTkZJR19NQ1lSSVhJSUkgaXMgbm90IHNldAorIyBDT05GSUdfTVZJQUMzXzIgaXMgbm90IHNldAorIyBDT05GSUdfWDg2X0dFTkVSSUMgaXMgbm90IHNldAorQ09ORklHX1g4Nl9DTVBYQ0hHPXkKK0NPTkZJR19YODZfWEFERD15CitDT05GSUdfWDg2X0wxX0NBQ0hFX1NISUZUPTcKK0NPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15CitDT05GSUdfWDg2X1dQX1dPUktTX09LPXkKK0NPTkZJR19YODZfSU5WTFBHPXkKK0NPTkZJR19YODZfQlNXQVA9eQorQ09ORklHX1g4Nl9QT1BBRF9PSz15CitDT05GSUdfWDg2X0dPT0RfQVBJQz15CitDT05GSUdfWDg2X0lOVEVMX1VTRVJDT1BZPXkKK0NPTkZJR19YODZfVVNFX1BQUk9fQ0hFQ0tTVU09eQorIyBDT05GSUdfSFBFVF9USU1FUiBpcyBub3Qgc2V0CisjIENPTkZJR19IUEVUX0VNVUxBVEVfUlRDIGlzIG5vdCBzZXQKK0NPTkZJR19TTVA9eQorQ09ORklHX05SX0NQVVM9OAorQ09ORklHX1NDSEVEX1NNVD15CitDT05GSUdfUFJFRU1QVD15CitDT05GSUdfWDg2X0xPQ0FMX0FQSUM9eQorQ09ORklHX1g4Nl9JT19BUElDPXkKK0NPTkZJR19YODZfVFNDPXkKK0NPTkZJR19YODZfTUNFPXkKK0NPTkZJR19YODZfTUNFX05PTkZBVEFMPXkKK0NPTkZJR19YODZfTUNFX1A0VEhFUk1BTD15CisjIENPTkZJR19UT1NISUJBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0k4SyBpcyBub3Qgc2V0CisjIENPTkZJR19NSUNST0NPREUgaXMgbm90IHNldAorIyBDT05GSUdfWDg2X01TUiBpcyBub3Qgc2V0CisjIENPTkZJR19YODZfQ1BVSUQgaXMgbm90IHNldAorCisjCisjIEZpcm13YXJlIERyaXZlcnMKKyMKKyMgQ09ORklHX0VERCBpcyBub3Qgc2V0CitDT05GSUdfTk9ISUdITUVNPXkKKyMgQ09ORklHX0hJR0hNRU00RyBpcyBub3Qgc2V0CisjIENPTkZJR19ISUdITUVNNjRHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BVEhfRU1VTEFUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19NVFJSPXkKKyMgQ09ORklHX0VGSSBpcyBub3Qgc2V0CitDT05GSUdfSVJRQkFMQU5DRT15CitDT05GSUdfSEFWRV9ERUNfTE9DSz15CisjIENPTkZJR19SRUdQQVJNIGlzIG5vdCBzZXQKKworIworIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMgKEFDUEksIEFQTSkKKyMKK0NPTkZJR19QTT15CitDT05GSUdfU09GVFdBUkVfU1VTUEVORD15CisjIENPTkZJR19QTV9ESVNLIGlzIG5vdCBzZXQKKworIworIyBBQ1BJIChBZHZhbmNlZCBDb25maWd1cmF0aW9uIGFuZCBQb3dlciBJbnRlcmZhY2UpIFN1cHBvcnQKKyMKK0NPTkZJR19BQ1BJPXkKK0NPTkZJR19BQ1BJX0JPT1Q9eQorQ09ORklHX0FDUElfSU5URVJQUkVURVI9eQorQ09ORklHX0FDUElfU0xFRVA9eQorQ09ORklHX0FDUElfU0xFRVBfUFJPQ19GUz15CitDT05GSUdfQUNQSV9BQz15CitDT05GSUdfQUNQSV9CQVRURVJZPXkKK0NPTkZJR19BQ1BJX0JVVFRPTj15CitDT05GSUdfQUNQSV9GQU49eQorQ09ORklHX0FDUElfUFJPQ0VTU09SPXkKK0NPTkZJR19BQ1BJX1RIRVJNQUw9eQorIyBDT05GSUdfQUNQSV9BU1VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FDUElfVE9TSElCQSBpcyBub3Qgc2V0CisjIENPTkZJR19BQ1BJX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19BQ1BJX0JVUz15CitDT05GSUdfQUNQSV9FQz15CitDT05GSUdfQUNQSV9QT1dFUj15CitDT05GSUdfQUNQSV9QQ0k9eQorQ09ORklHX0FDUElfU1lTVEVNPXkKKyMgQ09ORklHX1g4Nl9QTV9USU1FUiBpcyBub3Qgc2V0CisKKyMKKyMgQVBNIChBZHZhbmNlZCBQb3dlciBNYW5hZ2VtZW50KSBCSU9TIFN1cHBvcnQKKyMKKyMgQ09ORklHX0FQTSBpcyBub3Qgc2V0CisKKyMKKyMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCisjCisjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0CisKKyMKKyMgQnVzIG9wdGlvbnMgKFBDSSwgUENNQ0lBLCBFSVNBLCBNQ0EsIElTQSkKKyMKK0NPTkZJR19QQ0k9eQorIyBDT05GSUdfUENJX0dPQklPUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0lfR09NTUNPTkZJRyBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0lfR09ESVJFQ1QgaXMgbm90IHNldAorQ09ORklHX1BDSV9HT0FOWT15CitDT05GSUdfUENJX0JJT1M9eQorQ09ORklHX1BDSV9ESVJFQ1Q9eQorQ09ORklHX1BDSV9NTUNPTkZJRz15CisjIENPTkZJR19QQ0lfVVNFX1ZFQ1RPUiBpcyBub3Qgc2V0CitDT05GSUdfUENJX0xFR0FDWV9QUk9DPXkKK0NPTkZJR19QQ0lfTkFNRVM9eQorQ09ORklHX0lTQT15CisjIENPTkZJR19FSVNBIGlzIG5vdCBzZXQKKyMgQ09ORklHX01DQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ3gyMDAgaXMgbm90IHNldAorCisjCisjIFBDTUNJQS9DYXJkQnVzIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDTUNJQSBpcyBub3Qgc2V0CitDT05GSUdfUENNQ0lBX1BST0JFPXkKKworIworIyBQQ0kgSG90cGx1ZyBTdXBwb3J0CisjCisjIENPTkZJR19IT1RQTFVHX1BDSSBpcyBub3Qgc2V0CisKKyMKKyMgRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKK0NPTkZJR19CSU5GTVRfQU9VVD15CitDT05GSUdfQklORk1UX01JU0M9eQorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX0ZXX0xPQURFUj1tCisKKyMKKyMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQorIworIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19QQVJQT1JUPXkKK0NPTkZJR19QQVJQT1JUX1BDPXkKK0NPTkZJR19QQVJQT1JUX1BDX0NNTDE9eQorIyBDT05GSUdfUEFSUE9SVF9TRVJJQUwgaXMgbm90IHNldAorIyBDT05GSUdfUEFSUE9SVF9QQ19GSUZPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBUlBPUlRfUENfU1VQRVJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVJQT1JUX09USEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBUlBPUlRfMTI4NCBpcyBub3Qgc2V0CisKKyMKKyMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CisjCitDT05GSUdfUE5QPXkKKyMgQ09ORklHX1BOUF9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgUHJvdG9jb2xzCisjCisjIENPTkZJR19JU0FQTlAgaXMgbm90IHNldAorIyBDT05GSUdfUE5QQklPUyBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworQ09ORklHX0JMS19ERVZfRkQ9eQorIyBDT05GSUdfQkxLX0RFVl9YRCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVJJREUgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0NJU1NfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9EQUM5NjAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9VTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NBUk1FTCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1JBTSBpcyBub3Qgc2V0CitDT05GSUdfTEJEPXkKKworIworIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CisjCitDT05GSUdfSURFPXkKK0NPTkZJR19CTEtfREVWX0lERT15CisKKyMKKyMgUGxlYXNlIHNlZSBEb2N1bWVudGF0aW9uL2lkZS50eHQgZm9yIGhlbHAvaW5mbyBvbiBJREUgZHJpdmVzCisjCisjIENPTkZJR19CTEtfREVWX0hEX0lERSBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JREVESVNLPXkKK0NPTkZJR19JREVESVNLX01VTFRJX01PREU9eQorQ09ORklHX0JMS19ERVZfSURFQ0Q9eQorIyBDT05GSUdfQkxLX0RFVl9JREVUQVBFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFRkxPUFBZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFU0NTSSBpcyBub3Qgc2V0CisjIENPTkZJR19JREVfVEFTS19JT0NUTCBpcyBub3Qgc2V0CitDT05GSUdfSURFX1RBU0tGSUxFX0lPPXkKKworIworIyBJREUgY2hpcHNldCBzdXBwb3J0L2J1Z2ZpeGVzCisjCitDT05GSUdfSURFX0dFTkVSSUM9eQorQ09ORklHX0JMS19ERVZfQ01ENjQwPXkKKyMgQ09ORklHX0JMS19ERVZfQ01ENjQwX0VOSEFOQ0VEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFUE5QIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lERVBDST15CitDT05GSUdfSURFUENJX1NIQVJFX0lSUT15CisjIENPTkZJR19CTEtfREVWX09GRkJPQVJEIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0dFTkVSSUM9eQorIyBDT05GSUdfQkxLX0RFVl9PUFRJNjIxIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JaMTAwMD15CitDT05GSUdfQkxLX0RFVl9JREVETUFfUENJPXkKKyMgQ09ORklHX0JMS19ERVZfSURFRE1BX0ZPUkNFRCBpcyBub3Qgc2V0CitDT05GSUdfSURFRE1BX1BDSV9BVVRPPXkKKyMgQ09ORklHX0lERURNQV9PTkxZRElTSyBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9BRE1BPXkKKyMgQ09ORklHX0JMS19ERVZfQUVDNjJYWCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0FMSTE1WDMgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9BTUQ3NFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQVRJSVhQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ01ENjRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVFJJRkxFWCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NZODJDNjkzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ1M1NTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ1M1NTMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSFBUMzRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSFBUMzY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU0MxMjAwIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1BJSVg9eQorIyBDT05GSUdfQkxLX0RFVl9OUzg3NDE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUERDMjAyWFhfT0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUERDMjAyWFhfTkVXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1ZXS1MgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TSUlNQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU0lTNTUxMyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NMQzkwRTY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVFJNMjkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVklBODJDWFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERV9BUk0gaXMgbm90IHNldAorIyBDT05GSUdfSURFX0NISVBTRVRTIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lERURNQT15CisjIENPTkZJR19JREVETUFfSVZCIGlzIG5vdCBzZXQKK0NPTkZJR19JREVETUFfQVVUTz15CisjIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfU0NTST15CitDT05GSUdfU0NTSV9QUk9DX0ZTPXkKKworIworIyBTQ1NJIHN1cHBvcnQgdHlwZSAoZGlzaywgdGFwZSwgQ0QtUk9NKQorIworQ09ORklHX0JMS19ERVZfU0Q9eQorIyBDT05GSUdfQ0hSX0RFVl9TVCBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX09TU1QgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TUiBpcyBub3Qgc2V0CitDT05GSUdfQ0hSX0RFVl9TRz15CisKKyMKKyMgU29tZSBTQ1NJIGRldmljZXMgKGUuZy4gQ0QganVrZWJveCkgc3VwcG9ydCBtdWx0aXBsZSBMVU5zCisjCisjIENPTkZJR19TQ1NJX01VTFRJX0xVTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAorCisjCisjIFNDU0kgVHJhbnNwb3J0IEF0dHJpYnV0ZXMKKyMKKyMgQ09ORklHX1NDU0lfU1BJX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRkNfQVRUUlMgaXMgbm90IHNldAorCisjCisjIFNDU0kgbG93LWxldmVsIGRyaXZlcnMKKyMKKyMgQ09ORklHX0JMS19ERVZfM1dfWFhYWF9SQUlEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfNzAwMEZBU1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUNBUkQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSEExNTJYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUhBMTU0MiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FBQ1JBSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDN1hYWF9PTEQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3OVhYIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX0RQVF9JMk89bQorIyBDT05GSUdfU0NTSV9BRFZBTlNZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lOMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX01FR0FSQUlEIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1NBVEE9eQorIyBDT05GSUdfU0NTSV9TQVRBX1NWVyBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9BVEFfUElJWD15CisjIENPTkZJR19TQ1NJX1NBVEFfUFJPTUlTRSBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9TQVRBX1NYND1tCisjIENPTkZJR19TQ1NJX1NBVEFfU0lMIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1NBVEFfU0lTPW0KKyMgQ09ORklHX1NDU0lfU0FUQV9WSUEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVRBX1ZJVEVTU0UgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9CVVNMT0dJQyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0NQUUZDVFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ETVgzMTkxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RUQzMyODAgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9FQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRUFUQV9QSU8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9GVVRVUkVfRE9NQUlOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfR0RUSCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0dFTkVSSUNfTkNSNTM4MCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0dFTkVSSUNfTkNSNTM4MF9NTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU5JQTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1BQQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lNTSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05DUjUzQzQwNkEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TWU01M0M4WFhfMiBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9JUFI9bQorIyBDT05GSUdfU0NTSV9JUFJfVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JUFJfRFVNUCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1BBUzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUFNJMjQwSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMT0dJQ19GQVMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTE9HSUNfSVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxPR0lDX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxPR0lDXzEyODAgaXMgbm90IHNldAorQ09ORklHX1NDU0lfUUxBMlhYWD15CisjIENPTkZJR19TQ1NJX1FMQTIxWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEEyMlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBMjMwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMQTIzMjIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEE2MzEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBNjMyMiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NZTTUzQzQxNiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RDMzk1eCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RDMzkwVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1QxMjggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9VMTRfMzRGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfVUxUUkFTVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTlNQMzIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgT2xkIENELVJPTSBkcml2ZXJzIChub3QgU0NTSSwgbm90IElERSkKKyMKKyMgQ09ORklHX0NEX05PX0lERVNDU0kgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCitDT05GSUdfSUVFRTEzOTQ9eQorCisjCisjIFN1YnN5c3RlbSBPcHRpb25zCisjCisjIENPTkZJR19JRUVFMTM5NF9WRVJCT1NFREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTEzOTRfT1VJX0RCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUUxMzk0X0VYVFJBX0NPTkZJR19ST01TIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIFRleGFzIEluc3RydW1lbnRzIFBDSUx5bnggcmVxdWlyZXMgSTJDCisjCitDT05GSUdfSUVFRTEzOTRfT0hDSTEzOTQ9eQorCisjCisjIFByb3RvY29sIERyaXZlcnMKKyMKKyMgQ09ORklHX0lFRUUxMzk0X1ZJREVPMTM5NCBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFMTM5NF9TQlAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUUxMzk0X0VUSDEzOTQgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTEzOTRfRFYxMzk0IGlzIG5vdCBzZXQKK0NPTkZJR19JRUVFMTM5NF9SQVdJTz15CisjIENPTkZJR19JRUVFMTM5NF9DTVAgaXMgbm90IHNldAorCisjCisjIEkyTyBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JraW5nIHN1cHBvcnQKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRMSU5LX0RFViBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKK0NPTkZJR19JUF9NVUxUSUNBU1Q9eQorIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1BOUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTVJPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisKKyMKKyMgSVA6IFZpcnR1YWwgU2VydmVyIENvbmZpZ3VyYXRpb24KKyMKKyMgQ09ORklHX0lQX1ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorQ09ORklHX05FVEZJTFRFUj15CisjIENPTkZJR19ORVRGSUxURVJfREVCVUcgaXMgbm90IHNldAorCisjCisjIElQOiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgorIworQ09ORklHX0lQX05GX0NPTk5UUkFDSz15CisjIENPTkZJR19JUF9ORl9GVFAgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfSVJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX1RGVFAgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfQU1BTkRBIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9ORl9RVUVVRT15CitDT05GSUdfSVBfTkZfSVBUQUJMRVM9eQorQ09ORklHX0lQX05GX01BVENIX0xJTUlUPXkKK0NPTkZJR19JUF9ORl9NQVRDSF9JUFJBTkdFPXkKK0NPTkZJR19JUF9ORl9NQVRDSF9NQUM9eQorQ09ORklHX0lQX05GX01BVENIX1BLVFRZUEU9eQorQ09ORklHX0lQX05GX01BVENIX01BUks9eQorQ09ORklHX0lQX05GX01BVENIX01VTFRJUE9SVD15CitDT05GSUdfSVBfTkZfTUFUQ0hfVE9TPXkKK0NPTkZJR19JUF9ORl9NQVRDSF9SRUNFTlQ9eQorQ09ORklHX0lQX05GX01BVENIX0VDTj15CitDT05GSUdfSVBfTkZfTUFUQ0hfRFNDUD15CitDT05GSUdfSVBfTkZfTUFUQ0hfQUhfRVNQPXkKK0NPTkZJR19JUF9ORl9NQVRDSF9MRU5HVEg9eQorQ09ORklHX0lQX05GX01BVENIX1RUTD15CitDT05GSUdfSVBfTkZfTUFUQ0hfVENQTVNTPXkKK0NPTkZJR19JUF9ORl9NQVRDSF9IRUxQRVI9eQorQ09ORklHX0lQX05GX01BVENIX1NUQVRFPXkKK0NPTkZJR19JUF9ORl9NQVRDSF9DT05OVFJBQ0s9eQorQ09ORklHX0lQX05GX01BVENIX09XTkVSPXkKK0NPTkZJR19JUF9ORl9GSUxURVI9eQorQ09ORklHX0lQX05GX1RBUkdFVF9SRUpFQ1Q9eQorQ09ORklHX0lQX05GX05BVD15CitDT05GSUdfSVBfTkZfTkFUX05FRURFRD15CitDT05GSUdfSVBfTkZfVEFSR0VUX01BU1FVRVJBREU9eQorQ09ORklHX0lQX05GX1RBUkdFVF9SRURJUkVDVD15CitDT05GSUdfSVBfTkZfVEFSR0VUX05FVE1BUD15CitDT05GSUdfSVBfTkZfVEFSR0VUX1NBTUU9eQorIyBDT05GSUdfSVBfTkZfTkFUX1NOTVBfQkFTSUMgaXMgbm90IHNldAorQ09ORklHX0lQX05GX01BTkdMRT15CitDT05GSUdfSVBfTkZfVEFSR0VUX1RPUz15CitDT05GSUdfSVBfTkZfVEFSR0VUX0VDTj15CitDT05GSUdfSVBfTkZfVEFSR0VUX0RTQ1A9eQorQ09ORklHX0lQX05GX1RBUkdFVF9NQVJLPXkKK0NPTkZJR19JUF9ORl9UQVJHRVRfQ0xBU1NJRlk9eQorQ09ORklHX0lQX05GX1RBUkdFVF9MT0c9eQorQ09ORklHX0lQX05GX1RBUkdFVF9VTE9HPXkKK0NPTkZJR19JUF9ORl9UQVJHRVRfVENQTVNTPXkKK0NPTkZJR19JUF9ORl9BUlBUQUJMRVM9eQorQ09ORklHX0lQX05GX0FSUEZJTFRFUj15CitDT05GSUdfSVBfTkZfQVJQX01BTkdMRT15CitDT05GSUdfSVBfTkZfVEFSR0VUX05PVFJBQ0s9bQorQ09ORklHX0lQX05GX1JBVz1tCisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRkFTVFJPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9IV19GTE9XQ09OVFJPTCBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CitDT05GSUdfRFVNTVk9bQorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9TQjEwMDAgaXMgbm90IHNldAorCisjCisjIEFSQ25ldCBkZXZpY2VzCisjCisjIENPTkZJR19BUkNORVQgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQorIworQ09ORklHX05FVF9FVEhFUk5FVD15CitDT05GSUdfTUlJPXkKKyMgQ09ORklHX0hBUFBZTUVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5HRU0gaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl8zQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBTkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfU01DIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfUkFDQUwgaXMgbm90IHNldAorCisjCisjIFR1bGlwIGZhbWlseSBuZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19ORVRfVFVMSVAgaXMgbm90IHNldAorIyBDT05GSUdfQVQxNzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFUENBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JU0EgaXMgbm90IHNldAorQ09ORklHX05FVF9QQ0k9eQorIyBDT05GSUdfUENORVQzMiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUQ4MTExX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19BREFQVEVDX1NUQVJGSVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FDMzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUFJJQ09UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19GT1JDRURFVEggaXMgbm90IHNldAorIyBDT05GSUdfQ1M4OXgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RHUlMgaXMgbm90IHNldAorIyBDT05GSUdfRUVQUk8xMDAgaXMgbm90IHNldAorIyBDT05GSUdfRTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFMTlggaXMgbm90IHNldAorIyBDT05GSUdfTkFUU0VNSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORTJLX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR184MTM5Q1AgaXMgbm90IHNldAorQ09ORklHXzgxMzlUT089eQorQ09ORklHXzgxMzlUT09fUElPPXkKKyMgQ09ORklHXzgxMzlUT09fVFVORV9UV0lTVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHXzgxMzlUT09fODEyOSBpcyBub3Qgc2V0CisjIENPTkZJR184MTM5X09MRF9SWF9SRVNFVCBpcyBub3Qgc2V0CisjIENPTkZJR19TSVM5MDAgaXMgbm90IHNldAorIyBDT05GSUdfRVBJQzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5EQU5DRSBpcyBub3Qgc2V0CisjIENPTkZJR19UTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9SSElORSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9DS0VUIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RMMksgaXMgbm90IHNldAorIyBDT05GSUdfRTEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CisjIENPTkZJR19SODE2OSBpcyBub3Qgc2V0CisjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisjIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKK0NPTkZJR19TMklPPW0KKyMgQ09ORklHX1MySU9fTkFQSSBpcyBub3Qgc2V0CisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisjIENPTkZJR19UUiBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCisjIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAorCisjCisjIFdhbiBpbnRlcmZhY2VzCisjCisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0CisjIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0CisjIENPTkZJR19QTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9GQyBpcyBub3Qgc2V0CisjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIFRlbGVwaG9ueSBTdXBwb3J0CisjCisjIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworQ09ORklHX0lOUFVUX01PVVNFREVWPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWD15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBJL08gZHJpdmVycworIworIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorQ09ORklHX1NPVU5EX0dBTUVQT1JUPXkKK0NPTkZJR19TRVJJTz15CitDT05GSUdfU0VSSU9fSTgwNDI9eQorIyBDT05GSUdfU0VSSU9fU0VSUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJT19DVDgyQzcxMCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJT19QQVJLQkQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSU9fUENJUFMyIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKK0NPTkZJR19LRVlCT0FSRF9BVEtCRD15CisjIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9NT1VTRT15CitDT05GSUdfTU9VU0VfUFMyPXkKKyMgQ09ORklHX01PVVNFX1NFUklBTCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9JTlBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfTE9HSUJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1BDMTEwUEFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1ZTWFhYQUEgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CitDT05GSUdfVlRfQ09OU09MRT15CitDT05GSUdfSFdfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCitDT05GSUdfU0VSSUFMXzgyNTA9eQorIyBDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfODI1MF9BQ1BJIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz00CisjIENPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19VTklYOThfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CitDT05GSUdfUFJJTlRFUj15CisjIENPTkZJR19MUF9DT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJUEFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FJQzAyX1RBUEUgaXMgbm90IHNldAorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19SVEMgaXMgbm90IHNldAorIyBDT05GSUdfR0VOX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPTllQSSBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCitDT05GSUdfQUdQPXkKKyMgQ09ORklHX0FHUF9BTEkgaXMgbm90IHNldAorIyBDT05GSUdfQUdQX0FUSSBpcyBub3Qgc2V0CisjIENPTkZJR19BR1BfQU1EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FHUF9BTUQ2NCBpcyBub3Qgc2V0CitDT05GSUdfQUdQX0lOVEVMPXkKKyMgQ09ORklHX0FHUF9OVklESUEgaXMgbm90IHNldAorIyBDT05GSUdfQUdQX1NJUyBpcyBub3Qgc2V0CisjIENPTkZJR19BR1BfU1dPUktTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FHUF9WSUEgaXMgbm90IHNldAorIyBDT05GSUdfQUdQX0VGRklDRU9OIGlzIG5vdCBzZXQKK0NPTkZJR19EUk09eQorIyBDT05GSUdfRFJNX1RERlggaXMgbm90IHNldAorIyBDT05GSUdfRFJNX0dBTU1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RSTV9SMTI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0RSTV9SQURFT04gaXMgbm90IHNldAorIyBDT05GSUdfRFJNX0k4MTAgaXMgbm90IHNldAorQ09ORklHX0RSTV9JODMwPXkKKyMgQ09ORklHX0RSTV9NR0EgaXMgbm90IHNldAorIyBDT05GSUdfRFJNX1NJUyBpcyBub3Qgc2V0CisjIENPTkZJR19NV0FWRSBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTkdDSEVDS19USU1FUiBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisjIENPTkZJR19JQk1fQVNNIGlzIG5vdCBzZXQKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisKKyMKKyMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcworIworIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19TRUxFQ1QgaXMgbm90IHNldAorCisjCisjIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAorIworQ09ORklHX1ZHQV9DT05TT0xFPXkKKyMgQ09ORklHX01EQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKKworIworIyBTb3VuZAorIworQ09ORklHX1NPVU5EPXkKKworIworIyBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKKyMKK0NPTkZJR19TTkQ9eQorQ09ORklHX1NORF9USU1FUj15CitDT05GSUdfU05EX1BDTT15CitDT05GSUdfU05EX1JBV01JREk9eQorQ09ORklHX1NORF9TRVFVRU5DRVI9eQorIyBDT05GSUdfU05EX1NFUV9EVU1NWSBpcyBub3Qgc2V0CitDT05GSUdfU05EX09TU0VNVUw9eQorQ09ORklHX1NORF9NSVhFUl9PU1M9eQorQ09ORklHX1NORF9QQ01fT1NTPXkKK0NPTkZJR19TTkRfU0VRVUVOQ0VSX09TUz15CisjIENPTkZJR19TTkRfVkVSQk9TRV9QUklOVEsgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBHZW5lcmljIGRldmljZXMKKyMKK0NPTkZJR19TTkRfTVBVNDAxX1VBUlQ9eQorIyBDT05GSUdfU05EX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9WSVJNSURJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NVFBBViBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU0VSSUFMX1UxNjU1MCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTVBVNDAxIGlzIG5vdCBzZXQKKworIworIyBJU0EgZGV2aWNlcworIworIyBDT05GSUdfU05EX0FEMTg0OCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQ1M0MjMxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9DUzQyMzIgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0NTNDIzNiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRVMxNjg4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9FUzE4WFggaXMgbm90IHNldAorIyBDT05GSUdfU05EX0dVU0NMQVNTSUMgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0dVU0VYVFJFTUUgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0dVU01BWCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSU5URVJXQVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9JTlRFUldBVkVfU1RCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9PUFRJOTJYX0FEMTg0OCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfT1BUSTkyWF9DUzQyMzEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX09QVEk5M1ggaXMgbm90IHNldAorIyBDT05GSUdfU05EX1NCOCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU0IxNiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU0JBV0UgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1dBVkVGUk9OVCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQ01JODMzMCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfT1BMM1NBMiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU0dBTEFYWSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU1NDQVBFIGlzIG5vdCBzZXQKKworIworIyBQQ0kgZGV2aWNlcworIworQ09ORklHX1NORF9BQzk3X0NPREVDPXkKKyMgQ09ORklHX1NORF9BTEk1NDUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9BVElJWFAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FVODgxMCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQVU4ODIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9BVTg4MzAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FaVDMzMjggaXMgbm90IHNldAorIyBDT05GSUdfU05EX0JUODdYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9DUzQ2WFggaXMgbm90IHNldAorIyBDT05GSUdfU05EX0NTNDI4MSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRU1VMTBLMSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfS09SRzEyMTIgaXMgbm90IHNldAorIyBDT05GSUdfU05EX01JWEFSVCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTk0yNTYgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1JNRTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9STUU5NiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfUk1FOTY1MiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSERTUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfVFJJREVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfWU1GUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9BTFM0MDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9DTUlQQ0kgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0VOUzEzNzAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0VOUzEzNzEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0VTMTkzOCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRVMxOTY4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NQUVTVFJPMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRk04MDEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0lDRTE3MTIgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0lDRTE3MjQgaXMgbm90IHNldAorQ09ORklHX1NORF9JTlRFTDhYMD15CisjIENPTkZJR19TTkRfSU5URUw4WDBNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9TT05JQ1ZJQkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9WSUE4MlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9WWDIyMiBpcyBub3Qgc2V0CisKKyMKKyMgQUxTQSBVU0IgZGV2aWNlcworIworIyBDT05GSUdfU05EX1VTQl9BVURJTyBpcyBub3Qgc2V0CisKKyMKKyMgT3BlbiBTb3VuZCBTeXN0ZW0KKyMKKyMgQ09ORklHX1NPVU5EX1BSSU1FIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworQ09ORklHX1VTQj15CisjIENPTkZJR19VU0JfREVCVUcgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgVVNCIG9wdGlvbnMKKyMKK0NPTkZJR19VU0JfREVWSUNFRlM9eQorIyBDT05GSUdfVVNCX0JBTkRXSURUSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAorCisjCisjIFVTQiBIb3N0IENvbnRyb2xsZXIgRHJpdmVycworIworQ09ORklHX1VTQl9FSENJX0hDRD15CisjIENPTkZJR19VU0JfRUhDSV9TUExJVF9JU08gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VIQ0lfUk9PVF9IVUJfVFQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX09IQ0lfSENEIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfVUhDSV9IQ0Q9eQorCisjCisjIFVTQiBEZXZpY2UgQ2xhc3MgZHJpdmVycworIworIyBDT05GSUdfVVNCX0FVRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9CTFVFVE9PVEhfVFRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9NSURJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BQ00gaXMgbm90IHNldAorQ09ORklHX1VTQl9QUklOVEVSPXkKK0NPTkZJR19VU0JfU1RPUkFHRT15CisjIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9EQVRBRkFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0ZSRUVDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfSVNEMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0RQQ00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfSFA4MjAwZSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9TRERSMDkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0pVTVBTSE9UIGlzIG5vdCBzZXQKKworIworIyBVU0IgSHVtYW4gSW50ZXJmYWNlIERldmljZXMgKEhJRCkKKyMKK0NPTkZJR19VU0JfSElEPXkKK0NPTkZJR19VU0JfSElESU5QVVQ9eQorIyBDT05GSUdfSElEX0ZGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9ISURERVYgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FJUFRFSyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfV0FDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0tCVEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QT1dFUk1BVEUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01UT1VDSCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0VHQUxBWD1tCisjIENPTkZJR19VU0JfWFBBRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVRJX1JFTU9URSBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEltYWdpbmcgZGV2aWNlcworIworIyBDT05GSUdfVVNCX01EQzgwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTUlDUk9URUsgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0hQVVNCU0NTSSBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVVNCX0RBQlVTQiBpcyBub3Qgc2V0CisKKyMKKyMgVmlkZW80TGludXggc3VwcG9ydCBpcyBuZWVkZWQgZm9yIFVTQiBNdWx0aW1lZGlhIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgVVNCIE5ldHdvcmsgYWRhcHRvcnMKKyMKKyMgQ09ORklHX1VTQl9DQVRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9LQVdFVEggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BFR0FTVVMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1JUTDgxNTAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1VTQk5FVCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHBvcnQgZHJpdmVycworIworIyBDT05GSUdfVVNCX1VTUzcyMCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIFNlcmlhbCBDb252ZXJ0ZXIgc3VwcG9ydAorIworIyBDT05GSUdfVVNCX1NFUklBTCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIE1pc2NlbGxhbmVvdXMgZHJpdmVycworIworIyBDT05GSUdfVVNCX0VNSTYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9FTUkyNiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVElHTCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVVFUlNXQUxEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SSU81MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFR09UT1dFUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUQgaXMgbm90IHNldAorQ09ORklHX1VTQl9DWVRIRVJNPW0KK0NPTkZJR19VU0JfUEhJREdFVFNFUlZPPW0KKyMgQ09ORklHX1VTQl9URVNUIGlzIG5vdCBzZXQKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9eQorIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CitDT05GSUdfRVhUM19GUz15CitDT05GSUdfRVhUM19GU19YQVRUUj15CisjIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKK0NPTkZJR19KQkQ9eQorIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19GU19NQkNBQ0hFPXkKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19BVVRPRlM0X0ZTPXkKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfSVNPOTY2MF9GUz15CitDT05GSUdfSk9MSUVUPXkKKyMgQ09ORklHX1pJU09GUyBpcyBub3Qgc2V0CitDT05GSUdfVURGX0ZTPXkKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfRkFUX0ZTPXkKK0NPTkZJR19NU0RPU19GUz15CitDT05GSUdfVkZBVF9GUz15CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19QUk9DX0tDT1JFPXkKK0NPTkZJR19TWVNGUz15CisjIENPTkZJR19ERVZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZQVFNfRlNfWEFUVFIgaXMgbm90IHNldAorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX0hVR0VUTEJGUyBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CisjIENPTkZJR19ORlNfVjMgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CitDT05GSUdfTkZTRD15CisjIENPTkZJR19ORlNEX1YzIGlzIG5vdCBzZXQKK0NPTkZJR19ORlNEX1RDUD15CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX0VYUE9SVEZTPXkKK0NPTkZJR19TVU5SUEM9eQorIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCisjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKK0NPTkZJR19OTFM9eQorQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCitDT05GSUdfTkxTX0NPREVQQUdFXzQzNz15CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk0OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzggaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTEgaXMgbm90IHNldAorQ09ORklHX05MU19JU084ODU5XzE9eQorIyBDT05GSUdfTkxTX0lTTzg4NTlfMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8zIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV82IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX1VURjggaXMgbm90IHNldAorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCitDT05GSUdfUFJPRklMSU5HPXkKK0NPTkZJR19PUFJPRklMRT15CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CitDT05GSUdfRUFSTFlfUFJJTlRLPXkKK0NPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUD15CisjIENPTkZJR19GUkFNRV9QT0lOVEVSIGlzIG5vdCBzZXQKK0NPTkZJR180S1NUQUNLUz15CitDT05GSUdfWDg2X0ZJTkRfU01QX0NPTkZJRz15CitDT05GSUdfWDg2X01QUEFSU0U9eQorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworQ09ORklHX0NSQzMyPXkKK0NPTkZJR19MSUJDUkMzMkM9bQorQ09ORklHX1g4Nl9TTVA9eQorQ09ORklHX1g4Nl9IVD15CitDT05GSUdfWDg2X0JJT1NfUkVCT09UPXkKK0NPTkZJR19YODZfVFJBTVBPTElORT15CitDT05GSUdfWDg2X1NURF9SRVNPVVJDRVM9eQorQ09ORklHX1BDPXkKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL2kzODYva2VybmVsL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMzc4N2EKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL01ha2VmaWxlCkBAIC0wLDAgKzEsNzEgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuCisjCisKK2V4dHJhLXkgOj0gaGVhZC5vIGluaXRfdGFzay5vIHZtbGludXgubGRzCisKK29iai15CTo9IHByb2Nlc3MubyBzZW1hcGhvcmUubyBzaWduYWwubyBlbnRyeS5vIHRyYXBzLm8gaXJxLm8gdm04Ni5vIFwKKwkJcHRyYWNlLm8gdGltZS5vIGlvcG9ydC5vIGxkdC5vIHNldHVwLm8gaTgyNTkubyBzeXNfaTM4Ni5vIFwKKwkJcGNpLWRtYS5vIGkzODZfa3N5bXMubyBpMzg3Lm8gZG1pX3NjYW4ubyBib290ZmxhZy5vIFwKKwkJZG91YmxlZmF1bHQubyBxdWlya3MubworCitvYmoteQkJCQkrPSBjcHUvCitvYmoteQkJCQkrPSB0aW1lcnMvCitvYmotJChDT05GSUdfQUNQSV9CT09UKQkJKz0gYWNwaS8KK29iai0kKENPTkZJR19YODZfQklPU19SRUJPT1QpCSs9IHJlYm9vdC5vCitvYmotJChDT05GSUdfTUNBKQkJKz0gbWNhLm8KK29iai0kKENPTkZJR19YODZfTVNSKQkJKz0gbXNyLm8KK29iai0kKENPTkZJR19YODZfQ1BVSUQpCQkrPSBjcHVpZC5vCitvYmotJChDT05GSUdfTUlDUk9DT0RFKQkJKz0gbWljcm9jb2RlLm8KK29iai0kKENPTkZJR19BUE0pCQkrPSBhcG0ubworb2JqLSQoQ09ORklHX1g4Nl9TTVApCQkrPSBzbXAubyBzbXBib290Lm8KK29iai0kKENPTkZJR19YODZfVFJBTVBPTElORSkJKz0gdHJhbXBvbGluZS5vCitvYmotJChDT05GSUdfWDg2X01QUEFSU0UpCSs9IG1wcGFyc2Uubworb2JqLSQoQ09ORklHX1g4Nl9MT0NBTF9BUElDKQkrPSBhcGljLm8gbm1pLm8KK29iai0kKENPTkZJR19YODZfSU9fQVBJQykJKz0gaW9fYXBpYy5vCitvYmotJChDT05GSUdfWDg2X05VTUFRKQkJKz0gbnVtYXEubworb2JqLSQoQ09ORklHX1g4Nl9TVU1NSVRfTlVNQSkJKz0gc3VtbWl0Lm8KK29iai0kKENPTkZJR19LUFJPQkVTKQkJKz0ga3Byb2Jlcy5vCitvYmotJChDT05GSUdfTU9EVUxFUykJCSs9IG1vZHVsZS5vCitvYmoteQkJCQkrPSBzeXNlbnRlci5vIHZzeXNjYWxsLm8KK29iai0kKENPTkZJR19BQ1BJX1NSQVQpIAkrPSBzcmF0Lm8KK29iai0kKENPTkZJR19IUEVUX1RJTUVSKSAJKz0gdGltZV9ocGV0Lm8KK29iai0kKENPTkZJR19FRkkpIAkJKz0gZWZpLm8gZWZpX3N0dWIubworb2JqLSQoQ09ORklHX0VBUkxZX1BSSU5USykJKz0gZWFybHlfcHJpbnRrLm8KKworRVhUUkFfQUZMQUdTICAgOj0gLXRyYWRpdGlvbmFsCisKK29iai0kKENPTkZJR19TQ3gyMDApCQkrPSBzY3gyMDAubworCisjIHZzeXNjYWxsLm8gY29udGFpbnMgdGhlIHZzeXNjYWxsIERTTyBpbWFnZXMgYXMgX19pbml0ZGF0YS4KKyMgV2UgbXVzdCBidWlsZCBib3RoIGltYWdlcyBiZWZvcmUgd2UgY2FuIGFzc2VtYmxlIGl0LgorIyBOb3RlOiBrYnVpbGQgZG9lcyBub3QgdHJhY2sgdGhpcyBkZXBlbmRlbmN5IGR1ZSB0byB1c2FnZSBvZiAuaW5jYmluCiskKG9iaikvdnN5c2NhbGwubzogJChvYmopL3ZzeXNjYWxsLWludDgwLnNvICQob2JqKS92c3lzY2FsbC1zeXNlbnRlci5zbwordGFyZ2V0cyArPSAkKGZvcmVhY2ggRixpbnQ4MCBzeXNlbnRlcix2c3lzY2FsbC0kRi5vIHZzeXNjYWxsLSRGLnNvKQordGFyZ2V0cyArPSB2c3lzY2FsbC5sZHMKKworIyBUaGUgRFNPIGltYWdlcyBhcmUgYnVpbHQgdXNpbmcgYSBzcGVjaWFsIGxpbmtlciBzY3JpcHQuCitxdWlldF9jbWRfc3lzY2FsbCA9IFNZU0NBTEwgJEAKKyAgICAgIGNtZF9zeXNjYWxsID0gJChDQykgLW0gZWxmX2kzODYgLW5vc3RkbGliICQoU1lTQ0ZMQUdTXyQoQEYpKSBcCisJCSAgICAgICAgICAtV2wsLVQsJChmaWx0ZXItb3V0IEZPUkNFLCReKSAtbyAkQAorCitleHBvcnQgQ1BQRkxBR1NfdnN5c2NhbGwubGRzICs9IC1QIC1DIC1VJChBUkNIKQorCit2c3lzY2FsbC1mbGFncyA9IC1zaGFyZWQgLXMgLVdsLC1zb25hbWU9bGludXgtZ2F0ZS5zby4xCitTWVNDRkxBR1NfdnN5c2NhbGwtc3lzZW50ZXIuc28JPSAkKHZzeXNjYWxsLWZsYWdzKQorU1lTQ0ZMQUdTX3ZzeXNjYWxsLWludDgwLnNvCT0gJCh2c3lzY2FsbC1mbGFncykKKworJChvYmopL3ZzeXNjYWxsLWludDgwLnNvICQob2JqKS92c3lzY2FsbC1zeXNlbnRlci5zbzogXAorJChvYmopL3ZzeXNjYWxsLSUuc286ICQoc3JjKS92c3lzY2FsbC5sZHMgJChvYmopL3ZzeXNjYWxsLSUubyBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLHN5c2NhbGwpCisKKyMgV2UgYWxzbyBjcmVhdGUgYSBzcGVjaWFsIHJlbG9jYXRhYmxlIG9iamVjdCB0aGF0IHNob3VsZCBtaXJyb3IgdGhlIHN5bWJvbAorIyB0YWJsZSBhbmQgbGF5b3V0IG9mIHRoZSBsaW5rZWQgRFNPLiAgV2l0aCBsZCAtUiB3ZSBjYW4gdGhlbiByZWZlciB0bworIyB0aGVzZSBzeW1ib2xzIGluIHRoZSBrZXJuZWwgY29kZSByYXRoZXIgdGhhbiBoYW5kLWNvZGVkIGFkZHJlc3Nlcy4KK2V4dHJhLXkgKz0gdnN5c2NhbGwtc3ltcy5vCiskKG9iaikvYnVpbHQtaW4ubzogJChvYmopL3ZzeXNjYWxsLXN5bXMubworJChvYmopL2J1aWx0LWluLm86IGxkX2ZsYWdzICs9IC1SICQob2JqKS92c3lzY2FsbC1zeW1zLm8KKworU1lTQ0ZMQUdTX3ZzeXNjYWxsLXN5bXMubyA9IC1yCiskKG9iaikvdnN5c2NhbGwtc3ltcy5vOiAkKHNyYykvdnN5c2NhbGwubGRzICQob2JqKS92c3lzY2FsbC1zeXNlbnRlci5vIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsc3lzY2FsbCkKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9NYWtlZmlsZSBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTc1Y2IyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL01ha2VmaWxlCkBAIC0wLDAgKzEsNCBAQAorb2JqLSQoQ09ORklHX0FDUElfQk9PVCkJCTo9IGJvb3Qubworb2JqLSQoQ09ORklHX1g4Nl9JT19BUElDKQkrPSBlYXJseXF1aXJrLm8KK29iai0kKENPTkZJR19BQ1BJX1NMRUVQKQkrPSBzbGVlcC5vIHdha2V1cC5vCisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9ib290LmMgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvYm9vdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYTBiOTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvYm9vdC5jCkBAIC0wLDAgKzEsOTA4IEBACisvKgorICogIGJvb3QuYyAtIEFyY2hpdGVjdHVyZS1TcGVjaWZpYyBMb3ctTGV2ZWwgQUNQSSBCb290IFN1cHBvcnQKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIFBhdWwgRGllZmVuYmF1Z2ggPHBhdWwucy5kaWVmZW5iYXVnaEBpbnRlbC5jb20+CisgKiAgQ29weXJpZ2h0IChDKSAyMDAxIEp1biBOYWthamltYSA8anVuLm5ha2FqaW1hQGludGVsLmNvbT4KKyAqCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvZWZpLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9pb19hcGljLmg+CisjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL21wc3BlYy5oPgorCisjaWZkZWYJQ09ORklHX1g4Nl82NAorCitzdGF0aWMgaW5saW5lIHZvaWQgIGFjcGlfbWFkdF9vZW1fY2hlY2soY2hhciAqb2VtX2lkLCBjaGFyICpvZW1fdGFibGVfaWQpIHsgfQorZXh0ZXJuIHZvaWQgX19pbml0IGNsdXN0ZXJlZF9hcGljX2NoZWNrKHZvaWQpOworc3RhdGljIGlubGluZSBpbnQgaW9hcGljX3NldHVwX2Rpc2FibGVkKHZvaWQpIHsgcmV0dXJuIDA7IH0KKyNpbmNsdWRlIDxhc20vcHJvdG8uaD4KKworI2Vsc2UJLyogWDg2ICovCisKKyNpZmRlZglDT05GSUdfWDg2X0xPQ0FMX0FQSUMKKyNpbmNsdWRlIDxtYWNoX2FwaWMuaD4KKyNpbmNsdWRlIDxtYWNoX21wcGFyc2UuaD4KKyNlbmRpZgkvKiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMgKi8KKworI2VuZGlmCS8qIFg4NiAqLworCisjZGVmaW5lIEJBRF9NQURUX0VOVFJZKGVudHJ5LCBlbmQpICgJCQkJCSAgICBcCisJCSghZW50cnkpIHx8ICh1bnNpZ25lZCBsb25nKWVudHJ5ICsgc2l6ZW9mKCplbnRyeSkgPiBlbmQgfHwgIFwKKwkJKChhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqKWVudHJ5KS0+bGVuZ3RoICE9IHNpemVvZigqZW50cnkpKQorCisjZGVmaW5lIFBSRUZJWAkJCSJBQ1BJOiAiCisKKyNpZmRlZiBDT05GSUdfQUNQSV9QQ0kKK2ludCBhY3BpX25vaXJxIF9faW5pdGRhdGE7CS8qIHNraXAgQUNQSSBJUlEgaW5pdGlhbGl6YXRpb24gKi8KK2ludCBhY3BpX3BjaV9kaXNhYmxlZCBfX2luaXRkYXRhOyAvKiBza2lwIEFDUEkgUENJIHNjYW4gYW5kIElSUSBpbml0aWFsaXphdGlvbiAqLworI2Vsc2UKK2ludCBhY3BpX25vaXJxIF9faW5pdGRhdGEgPSAxOworaW50IGFjcGlfcGNpX2Rpc2FibGVkIF9faW5pdGRhdGEgPSAxOworI2VuZGlmCitpbnQgYWNwaV9odCBfX2luaXRkYXRhID0gMTsJLyogZW5hYmxlIEhUICovCisKK2ludCBhY3BpX2xhcGljOworaW50IGFjcGlfaW9hcGljOworaW50IGFjcGlfc3RyaWN0OworRVhQT1JUX1NZTUJPTChhY3BpX3N0cmljdCk7CisKK2FjcGlfaW50ZXJydXB0X2ZsYWdzIGFjcGlfc2NpX2ZsYWdzIF9faW5pdGRhdGE7CitpbnQgYWNwaV9zY2lfb3ZlcnJpZGVfZ3NpIF9faW5pdGRhdGE7CitpbnQgYWNwaV9za2lwX3RpbWVyX292ZXJyaWRlIF9faW5pdGRhdGE7CisKKyNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKK3N0YXRpYyB1NjQgYWNwaV9sYXBpY19hZGRyIF9faW5pdGRhdGEgPSBBUElDX0RFRkFVTFRfUEhZU19CQVNFOworI2VuZGlmCisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfQ01QWENIRworI3dhcm5pbmcgQUNQSSB1c2VzIENNUFhDSEcsIGk0ODYgYW5kIGxhdGVyIGhhcmR3YXJlCisjZW5kaWYKKworI2RlZmluZSBNQVhfTUFEVF9FTlRSSUVTCTI1NgordTggeDg2X2FjcGlpZF90b19hcGljaWRbTUFYX01BRFRfRU5UUklFU10gPQorCQkJeyBbMCAuLi4gTUFYX01BRFRfRU5UUklFUy0xXSA9IDB4ZmYgfTsKK0VYUE9SVF9TWU1CT0woeDg2X2FjcGlpZF90b19hcGljaWQpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vdC10aW1lIENvbmZpZ3VyYXRpb24KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBUaGUgZGVmYXVsdCBpbnRlcnJ1cHQgcm91dGluZyBtb2RlbCBpcyBQSUMgKDgyNTkpLiAgVGhpcyBnZXRzCisgKiBvdmVycmlkZW4gaWYgSU9BUElDcyBhcmUgZW51bWVyYXRlZCAoYmVsb3cpLgorICovCitlbnVtIGFjcGlfaXJxX21vZGVsX2lkCQlhY3BpX2lycV9tb2RlbCA9IEFDUElfSVJRX01PREVMX1BJQzsKKworI2lmZGVmCUNPTkZJR19YODZfNjQKKworLyogcmVseSBvbiBhbGwgQUNQSSB0YWJsZXMgYmVpbmcgaW4gdGhlIGRpcmVjdCBtYXBwaW5nICovCitjaGFyICpfX2FjcGlfbWFwX3RhYmxlKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaWYgKCFwaHlzX2FkZHIgfHwgIXNpemUpCisJcmV0dXJuIE5VTEw7CisKKwlpZiAocGh5c19hZGRyIDwgKGVuZF9wZm5fbWFwIDw8IFBBR0VfU0hJRlQpKQorCQlyZXR1cm4gX192YShwaHlzX2FkZHIpOworCisJcmV0dXJuIE5VTEw7Cit9CisKKyNlbHNlCisKKy8qCisgKiBUZW1wb3JhcmlseSB1c2UgdGhlIHZpcnR1YWwgYXJlYSBzdGFydGluZyBmcm9tIEZJWF9JT19BUElDX0JBU0VfRU5ELAorICogdG8gbWFwIHRoZSB0YXJnZXQgcGh5c2ljYWwgYWRkcmVzcy4gVGhlIHByb2JsZW0gaXMgdGhhdCBzZXRfZml4bWFwKCkKKyAqIHByb3ZpZGVzIGEgc2luZ2xlIHBhZ2UsIGFuZCBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBwYWdlIGlzIG5vdAorICogc3VmZmljaWVudC4KKyAqIEJ5IHVzaW5nIHRoaXMgYXJlYSwgd2UgY2FuIG1hcCB1cCB0byBNQVhfSU9fQVBJQ1MgcGFnZXMgdGVtcG9yYXJpbHksCisgKiBpLmUuIHVudGlsIHRoZSBuZXh0IF9fdmFfcmFuZ2UoKSBjYWxsLgorICoKKyAqIEltcG9ydGFudCBTYWZldHkgTm90ZTogIFRoZSBmaXhlZCBJL08gQVBJQyBwYWdlIG51bWJlcnMgYXJlICpzdWJ0cmFjdGVkKgorICogZnJvbSB0aGUgZml4ZWQgYmFzZS4gIFRoYXQncyB3aHkgd2Ugc3RhcnQgYXQgRklYX0lPX0FQSUNfQkFTRV9FTkQgYW5kCisgKiBjb3VudCBpZHggZG93biB3aGlsZSBpbmNyZW1lbnRpbmcgdGhlIHBoeXMgYWRkcmVzcy4KKyAqLworY2hhciAqX19hY3BpX21hcF90YWJsZSh1bnNpZ25lZCBsb25nIHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGJhc2UsIG9mZnNldCwgbWFwcGVkX3NpemU7CisJaW50IGlkeDsKKworCWlmIChwaHlzICsgc2l6ZSA8IDgqMTAyNCoxMDI0KSAKKwkJcmV0dXJuIF9fdmEocGh5cyk7IAorCisJb2Zmc2V0ID0gcGh5cyAmIChQQUdFX1NJWkUgLSAxKTsKKwltYXBwZWRfc2l6ZSA9IFBBR0VfU0laRSAtIG9mZnNldDsKKwlzZXRfZml4bWFwKEZJWF9BQ1BJX0VORCwgcGh5cyk7CisJYmFzZSA9IGZpeF90b192aXJ0KEZJWF9BQ1BJX0VORCk7CisKKwkvKgorCSAqIE1vc3QgY2FzZXMgY2FuIGJlIGNvdmVyZWQgYnkgdGhlIGJlbG93LgorCSAqLworCWlkeCA9IEZJWF9BQ1BJX0VORDsKKwl3aGlsZSAobWFwcGVkX3NpemUgPCBzaXplKSB7CisJCWlmICgtLWlkeCA8IEZJWF9BQ1BJX0JFR0lOKQorCQkJcmV0dXJuIE5VTEw7CS8qIGNhbm5vdCBoYW5kbGUgdGhpcyAqLworCQlwaHlzICs9IFBBR0VfU0laRTsKKwkJc2V0X2ZpeG1hcChpZHgsIHBoeXMpOworCQltYXBwZWRfc2l6ZSArPSBQQUdFX1NJWkU7CisJfQorCisJcmV0dXJuICgodW5zaWduZWQgY2hhciAqKSBiYXNlICsgb2Zmc2V0KTsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BDSV9NTUNPTkZJRworc3RhdGljIGludCBfX2luaXQgYWNwaV9wYXJzZV9tY2ZnKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJc3RydWN0IGFjcGlfdGFibGVfbWNmZyAqbWNmZzsKKworCWlmICghcGh5c19hZGRyIHx8ICFzaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1jZmcgPSAoc3RydWN0IGFjcGlfdGFibGVfbWNmZyAqKSBfX2FjcGlfbWFwX3RhYmxlKHBoeXNfYWRkciwgc2l6ZSk7CisJaWYgKCFtY2ZnKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJVbmFibGUgdG8gbWFwIE1DRkdcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAobWNmZy0+YmFzZV9yZXNlcnZlZCkgeworCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJNTUNPTkZJRyBub3QgaW4gbG93IDRHQiBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwY2lfbW1jZmdfYmFzZV9hZGRyID0gbWNmZy0+YmFzZV9hZGRyZXNzOworCisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZQlhY3BpX3BhcnNlX21jZmcgTlVMTAorI2VuZGlmIC8qICFDT05GSUdfUENJX01NQ09ORklHICovCisKKyNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKK3N0YXRpYyBpbnQgX19pbml0CithY3BpX3BhcnNlX21hZHQgKAorCXVuc2lnbmVkIGxvbmcJCXBoeXNfYWRkciwKKwl1bnNpZ25lZCBsb25nCQlzaXplKQoreworCXN0cnVjdCBhY3BpX3RhYmxlX21hZHQJKm1hZHQgPSBOVUxMOworCisJaWYgKCFwaHlzX2FkZHIgfHwgIXNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJbWFkdCA9IChzdHJ1Y3QgYWNwaV90YWJsZV9tYWR0ICopIF9fYWNwaV9tYXBfdGFibGUocGh5c19hZGRyLCBzaXplKTsKKwlpZiAoIW1hZHQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIlVuYWJsZSB0byBtYXAgTUFEVFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChtYWR0LT5sYXBpY19hZGRyZXNzKSB7CisJCWFjcGlfbGFwaWNfYWRkciA9ICh1NjQpIG1hZHQtPmxhcGljX2FkZHJlc3M7CisKKwkJcHJpbnRrKEtFUk5fREVCVUcgUFJFRklYICJMb2NhbCBBUElDIGFkZHJlc3MgMHglMDh4XG4iLAorCQkJbWFkdC0+bGFwaWNfYWRkcmVzcyk7CisJfQorCisJYWNwaV9tYWR0X29lbV9jaGVjayhtYWR0LT5oZWFkZXIub2VtX2lkLCBtYWR0LT5oZWFkZXIub2VtX3RhYmxlX2lkKTsKKwkKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IF9faW5pdAorYWNwaV9wYXJzZV9sYXBpYyAoCisJYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKmhlYWRlciwgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJc3RydWN0IGFjcGlfdGFibGVfbGFwaWMJKnByb2Nlc3NvciA9IE5VTEw7CisKKwlwcm9jZXNzb3IgPSAoc3RydWN0IGFjcGlfdGFibGVfbGFwaWMqKSBoZWFkZXI7CisKKwlpZiAoQkFEX01BRFRfRU5UUlkocHJvY2Vzc29yLCBlbmQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWFjcGlfdGFibGVfcHJpbnRfbWFkdF9lbnRyeShoZWFkZXIpOworCisJLyogbm8gdXRpbGl0eSBpbiByZWdpc3RlcmluZyBhIGRpc2FibGVkIHByb2Nlc3NvciAqLworCWlmIChwcm9jZXNzb3ItPmZsYWdzLmVuYWJsZWQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwl4ODZfYWNwaWlkX3RvX2FwaWNpZFtwcm9jZXNzb3ItPmFjcGlfaWRdID0gcHJvY2Vzc29yLT5pZDsKKworCW1wX3JlZ2lzdGVyX2xhcGljICgKKwkJcHJvY2Vzc29yLT5pZCwJCQkJCSAgIC8qIEFQSUMgSUQgKi8KKwkJcHJvY2Vzc29yLT5mbGFncy5lbmFibGVkKTsJCQkgIC8qIEVuYWJsZWQ/ICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQKK2FjcGlfcGFyc2VfbGFwaWNfYWRkcl9vdnIgKAorCWFjcGlfdGFibGVfZW50cnlfaGVhZGVyICpoZWFkZXIsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXN0cnVjdCBhY3BpX3RhYmxlX2xhcGljX2FkZHJfb3ZyICpsYXBpY19hZGRyX292ciA9IE5VTEw7CisKKwlsYXBpY19hZGRyX292ciA9IChzdHJ1Y3QgYWNwaV90YWJsZV9sYXBpY19hZGRyX292ciopIGhlYWRlcjsKKworCWlmIChCQURfTUFEVF9FTlRSWShsYXBpY19hZGRyX292ciwgZW5kKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhY3BpX2xhcGljX2FkZHIgPSBsYXBpY19hZGRyX292ci0+YWRkcmVzczsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdAorYWNwaV9wYXJzZV9sYXBpY19ubWkgKAorCWFjcGlfdGFibGVfZW50cnlfaGVhZGVyICpoZWFkZXIsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXN0cnVjdCBhY3BpX3RhYmxlX2xhcGljX25taSAqbGFwaWNfbm1pID0gTlVMTDsKKworCWxhcGljX25taSA9IChzdHJ1Y3QgYWNwaV90YWJsZV9sYXBpY19ubWkqKSBoZWFkZXI7CisKKwlpZiAoQkFEX01BRFRfRU5UUlkobGFwaWNfbm1pLCBlbmQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWFjcGlfdGFibGVfcHJpbnRfbWFkdF9lbnRyeShoZWFkZXIpOworCisJaWYgKGxhcGljX25taS0+bGludCAhPSAxKQorCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiTk1JIG5vdCBjb25uZWN0ZWQgdG8gTElOVCAxIVxuIik7CisKKwlyZXR1cm4gMDsKK30KKworCisjZW5kaWYgLypDT05GSUdfWDg2X0xPQ0FMX0FQSUMqLworCisjaWYgZGVmaW5lZChDT05GSUdfWDg2X0lPX0FQSUMpICYmIGRlZmluZWQoQ09ORklHX0FDUElfSU5URVJQUkVURVIpCisKK3N0YXRpYyBpbnQgX19pbml0CithY3BpX3BhcnNlX2lvYXBpYyAoCisJYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKmhlYWRlciwgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJc3RydWN0IGFjcGlfdGFibGVfaW9hcGljICppb2FwaWMgPSBOVUxMOworCisJaW9hcGljID0gKHN0cnVjdCBhY3BpX3RhYmxlX2lvYXBpYyopIGhlYWRlcjsKKworCWlmIChCQURfTUFEVF9FTlRSWShpb2FwaWMsIGVuZCkpCisJCXJldHVybiAtRUlOVkFMOworIAorCWFjcGlfdGFibGVfcHJpbnRfbWFkdF9lbnRyeShoZWFkZXIpOworCisJbXBfcmVnaXN0ZXJfaW9hcGljICgKKwkJaW9hcGljLT5pZCwKKwkJaW9hcGljLT5hZGRyZXNzLAorCQlpb2FwaWMtPmdsb2JhbF9pcnFfYmFzZSk7CisgCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQYXJzZSBJbnRlcnJ1cHQgU291cmNlIE92ZXJyaWRlIGZvciB0aGUgQUNQSSBTQ0kKKyAqLworc3RhdGljIHZvaWQKK2FjcGlfc2NpX2lvYXBpY19zZXR1cCh1MzIgZ3NpLCB1MTYgcG9sYXJpdHksIHUxNiB0cmlnZ2VyKQoreworCWlmICh0cmlnZ2VyID09IDApCS8qIGNvbXBhdGlibGUgU0NJIHRyaWdnZXIgaXMgbGV2ZWwgKi8KKwkJdHJpZ2dlciA9IDM7CisKKwlpZiAocG9sYXJpdHkgPT0gMCkJLyogY29tcGF0aWJsZSBTQ0kgcG9sYXJpdHkgaXMgbG93ICovCisJCXBvbGFyaXR5ID0gMzsKKworCS8qIENvbW1hbmQtbGluZSBvdmVyLXJpZGUgdmlhIGFjcGlfc2NpPSAqLworCWlmIChhY3BpX3NjaV9mbGFncy50cmlnZ2VyKQorCQl0cmlnZ2VyID0gYWNwaV9zY2lfZmxhZ3MudHJpZ2dlcjsKKworCWlmIChhY3BpX3NjaV9mbGFncy5wb2xhcml0eSkKKwkJcG9sYXJpdHkgPSBhY3BpX3NjaV9mbGFncy5wb2xhcml0eTsKKworCS8qCisgCSAqIG1wX2NvbmZpZ19hY3BpX2xlZ2FjeV9pcnFzKCkgYWxyZWFkeSBzZXR1cCBJUlFzIDwgMTYKKwkgKiBJZiBHU0kgaXMgPCAxNiwgdGhpcyB3aWxsIHVwZGF0ZSBpdHMgZmxhZ3MsCisJICogZWxzZSBpdCB3aWxsIGNyZWF0ZSBhIG5ldyBtcF9pcnFzW10gZW50cnkuCisJICovCisJbXBfb3ZlcnJpZGVfbGVnYWN5X2lycShnc2ksIHBvbGFyaXR5LCB0cmlnZ2VyLCBnc2kpOworCisJLyoKKwkgKiBzdGFzaCBvdmVyLXJpZGUgdG8gaW5kaWNhdGUgd2UndmUgYmVlbiBoZXJlCisJICogYW5kIGZvciBsYXRlciB1cGRhdGUgb2YgYWNwaV9mYWR0CisJICovCisJYWNwaV9zY2lfb3ZlcnJpZGVfZ3NpID0gZ3NpOworCXJldHVybjsKK30KKworc3RhdGljIGludCBfX2luaXQKK2FjcGlfcGFyc2VfaW50X3NyY19vdnIgKAorCWFjcGlfdGFibGVfZW50cnlfaGVhZGVyICpoZWFkZXIsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXN0cnVjdCBhY3BpX3RhYmxlX2ludF9zcmNfb3ZyICppbnRzcmMgPSBOVUxMOworCisJaW50c3JjID0gKHN0cnVjdCBhY3BpX3RhYmxlX2ludF9zcmNfb3ZyKikgaGVhZGVyOworCisJaWYgKEJBRF9NQURUX0VOVFJZKGludHNyYywgZW5kKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhY3BpX3RhYmxlX3ByaW50X21hZHRfZW50cnkoaGVhZGVyKTsKKworCWlmIChpbnRzcmMtPmJ1c19pcnEgPT0gYWNwaV9mYWR0LnNjaV9pbnQpIHsKKwkJYWNwaV9zY2lfaW9hcGljX3NldHVwKGludHNyYy0+Z2xvYmFsX2lycSwKKwkJCWludHNyYy0+ZmxhZ3MucG9sYXJpdHksIGludHNyYy0+ZmxhZ3MudHJpZ2dlcik7CisJCXJldHVybiAwOworCX0KKworCWlmIChhY3BpX3NraXBfdGltZXJfb3ZlcnJpZGUgJiYKKwkJaW50c3JjLT5idXNfaXJxID09IDAgJiYgaW50c3JjLT5nbG9iYWxfaXJxID09IDIpIHsKKwkJCXByaW50ayhQUkVGSVggIkJJT1MgSVJRMCBwaW4yIG92ZXJyaWRlIGlnbm9yZWQuXG4iKTsKKwkJCXJldHVybiAwOworCX0KKworCW1wX292ZXJyaWRlX2xlZ2FjeV9pcnEgKAorCQlpbnRzcmMtPmJ1c19pcnEsCisJCWludHNyYy0+ZmxhZ3MucG9sYXJpdHksCisJCWludHNyYy0+ZmxhZ3MudHJpZ2dlciwKKwkJaW50c3JjLT5nbG9iYWxfaXJxKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgX19pbml0CithY3BpX3BhcnNlX25taV9zcmMgKAorCWFjcGlfdGFibGVfZW50cnlfaGVhZGVyICpoZWFkZXIsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXN0cnVjdCBhY3BpX3RhYmxlX25taV9zcmMgKm5taV9zcmMgPSBOVUxMOworCisJbm1pX3NyYyA9IChzdHJ1Y3QgYWNwaV90YWJsZV9ubWlfc3JjKikgaGVhZGVyOworCisJaWYgKEJBRF9NQURUX0VOVFJZKG5taV9zcmMsIGVuZCkpCisJCXJldHVybiAtRUlOVkFMOworCisJYWNwaV90YWJsZV9wcmludF9tYWR0X2VudHJ5KGhlYWRlcik7CisKKwkvKiBUQkQ6IFN1cHBvcnQgbmltc3JjIGVudHJpZXM/ICovCisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIENPTkZJR19YODZfSU9fQVBJQyAqLworCisjaWZkZWYJQ09ORklHX0FDUElfQlVTCisKKy8qCisgKiBhY3BpX3BpY19zY2lfc2V0X3RyaWdnZXIoKQorICogCisgKiB1c2UgRUxDUiB0byBzZXQgUElDLW1vZGUgdHJpZ2dlciB0eXBlIGZvciBTQ0kKKyAqCisgKiBJZiBhIFBJQy1tb2RlIFNDSSBpcyBub3QgcmVjb2duaXplZCBvciBnaXZlcyBzcHVyaW91cyBJUlE3J3MKKyAqIGl0IG1heSByZXF1aXJlIEVkZ2UgVHJpZ2dlciAtLSB1c2UgImFjcGlfc2NpPWVkZ2UiCisgKgorICogUG9ydCAweDRkMC00ZDEgYXJlIEVDTFIxIGFuZCBFQ0xSMiwgdGhlIEVkZ2UvTGV2ZWwgQ29udHJvbCBSZWdpc3RlcnMKKyAqIGZvciB0aGUgODI1OSBQSUMuICBiaXRbbl0gPSAxIG1lYW5zIGlycVtuXSBpcyBMZXZlbCwgb3RoZXJ3aXNlIEVkZ2UuCisgKiBFQ0xSMSBpcyBJUlEncyAwLTcgKElSUSAwLCAxLCAyIG11c3QgYmUgMCkKKyAqIEVDTFIyIGlzIElSUSdzIDgtMTUgKElSUSA4LCAxMyBtdXN0IGJlIDApCisgKi8KKwordm9pZCBfX2luaXQKK2FjcGlfcGljX3NjaV9zZXRfdHJpZ2dlcih1bnNpZ25lZCBpbnQgaXJxLCB1MTYgdHJpZ2dlcikKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDEgPDwgaXJxOworCXVuc2lnbmVkIGludCBvbGQsIG5ldzsKKworCS8qIFJlYWwgb2xkIEVMQ1IgbWFzayAqLworCW9sZCA9IGluYigweDRkMCkgfCAoaW5iKDB4NGQxKSA8PCA4KTsKKworCS8qCisJICogSWYgd2UgdXNlIEFDUEkgdG8gc2V0IFBDSSBpcnEncywgdGhlbiB3ZSBzaG91bGQgY2xlYXIgRUxDUgorCSAqIHNpbmNlIHdlIHdpbGwgc2V0IGl0IGNvcnJlY3RseSBhcyB3ZSBlbmFibGUgdGhlIFBDSSBpcnEKKwkgKiByb3V0aW5nLgorCSAqLworCW5ldyA9IGFjcGlfbm9pcnEgPyBvbGQgOiAwOworCisJLyoKKwkgKiBVcGRhdGUgU0NJIGluZm9ybWF0aW9uIGluIHRoZSBFTENSLCBpdCBpc24ndCBpbiB0aGUgUENJCisJICogcm91dGluZyB0YWJsZXMuLgorCSAqLworCXN3aXRjaCAodHJpZ2dlcikgeworCWNhc2UgMToJLyogRWRnZSAtIGNsZWFyICovCisJCW5ldyAmPSB+bWFzazsKKwkJYnJlYWs7CisJY2FzZSAzOiAvKiBMZXZlbCAtIHNldCAqLworCQluZXcgfD0gbWFzazsKKwkJYnJlYWs7CisJfQorCisJaWYgKG9sZCA9PSBuZXcpCisJCXJldHVybjsKKworCXByaW50ayhQUkVGSVggInNldHRpbmcgRUxDUiB0byAlMDR4IChmcm9tICUwNHgpXG4iLCBuZXcsIG9sZCk7CisJb3V0YihuZXcsIDB4NGQwKTsKKwlvdXRiKG5ldyA+PiA4LCAweDRkMSk7Cit9CisKKworI2VuZGlmIC8qIENPTkZJR19BQ1BJX0JVUyAqLworCitpbnQgYWNwaV9nc2lfdG9faXJxKHUzMiBnc2ksIHVuc2lnbmVkIGludCAqaXJxKQoreworI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQworCWlmICh1c2VfcGNpX3ZlY3RvcigpICYmICFwbGF0Zm9ybV9sZWdhY3lfaXJxKGdzaSkpCisgCQkqaXJxID0gSU9fQVBJQ19WRUNUT1IoZ3NpKTsKKwllbHNlCisjZW5kaWYKKwkJKmlycSA9IGdzaTsKKwlyZXR1cm4gMDsKK30KKwordW5zaWduZWQgaW50IGFjcGlfcmVnaXN0ZXJfZ3NpKHUzMiBnc2ksIGludCBlZGdlX2xldmVsLCBpbnQgYWN0aXZlX2hpZ2hfbG93KQoreworCXVuc2lnbmVkIGludCBpcnE7CisJdW5zaWduZWQgaW50IHBsYXRfZ3NpID0gZ3NpOworCisjaWZkZWYgQ09ORklHX1BDSQorCS8qCisJICogTWFrZSBzdXJlIGFsbCAobGVnYWN5KSBQQ0kgSVJRcyBhcmUgc2V0IGFzIGxldmVsLXRyaWdnZXJlZC4KKwkgKi8KKwlpZiAoYWNwaV9pcnFfbW9kZWwgPT0gQUNQSV9JUlFfTU9ERUxfUElDKSB7CisJCWV4dGVybiB2b2lkIGVpc2Ffc2V0X2xldmVsX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKKworCQlpZiAoZWRnZV9sZXZlbCA9PSBBQ1BJX0xFVkVMX1NFTlNJVElWRSkKKwkJCQllaXNhX3NldF9sZXZlbF9pcnEoZ3NpKTsKKwl9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQworCWlmIChhY3BpX2lycV9tb2RlbCA9PSBBQ1BJX0lSUV9NT0RFTF9JT0FQSUMpIHsKKwkJcGxhdF9nc2kgPSBtcF9yZWdpc3Rlcl9nc2koZ3NpLCBlZGdlX2xldmVsLCBhY3RpdmVfaGlnaF9sb3cpOworCX0KKyNlbmRpZgorCWFjcGlfZ3NpX3RvX2lycShwbGF0X2dzaSwgJmlycSk7CisJcmV0dXJuIGlycTsKK30KK0VYUE9SVF9TWU1CT0woYWNwaV9yZWdpc3Rlcl9nc2kpOworCisvKgorICogIEFDUEkgYmFzZWQgaG90cGx1ZyBzdXBwb3J0IGZvciBDUFUKKyAqLworI2lmZGVmIENPTkZJR19BQ1BJX0hPVFBMVUdfQ1BVCitpbnQKK2FjcGlfbWFwX2xzYXBpYyhhY3BpX2hhbmRsZSBoYW5kbGUsIGludCAqcGNwdSkKK3sKKwkvKiBUQkQgKi8KKwlyZXR1cm4gLUVJTlZBTDsKK30KK0VYUE9SVF9TWU1CT0woYWNwaV9tYXBfbHNhcGljKTsKKworCitpbnQKK2FjcGlfdW5tYXBfbHNhcGljKGludCBjcHUpCit7CisJLyogVEJEICovCisJcmV0dXJuIC1FSU5WQUw7Cit9CitFWFBPUlRfU1lNQk9MKGFjcGlfdW5tYXBfbHNhcGljKTsKKyNlbmRpZiAvKiBDT05GSUdfQUNQSV9IT1RQTFVHX0NQVSAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXQKK2FjcGlfc2Nhbl9yc2RwICgKKwl1bnNpZ25lZCBsb25nCQlzdGFydCwKKwl1bnNpZ25lZCBsb25nCQlsZW5ndGgpCit7CisJdW5zaWduZWQgbG9uZwkJb2Zmc2V0ID0gMDsKKwl1bnNpZ25lZCBsb25nCQlzaWdfbGVuID0gc2l6ZW9mKCJSU0QgUFRSICIpIC0gMTsKKworCS8qCisJICogU2NhbiBhbGwgMTYtYnl0ZSBib3VuZGFyaWVzIG9mIHRoZSBwaHlzaWNhbCBtZW1vcnkgcmVnaW9uIGZvciB0aGUKKwkgKiBSU0RQIHNpZ25hdHVyZS4KKwkgKi8KKwlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IGxlbmd0aDsgb2Zmc2V0ICs9IDE2KSB7CisJCWlmIChzdHJuY21wKChjaGFyICopIChzdGFydCArIG9mZnNldCksICJSU0QgUFRSICIsIHNpZ19sZW4pKQorCQkJY29udGludWU7CisJCXJldHVybiAoc3RhcnQgKyBvZmZzZXQpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX3BhcnNlX3NiZih1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXN0cnVjdCBhY3BpX3RhYmxlX3NiZiAqc2I7CisKKwlpZiAoIXBoeXNfYWRkciB8fCAhc2l6ZSkKKwlyZXR1cm4gLUVJTlZBTDsKKworCXNiID0gKHN0cnVjdCBhY3BpX3RhYmxlX3NiZiAqKSBfX2FjcGlfbWFwX3RhYmxlKHBoeXNfYWRkciwgc2l6ZSk7CisJaWYgKCFzYikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiVW5hYmxlIHRvIG1hcCBTQkZcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlzYmZfcG9ydCA9IHNiLT5zYmZfY21vczsgLyogU2F2ZSBDTU9TIHBvcnQgKi8KKworCXJldHVybiAwOworfQorCisKKyNpZmRlZiBDT05GSUdfSFBFVF9USU1FUgorCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX3BhcnNlX2hwZXQodW5zaWduZWQgbG9uZyBwaHlzLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJc3RydWN0IGFjcGlfdGFibGVfaHBldCAqaHBldF90Ymw7CisKKwlpZiAoIXBoeXMgfHwgIXNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJaHBldF90YmwgPSAoc3RydWN0IGFjcGlfdGFibGVfaHBldCAqKSBfX2FjcGlfbWFwX3RhYmxlKHBoeXMsIHNpemUpOworCWlmICghaHBldF90YmwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIlVuYWJsZSB0byBtYXAgSFBFVFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChocGV0X3RibC0+YWRkci5zcGFjZV9pZCAhPSBBQ1BJX1NQQUNFX01FTSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiSFBFVCB0aW1lcnMgbXVzdCBiZSBsb2NhdGVkIGluICIKKwkJICAgICAgICJtZW1vcnkuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworI2lmZGVmCUNPTkZJR19YODZfNjQKKyAgICAgICAgdnh0aW1lLmhwZXRfYWRkcmVzcyA9IGhwZXRfdGJsLT5hZGRyLmFkZHJsIHwKKyAgICAgICAgICAgICAgICAoKGxvbmcpIGhwZXRfdGJsLT5hZGRyLmFkZHJoIDw8IDMyKTsKKworICAgICAgICBwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiSFBFVCBpZDogJSN4IGJhc2U6ICUjbHhcbiIsCisgICAgICAgICAgICAgICBocGV0X3RibC0+aWQsIHZ4dGltZS5ocGV0X2FkZHJlc3MpOworI2Vsc2UJLyogWDg2ICovCisJeworCQlleHRlcm4gdW5zaWduZWQgbG9uZyBocGV0X2FkZHJlc3M7CisKKwkJaHBldF9hZGRyZXNzID0gaHBldF90YmwtPmFkZHIuYWRkcmw7CisJCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJIUEVUIGlkOiAlI3ggYmFzZTogJSNseFxuIiwKKwkJCWhwZXRfdGJsLT5pZCwgaHBldF9hZGRyZXNzKTsKKwl9CisjZW5kaWYJLyogWDg2ICovCisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lCWFjcGlfcGFyc2VfaHBldAlOVUxMCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19YODZfUE1fVElNRVIKK2V4dGVybiB1MzIgcG10bXJfaW9wb3J0OworI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfcGFyc2VfZmFkdCh1bnNpZ25lZCBsb25nIHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIgKmZhZHQgPSBOVUxMOworCisJZmFkdCA9IChzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIqKSBfX2FjcGlfbWFwX3RhYmxlKHBoeXMsc2l6ZSk7CisJaWYoIWZhZHQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIlVuYWJsZSB0byBtYXAgRkFEVFxuIik7CisJCXJldHVybiAwOworCX0KKworI2lmZGVmCUNPTkZJR19BQ1BJX0lOVEVSUFJFVEVSCisJLyogaW5pdGlhbGl6ZSBzY2lfaW50IGVhcmx5IGZvciBJTlRfU1JDX09WUiBNQURUIHBhcnNpbmcgKi8KKwlhY3BpX2ZhZHQuc2NpX2ludCA9IGZhZHQtPnNjaV9pbnQ7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19YODZfUE1fVElNRVIKKwkvKiBkZXRlY3QgdGhlIGxvY2F0aW9uIG9mIHRoZSBBQ1BJIFBNIFRpbWVyICovCisJaWYgKGZhZHQtPnJldmlzaW9uID49IEZBRFQyX1JFVklTSU9OX0lEKSB7CisJCS8qIEZBRFQgcmV2LiAyICovCisJCWlmIChmYWR0LT54cG1fdG1yX2Jsay5hZGRyZXNzX3NwYWNlX2lkICE9IEFDUElfQURSX1NQQUNFX1NZU1RFTV9JTykKKwkJCXJldHVybiAwOworCisJCXBtdG1yX2lvcG9ydCA9IGZhZHQtPnhwbV90bXJfYmxrLmFkZHJlc3M7CisJfSBlbHNlIHsKKwkJLyogRkFEVCByZXYuIDEgKi8KKwkJcG10bXJfaW9wb3J0ID0gZmFkdC0+VjFfcG1fdG1yX2JsazsKKwl9CisJaWYgKHBtdG1yX2lvcG9ydCkKKwkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIlBNLVRpbWVyIElPIFBvcnQ6ICUjeFxuIiwgcG10bXJfaW9wb3J0KTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisKK3Vuc2lnbmVkIGxvbmcgX19pbml0CithY3BpX2ZpbmRfcnNkcCAodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nCQlyc2RwX3BoeXMgPSAwOworCisJaWYgKGVmaV9lbmFibGVkKSB7CisJCWlmIChlZmkuYWNwaTIwKQorCQkJcmV0dXJuIF9fcGEoZWZpLmFjcGkyMCk7CisJCWVsc2UgaWYgKGVmaS5hY3BpKQorCQkJcmV0dXJuIF9fcGEoZWZpLmFjcGkpOworCX0KKwkvKgorCSAqIFNjYW4gbWVtb3J5IGxvb2tpbmcgZm9yIHRoZSBSU0RQIHNpZ25hdHVyZS4gRmlyc3Qgc2VhcmNoIEVCREEgKGxvdworCSAqIG1lbW9yeSkgcGFyYWdyYXBocyBhbmQgdGhlbiBzZWFyY2ggdXBwZXIgbWVtb3J5IChFMDAwMC1GRkZGRikuCisJICovCisJcnNkcF9waHlzID0gYWNwaV9zY2FuX3JzZHAgKDAsIDB4NDAwKTsKKwlpZiAoIXJzZHBfcGh5cykKKwkJcnNkcF9waHlzID0gYWNwaV9zY2FuX3JzZHAgKDB4RTAwMDAsIDB4RkZGRkYpOworCisJcmV0dXJuIHJzZHBfcGh5czsKK30KKworI2lmZGVmCUNPTkZJR19YODZfTE9DQUxfQVBJQworLyoKKyAqIFBhcnNlIExBUElDIGVudHJpZXMgaW4gTUFEVAorICogcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIDwgMCBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IF9faW5pdAorYWNwaV9wYXJzZV9tYWR0X2xhcGljX2VudHJpZXModm9pZCkKK3sKKwlpbnQgY291bnQ7CisKKwkvKiAKKwkgKiBOb3RlIHRoYXQgdGhlIExBUElDIGFkZHJlc3MgaXMgb2J0YWluZWQgZnJvbSB0aGUgTUFEVCAoMzItYml0IHZhbHVlKQorCSAqIGFuZCAob3B0aW9uYWxseSkgb3ZlcnJpZGVuIGJ5IGEgTEFQSUNfQUREUl9PVlIgZW50cnkgKDY0LWJpdCB2YWx1ZSkuCisJICovCisKKwljb3VudCA9IGFjcGlfdGFibGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfTEFQSUNfQUREUl9PVlIsIGFjcGlfcGFyc2VfbGFwaWNfYWRkcl9vdnIsIDApOworCWlmIChjb3VudCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiRXJyb3IgcGFyc2luZyBMQVBJQyBhZGRyZXNzIG92ZXJyaWRlIGVudHJ5XG4iKTsKKwkJcmV0dXJuIGNvdW50OworCX0KKworCW1wX3JlZ2lzdGVyX2xhcGljX2FkZHJlc3MoYWNwaV9sYXBpY19hZGRyKTsKKworCWNvdW50ID0gYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFEVF9MQVBJQywgYWNwaV9wYXJzZV9sYXBpYywKKwkJCQkgICAgICAgTUFYX0FQSUNTKTsKKwlpZiAoIWNvdW50KSB7IAorCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJObyBMQVBJQyBlbnRyaWVzIHByZXNlbnRcbiIpOworCQkvKiBUQkQ6IENsZWFudXAgdG8gYWxsb3cgZmFsbGJhY2sgdG8gTVBTICovCisJCXJldHVybiAtRU5PREVWOworCX0KKwllbHNlIGlmIChjb3VudCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiRXJyb3IgcGFyc2luZyBMQVBJQyBlbnRyeVxuIik7CisJCS8qIFRCRDogQ2xlYW51cCB0byBhbGxvdyBmYWxsYmFjayB0byBNUFMgKi8KKwkJcmV0dXJuIGNvdW50OworCX0KKworCWNvdW50ID0gYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFEVF9MQVBJQ19OTUksIGFjcGlfcGFyc2VfbGFwaWNfbm1pLCAwKTsKKwlpZiAoY291bnQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkVycm9yIHBhcnNpbmcgTEFQSUMgTk1JIGVudHJ5XG4iKTsKKwkJLyogVEJEOiBDbGVhbnVwIHRvIGFsbG93IGZhbGxiYWNrIHRvIE1QUyAqLworCQlyZXR1cm4gY291bnQ7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19YODZfTE9DQUxfQVBJQyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfWDg2X0lPX0FQSUMpICYmIGRlZmluZWQoQ09ORklHX0FDUElfSU5URVJQUkVURVIpCisvKgorICogUGFyc2UgSU9BUElDIHJlbGF0ZWQgZW50cmllcyBpbiBNQURUCisgKiByZXR1cm5zIDAgb24gc3VjY2VzcywgPCAwIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgX19pbml0CithY3BpX3BhcnNlX21hZHRfaW9hcGljX2VudHJpZXModm9pZCkKK3sKKwlpbnQgY291bnQ7CisKKwkvKgorCSAqIEFDUEkgaW50ZXJwcmV0ZXIgaXMgcmVxdWlyZWQgdG8gY29tcGxldGUgaW50ZXJydXB0IHNldHVwLAorCSAqIHNvIGlmIGl0IGlzIG9mZiwgZG9uJ3QgZW51bWVyYXRlIHRoZSBpby1hcGljcyB3aXRoIEFDUEkuCisJICogSWYgTVBTIGlzIHByZXNlbnQsIGl0IHdpbGwgaGFuZGxlIHRoZW0sCisJICogb3RoZXJ3aXNlIHRoZSBzeXN0ZW0gd2lsbCBzdGF5IGluIFBJQyBtb2RlCisJICovCisJaWYgKGFjcGlfZGlzYWJsZWQgfHwgYWNwaV9ub2lycSkgeworCQlyZXR1cm4gLUVOT0RFVjsKKyAgICAgICAgfQorCisJLyoKKyAJICogaWYgIm5vYXBpYyIgYm9vdCBvcHRpb24sIGRvbid0IGxvb2sgZm9yIElPLUFQSUNzCisJICovCisJaWYgKHNraXBfaW9hcGljX3NldHVwKSB7CisJCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJTa2lwcGluZyBJT0FQSUMgcHJvYmUgIgorCQkJImR1ZSB0byAnbm9hcGljJyBvcHRpb24uXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJY291bnQgPSBhY3BpX3RhYmxlX3BhcnNlX21hZHQoQUNQSV9NQURUX0lPQVBJQywgYWNwaV9wYXJzZV9pb2FwaWMsIE1BWF9JT19BUElDUyk7CisJaWYgKCFjb3VudCkgeworCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJObyBJT0FQSUMgZW50cmllcyBwcmVzZW50XG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWVsc2UgaWYgKGNvdW50IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJFcnJvciBwYXJzaW5nIElPQVBJQyBlbnRyeVxuIik7CisJCXJldHVybiBjb3VudDsKKwl9CisKKwljb3VudCA9IGFjcGlfdGFibGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfSU5UX1NSQ19PVlIsIGFjcGlfcGFyc2VfaW50X3NyY19vdnIsIE5SX0lSUV9WRUNUT1JTKTsKKwlpZiAoY291bnQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkVycm9yIHBhcnNpbmcgaW50ZXJydXB0IHNvdXJjZSBvdmVycmlkZXMgZW50cnlcbiIpOworCQkvKiBUQkQ6IENsZWFudXAgdG8gYWxsb3cgZmFsbGJhY2sgdG8gTVBTICovCisJCXJldHVybiBjb3VudDsKKwl9CisKKwkvKgorCSAqIElmIEJJT1MgZGlkIG5vdCBzdXBwbHkgYW4gSU5UX1NSQ19PVlIgZm9yIHRoZSBTQ0kKKwkgKiBwcmV0ZW5kIHdlIGdvdCBvbmUgc28gd2UgY2FuIHNldCB0aGUgU0NJIGZsYWdzLgorCSAqLworCWlmICghYWNwaV9zY2lfb3ZlcnJpZGVfZ3NpKQorCQlhY3BpX3NjaV9pb2FwaWNfc2V0dXAoYWNwaV9mYWR0LnNjaV9pbnQsIDAsIDApOworCisJLyogRmlsbCBpbiBpZGVudGl0eSBsZWdhY3kgbWFwaW5ncyB3aGVyZSBubyBvdmVycmlkZSAqLworCW1wX2NvbmZpZ19hY3BpX2xlZ2FjeV9pcnFzKCk7CisKKwljb3VudCA9IGFjcGlfdGFibGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfTk1JX1NSQywgYWNwaV9wYXJzZV9ubWlfc3JjLCBOUl9JUlFfVkVDVE9SUyk7CisJaWYgKGNvdW50IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJFcnJvciBwYXJzaW5nIE5NSSBTUkMgZW50cnlcbiIpOworCQkvKiBUQkQ6IENsZWFudXAgdG8gYWxsb3cgZmFsbGJhY2sgdG8gTVBTICovCisJCXJldHVybiBjb3VudDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBhY3BpX3BhcnNlX21hZHRfaW9hcGljX2VudHJpZXModm9pZCkKK3sKKwlyZXR1cm4gLTE7Cit9CisjZW5kaWYgLyogIShDT05GSUdfWDg2X0lPX0FQSUMgJiYgQ09ORklHX0FDUElfSU5URVJQUkVURVIpICovCisKKworc3RhdGljIHZvaWQgX19pbml0CithY3BpX3Byb2Nlc3NfbWFkdCh2b2lkKQoreworI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQworCWludCBjb3VudCwgZXJyb3I7CisKKwljb3VudCA9IGFjcGlfdGFibGVfcGFyc2UoQUNQSV9BUElDLCBhY3BpX3BhcnNlX21hZHQpOworCWlmIChjb3VudCA+PSAxKSB7CisKKwkJLyoKKwkJICogUGFyc2UgTUFEVCBMQVBJQyBlbnRyaWVzCisJCSAqLworCQllcnJvciA9IGFjcGlfcGFyc2VfbWFkdF9sYXBpY19lbnRyaWVzKCk7CisJCWlmICghZXJyb3IpIHsKKwkJCWFjcGlfbGFwaWMgPSAxOworCisJCQkvKgorCQkJICogUGFyc2UgTUFEVCBJTy1BUElDIGVudHJpZXMKKwkJCSAqLworCQkJZXJyb3IgPSBhY3BpX3BhcnNlX21hZHRfaW9hcGljX2VudHJpZXMoKTsKKwkJCWlmICghZXJyb3IpIHsKKwkJCQlhY3BpX2lycV9tb2RlbCA9IEFDUElfSVJRX01PREVMX0lPQVBJQzsKKwkJCQlhY3BpX2lycV9iYWxhbmNlX3NldChOVUxMKTsKKwkJCQlhY3BpX2lvYXBpYyA9IDE7CisKKwkJCQlzbXBfZm91bmRfY29uZmlnID0gMTsKKwkJCQljbHVzdGVyZWRfYXBpY19jaGVjaygpOworCQkJfQorCQl9CisJCWlmIChlcnJvciA9PSAtRUlOVkFMKSB7CisJCQkvKgorCQkJICogRGVsbCBQcmVjaXNpb24gV29ya3N0YXRpb24gNDEwLCA2MTAgY29tZSBoZXJlLgorCQkJICovCisJCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJJbnZhbGlkIEJJT1MgTUFEVCwgZGlzYWJsaW5nIEFDUElcbiIpOworCQkJZGlzYWJsZV9hY3BpKCk7CisJCX0KKwl9CisjZW5kaWYKKwlyZXR1cm47Cit9CisKKy8qCisgKiBhY3BpX2Jvb3RfdGFibGVfaW5pdCgpIGFuZCBhY3BpX2Jvb3RfaW5pdCgpCisgKiAgY2FsbGVkIGZyb20gc2V0dXBfYXJjaCgpLCBhbHdheXMuCisgKgkxLiBjaGVja3N1bXMgYWxsIHRhYmxlcworICoJMi4gZW51bWVyYXRlcyBsYXBpY3MKKyAqCTMuIGVudW1lcmF0ZXMgaW8tYXBpY3MKKyAqCisgKiBhY3BpX3RhYmxlX2luaXQoKSBpcyBzZXBhcmF0ZSB0byBhbGxvdyByZWFkaW5nIFNSQVQgd2l0aG91dAorICogb3RoZXIgc2lkZSBlZmZlY3RzLgorICoKKyAqIHNpZGUgZWZmZWN0cyBvZiBhY3BpX2Jvb3RfaW5pdDoKKyAqCWFjcGlfbGFwaWMgPSAxIGlmIExBUElDIGZvdW5kCisgKglhY3BpX2lvYXBpYyA9IDEgaWYgSU9BUElDIGZvdW5kCisgKglpZiAoYWNwaV9sYXBpYyAmJiBhY3BpX2lvYXBpYykgc21wX2ZvdW5kX2NvbmZpZyA9IDE7CisgKglpZiBhY3BpX2JsYWNrbGlzdGVkKCkgYWNwaV9kaXNhYmxlZCA9IDE7CisgKglhY3BpX2lycV9tb2RlbD0uLi4KKyAqCS4uLgorICoKKyAqIHJldHVybiB2YWx1ZTogKGN1cnJlbnRseSBpZ25vcmVkKQorICoJMDogc3VjY2VzcworICoJITA6IGZhaWx1cmUKKyAqLworCitpbnQgX19pbml0CithY3BpX2Jvb3RfdGFibGVfaW5pdCh2b2lkKQoreworCWludCBlcnJvcjsKKworCS8qCisJICogSWYgYWNwaV9kaXNhYmxlZCwgYmFpbCBvdXQKKwkgKiBPbmUgZXhjZXB0aW9uOiBhY3BpPWh0IGNvbnRpbnVlcyBmYXIgZW5vdWdoIHRvIGVudW1lcmF0ZSBMQVBJQ3MKKwkgKi8KKwlpZiAoYWNwaV9kaXNhYmxlZCAmJiAhYWNwaV9odCkKKwkJIHJldHVybiAxOworCisJLyogCisJICogSW5pdGlhbGl6ZSB0aGUgQUNQSSBib290LXRpbWUgdGFibGUgcGFyc2VyLgorCSAqLworCWVycm9yID0gYWNwaV90YWJsZV9pbml0KCk7CisJaWYgKGVycm9yKSB7CisJCWRpc2FibGVfYWNwaSgpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisjaWZkZWYgX19pMzg2X18KKwljaGVja19hY3BpX3BjaSgpOworI2VuZGlmCisKKwlhY3BpX3RhYmxlX3BhcnNlKEFDUElfQk9PVCwgYWNwaV9wYXJzZV9zYmYpOworCisJLyoKKwkgKiBibGFja2xpc3QgbWF5IGRpc2FibGUgQUNQSSBlbnRpcmVseQorCSAqLworCWVycm9yID0gYWNwaV9ibGFja2xpc3RlZCgpOworCWlmIChlcnJvcikgeworCQlleHRlcm4gaW50IGFjcGlfZm9yY2U7CisKKwkJaWYgKGFjcGlfZm9yY2UpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJhY3BpPWZvcmNlIG92ZXJyaWRlXG4iKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJEaXNhYmxpbmcgQUNQSSBzdXBwb3J0XG4iKTsKKwkJCWRpc2FibGVfYWNwaSgpOworCQkJcmV0dXJuIGVycm9yOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworaW50IF9faW5pdCBhY3BpX2Jvb3RfaW5pdCh2b2lkKQoreworCS8qCisJICogSWYgYWNwaV9kaXNhYmxlZCwgYmFpbCBvdXQKKwkgKiBPbmUgZXhjZXB0aW9uOiBhY3BpPWh0IGNvbnRpbnVlcyBmYXIgZW5vdWdoIHRvIGVudW1lcmF0ZSBMQVBJQ3MKKwkgKi8KKwlpZiAoYWNwaV9kaXNhYmxlZCAmJiAhYWNwaV9odCkKKwkJIHJldHVybiAxOworCisJYWNwaV90YWJsZV9wYXJzZShBQ1BJX0JPT1QsIGFjcGlfcGFyc2Vfc2JmKTsKKworCS8qCisJICogc2V0IHNjaV9pbnQgYW5kIFBNIHRpbWVyIGFkZHJlc3MKKwkgKi8KKwlhY3BpX3RhYmxlX3BhcnNlKEFDUElfRkFEVCwgYWNwaV9wYXJzZV9mYWR0KTsKKworCS8qCisJICogUHJvY2VzcyB0aGUgTXVsdGlwbGUgQVBJQyBEZXNjcmlwdGlvbiBUYWJsZSAoTUFEVCksIGlmIHByZXNlbnQKKwkgKi8KKwlhY3BpX3Byb2Nlc3NfbWFkdCgpOworCisJYWNwaV90YWJsZV9wYXJzZShBQ1BJX0hQRVQsIGFjcGlfcGFyc2VfaHBldCk7CisJYWNwaV90YWJsZV9wYXJzZShBQ1BJX01DRkcsIGFjcGlfcGFyc2VfbWNmZyk7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2Vhcmx5cXVpcmsuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9lYXJseXF1aXJrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI2YTVjYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9lYXJseXF1aXJrLmMKQEAgLTAsMCArMSw1MSBAQAorLyogCisgKiBEbyBlYXJseSBQQ0kgcHJvYmluZyBmb3IgYnVnIGRldGVjdGlvbiB3aGVuIHRoZSBtYWluIFBDSSBzdWJzeXN0ZW0gaXMgCisgKiBub3QgdXAgeWV0LgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGFzbS9wY2ktZGlyZWN0Lmg+CisjaW5jbHVkZSA8YXNtL2FjcGkuaD4KKworc3RhdGljIGludCBfX2luaXQgY2hlY2tfYnJpZGdlKGludCB2ZW5kb3IsIGludCBkZXZpY2UpIAoreworCS8qIEFjY29yZGluZyB0byBOdmlkaWEgYWxsIHRpbWVyIG92ZXJyaWRlcyBhcmUgYm9ndXMuIEp1c3QgaWdub3JlCisJICAgdGhlbSBhbGwuICovCisJaWYgKHZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX05WSURJQSkgeyAKKwkJYWNwaV9za2lwX3RpbWVyX292ZXJyaWRlID0gMTsgCQkKKwl9CisJcmV0dXJuIDA7Cit9CisgICAKK3ZvaWQgX19pbml0IGNoZWNrX2FjcGlfcGNpKHZvaWQpIAoreyAKKwlpbnQgbnVtLHNsb3QsZnVuYzsgCisKKwkvKiBBc3N1bWUgdGhlIG1hY2hpbmUgc3VwcG9ydHMgdHlwZSAxLiBJZiBub3QgaXQgd2lsbCAKKwkgICBhbHdheXMgcmVhZCBmZmZmZmZmZiBhbmQgc2hvdWxkIG5vdCBoYXZlIGFueSBzaWRlIGVmZmVjdC4gKi8KKworCS8qIFBvb3IgbWFuJ3MgUENJIGRpc2NvdmVyeSAqLworCWZvciAobnVtID0gMDsgbnVtIDwgMzI7IG51bSsrKSB7IAorCQlmb3IgKHNsb3QgPSAwOyBzbG90IDwgMzI7IHNsb3QrKykgeyAKKwkJCWZvciAoZnVuYyA9IDA7IGZ1bmMgPCA4OyBmdW5jKyspIHsgCisJCQkJdTMyIGNsYXNzOworCQkJCXUzMiB2ZW5kb3I7CisJCQkJY2xhc3MgPSByZWFkX3BjaV9jb25maWcobnVtLHNsb3QsZnVuYywKKwkJCQkJCQlQQ0lfQ0xBU1NfUkVWSVNJT04pOworCQkJCWlmIChjbGFzcyA9PSAweGZmZmZmZmZmKQorCQkJCQlicmVhazsgCisKKwkJCQlpZiAoKGNsYXNzID4+IDE2KSAhPSBQQ0lfQ0xBU1NfQlJJREdFX1BDSSkKKwkJCQkJY29udGludWU7IAorCQkJCQorCQkJCXZlbmRvciA9IHJlYWRfcGNpX2NvbmZpZyhudW0sIHNsb3QsIGZ1bmMsIAorCQkJCQkJCSBQQ0lfVkVORE9SX0lEKTsKKwkJCQkKKwkJCQlpZiAoY2hlY2tfYnJpZGdlKHZlbmRvciYweGZmZmYsIHZlbmRvciA+PiAxNikpCisJCQkJCXJldHVybjsgCisJCQl9IAorCQkJCisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2FjcGkvc2xlZXAuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9zbGVlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YmIwNTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvc2xlZXAuYwpAQCAtMCwwICsxLDkzIEBACisvKgorICogc2xlZXAuYyAtIHg4Ni1zcGVjaWZpYyBBQ1BJIHNsZWVwIHN1cHBvcnQuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIFBhdHJpY2sgTW9jaGVsCisgKiAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgUGF2ZWwgTWFjaGVrIDxwYXZlbEBzdXNlLmN6PgorICovCisKKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGFzbS9zbXAuaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKworLyogYWRkcmVzcyBpbiBsb3cgbWVtb3J5IG9mIHRoZSB3YWtldXAgcm91dGluZS4gKi8KK3Vuc2lnbmVkIGxvbmcgYWNwaV93YWtldXBfYWRkcmVzcyA9IDA7Cit1bnNpZ25lZCBsb25nIGFjcGlfdmlkZW9fZmxhZ3M7CitleHRlcm4gY2hhciB3YWtldXBfc3RhcnQsIHdha2V1cF9lbmQ7CisKK2V4dGVybiB2b2lkIHphcF9sb3dfbWFwcGluZ3Modm9pZCk7CisKK2V4dGVybiB1bnNpZ25lZCBsb25nIEZBU1RDQUxMKGFjcGlfY29weV93YWtldXBfcm91dGluZSh1bnNpZ25lZCBsb25nKSk7CisKK3N0YXRpYyB2b2lkIGluaXRfbG93X21hcHBpbmcocGdkX3QgKnBnZCwgaW50IHBnZF9saW1pdCkKK3sKKwlpbnQgcGdkX29mcyA9IDA7CisKKwl3aGlsZSAoKHBnZF9vZnMgPCBwZ2RfbGltaXQpICYmIChwZ2Rfb2ZzICsgVVNFUl9QVFJTX1BFUl9QR0QgPCBQVFJTX1BFUl9QR0QpKSB7CisJCXNldF9wZ2QocGdkLCAqKHBnZCtVU0VSX1BUUlNfUEVSX1BHRCkpOworCQlwZ2Rfb2ZzKyssIHBnZCsrOworCX0KKwlmbHVzaF90bGJfYWxsKCk7Cit9CisKKy8qKgorICogYWNwaV9zYXZlX3N0YXRlX21lbSAtIHNhdmUga2VybmVsIHN0YXRlCisgKgorICogQ3JlYXRlIGFuIGlkZW50aXR5IG1hcHBlZCBwYWdlIHRhYmxlIGFuZCBjb3B5IHRoZSB3YWtldXAgcm91dGluZSB0bworICogbG93IG1lbW9yeS4KKyAqLworaW50IGFjcGlfc2F2ZV9zdGF0ZV9tZW0gKHZvaWQpCit7CisJaWYgKCFhY3BpX3dha2V1cF9hZGRyZXNzKQorCQlyZXR1cm4gMTsKKwlpbml0X2xvd19tYXBwaW5nKHN3YXBwZXJfcGdfZGlyLCBVU0VSX1BUUlNfUEVSX1BHRCk7CisJbWVtY3B5KCh2b2lkICopIGFjcGlfd2FrZXVwX2FkZHJlc3MsICZ3YWtldXBfc3RhcnQsICZ3YWtldXBfZW5kIC0gJndha2V1cF9zdGFydCk7CisJYWNwaV9jb3B5X3dha2V1cF9yb3V0aW5lKGFjcGlfd2FrZXVwX2FkZHJlc3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBhY3BpX3Jlc3RvcmVfc3RhdGUgLSB1bmRvIGVmZmVjdHMgb2YgYWNwaV9zYXZlX3N0YXRlX21lbQorICovCit2b2lkIGFjcGlfcmVzdG9yZV9zdGF0ZV9tZW0gKHZvaWQpCit7CisJemFwX2xvd19tYXBwaW5ncygpOworfQorCisvKioKKyAqIGFjcGlfcmVzZXJ2ZV9ib290bWVtIC0gZG8gX3ZlcnlfIGVhcmx5IEFDUEkgaW5pdGlhbGlzYXRpb24KKyAqCisgKiBXZSBhbGxvY2F0ZSBhIHBhZ2UgZnJvbSB0aGUgZmlyc3QgMU1CIG9mIG1lbW9yeSBmb3IgdGhlIHdha2V1cAorICogcm91dGluZSBmb3Igd2hlbiB3ZSBjb21lIGJhY2sgZnJvbSBhIHNsZWVwIHN0YXRlLiBUaGUKKyAqIHJ1bnRpbWUgYWxsb2NhdG9yIGFsbG93cyBzcGVjaWZpY2F0aW9uIG9mIDwxNk1CIHBhZ2VzLCBidXQgbm90CisgKiA8MU1CIHBhZ2VzLgorICovCit2b2lkIF9faW5pdCBhY3BpX3Jlc2VydmVfYm9vdG1lbSh2b2lkKQoreworCWlmICgoJndha2V1cF9lbmQgLSAmd2FrZXVwX3N0YXJ0KSA+IFBBR0VfU0laRSkgeworCQlwcmludGsoS0VSTl9FUlIgIkFDUEk6IFdha2V1cCBjb2RlIHdheSB0b28gYmlnLCBTMyBkaXNhYmxlZC5cbiIpOworCQlyZXR1cm47CisJfQorCisJYWNwaV93YWtldXBfYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKWFsbG9jX2Jvb3RtZW1fbG93KFBBR0VfU0laRSk7CisJaWYgKCFhY3BpX3dha2V1cF9hZGRyZXNzKQorCQlwcmludGsoS0VSTl9FUlIgIkFDUEk6IENhbm5vdCBhbGxvY2F0ZSBsb3dtZW0sIFMzIGRpc2FibGVkLlxuIik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfc2xlZXBfc2V0dXAoY2hhciAqc3RyKQoreworCXdoaWxlICgoc3RyICE9IE5VTEwpICYmICgqc3RyICE9ICdcMCcpKSB7CisJCWlmIChzdHJuY21wKHN0ciwgInMzX2Jpb3MiLCA3KSA9PSAwKQorCQkJYWNwaV92aWRlb19mbGFncyA9IDE7CisJCWlmIChzdHJuY21wKHN0ciwgInMzX21vZGUiLCA3KSA9PSAwKQorCQkJYWNwaV92aWRlb19mbGFncyB8PSAyOworCQlzdHIgPSBzdHJjaHIoc3RyLCAnLCcpOworCQlpZiAoc3RyICE9IE5VTEwpCisJCQlzdHIgKz0gc3Ryc3BuKHN0ciwgIiwgXHQiKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKKworX19zZXR1cCgiYWNwaV9zbGVlcD0iLCBhY3BpX3NsZWVwX3NldHVwKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS93YWtldXAuUyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS93YWtldXAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWQzMjQ4NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS93YWtldXAuUwpAQCAtMCwwICsxLDMxOCBAQAorLnRleHQKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCisjCisjIHdha2V1cF9jb2RlIHJ1bnMgaW4gcmVhbCBtb2RlLCBhbmQgYXQgdW5rbm93biBhZGRyZXNzIChkZXRlcm1pbmVkIGF0IHJ1bi10aW1lKS4KKyMgVGhlcmVmb3JlIGl0IG11c3Qgb25seSB1c2UgcmVsYXRpdmUganVtcHMvY2FsbHMuIAorIworIyBEbyB3ZSBuZWVkIHRvIGRlYWwgd2l0aCBBMjA/IEl0IGlzIG9rYXk6IEFDUEkgc3BlY3Mgc2F5cyBBMjAgbXVzdCBiZSBlbmFibGVkCisjCisjIElmIHBoeXNpY2FsIGFkZHJlc3Mgb2Ygd2FrZXVwX2NvZGUgaXMgMHgxMjM0NSwgQklPUyBzaG91bGQgY2FsbCB1cyB3aXRoCisjIGNzID0gMHgxMjM0LCBlaXAgPSAweDA1CisjIAorCitBTElHTgorCS5hbGlnbgk0MDk2CitFTlRSWSh3YWtldXBfc3RhcnQpCit3YWtldXBfY29kZToKKwl3YWtldXBfY29kZV9zdGFydCA9IC4KKwkuY29kZTE2CisKKyAJbW92dwkkMHhiODAwLCAlYXgKKwltb3Z3CSVheCwlZnMKKwltb3Z3CSQweDBlMDAgKyAnTCcsICVmczooMHgxMCkKKworCWNsaQorCWNsZAorCisJIyBzZXR1cCBkYXRhIHNlZ21lbnQKKwltb3Z3CSVjcywgJWF4CisJbW92dwklYXgsICVkcwkJCQkJIyBNYWtlIGRzOjAgcG9pbnQgdG8gd2FrZXVwX3N0YXJ0CisJbW92dwklYXgsICVzcworCW1vdgkkKHdha2V1cF9zdGFjayAtIHdha2V1cF9jb2RlKSwgJXNwCQkjIFByaXZhdGUgc3RhY2sgaXMgbmVlZGVkIGZvciBBU1VTIGJvYXJkCisJbW92dwkkMHgwZTAwICsgJ1MnLCAlZnM6KDB4MTIpCisKKwlwdXNobAkkMAkJCQkJCSMgS2lsbCBhbnkgZGFuZ2Vyb3VzIGZsYWdzCisJcG9wZmwKKworCW1vdmwJcmVhbF9tYWdpYyAtIHdha2V1cF9jb2RlLCAlZWF4CisJY21wbAkkMHgxMjM0NTY3OCwgJWVheAorCWpuZQlib2d1c19yZWFsX21hZ2ljCisKKwl0ZXN0bAkkMSwgdmlkZW9fZmxhZ3MgLSB3YWtldXBfY29kZQorCWp6CTFmCisJbGNhbGwgICAkMHhjMDAwLCQzCisJbW92dwklY3MsICVheAorCW1vdncJJWF4LCAlZHMJCQkJCSMgQmlvcyBtaWdodCBoYXZlIHBsYXllZCB3aXRoIHRoYXQKKwltb3Z3CSVheCwgJXNzCisxOgorCisJdGVzdGwJJDIsIHZpZGVvX2ZsYWdzIC0gd2FrZXVwX2NvZGUKKwlqegkxZgorCW1vdgl2aWRlb19tb2RlIC0gd2FrZXVwX2NvZGUsICVheAorCWNhbGwJbW9kZV9zZXQKKzE6CisKKwkjIHNldCB1cCBwYWdlIHRhYmxlCisJbW92bAkkc3dhcHBlcl9wZ19kaXItX19QQUdFX09GRlNFVCwgJWVheAorCW1vdmwJJWVheCwgJWNyMworCisJdGVzdGwJJDEsIHJlYWxfZWZlcl9zYXZlX3Jlc3RvcmUgLSB3YWtldXBfY29kZQorCWp6CTRmCisJIyByZXN0b3JlIGVmZXIgc2V0dGluZworCW1vdmwJcmVhbF9zYXZlX2VmZXJfZWR4IC0gd2FrZXVwX2NvZGUsICVlZHgKKwltb3ZsCXJlYWxfc2F2ZV9lZmVyX2VheCAtIHdha2V1cF9jb2RlLCAlZWF4CisJbW92ICAgICAkMHhjMDAwMDA4MCwgJWVjeAorCXdybXNyCis0OgorCSMgbWFrZSBzdXJlICVjcjQgaXMgc2V0IGNvcnJlY3RseSAoZmVhdHVyZXMsIGV0YykKKwltb3ZsCXJlYWxfc2F2ZV9jcjQgLSB3YWtldXBfY29kZSwgJWVheAorCW1vdmwJJWVheCwgJWNyNAorCW1vdncJJDB4YjgwMCwgJWF4CisJbW92dwklYXgsJWZzCisJbW92dwkkMHgwZTAwICsgJ2knLCAlZnM6KDB4MTIpCisJCisJIyBuZWVkIGEgZ2R0CisJbGdkdAlyZWFsX3NhdmVfZ2R0IC0gd2FrZXVwX2NvZGUKKworCW1vdmwJcmVhbF9zYXZlX2NyMCAtIHdha2V1cF9jb2RlLCAlZWF4CisJbW92bAklZWF4LCAlY3IwCisJam1wIDFmCisxOgorCW1vdncJJDB4MGUwMCArICduJywgJWZzOigweDE0KQorCisJbW92bAlyZWFsX21hZ2ljIC0gd2FrZXVwX2NvZGUsICVlYXgKKwljbXBsCSQweDEyMzQ1Njc4LCAlZWF4CisJam5lCWJvZ3VzX3JlYWxfbWFnaWMKKworCWxqbXBsCSRfX0tFUk5FTF9DUywkd2FrZXVwX3Btb2RlX3JldHVybgorCityZWFsX3NhdmVfZ2R0Ogkud29yZCAwCisJCS5sb25nIDAKK3JlYWxfc2F2ZV9jcjA6CS5sb25nIDAKK3JlYWxfc2F2ZV9jcjM6CS5sb25nIDAKK3JlYWxfc2F2ZV9jcjQ6CS5sb25nIDAKK3JlYWxfbWFnaWM6CS5sb25nIDAKK3ZpZGVvX21vZGU6CS5sb25nIDAKK3ZpZGVvX2ZsYWdzOgkubG9uZyAwCityZWFsX2VmZXJfc2F2ZV9yZXN0b3JlOgkubG9uZyAwCityZWFsX3NhdmVfZWZlcl9lZHg6IAkubG9uZyAwCityZWFsX3NhdmVfZWZlcl9lYXg6IAkubG9uZyAwCisKK2JvZ3VzX3JlYWxfbWFnaWM6CisJbW92dwkkMHgwZTAwICsgJ0InLCAlZnM6KDB4MTIpCisJam1wIGJvZ3VzX3JlYWxfbWFnaWMKKworLyogVGhpcyBjb2RlIHVzZXMgYW4gZXh0ZW5kZWQgc2V0IG9mIHZpZGVvIG1vZGUgbnVtYmVycy4gVGhlc2UgaW5jbHVkZToKKyAqIEFsaWFzZXMgZm9yIHN0YW5kYXJkIG1vZGVzCisgKglOT1JNQUxfVkdBICgtMSkKKyAqCUVYVEVOREVEX1ZHQSAoLTIpCisgKglBU0tfVkdBICgtMykKKyAqIFZpZGVvIG1vZGVzIG51bWJlcmVkIGJ5IG1lbnUgcG9zaXRpb24gLS0gTk9UIFJFQ09NTUVOREVEIGJlY2F1c2Ugb2YgbGFjaworICogb2YgY29tcGF0aWJpbGl0eSB3aGVuIGV4dGVuZGluZyB0aGUgdGFibGUuIFRoZXNlIGFyZSBiZXR3ZWVuIDB4MDAgYW5kIDB4ZmYuCisgKi8KKyNkZWZpbmUgVklERU9fRklSU1RfTUVOVSAweDAwMDAKKworLyogU3RhbmRhcmQgQklPUyB2aWRlbyBtb2RlcyAoQklPUyBudW1iZXIgKyAweDAxMDApICovCisjZGVmaW5lIFZJREVPX0ZJUlNUX0JJT1MgMHgwMTAwCisKKy8qIFZFU0EgQklPUyB2aWRlbyBtb2RlcyAoVkVTQSBudW1iZXIgKyAweDAyMDApICovCisjZGVmaW5lIFZJREVPX0ZJUlNUX1ZFU0EgMHgwMjAwCisKKy8qIFZpZGVvNyBzcGVjaWFsIG1vZGVzIChCSU9TIG51bWJlciArIDB4MDkwMCkgKi8KKyNkZWZpbmUgVklERU9fRklSU1RfVjcgMHgwOTAwCisKKyMgU2V0dGluZyBvZiB1c2VyIG1vZGUgKEFYPW1vZGUgSUQpID0+IENGPXN1Y2Nlc3MKK21vZGVfc2V0OgorCW1vdncJJWF4LCAlYngKKyNpZiAwCisJY21wYgkkMHhmZiwgJWFoCisJanoJc2V0YWxpYXMKKworCXRlc3RiCSRWSURFT19SRUNBTEM+PjgsICVhaAorCWpueglfc2V0cmVjCisKKwljbXBiCSRWSURFT19GSVJTVF9SRVNPTFVUSU9OPj44LCAlYWgKKwlqbmMJc2V0cmVzCisJCisJY21wYgkkVklERU9fRklSU1RfU1BFQ0lBTD4+OCwgJWFoCisJanoJc2V0c3BjCisKKwljbXBiCSRWSURFT19GSVJTVF9WNz4+OCwgJWFoCisJanoJc2V0djcKKyNlbmRpZgorCQorCWNtcGIJJFZJREVPX0ZJUlNUX1ZFU0E+PjgsICVhaAorCWpuYwljaGVja192ZXNhCisjaWYgMAkKKwlvcmIJJWFoLCAlYWgKKwlqeglzZXRtZW51CisjZW5kaWYKKwkKKwlkZWNiCSVhaAorIwlqeglzZXRiaW9zCQkJCSAgQWRkIGJpb3MgbW9kZXMgbGF0ZXIKKworc2V0YmFkOgljbGMKKwlyZXQKKworY2hlY2tfdmVzYToKKwlzdWJiCSRWSURFT19GSVJTVF9WRVNBPj44LCAlYmgKKwlvcncJJDB4NDAwMCwgJWJ4CQkJIyBVc2UgbGluZWFyIGZyYW1lIGJ1ZmZlcgorCW1vdncJJDB4NGYwMiwgJWF4CQkJIyBWRVNBIEJJT1MgbW9kZSBzZXQgY2FsbAorCWludAkkMHgxMAorCWNtcHcJJDB4MDA0ZiwgJWF4CQkJIyBBTD00ZiBpZiBpbXBsZW1lbnRlZAorCWpueglfc2V0YmFkCQkJCSMgQUg9MCBpZiBPSworCisJc3RjCisJcmV0CisKK19zZXRiYWQ6IGptcCBzZXRiYWQKKworCS5jb2RlMzIKKwlBTElHTgorCisub3JnCTB4ODAwCit3YWtldXBfc3RhY2tfYmVnaW46CSMgU3RhY2sgZ3Jvd3MgZG93bgorCisub3JnCTB4ZmYwCQkjIEp1c3QgYmVsb3cgZW5kIG9mIHBhZ2UKK3dha2V1cF9zdGFjazoKK0VOVFJZKHdha2V1cF9lbmQpCisJCisub3JnCTB4MTAwMAorCit3YWtldXBfcG1vZGVfcmV0dXJuOgorCW1vdncJJF9fS0VSTkVMX0RTLCAlYXgKKwltb3Z3CSVheCwgJXNzCisJbW92dwklYXgsICVkcworCW1vdncJJWF4LCAlZXMKKwltb3Z3CSVheCwgJWZzCisJbW92dwklYXgsICVncworCW1vdncJJDB4MGUwMCArICd1JywgMHhiODAxNgorCisJIyByZWxvYWQgdGhlIGdkdCwgYXMgd2UgbmVlZCB0aGUgZnVsbCAzMiBiaXQgYWRkcmVzcworCWxnZHQJc2F2ZWRfZ2R0CisJbGlkdAlzYXZlZF9pZHQKKwlsbGR0CXNhdmVkX2xkdAorCWxqbXAJJChfX0tFUk5FTF9DUyksJDFmCisxOgorCW1vdmwJJWNyMywgJWVheAorCW1vdmwJJWVheCwgJWNyMworCXdiaW52ZAorCisJIyBhbmQgcmVzdG9yZSB0aGUgc3RhY2sgLi4uIGJ1dCB5b3UgbmVlZCBnZHQgZm9yIHRoaXMgdG8gd29yaworCW1vdmwJc2F2ZWRfY29udGV4dF9lc3AsICVlc3AKKworCW1vdmwJJWNzOnNhdmVkX21hZ2ljLCAlZWF4CisJY21wbAkkMHgxMjM0NTY3OCwgJWVheAorCWpuZQlib2d1c19tYWdpYworCisJIyBqdW1wIHRvIHBsYWNlIHdoZXJlIHdlIGxlZnQgb2ZmCisJbW92bAlzYXZlZF9laXAsJWVheAorCWptcAkqJWVheAorCitib2d1c19tYWdpYzoKKwltb3Z3CSQweDBlMDAgKyAnQicsIDB4YjgwMTgKKwlqbXAJYm9ndXNfbWFnaWMKKworCisjIworIyBhY3BpX2NvcHlfd2FrZXVwX3JvdXRpbmUKKyMKKyMgQ29weSB0aGUgYWJvdmUgcm91dGluZSB0byBsb3cgbWVtb3J5LgorIworIyBQYXJhbWV0ZXJzOgorIyAlZWF4OglwbGFjZSB0byBjb3B5IHdha2V1cCByb3V0aW5lIHRvCisjCisjIFJldHVybmVkIGFkZHJlc3MgaXMgbG9jYXRpb24gb2YgY29kZSBpbiBsb3cgbWVtb3J5IChwYXN0IGRhdGEgYW5kIHN0YWNrKQorIworRU5UUlkoYWNwaV9jb3B5X3dha2V1cF9yb3V0aW5lKQorCisJc2dkdAlzYXZlZF9nZHQKKwlzaWR0CXNhdmVkX2lkdAorCXNsZHQJc2F2ZWRfbGR0CisJc3RyCXNhdmVkX3RzcworCisJbW92bAlueF9lbmFibGVkLCAlZWR4CisJbW92bAklZWR4LCByZWFsX2VmZXJfc2F2ZV9yZXN0b3JlIC0gd2FrZXVwX3N0YXJ0ICglZWF4KQorCXRlc3RsCSQxLCByZWFsX2VmZXJfc2F2ZV9yZXN0b3JlIC0gd2FrZXVwX3N0YXJ0ICglZWF4KQorCWp6CTJmCisJIyBzYXZlIGVmZXIgc2V0dGluZworCXB1c2hsCSVlYXgKKwltb3ZsCSVlYXgsICVlYngKKwltb3YgICAgICQweGMwMDAwMDgwLCAlZWN4CisJcmRtc3IKKwltb3ZsCSVlZHgsIHJlYWxfc2F2ZV9lZmVyX2VkeCAtIHdha2V1cF9zdGFydCAoJWVieCkKKwltb3ZsCSVlYXgsIHJlYWxfc2F2ZV9lZmVyX2VheCAtIHdha2V1cF9zdGFydCAoJWVieCkKKwlwb3BsCSVlYXgKKzI6CisKKwltb3ZsICAgICVjcjMsICVlZHgKKwltb3ZsICAgICVlZHgsIHJlYWxfc2F2ZV9jcjMgLSB3YWtldXBfc3RhcnQgKCVlYXgpCisJbW92bCAgICAlY3I0LCAlZWR4CisJbW92bCAgICAlZWR4LCByZWFsX3NhdmVfY3I0IC0gd2FrZXVwX3N0YXJ0ICglZWF4KQorCW1vdmwJJWNyMCwgJWVkeAorCW1vdmwJJWVkeCwgcmVhbF9zYXZlX2NyMCAtIHdha2V1cF9zdGFydCAoJWVheCkKKwlzZ2R0ICAgIHJlYWxfc2F2ZV9nZHQgLSB3YWtldXBfc3RhcnQgKCVlYXgpCisKKwltb3ZsCXNhdmVkX3ZpZGVvbW9kZSwgJWVkeAorCW1vdmwJJWVkeCwgdmlkZW9fbW9kZSAtIHdha2V1cF9zdGFydCAoJWVheCkKKwltb3ZsCWFjcGlfdmlkZW9fZmxhZ3MsICVlZHgKKwltb3ZsCSVlZHgsIHZpZGVvX2ZsYWdzIC0gd2FrZXVwX3N0YXJ0ICglZWF4KQorCW1vdmwJJDB4MTIzNDU2NzgsIHJlYWxfbWFnaWMgLSB3YWtldXBfc3RhcnQgKCVlYXgpCisJbW92bAkkMHgxMjM0NTY3OCwgc2F2ZWRfbWFnaWMKKwlyZXQKKworLmRhdGEKK0FMSUdOCitFTlRSWShzYXZlZF9tYWdpYykJLmxvbmcJMAorRU5UUlkoc2F2ZWRfZWlwKQkubG9uZwkwCisKK3NhdmVfcmVnaXN0ZXJzOgorCWxlYWwJNCglZXNwKSwgJWVheAorCW1vdmwJJWVheCwgc2F2ZWRfY29udGV4dF9lc3AKKwltb3ZsICVlYngsIHNhdmVkX2NvbnRleHRfZWJ4CisJbW92bCAlZWJwLCBzYXZlZF9jb250ZXh0X2VicAorCW1vdmwgJWVzaSwgc2F2ZWRfY29udGV4dF9lc2kKKwltb3ZsICVlZGksIHNhdmVkX2NvbnRleHRfZWRpCisJcHVzaGZsIDsgcG9wbCBzYXZlZF9jb250ZXh0X2VmbGFncworCisJbW92bCAkcmV0X3BvaW50LCBzYXZlZF9laXAKKwlyZXQKKworCityZXN0b3JlX3JlZ2lzdGVyczoKKwltb3ZsIHNhdmVkX2NvbnRleHRfZWJwLCAlZWJwCisJbW92bCBzYXZlZF9jb250ZXh0X2VieCwgJWVieAorCW1vdmwgc2F2ZWRfY29udGV4dF9lc2ksICVlc2kKKwltb3ZsIHNhdmVkX2NvbnRleHRfZWRpLCAlZWRpCisJcHVzaGwgc2F2ZWRfY29udGV4dF9lZmxhZ3MgOyBwb3BmbAorCXJldAkKKworRU5UUlkoZG9fc3VzcGVuZF9sb3dsZXZlbCkKKwljYWxsCXNhdmVfcHJvY2Vzc29yX3N0YXRlCisJY2FsbAlzYXZlX3JlZ2lzdGVycworCXB1c2hsCSQzCisJY2FsbAlhY3BpX2VudGVyX3NsZWVwX3N0YXRlCisJYWRkbAkkNCwgJWVzcAorCXJldAorCS5wMmFsaWduIDQsLDcKK3JldF9wb2ludDoKKwljYWxsCXJlc3RvcmVfcmVnaXN0ZXJzCisJY2FsbAlyZXN0b3JlX3Byb2Nlc3Nvcl9zdGF0ZQorCXJldAorCitFTlRSWShkb19zdXNwZW5kX2xvd2xldmVsX3M0YmlvcykKKwljYWxsIHNhdmVfcHJvY2Vzc29yX3N0YXRlCisJY2FsbCBzYXZlX3JlZ2lzdGVycworCWNhbGwgYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZV9zNGJpb3MKKwlyZXQKKworQUxJR04KKyMgc2F2ZWQgcmVnaXN0ZXJzCitzYXZlZF9nZHQ6CS5sb25nCTAsMAorc2F2ZWRfaWR0OgkubG9uZwkwLDAKK3NhdmVkX2xkdDoJLmxvbmcJMAorc2F2ZWRfdHNzOgkubG9uZwkwCisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvYXBpYy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9hcGljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVjMTc1MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYXBpYy5jCkBAIC0wLDAgKzEsMTI3OCBAQAorLyoKKyAqCUxvY2FsIEFQSUMgaGFuZGxpbmcsIGxvY2FsIEFQSUMgdGltZXJzCisgKgorICoJKGMpIDE5OTksIDIwMDAgSW5nbyBNb2xuYXIgPG1pbmdvQHJlZGhhdC5jb20+CisgKgorICoJRml4ZXMKKyAqCU1hY2llaiBXLiBSb3p5Y2tpCToJQml0cyBmb3IgZ2VudWluZSA4MjQ4OURYIEFQSUNzOworICoJCQkJCXRoYW5rcyB0byBFcmljIEdpbG1vcmUKKyAqCQkJCQlhbmQgUm9sZiBHLiBUZXdzCisgKgkJCQkJZm9yIHRlc3RpbmcgdGhlc2UgZXh0ZW5zaXZlbHkuCisgKglNYWNpZWogVy4gUm96eWNraQk6CVZhcmlvdXMgdXBkYXRlcyBhbmQgZml4ZXMuCisgKglNaWthZWwgUGV0dGVyc3Nvbgk6CVBvd2VyIE1hbmFnZW1lbnQgZm9yIFVQLUFQSUMuCisgKglQYXZlbCBNYWNoZWsgYW5kCisgKglNaWthZWwgUGV0dGVyc3Nvbgk6CVBNIGNvbnZlcnRlZCB0byBkcml2ZXIgbW9kZWwuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisKKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL3NtcC5oPgorI2luY2x1ZGUgPGFzbS9tdHJyLmg+CisjaW5jbHVkZSA8YXNtL21wc3BlYy5oPgorI2luY2x1ZGUgPGFzbS9kZXNjLmg+CisjaW5jbHVkZSA8YXNtL2FyY2hfaG9va3MuaD4KKyNpbmNsdWRlIDxhc20vaHBldC5oPgorCisjaW5jbHVkZSA8bWFjaF9hcGljLmg+CisKKyNpbmNsdWRlICJpb19wb3J0cy5oIgorCisvKgorICogRGVidWcgbGV2ZWwKKyAqLworaW50IGFwaWNfdmVyYm9zaXR5OworCisKK3N0YXRpYyB2b2lkIGFwaWNfcG1fYWN0aXZhdGUodm9pZCk7CisKKy8qCisgKiAnd2hhdCBzaG91bGQgd2UgZG8gaWYgd2UgZ2V0IGEgaHcgaXJxIGV2ZW50IG9uIGFuIGlsbGVnYWwgdmVjdG9yJy4KKyAqIGVhY2ggYXJjaGl0ZWN0dXJlIGhhcyB0byBhbnN3ZXIgdGhpcyB0aGVtc2VsdmVzLgorICovCit2b2lkIGFja19iYWRfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJcHJpbnRrKCJ1bmV4cGVjdGVkIElSUSB0cmFwIGF0IHZlY3RvciAlMDJ4XG4iLCBpcnEpOworCS8qCisJICogQ3VycmVudGx5IHVuZXhwZWN0ZWQgdmVjdG9ycyBoYXBwZW4gb25seSBvbiBTTVAgYW5kIEFQSUMuCisJICogV2UgX211c3RfIGFjayB0aGVzZSBiZWNhdXNlIGV2ZXJ5IGxvY2FsIEFQSUMgaGFzIG9ubHkgTgorCSAqIGlycSBzbG90cyBwZXIgcHJpb3JpdHkgbGV2ZWwsIGFuZCBhICdoYW5naW5nLCB1bmFja2VkJyBJUlEKKwkgKiBob2xkcyB1cCBhbiBpcnEgc2xvdCAtIGluIGV4Y2Vzc2l2ZSBjYXNlcyAod2hlbiBtdWx0aXBsZQorCSAqIHVuZXhwZWN0ZWQgdmVjdG9ycyBvY2N1cikgdGhhdCBtaWdodCBsb2NrIHVwIHRoZSBBUElDCisJICogY29tcGxldGVseS4KKwkgKi8KKwlhY2tfQVBJQ19pcnEoKTsKK30KKwordm9pZCBfX2luaXQgYXBpY19pbnRyX2luaXQodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfU01QCisJc21wX2ludHJfaW5pdCgpOworI2VuZGlmCisJLyogc2VsZiBnZW5lcmF0ZWQgSVBJIGZvciBsb2NhbCBBUElDIHRpbWVyICovCisJc2V0X2ludHJfZ2F0ZShMT0NBTF9USU1FUl9WRUNUT1IsIGFwaWNfdGltZXJfaW50ZXJydXB0KTsKKworCS8qIElQSSB2ZWN0b3JzIGZvciBBUElDIHNwdXJpb3VzIGFuZCBlcnJvciBpbnRlcnJ1cHRzICovCisJc2V0X2ludHJfZ2F0ZShTUFVSSU9VU19BUElDX1ZFQ1RPUiwgc3B1cmlvdXNfaW50ZXJydXB0KTsKKwlzZXRfaW50cl9nYXRlKEVSUk9SX0FQSUNfVkVDVE9SLCBlcnJvcl9pbnRlcnJ1cHQpOworCisJLyogdGhlcm1hbCBtb25pdG9yIExWVCBpbnRlcnJ1cHQgKi8KKyNpZmRlZiBDT05GSUdfWDg2X01DRV9QNFRIRVJNQUwKKwlzZXRfaW50cl9nYXRlKFRIRVJNQUxfQVBJQ19WRUNUT1IsIHRoZXJtYWxfaW50ZXJydXB0KTsKKyNlbmRpZgorfQorCisvKiBVc2luZyBBUElDIHRvIGdlbmVyYXRlIHNtcF9sb2NhbF90aW1lcl9pbnRlcnJ1cHQ/ICovCitpbnQgdXNpbmdfYXBpY190aW1lciA9IDA7CisKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIHByb2ZfbXVsdGlwbGllcikgPSAxOworc3RhdGljIERFRklORV9QRVJfQ1BVKGludCwgcHJvZl9vbGRfbXVsdGlwbGllcikgPSAxOworc3RhdGljIERFRklORV9QRVJfQ1BVKGludCwgcHJvZl9jb3VudGVyKSA9IDE7CisKK3N0YXRpYyBpbnQgZW5hYmxlZF92aWFfYXBpY2Jhc2U7CisKK3ZvaWQgZW5hYmxlX05NSV90aHJvdWdoX0xWVDAgKHZvaWQgKiBkdW1teSkKK3sKKwl1bnNpZ25lZCBpbnQgdiwgdmVyOworCisJdmVyID0gYXBpY19yZWFkKEFQSUNfTFZSKTsKKwl2ZXIgPSBHRVRfQVBJQ19WRVJTSU9OKHZlcik7CisJdiA9IEFQSUNfRE1fTk1JOwkJCS8qIHVubWFzayBhbmQgc2V0IHRvIE5NSSAqLworCWlmICghQVBJQ19JTlRFR1JBVEVEKHZlcikpCQkvKiA4MjQ4OURYICovCisJCXYgfD0gQVBJQ19MVlRfTEVWRUxfVFJJR0dFUjsKKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVDAsIHYpOworfQorCitpbnQgZ2V0X3BoeXNpY2FsX2Jyb2FkY2FzdCh2b2lkKQoreworCXVuc2lnbmVkIGludCBsdnIsIHZlcnNpb247CisJbHZyID0gYXBpY19yZWFkKEFQSUNfTFZSKTsKKwl2ZXJzaW9uID0gR0VUX0FQSUNfVkVSU0lPTihsdnIpOworCWlmICghQVBJQ19JTlRFR1JBVEVEKHZlcnNpb24pIHx8IHZlcnNpb24gPj0gMHgxNCkKKwkJcmV0dXJuIDB4ZmY7CisJZWxzZQorCQlyZXR1cm4gMHhmOworfQorCitpbnQgZ2V0X21heGx2dCh2b2lkKQoreworCXVuc2lnbmVkIGludCB2LCB2ZXIsIG1heGx2dDsKKworCXYgPSBhcGljX3JlYWQoQVBJQ19MVlIpOworCXZlciA9IEdFVF9BUElDX1ZFUlNJT04odik7CisJLyogODI0ODlEWHMgZG8gbm90IHJlcG9ydCAjIG9mIExWVCBlbnRyaWVzLiAqLworCW1heGx2dCA9IEFQSUNfSU5URUdSQVRFRCh2ZXIpID8gR0VUX0FQSUNfTUFYTFZUKHYpIDogMjsKKwlyZXR1cm4gbWF4bHZ0OworfQorCit2b2lkIGNsZWFyX2xvY2FsX0FQSUModm9pZCkKK3sKKwlpbnQgbWF4bHZ0OworCXVuc2lnbmVkIGxvbmcgdjsKKworCW1heGx2dCA9IGdldF9tYXhsdnQoKTsKKworCS8qCisJICogTWFza2luZyBhbiBMVlQgZW50cnkgb24gYSBQNiBjYW4gdHJpZ2dlciBhIGxvY2FsIEFQSUMgZXJyb3IKKwkgKiBpZiB0aGUgdmVjdG9yIGlzIHplcm8uIE1hc2sgTFZURVJSIGZpcnN0IHRvIHByZXZlbnQgdGhpcy4KKwkgKi8KKwlpZiAobWF4bHZ0ID49IDMpIHsKKwkJdiA9IEVSUk9SX0FQSUNfVkVDVE9SOyAvKiBhbnkgbm9uLXplcm8gdmVjdG9yIHdpbGwgZG8gKi8KKwkJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlRFUlIsIHYgfCBBUElDX0xWVF9NQVNLRUQpOworCX0KKwkvKgorCSAqIENhcmVmdWw6IHdlIGhhdmUgdG8gc2V0IG1hc2tzIG9ubHkgZmlyc3QgdG8gZGVhc3NlcnQKKwkgKiBhbnkgbGV2ZWwtdHJpZ2dlcmVkIHNvdXJjZXMuCisJICovCisJdiA9IGFwaWNfcmVhZChBUElDX0xWVFQpOworCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUVCwgdiB8IEFQSUNfTFZUX01BU0tFRCk7CisJdiA9IGFwaWNfcmVhZChBUElDX0xWVDApOworCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUMCwgdiB8IEFQSUNfTFZUX01BU0tFRCk7CisJdiA9IGFwaWNfcmVhZChBUElDX0xWVDEpOworCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUMSwgdiB8IEFQSUNfTFZUX01BU0tFRCk7CisJaWYgKG1heGx2dCA+PSA0KSB7CisJCXYgPSBhcGljX3JlYWQoQVBJQ19MVlRQQyk7CisJCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUUEMsIHYgfCBBUElDX0xWVF9NQVNLRUQpOworCX0KKworLyogbGV0cyBub3QgdG91Y2ggdGhpcyBpZiB3ZSBkaWRuJ3QgZnJvYiBpdCAqLworI2lmZGVmIENPTkZJR19YODZfTUNFX1A0VEhFUk1BTAorCWlmIChtYXhsdnQgPj0gNSkgeworCQl2ID0gYXBpY19yZWFkKEFQSUNfTFZUVEhNUik7CisJCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUVEhNUiwgdiB8IEFQSUNfTFZUX01BU0tFRCk7CisJfQorI2VuZGlmCisJLyoKKwkgKiBDbGVhbiBBUElDIHN0YXRlIGZvciBvdGhlciBPU3M6CisJICovCisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlRULCBBUElDX0xWVF9NQVNLRUQpOworCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUMCwgQVBJQ19MVlRfTUFTS0VEKTsKKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVDEsIEFQSUNfTFZUX01BU0tFRCk7CisJaWYgKG1heGx2dCA+PSAzKQorCQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVEVSUiwgQVBJQ19MVlRfTUFTS0VEKTsKKwlpZiAobWF4bHZ0ID49IDQpCisJCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUUEMsIEFQSUNfTFZUX01BU0tFRCk7CisKKyNpZmRlZiBDT05GSUdfWDg2X01DRV9QNFRIRVJNQUwKKwlpZiAobWF4bHZ0ID49IDUpCisJCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUVEhNUiwgQVBJQ19MVlRfTUFTS0VEKTsKKyNlbmRpZgorCXYgPSBHRVRfQVBJQ19WRVJTSU9OKGFwaWNfcmVhZChBUElDX0xWUikpOworCWlmIChBUElDX0lOVEVHUkFURUQodikpIHsJLyogITgyNDg5RFggKi8KKwkJaWYgKG1heGx2dCA+IDMpCQkvKiBEdWUgdG8gUGVudGl1bSBlcnJhdGEgM0FQIGFuZCAxMUFQLiAqLworCQkJYXBpY193cml0ZShBUElDX0VTUiwgMCk7CisJCWFwaWNfcmVhZChBUElDX0VTUik7CisJfQorfQorCit2b2lkIF9faW5pdCBjb25uZWN0X2JzcF9BUElDKHZvaWQpCit7CisJaWYgKHBpY19tb2RlKSB7CisJCS8qCisJCSAqIERvIG5vdCB0cnVzdCB0aGUgbG9jYWwgQVBJQyBiZWluZyBlbXB0eSBhdCBib290dXAuCisJCSAqLworCQljbGVhcl9sb2NhbF9BUElDKCk7CisJCS8qCisJCSAqIFBJQyBtb2RlLCBlbmFibGUgQVBJQyBtb2RlIGluIHRoZSBJTUNSLCBpLmUuCisJCSAqIGNvbm5lY3QgQlNQJ3MgbG9jYWwgQVBJQyB0byBJTlQgYW5kIE5NSSBsaW5lcy4KKwkJICovCisJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgImxlYXZpbmcgUElDIG1vZGUsICIKKwkJCQkiZW5hYmxpbmcgQVBJQyBtb2RlLlxuIik7CisJCW91dGIoMHg3MCwgMHgyMik7CisJCW91dGIoMHgwMSwgMHgyMyk7CisJfQorCWVuYWJsZV9hcGljX21vZGUoKTsKK30KKwordm9pZCBkaXNjb25uZWN0X2JzcF9BUElDKHZvaWQpCit7CisJaWYgKHBpY19tb2RlKSB7CisJCS8qCisJCSAqIFB1dCB0aGUgYm9hcmQgYmFjayBpbnRvIFBJQyBtb2RlIChoYXMgYW4gZWZmZWN0CisJCSAqIG9ubHkgb24gY2VydGFpbiBvbGRlciBib2FyZHMpLiAgTm90ZSB0aGF0IEFQSUMKKwkJICogaW50ZXJydXB0cywgaW5jbHVkaW5nIElQSXMsIHdvbid0IHdvcmsgYmV5b25kCisJCSAqIHRoaXMgcG9pbnQhICBUaGUgb25seSBleGNlcHRpb24gYXJlIElOSVQgSVBJcy4KKwkJICovCisJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgImRpc2FibGluZyBBUElDIG1vZGUsICIKKwkJCQkiZW50ZXJpbmcgUElDIG1vZGUuXG4iKTsKKwkJb3V0YigweDcwLCAweDIyKTsKKwkJb3V0YigweDAwLCAweDIzKTsKKwl9Cit9CisKK3ZvaWQgZGlzYWJsZV9sb2NhbF9BUElDKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKworCWNsZWFyX2xvY2FsX0FQSUMoKTsKKworCS8qCisJICogRGlzYWJsZSBBUElDIChpbXBsaWVzIGNsZWFyaW5nIG9mIHJlZ2lzdGVycworCSAqIGZvciA4MjQ4OURYISkuCisJICovCisJdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19TUElWKTsKKwl2YWx1ZSAmPSB+QVBJQ19TUElWX0FQSUNfRU5BQkxFRDsKKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX1NQSVYsIHZhbHVlKTsKKworCWlmIChlbmFibGVkX3ZpYV9hcGljYmFzZSkgeworCQl1bnNpZ25lZCBpbnQgbCwgaDsKKwkJcmRtc3IoTVNSX0lBMzJfQVBJQ0JBU0UsIGwsIGgpOworCQlsICY9IH5NU1JfSUEzMl9BUElDQkFTRV9FTkFCTEU7CisJCXdybXNyKE1TUl9JQTMyX0FQSUNCQVNFLCBsLCBoKTsKKwl9Cit9CisKKy8qCisgKiBUaGlzIGlzIHRvIHZlcmlmeSB0aGF0IHdlJ3JlIGxvb2tpbmcgYXQgYSByZWFsIGxvY2FsIEFQSUMuCisgKiBDaGVjayB0aGVzZSBhZ2FpbnN0IHlvdXIgYm9hcmQgaWYgdGhlIENQVXMgYXJlbid0IGdldHRpbmcKKyAqIHN0YXJ0ZWQgZm9yIG5vIGFwcGFyZW50IHJlYXNvbi4KKyAqLworaW50IF9faW5pdCB2ZXJpZnlfbG9jYWxfQVBJQyh2b2lkKQoreworCXVuc2lnbmVkIGludCByZWcwLCByZWcxOworCisJLyoKKwkgKiBUaGUgdmVyc2lvbiByZWdpc3RlciBpcyByZWFkLW9ubHkgaW4gYSByZWFsIEFQSUMuCisJICovCisJcmVnMCA9IGFwaWNfcmVhZChBUElDX0xWUik7CisJYXBpY19wcmludGsoQVBJQ19ERUJVRywgIkdldHRpbmcgVkVSU0lPTjogJXhcbiIsIHJlZzApOworCWFwaWNfd3JpdGUoQVBJQ19MVlIsIHJlZzAgXiBBUElDX0xWUl9NQVNLKTsKKwlyZWcxID0gYXBpY19yZWFkKEFQSUNfTFZSKTsKKwlhcGljX3ByaW50ayhBUElDX0RFQlVHLCAiR2V0dGluZyBWRVJTSU9OOiAleFxuIiwgcmVnMSk7CisKKwkvKgorCSAqIFRoZSB0d28gdmVyc2lvbiByZWFkcyBhYm92ZSBzaG91bGQgcHJpbnQgdGhlIHNhbWUKKwkgKiBudW1iZXJzLiAgSWYgdGhlIHNlY29uZCBvbmUgaXMgZGlmZmVyZW50LCB0aGVuIHdlCisJICogcG9rZSBhdCBhIG5vbi1BUElDLgorCSAqLworCWlmIChyZWcxICE9IHJlZzApCisJCXJldHVybiAwOworCisJLyoKKwkgKiBDaGVjayBpZiB0aGUgdmVyc2lvbiBsb29rcyByZWFzb25hYmx5LgorCSAqLworCXJlZzEgPSBHRVRfQVBJQ19WRVJTSU9OKHJlZzApOworCWlmIChyZWcxID09IDB4MDAgfHwgcmVnMSA9PSAweGZmKQorCQlyZXR1cm4gMDsKKwlyZWcxID0gZ2V0X21heGx2dCgpOworCWlmIChyZWcxIDwgMHgwMiB8fCByZWcxID09IDB4ZmYpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBUaGUgSUQgcmVnaXN0ZXIgaXMgcmVhZC93cml0ZSBpbiBhIHJlYWwgQVBJQy4KKwkgKi8KKwlyZWcwID0gYXBpY19yZWFkKEFQSUNfSUQpOworCWFwaWNfcHJpbnRrKEFQSUNfREVCVUcsICJHZXR0aW5nIElEOiAleFxuIiwgcmVnMCk7CisKKwkvKgorCSAqIFRoZSBuZXh0IHR3byBhcmUganVzdCB0byBzZWUgaWYgd2UgaGF2ZSBzYW5lIHZhbHVlcy4KKwkgKiBUaGV5J3JlIG9ubHkgcmVhbGx5IHJlbGV2YW50IGlmIHdlJ3JlIGluIFZpcnR1YWwgV2lyZQorCSAqIGNvbXBhdGliaWxpdHkgbW9kZSwgYnV0IG1vc3QgYm94ZXMgYXJlIGFueW1vcmUuCisJICovCisJcmVnMCA9IGFwaWNfcmVhZChBUElDX0xWVDApOworCWFwaWNfcHJpbnRrKEFQSUNfREVCVUcsICJHZXR0aW5nIExWVDA6ICV4XG4iLCByZWcwKTsKKwlyZWcxID0gYXBpY19yZWFkKEFQSUNfTFZUMSk7CisJYXBpY19wcmludGsoQVBJQ19ERUJVRywgIkdldHRpbmcgTFZUMTogJXhcbiIsIHJlZzEpOworCisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgX19pbml0IHN5bmNfQXJiX0lEcyh2b2lkKQoreworCS8qIFVuc3VwcG9ydGVkIG9uIFA0IC0gc2VlIEludGVsIERldi4gTWFudWFsIFZvbC4gMywgQ2guIDguNi4xICovCisJdW5zaWduZWQgaW50IHZlciA9IEdFVF9BUElDX1ZFUlNJT04oYXBpY19yZWFkKEFQSUNfTFZSKSk7CisJaWYgKHZlciA+PSAweDE0KQkvKiBQNCBvciBoaWdoZXIgKi8KKwkJcmV0dXJuOworCS8qCisJICogV2FpdCBmb3IgaWRsZS4KKwkgKi8KKwlhcGljX3dhaXRfaWNyX2lkbGUoKTsKKworCWFwaWNfcHJpbnRrKEFQSUNfREVCVUcsICJTeW5jaHJvbml6aW5nIEFyYiBJRHMuXG4iKTsKKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0lDUiwgQVBJQ19ERVNUX0FMTElOQyB8IEFQSUNfSU5UX0xFVkVMVFJJRworCQkJCXwgQVBJQ19ETV9JTklUKTsKK30KKworZXh0ZXJuIHZvaWQgX19lcnJvcl9pbl9hcGljX2MgKHZvaWQpOworCisvKgorICogQW4gaW5pdGlhbCBzZXR1cCBvZiB0aGUgdmlydHVhbCB3aXJlIG1vZGUuCisgKi8KK3ZvaWQgX19pbml0IGluaXRfYnNwX0FQSUModm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbHVlLCB2ZXI7CisKKwkvKgorCSAqIERvbid0IGRvIHRoZSBzZXR1cCBub3cgaWYgd2UgaGF2ZSBhIFNNUCBCSU9TIGFzIHRoZQorCSAqIHRocm91Z2gtSS9PLUFQSUMgdmlydHVhbCB3aXJlIG1vZGUgbWlnaHQgYmUgYWN0aXZlLgorCSAqLworCWlmIChzbXBfZm91bmRfY29uZmlnIHx8ICFjcHVfaGFzX2FwaWMpCisJCXJldHVybjsKKworCXZhbHVlID0gYXBpY19yZWFkKEFQSUNfTFZSKTsKKwl2ZXIgPSBHRVRfQVBJQ19WRVJTSU9OKHZhbHVlKTsKKworCS8qCisJICogRG8gbm90IHRydXN0IHRoZSBsb2NhbCBBUElDIGJlaW5nIGVtcHR5IGF0IGJvb3R1cC4KKwkgKi8KKwljbGVhcl9sb2NhbF9BUElDKCk7CisKKwkvKgorCSAqIEVuYWJsZSBBUElDLgorCSAqLworCXZhbHVlID0gYXBpY19yZWFkKEFQSUNfU1BJVik7CisJdmFsdWUgJj0gfkFQSUNfVkVDVE9SX01BU0s7CisJdmFsdWUgfD0gQVBJQ19TUElWX0FQSUNfRU5BQkxFRDsKKwkKKwkvKiBUaGlzIGJpdCBpcyByZXNlcnZlZCBvbiBQNC9YZW9uIGFuZCBzaG91bGQgYmUgY2xlYXJlZCAqLworCWlmICgoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfSU5URUwpICYmIChib290X2NwdV9kYXRhLng4NiA9PSAxNSkpCisJCXZhbHVlICY9IH5BUElDX1NQSVZfRk9DVVNfRElTQUJMRUQ7CisJZWxzZQorCQl2YWx1ZSB8PSBBUElDX1NQSVZfRk9DVVNfRElTQUJMRUQ7CisJdmFsdWUgfD0gU1BVUklPVVNfQVBJQ19WRUNUT1I7CisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19TUElWLCB2YWx1ZSk7CisKKwkvKgorCSAqIFNldCB1cCB0aGUgdmlydHVhbCB3aXJlIG1vZGUuCisJICovCisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQwLCBBUElDX0RNX0VYVElOVCk7CisJdmFsdWUgPSBBUElDX0RNX05NSTsKKwlpZiAoIUFQSUNfSU5URUdSQVRFRCh2ZXIpKQkJLyogODI0ODlEWCAqLworCQl2YWx1ZSB8PSBBUElDX0xWVF9MRVZFTF9UUklHR0VSOworCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUMSwgdmFsdWUpOworfQorCit2b2lkIF9faW5pdCBzZXR1cF9sb2NhbF9BUElDICh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgb2xkdmFsdWUsIHZhbHVlLCB2ZXIsIG1heGx2dDsKKworCS8qIFBvdW5kIHRoZSBFU1IgcmVhbGx5IGhhcmQgb3ZlciB0aGUgaGVhZCB3aXRoIGEgYmlnIGhhbW1lciAtIG1ibGlnaCAqLworCWlmIChlc3JfZGlzYWJsZSkgeworCQlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKKwkJYXBpY193cml0ZShBUElDX0VTUiwgMCk7CisJCWFwaWNfd3JpdGUoQVBJQ19FU1IsIDApOworCQlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKKwl9CisKKwl2YWx1ZSA9IGFwaWNfcmVhZChBUElDX0xWUik7CisJdmVyID0gR0VUX0FQSUNfVkVSU0lPTih2YWx1ZSk7CisKKwlpZiAoKFNQVVJJT1VTX0FQSUNfVkVDVE9SICYgMHgwZikgIT0gMHgwZikKKwkJX19lcnJvcl9pbl9hcGljX2MoKTsKKworCS8qCisJICogRG91YmxlLWNoZWNrIHdoZXRoZXIgdGhpcyBBUElDIGlzIHJlYWxseSByZWdpc3RlcmVkLgorCSAqLworCWlmICghYXBpY19pZF9yZWdpc3RlcmVkKCkpCisJCUJVRygpOworCisJLyoKKwkgKiBJbnRlbCByZWNvbW1lbmRzIHRvIHNldCBERlIsIExEUiBhbmQgVFBSIGJlZm9yZSBlbmFibGluZworCSAqIGFuIEFQSUMuICBTZWUgZS5nLiAiQVAtMzg4IDgyNDg5RFggVXNlcidzIE1hbnVhbCIgKEludGVsCisJICogZG9jdW1lbnQgbnVtYmVyIDI5MjExNikuICBTbyBoZXJlIGl0IGdvZXMuLi4KKwkgKi8KKwlpbml0X2FwaWNfbGRyKCk7CisKKwkvKgorCSAqIFNldCBUYXNrIFByaW9yaXR5IHRvICdhY2NlcHQgYWxsJy4gV2UgbmV2ZXIgY2hhbmdlIHRoaXMKKwkgKiBsYXRlciBvbi4KKwkgKi8KKwl2YWx1ZSA9IGFwaWNfcmVhZChBUElDX1RBU0tQUkkpOworCXZhbHVlICY9IH5BUElDX1RQUklfTUFTSzsKKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX1RBU0tQUkksIHZhbHVlKTsKKworCS8qCisJICogTm93IHRoYXQgd2UgYXJlIGFsbCBzZXQgdXAsIGVuYWJsZSB0aGUgQVBJQworCSAqLworCXZhbHVlID0gYXBpY19yZWFkKEFQSUNfU1BJVik7CisJdmFsdWUgJj0gfkFQSUNfVkVDVE9SX01BU0s7CisJLyoKKwkgKiBFbmFibGUgQVBJQworCSAqLworCXZhbHVlIHw9IEFQSUNfU1BJVl9BUElDX0VOQUJMRUQ7CisKKwkvKgorCSAqIFNvbWUgdW5rbm93biBJbnRlbCBJTy9BUElDIChvciBBUElDKSBlcnJhdGEgaXMgYml0aW5nIHVzIHdpdGgKKwkgKiBjZXJ0YWluIG5ldHdvcmtpbmcgY2FyZHMuIElmIGhpZ2ggZnJlcXVlbmN5IGludGVycnVwdHMgYXJlCisJICogaGFwcGVuaW5nIG9uIGEgcGFydGljdWxhciBJT0FQSUMgcGluLCBwbHVzIHRoZSBJT0FQSUMgcm91dGluZworCSAqIGVudHJ5IGlzIG1hc2tlZC91bm1hc2tlZCBhdCBhIGhpZ2ggcmF0ZSBhcyB3ZWxsIHRoZW4gc29vbmVyIG9yCisJICogbGF0ZXIgSU9BUElDIGxpbmUgZ2V0cyAnc3R1Y2snLCBubyBtb3JlIGludGVycnVwdHMgYXJlIHJlY2VpdmVkCisJICogZnJvbSB0aGUgZGV2aWNlLiBJZiBmb2N1cyBDUFUgaXMgZGlzYWJsZWQgdGhlbiB0aGUgaGFuZyBnb2VzCisJICogYXdheSwgb2ggd2VsbCA6LSgKKwkgKgorCSAqIFsgVGhpcyBidWcgY2FuIGJlIHJlcHJvZHVjZWQgZWFzaWx5IHdpdGggYSBsZXZlbC10cmlnZ2VyZWQKKwkgKiAgIFBDSSBOZTIwMDAgbmV0d29ya2luZyBjYXJkcyBhbmQgUElJL1BJSUkgcHJvY2Vzc29ycywgZHVhbAorCSAqICAgQlggY2hpcHNldC4gXQorCSAqLworCS8qCisJICogQWN0dWFsbHkgZGlzYWJsaW5nIHRoZSBmb2N1cyBDUFUgY2hlY2sganVzdCBtYWtlcyB0aGUgaGFuZyBsZXNzCisJICogZnJlcXVlbnQgYXMgaXQgbWFrZXMgdGhlIGludGVycnVwdCBkaXN0cmlidXRvbiBtb2RlbCBiZSBtb3JlCisJICogbGlrZSBMUlUgdGhhbiBNUlUgKHRoZSBzaG9ydC10ZXJtIGxvYWQgaXMgbW9yZSBldmVuIGFjcm9zcyBDUFVzKS4KKwkgKiBTZWUgYWxzbyB0aGUgY29tbWVudCBpbiBlbmRfbGV2ZWxfaW9hcGljX2lycSgpLiAgLS1tYWNybworCSAqLworI2lmIDEKKwkvKiBFbmFibGUgZm9jdXMgcHJvY2Vzc29yIChiaXQ9PTApICovCisJdmFsdWUgJj0gfkFQSUNfU1BJVl9GT0NVU19ESVNBQkxFRDsKKyNlbHNlCisJLyogRGlzYWJsZSBmb2N1cyBwcm9jZXNzb3IgKGJpdD09MSkgKi8KKwl2YWx1ZSB8PSBBUElDX1NQSVZfRk9DVVNfRElTQUJMRUQ7CisjZW5kaWYKKwkvKgorCSAqIFNldCBzcHVyaW91cyBJUlEgdmVjdG9yCisJICovCisJdmFsdWUgfD0gU1BVUklPVVNfQVBJQ19WRUNUT1I7CisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19TUElWLCB2YWx1ZSk7CisKKwkvKgorCSAqIFNldCB1cCBMVlQwLCBMVlQxOgorCSAqCisJICogc2V0IHVwIHRocm91Z2gtbG9jYWwtQVBJQyBvbiB0aGUgQlAncyBMSU5UMC4gVGhpcyBpcyBub3QKKwkgKiBzdHJpY3RseSBuZWNlc3NlcnkgaW4gcHVyZSBzeW1tZXRyaWMtSU8gbW9kZSwgYnV0IHNvbWV0aW1lcworCSAqIHdlIGRlbGVnYXRlIGludGVycnVwdHMgdG8gdGhlIDgyNTlBLgorCSAqLworCS8qCisJICogVE9ETzogc2V0IHVwIHRocm91Z2gtbG9jYWwtQVBJQyBmcm9tIHRocm91Z2gtSS9PLUFQSUM/IC0tbWFjcm8KKwkgKi8KKwl2YWx1ZSA9IGFwaWNfcmVhZChBUElDX0xWVDApICYgQVBJQ19MVlRfTUFTS0VEOworCWlmICghc21wX3Byb2Nlc3Nvcl9pZCgpICYmIChwaWNfbW9kZSB8fCAhdmFsdWUpKSB7CisJCXZhbHVlID0gQVBJQ19ETV9FWFRJTlQ7CisJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgImVuYWJsZWQgRXh0SU5UIG9uIENQVSMlZFxuIiwKKwkJCQlzbXBfcHJvY2Vzc29yX2lkKCkpOworCX0gZWxzZSB7CisJCXZhbHVlID0gQVBJQ19ETV9FWFRJTlQgfCBBUElDX0xWVF9NQVNLRUQ7CisJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgIm1hc2tlZCBFeHRJTlQgb24gQ1BVIyVkXG4iLAorCQkJCXNtcF9wcm9jZXNzb3JfaWQoKSk7CisJfQorCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUMCwgdmFsdWUpOworCisJLyoKKwkgKiBvbmx5IHRoZSBCUCBzaG91bGQgc2VlIHRoZSBMSU5UMSBOTUkgc2lnbmFsLCBvYnZpb3VzbHkuCisJICovCisJaWYgKCFzbXBfcHJvY2Vzc29yX2lkKCkpCisJCXZhbHVlID0gQVBJQ19ETV9OTUk7CisJZWxzZQorCQl2YWx1ZSA9IEFQSUNfRE1fTk1JIHwgQVBJQ19MVlRfTUFTS0VEOworCWlmICghQVBJQ19JTlRFR1JBVEVEKHZlcikpCQkvKiA4MjQ4OURYICovCisJCXZhbHVlIHw9IEFQSUNfTFZUX0xFVkVMX1RSSUdHRVI7CisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQxLCB2YWx1ZSk7CisKKwlpZiAoQVBJQ19JTlRFR1JBVEVEKHZlcikgJiYgIWVzcl9kaXNhYmxlKSB7CQkvKiAhODI0ODlEWCAqLworCQltYXhsdnQgPSBnZXRfbWF4bHZ0KCk7CisJCWlmIChtYXhsdnQgPiAzKQkJLyogRHVlIHRvIHRoZSBQZW50aXVtIGVycmF0dW0gM0FQLiAqLworCQkJYXBpY193cml0ZShBUElDX0VTUiwgMCk7CisJCW9sZHZhbHVlID0gYXBpY19yZWFkKEFQSUNfRVNSKTsKKworCQl2YWx1ZSA9IEVSUk9SX0FQSUNfVkVDVE9SOyAgICAgIC8vIGVuYWJsZXMgc2VuZGluZyBlcnJvcnMKKwkJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlRFUlIsIHZhbHVlKTsKKwkJLyoKKwkJICogc3BlYyBzYXlzIGNsZWFyIGVycm9ycyBhZnRlciBlbmFibGluZyB2ZWN0b3IuCisJCSAqLworCQlpZiAobWF4bHZ0ID4gMykKKwkJCWFwaWNfd3JpdGUoQVBJQ19FU1IsIDApOworCQl2YWx1ZSA9IGFwaWNfcmVhZChBUElDX0VTUik7CisJCWlmICh2YWx1ZSAhPSBvbGR2YWx1ZSkKKwkJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgIkVTUiB2YWx1ZSBiZWZvcmUgZW5hYmxpbmcgIgorCQkJCSJ2ZWN0b3I6IDB4JTA4bHggIGFmdGVyOiAweCUwOGx4XG4iLAorCQkJCW9sZHZhbHVlLCB2YWx1ZSk7CisJfSBlbHNlIHsKKwkJaWYgKGVzcl9kaXNhYmxlKQkKKwkJCS8qIAorCQkJICogU29tZXRoaW5nIHVudHJhY2VibGUgaXMgY3JlYXRpbmcgYmFkIGludGVycnVwdHMgb24gCisJCQkgKiBzZWNvbmRhcnkgcXVhZHMgLi4uIGZvciB0aGUgbW9tZW50LCBqdXN0IGxlYXZlIHRoZQorCQkJICogRVNSIGRpc2FibGVkIC0gd2UgY2FuJ3QgZG8gYW55dGhpbmcgdXNlZnVsIHdpdGggdGhlCisJCQkgKiBlcnJvcnMgYW55d2F5IC0gbWJsaWdoCisJCQkgKi8KKwkJCXByaW50aygiTGVhdmluZyBFU1IgZGlzYWJsZWQuXG4iKTsKKwkJZWxzZSAKKwkJCXByaW50aygiTm8gRVNSIGZvciA4MjQ4OURYLlxuIik7CisJfQorCisJaWYgKG5taV93YXRjaGRvZyA9PSBOTUlfTE9DQUxfQVBJQykKKwkJc2V0dXBfYXBpY19ubWlfd2F0Y2hkb2coKTsKKwlhcGljX3BtX2FjdGl2YXRlKCk7Cit9CisKKy8qCisgKiBJZiBMaW51eCBlbmFibGVkIHRoZSBMQVBJQyBhZ2FpbnN0IHRoZSBCSU9TIGRlZmF1bHQKKyAqIGRpc2FibGUgaXQgZG93biBiZWZvcmUgcmUtZW50ZXJpbmcgdGhlIEJJT1Mgb24gc2h1dGRvd24uCisgKiBPdGhlcndpc2UgdGhlIEJJT1MgbWF5IGdldCBjb25mdXNlZCBhbmQgbm90IHBvd2VyLW9mZi4KKyAqLwordm9pZCBsYXBpY19zaHV0ZG93bih2b2lkKQoreworCWlmICghY3B1X2hhc19hcGljIHx8ICFlbmFibGVkX3ZpYV9hcGljYmFzZSkKKwkJcmV0dXJuOworCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlkaXNhYmxlX2xvY2FsX0FQSUMoKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KKworc3RhdGljIHN0cnVjdCB7CisJaW50IGFjdGl2ZTsKKwkvKiByL3cgYXBpYyBmaWVsZHMgKi8KKwl1bnNpZ25lZCBpbnQgYXBpY19pZDsKKwl1bnNpZ25lZCBpbnQgYXBpY190YXNrcHJpOworCXVuc2lnbmVkIGludCBhcGljX2xkcjsKKwl1bnNpZ25lZCBpbnQgYXBpY19kZnI7CisJdW5zaWduZWQgaW50IGFwaWNfc3BpdjsKKwl1bnNpZ25lZCBpbnQgYXBpY19sdnR0OworCXVuc2lnbmVkIGludCBhcGljX2x2dHBjOworCXVuc2lnbmVkIGludCBhcGljX2x2dDA7CisJdW5zaWduZWQgaW50IGFwaWNfbHZ0MTsKKwl1bnNpZ25lZCBpbnQgYXBpY19sdnRlcnI7CisJdW5zaWduZWQgaW50IGFwaWNfdG1pY3Q7CisJdW5zaWduZWQgaW50IGFwaWNfdGRjcjsKKwl1bnNpZ25lZCBpbnQgYXBpY190aG1yOworfSBhcGljX3BtX3N0YXRlOworCitzdGF0aWMgaW50IGxhcGljX3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKmRldiwgdTMyIHN0YXRlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWFwaWNfcG1fc3RhdGUuYWN0aXZlKQorCQlyZXR1cm4gMDsKKworCWFwaWNfcG1fc3RhdGUuYXBpY19pZCA9IGFwaWNfcmVhZChBUElDX0lEKTsKKwlhcGljX3BtX3N0YXRlLmFwaWNfdGFza3ByaSA9IGFwaWNfcmVhZChBUElDX1RBU0tQUkkpOworCWFwaWNfcG1fc3RhdGUuYXBpY19sZHIgPSBhcGljX3JlYWQoQVBJQ19MRFIpOworCWFwaWNfcG1fc3RhdGUuYXBpY19kZnIgPSBhcGljX3JlYWQoQVBJQ19ERlIpOworCWFwaWNfcG1fc3RhdGUuYXBpY19zcGl2ID0gYXBpY19yZWFkKEFQSUNfU1BJVik7CisJYXBpY19wbV9zdGF0ZS5hcGljX2x2dHQgPSBhcGljX3JlYWQoQVBJQ19MVlRUKTsKKwlhcGljX3BtX3N0YXRlLmFwaWNfbHZ0cGMgPSBhcGljX3JlYWQoQVBJQ19MVlRQQyk7CisJYXBpY19wbV9zdGF0ZS5hcGljX2x2dDAgPSBhcGljX3JlYWQoQVBJQ19MVlQwKTsKKwlhcGljX3BtX3N0YXRlLmFwaWNfbHZ0MSA9IGFwaWNfcmVhZChBUElDX0xWVDEpOworCWFwaWNfcG1fc3RhdGUuYXBpY19sdnRlcnIgPSBhcGljX3JlYWQoQVBJQ19MVlRFUlIpOworCWFwaWNfcG1fc3RhdGUuYXBpY190bWljdCA9IGFwaWNfcmVhZChBUElDX1RNSUNUKTsKKwlhcGljX3BtX3N0YXRlLmFwaWNfdGRjciA9IGFwaWNfcmVhZChBUElDX1REQ1IpOworCWFwaWNfcG1fc3RhdGUuYXBpY190aG1yID0gYXBpY19yZWFkKEFQSUNfTFZUVEhNUik7CisJCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWRpc2FibGVfbG9jYWxfQVBJQygpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsYXBpY19yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBpbnQgbCwgaDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFhcGljX3BtX3N0YXRlLmFjdGl2ZSkKKwkJcmV0dXJuIDA7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGUgQVBJQ0JBU0UgcG9pbnRzIHRvIHRoZSByaWdodCBhZGRyZXNzCisJICoKKwkgKiBGSVhNRSEgVGhpcyB3aWxsIGJlIHdyb25nIGlmIHdlIGV2ZXIgc3VwcG9ydCBzdXNwZW5kIG9uCisJICogU01QISBXZSdsbCBuZWVkIHRvIGRvIHRoaXMgYXMgcGFydCBvZiB0aGUgQ1BVIHJlc3RvcmUhCisJICovCisJcmRtc3IoTVNSX0lBMzJfQVBJQ0JBU0UsIGwsIGgpOworCWwgJj0gfk1TUl9JQTMyX0FQSUNCQVNFX0JBU0U7CisJbCB8PSBNU1JfSUEzMl9BUElDQkFTRV9FTkFCTEUgfCBtcF9sYXBpY19hZGRyOworCXdybXNyKE1TUl9JQTMyX0FQSUNCQVNFLCBsLCBoKTsKKworCWFwaWNfd3JpdGUoQVBJQ19MVlRFUlIsIEVSUk9SX0FQSUNfVkVDVE9SIHwgQVBJQ19MVlRfTUFTS0VEKTsKKwlhcGljX3dyaXRlKEFQSUNfSUQsIGFwaWNfcG1fc3RhdGUuYXBpY19pZCk7CisJYXBpY193cml0ZShBUElDX0RGUiwgYXBpY19wbV9zdGF0ZS5hcGljX2Rmcik7CisJYXBpY193cml0ZShBUElDX0xEUiwgYXBpY19wbV9zdGF0ZS5hcGljX2xkcik7CisJYXBpY193cml0ZShBUElDX1RBU0tQUkksIGFwaWNfcG1fc3RhdGUuYXBpY190YXNrcHJpKTsKKwlhcGljX3dyaXRlKEFQSUNfU1BJViwgYXBpY19wbV9zdGF0ZS5hcGljX3NwaXYpOworCWFwaWNfd3JpdGUoQVBJQ19MVlQwLCBhcGljX3BtX3N0YXRlLmFwaWNfbHZ0MCk7CisJYXBpY193cml0ZShBUElDX0xWVDEsIGFwaWNfcG1fc3RhdGUuYXBpY19sdnQxKTsKKwlhcGljX3dyaXRlKEFQSUNfTFZUVEhNUiwgYXBpY19wbV9zdGF0ZS5hcGljX3RobXIpOworCWFwaWNfd3JpdGUoQVBJQ19MVlRQQywgYXBpY19wbV9zdGF0ZS5hcGljX2x2dHBjKTsKKwlhcGljX3dyaXRlKEFQSUNfTFZUVCwgYXBpY19wbV9zdGF0ZS5hcGljX2x2dHQpOworCWFwaWNfd3JpdGUoQVBJQ19URENSLCBhcGljX3BtX3N0YXRlLmFwaWNfdGRjcik7CisJYXBpY193cml0ZShBUElDX1RNSUNULCBhcGljX3BtX3N0YXRlLmFwaWNfdG1pY3QpOworCWFwaWNfd3JpdGUoQVBJQ19FU1IsIDApOworCWFwaWNfcmVhZChBUElDX0VTUik7CisJYXBpY193cml0ZShBUElDX0xWVEVSUiwgYXBpY19wbV9zdGF0ZS5hcGljX2x2dGVycik7CisJYXBpY193cml0ZShBUElDX0VTUiwgMCk7CisJYXBpY19yZWFkKEFQSUNfRVNSKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGRldmljZSBoYXMgbm8gc2h1dGRvd24gbWV0aG9kIC0gZnVsbHkgZnVuY3Rpb25pbmcgbG9jYWwgQVBJQ3MKKyAqIGFyZSBuZWVkZWQgb24gZXZlcnkgQ1BVIHVwIHVudGlsIG1hY2hpbmVfaGFsdC9yZXN0YXJ0L3Bvd2Vyb2ZmLgorICovCisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIGxhcGljX3N5c2NsYXNzID0geworCXNldF9rc2V0X25hbWUoImxhcGljIiksCisJLnJlc3VtZQkJPSBsYXBpY19yZXN1bWUsCisJLnN1c3BlbmQJPSBsYXBpY19zdXNwZW5kLAorfTsKKworc3RhdGljIHN0cnVjdCBzeXNfZGV2aWNlIGRldmljZV9sYXBpYyA9IHsKKwkuaWQJPSAwLAorCS5jbHMJPSAmbGFwaWNfc3lzY2xhc3MsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgYXBpY19wbV9hY3RpdmF0ZSh2b2lkKQoreworCWFwaWNfcG1fc3RhdGUuYWN0aXZlID0gMTsKK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdF9sYXBpY19zeXNmcyh2b2lkKQoreworCWludCBlcnJvcjsKKworCWlmICghY3B1X2hhc19hcGljKQorCQlyZXR1cm4gMDsKKwkvKiBYWFg6IHJlbW92ZSBzdXNwZW5kL3Jlc3VtZSBwcm9jcyBpZiAhYXBpY19wbV9zdGF0ZS5hY3RpdmU/ICovCisKKwllcnJvciA9IHN5c2Rldl9jbGFzc19yZWdpc3RlcigmbGFwaWNfc3lzY2xhc3MpOworCWlmICghZXJyb3IpCisJCWVycm9yID0gc3lzZGV2X3JlZ2lzdGVyKCZkZXZpY2VfbGFwaWMpOworCXJldHVybiBlcnJvcjsKK30KK2RldmljZV9pbml0Y2FsbChpbml0X2xhcGljX3N5c2ZzKTsKKworI2Vsc2UJLyogQ09ORklHX1BNICovCisKK3N0YXRpYyB2b2lkIGFwaWNfcG1fYWN0aXZhdGUodm9pZCkgeyB9CisKKyNlbmRpZgkvKiBDT05GSUdfUE0gKi8KKworLyoKKyAqIERldGVjdCBhbmQgZW5hYmxlIGxvY2FsIEFQSUNzIG9uIG5vbi1TTVAgYm9hcmRzLgorICogT3JpZ2luYWwgY29kZSB3cml0dGVuIGJ5IEtlaXIgRnJhc2VyLgorICovCisKKy8qCisgKiBLbm9iIHRvIGNvbnRyb2wgb3VyIHdpbGxpbmduZXNzIHRvIGVuYWJsZSB0aGUgbG9jYWwgQVBJQy4KKyAqLworaW50IGVuYWJsZV9sb2NhbF9hcGljIF9faW5pdGRhdGEgPSAwOyAvKiAtMT1mb3JjZS1kaXNhYmxlLCArMT1mb3JjZS1lbmFibGUgKi8KKworc3RhdGljIGludCBfX2luaXQgbGFwaWNfZGlzYWJsZShjaGFyICpzdHIpCit7CisJZW5hYmxlX2xvY2FsX2FwaWMgPSAtMTsKKwljbGVhcl9iaXQoWDg2X0ZFQVRVUkVfQVBJQywgYm9vdF9jcHVfZGF0YS54ODZfY2FwYWJpbGl0eSk7CisJcmV0dXJuIDA7Cit9CitfX3NldHVwKCJub2xhcGljIiwgbGFwaWNfZGlzYWJsZSk7CisKK3N0YXRpYyBpbnQgX19pbml0IGxhcGljX2VuYWJsZShjaGFyICpzdHIpCit7CisJZW5hYmxlX2xvY2FsX2FwaWMgPSAxOworCXJldHVybiAwOworfQorX19zZXR1cCgibGFwaWMiLCBsYXBpY19lbmFibGUpOworCitzdGF0aWMgaW50IF9faW5pdCBhcGljX3NldF92ZXJib3NpdHkoY2hhciAqc3RyKQoreworCWlmIChzdHJjbXAoImRlYnVnIiwgc3RyKSA9PSAwKQorCQlhcGljX3ZlcmJvc2l0eSA9IEFQSUNfREVCVUc7CisJZWxzZSBpZiAoc3RyY21wKCJ2ZXJib3NlIiwgc3RyKSA9PSAwKQorCQlhcGljX3ZlcmJvc2l0eSA9IEFQSUNfVkVSQk9TRTsKKwllbHNlCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFQSUMgVmVyYm9zaXR5IGxldmVsICVzIG5vdCByZWNvZ25pc2VkIgorCQkJCSIgdXNlIGFwaWM9dmVyYm9zZSBvciBhcGljPWRlYnVnIiwgc3RyKTsKKworCXJldHVybiAwOworfQorCitfX3NldHVwKCJhcGljPSIsIGFwaWNfc2V0X3ZlcmJvc2l0eSk7CisKK3N0YXRpYyBpbnQgX19pbml0IGRldGVjdF9pbml0X0FQSUMgKHZvaWQpCit7CisJdTMyIGgsIGwsIGZlYXR1cmVzOworCWV4dGVybiB2b2lkIGdldF9jcHVfdmVuZG9yKHN0cnVjdCBjcHVpbmZvX3g4NiopOworCisJLyogRGlzYWJsZWQgYnkga2VybmVsIG9wdGlvbj8gKi8KKwlpZiAoZW5hYmxlX2xvY2FsX2FwaWMgPCAwKQorCQlyZXR1cm4gLTE7CisKKwkvKiBXb3JrYXJvdW5kIGZvciB1cyBiZWluZyBjYWxsZWQgYmVmb3JlIGlkZW50aWZ5X2NwdSgpLiAqLworCWdldF9jcHVfdmVuZG9yKCZib290X2NwdV9kYXRhKTsKKworCXN3aXRjaCAoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yKSB7CisJY2FzZSBYODZfVkVORE9SX0FNRDoKKwkJaWYgKChib290X2NwdV9kYXRhLng4NiA9PSA2ICYmIGJvb3RfY3B1X2RhdGEueDg2X21vZGVsID4gMSkgfHwKKwkJICAgIChib290X2NwdV9kYXRhLng4NiA9PSAxNSkpCSAgICAKKwkJCWJyZWFrOworCQlnb3RvIG5vX2FwaWM7CisJY2FzZSBYODZfVkVORE9SX0lOVEVMOgorCQlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPT0gNiB8fCBib290X2NwdV9kYXRhLng4NiA9PSAxNSB8fAorCQkgICAgKGJvb3RfY3B1X2RhdGEueDg2ID09IDUgJiYgY3B1X2hhc19hcGljKSkKKwkJCWJyZWFrOworCQlnb3RvIG5vX2FwaWM7CisJZGVmYXVsdDoKKwkJZ290byBub19hcGljOworCX0KKworCWlmICghY3B1X2hhc19hcGljKSB7CisJCS8qCisJCSAqIE92ZXItcmlkZSBCSU9TIGFuZCB0cnkgdG8gZW5hYmxlIHRoZSBsb2NhbAorCQkgKiBBUElDIG9ubHkgaWYgImxhcGljIiBzcGVjaWZpZWQuCisJCSAqLworCQlpZiAoZW5hYmxlX2xvY2FsX2FwaWMgPD0gMCkgeworCQkJcHJpbnRrKCJMb2NhbCBBUElDIGRpc2FibGVkIGJ5IEJJT1MgLS0gIgorCQkJICAgICAgICJ5b3UgY2FuIGVuYWJsZSBpdCB3aXRoIFwibGFwaWNcIlxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJLyoKKwkJICogU29tZSBCSU9TZXMgZGlzYWJsZSB0aGUgbG9jYWwgQVBJQyBpbiB0aGUKKwkJICogQVBJQ19CQVNFIE1TUi4gVGhpcyBjYW4gb25seSBiZSBkb25lIGluCisJCSAqIHNvZnR3YXJlIGZvciBJbnRlbCBQNiBvciBsYXRlciBhbmQgQU1EIEs3CisJCSAqIChNb2RlbCA+IDEpIG9yIGxhdGVyLgorCQkgKi8KKwkJcmRtc3IoTVNSX0lBMzJfQVBJQ0JBU0UsIGwsIGgpOworCQlpZiAoIShsICYgTVNSX0lBMzJfQVBJQ0JBU0VfRU5BQkxFKSkgeworCQkJcHJpbnRrKCJMb2NhbCBBUElDIGRpc2FibGVkIGJ5IEJJT1MgLS0gcmVlbmFibGluZy5cbiIpOworCQkJbCAmPSB+TVNSX0lBMzJfQVBJQ0JBU0VfQkFTRTsKKwkJCWwgfD0gTVNSX0lBMzJfQVBJQ0JBU0VfRU5BQkxFIHwgQVBJQ19ERUZBVUxUX1BIWVNfQkFTRTsKKwkJCXdybXNyKE1TUl9JQTMyX0FQSUNCQVNFLCBsLCBoKTsKKwkJCWVuYWJsZWRfdmlhX2FwaWNiYXNlID0gMTsKKwkJfQorCX0KKwkvKgorCSAqIFRoZSBBUElDIGZlYXR1cmUgYml0IHNob3VsZCBub3cgYmUgZW5hYmxlZAorCSAqIGluIGBjcHVpZCcKKwkgKi8KKwlmZWF0dXJlcyA9IGNwdWlkX2VkeCgxKTsKKwlpZiAoIShmZWF0dXJlcyAmICgxIDw8IFg4Nl9GRUFUVVJFX0FQSUMpKSkgeworCQlwcmludGsoIkNvdWxkIG5vdCBlbmFibGUgQVBJQyFcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXNldF9iaXQoWDg2X0ZFQVRVUkVfQVBJQywgYm9vdF9jcHVfZGF0YS54ODZfY2FwYWJpbGl0eSk7CisJbXBfbGFwaWNfYWRkciA9IEFQSUNfREVGQVVMVF9QSFlTX0JBU0U7CisKKwkvKiBUaGUgQklPUyBtYXkgaGF2ZSBzZXQgdXAgdGhlIEFQSUMgYXQgc29tZSBvdGhlciBhZGRyZXNzICovCisJcmRtc3IoTVNSX0lBMzJfQVBJQ0JBU0UsIGwsIGgpOworCWlmIChsICYgTVNSX0lBMzJfQVBJQ0JBU0VfRU5BQkxFKQorCQltcF9sYXBpY19hZGRyID0gbCAmIE1TUl9JQTMyX0FQSUNCQVNFX0JBU0U7CisKKwlpZiAobm1pX3dhdGNoZG9nICE9IE5NSV9OT05FKQorCQlubWlfd2F0Y2hkb2cgPSBOTUlfTE9DQUxfQVBJQzsKKworCXByaW50aygiRm91bmQgYW5kIGVuYWJsZWQgbG9jYWwgQVBJQyFcbiIpOworCisJYXBpY19wbV9hY3RpdmF0ZSgpOworCisJcmV0dXJuIDA7CisKK25vX2FwaWM6CisJcHJpbnRrKCJObyBsb2NhbCBBUElDIHByZXNlbnQgb3IgaGFyZHdhcmUgZGlzYWJsZWRcbiIpOworCXJldHVybiAtMTsKK30KKwordm9pZCBfX2luaXQgaW5pdF9hcGljX21hcHBpbmdzKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBhcGljX3BoeXM7CisKKwkvKgorCSAqIElmIG5vIGxvY2FsIEFQSUMgY2FuIGJlIGZvdW5kIHRoZW4gc2V0IHVwIGEgZmFrZSBhbGwKKwkgKiB6ZXJvZXMgcGFnZSB0byBzaW11bGF0ZSB0aGUgbG9jYWwgQVBJQyBhbmQgYW5vdGhlcgorCSAqIG9uZSBmb3IgdGhlIElPLUFQSUMuCisJICovCisJaWYgKCFzbXBfZm91bmRfY29uZmlnICYmIGRldGVjdF9pbml0X0FQSUMoKSkgeworCQlhcGljX3BoeXMgPSAodW5zaWduZWQgbG9uZykgYWxsb2NfYm9vdG1lbV9wYWdlcyhQQUdFX1NJWkUpOworCQlhcGljX3BoeXMgPSBfX3BhKGFwaWNfcGh5cyk7CisJfSBlbHNlCisJCWFwaWNfcGh5cyA9IG1wX2xhcGljX2FkZHI7CisKKwlzZXRfZml4bWFwX25vY2FjaGUoRklYX0FQSUNfQkFTRSwgYXBpY19waHlzKTsKKwlwcmludGsoS0VSTl9ERUJVRyAibWFwcGVkIEFQSUMgdG8gJTA4bHggKCUwOGx4KVxuIiwgQVBJQ19CQVNFLAorCSAgICAgICBhcGljX3BoeXMpOworCisJLyoKKwkgKiBGZXRjaCB0aGUgQVBJQyBJRCBvZiB0aGUgQlNQIGluIGNhc2Ugd2UgaGF2ZSBhCisJICogZGVmYXVsdCBjb25maWd1cmF0aW9uIChvciB0aGUgTVAgdGFibGUgaXMgYnJva2VuKS4KKwkgKi8KKwlpZiAoYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkID09IC0xVSkKKwkJYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkID0gR0VUX0FQSUNfSUQoYXBpY19yZWFkKEFQSUNfSUQpKTsKKworI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQworCXsKKwkJdW5zaWduZWQgbG9uZyBpb2FwaWNfcGh5cywgaWR4ID0gRklYX0lPX0FQSUNfQkFTRV8wOworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgbnJfaW9hcGljczsgaSsrKSB7CisJCQlpZiAoc21wX2ZvdW5kX2NvbmZpZykgeworCQkJCWlvYXBpY19waHlzID0gbXBfaW9hcGljc1tpXS5tcGNfYXBpY2FkZHI7CisJCQkJaWYgKCFpb2FwaWNfcGh5cykgeworCQkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkJICAgICAgICJXQVJOSU5HOiBib2d1cyB6ZXJvIElPLUFQSUMgIgorCQkJCQkgICAgICAgImFkZHJlc3MgZm91bmQgaW4gTVBUQUJMRSwgIgorCQkJCQkgICAgICAgImRpc2FibGluZyBJTy9BUElDIHN1cHBvcnQhXG4iKTsKKwkJCQkJc21wX2ZvdW5kX2NvbmZpZyA9IDA7CisJCQkJCXNraXBfaW9hcGljX3NldHVwID0gMTsKKwkJCQkJZ290byBmYWtlX2lvYXBpY19wYWdlOworCQkJCX0KKwkJCX0gZWxzZSB7CitmYWtlX2lvYXBpY19wYWdlOgorCQkJCWlvYXBpY19waHlzID0gKHVuc2lnbmVkIGxvbmcpCisJCQkJCSAgICAgIGFsbG9jX2Jvb3RtZW1fcGFnZXMoUEFHRV9TSVpFKTsKKwkJCQlpb2FwaWNfcGh5cyA9IF9fcGEoaW9hcGljX3BoeXMpOworCQkJfQorCQkJc2V0X2ZpeG1hcF9ub2NhY2hlKGlkeCwgaW9hcGljX3BoeXMpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIm1hcHBlZCBJT0FQSUMgdG8gJTA4bHggKCUwOGx4KVxuIiwKKwkJCSAgICAgICBfX2ZpeF90b192aXJ0KGlkeCksIGlvYXBpY19waHlzKTsKKwkJCWlkeCsrOworCQl9CisJfQorI2VuZGlmCit9CisKKy8qCisgKiBUaGlzIHBhcnQgc2V0cyB1cCB0aGUgQVBJQyAzMiBiaXQgY2xvY2sgaW4gTFZUVDEsIHdpdGggSFogaW50ZXJydXB0cworICogcGVyIHNlY29uZC4gV2UgYXNzdW1lIHRoYXQgdGhlIGNhbGxlciBoYXMgYWxyZWFkeSBzZXQgdXAgdGhlIGxvY2FsCisgKiBBUElDLgorICoKKyAqIFRoZSBBUElDIHRpbWVyIGlzIG5vdCBleGFjdGx5IHN5bmMgd2l0aCB0aGUgZXh0ZXJuYWwgdGltZXIgY2hpcCwgaXQKKyAqIGNsb3NlbHkgZm9sbG93cyBidXMgY2xvY2tzLgorICovCisKKy8qCisgKiBUaGUgdGltZXIgY2hpcCBpcyBhbHJlYWR5IHNldCB1cCBhdCBIWiBpbnRlcnJ1cHRzIHBlciBzZWNvbmQgaGVyZSwKKyAqIGJ1dCB3ZSBkbyBub3QgYWNjZXB0IHRpbWVyIGludGVycnVwdHMgeWV0LiBXZSBvbmx5IGFsbG93IHRoZSBCUAorICogdG8gY2FsaWJyYXRlLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBnZXRfODI1NF90aW1lcl9jb3VudCh2b2lkKQoreworCWV4dGVybiBzcGlubG9ja190IGk4MjUzX2xvY2s7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXVuc2lnbmVkIGludCBjb3VudDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpODI1M19sb2NrLCBmbGFncyk7CisKKwlvdXRiX3AoMHgwMCwgUElUX01PREUpOworCWNvdW50ID0gaW5iX3AoUElUX0NIMCk7CisJY291bnQgfD0gaW5iX3AoUElUX0NIMCkgPDwgODsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmk4MjUzX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBjb3VudDsKK30KKworLyogbmV4dCB0aWNrIGluIDgyNTQgY2FuIGJlIGNhdWdodCBieSBjYXRjaGluZyB0aW1lciB3cmFwYXJvdW5kICovCitzdGF0aWMgdm9pZCBfX2luaXQgd2FpdF84MjU0X3dyYXBhcm91bmQodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgY3Vycl9jb3VudCwgcHJldl9jb3VudDsKKworCWN1cnJfY291bnQgPSBnZXRfODI1NF90aW1lcl9jb3VudCgpOworCWRvIHsKKwkJcHJldl9jb3VudCA9IGN1cnJfY291bnQ7CisJCWN1cnJfY291bnQgPSBnZXRfODI1NF90aW1lcl9jb3VudCgpOworCisJCS8qIHdvcmthcm91bmQgZm9yIGJyb2tlbiBNZXJjdXJ5L05lcHR1bmUgKi8KKwkJaWYgKHByZXZfY291bnQgPj0gY3Vycl9jb3VudCArIDB4MTAwKQorCQkJY3Vycl9jb3VudCA9IGdldF84MjU0X3RpbWVyX2NvdW50KCk7CisKKwl9IHdoaWxlIChwcmV2X2NvdW50ID49IGN1cnJfY291bnQpOworfQorCisvKgorICogRGVmYXVsdCBpbml0aWFsaXphdGlvbiBmb3IgODI1NCB0aW1lcnMuIElmIHdlIHVzZSBvdGhlciB0aW1lcnMgbGlrZSBIUEVULAorICogd2Ugb3ZlcnJpZGUgdGhpcyBsYXRlcgorICovCit2b2lkICgqd2FpdF90aW1lcl90aWNrKSh2b2lkKSBfX2luaXRkYXRhID0gd2FpdF84MjU0X3dyYXBhcm91bmQ7CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdXAgdGhlIGxvY2FsIEFQSUMgdGltZXIsIHdpdGggYSB0aW1lb3V0IG9mCisgKiAnY2xvY2tzJyBBUElDIGJ1cyBjbG9jay4gRHVyaW5nIGNhbGlicmF0aW9uIHdlIGFjdHVhbGx5IGNhbGwKKyAqIHRoaXMgZnVuY3Rpb24gdHdpY2Ugb24gdGhlIGJvb3QgQ1BVLCBvbmNlIHdpdGggYSBib2d1cyB0aW1lb3V0CisgKiB2YWx1ZSwgc2Vjb25kIHRpbWUgZm9yIHJlYWwuIFRoZSBvdGhlciAobm9uY2FsaWJyYXRpbmcpIENQVXMKKyAqIGNhbGwgdGhpcyBmdW5jdGlvbiBvbmx5IG9uY2UsIHdpdGggdGhlIHJlYWwsIGNhbGlicmF0ZWQgdmFsdWUuCisgKgorICogV2UgZG8gcmVhZHMgYmVmb3JlIHdyaXRlcyBldmVuIGlmIHVubmVjZXNzYXJ5LCB0byBnZXQgYXJvdW5kIHRoZQorICogUDUgQVBJQyBkb3VibGUgd3JpdGUgYnVnLgorICovCisKKyNkZWZpbmUgQVBJQ19ESVZJU09SIDE2CisKK3N0YXRpYyB2b2lkIF9fc2V0dXBfQVBJQ19MVlRUKHVuc2lnbmVkIGludCBjbG9ja3MpCit7CisJdW5zaWduZWQgaW50IGx2dHRfdmFsdWUsIHRtcF92YWx1ZSwgdmVyOworCisJdmVyID0gR0VUX0FQSUNfVkVSU0lPTihhcGljX3JlYWQoQVBJQ19MVlIpKTsKKwlsdnR0X3ZhbHVlID0gQVBJQ19MVlRfVElNRVJfUEVSSU9ESUMgfCBMT0NBTF9USU1FUl9WRUNUT1I7CisJaWYgKCFBUElDX0lOVEVHUkFURUQodmVyKSkKKwkJbHZ0dF92YWx1ZSB8PSBTRVRfQVBJQ19USU1FUl9CQVNFKEFQSUNfVElNRVJfQkFTRV9ESVYpOworCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUVCwgbHZ0dF92YWx1ZSk7CisKKwkvKgorCSAqIERpdmlkZSBQSUNMSyBieSAxNgorCSAqLworCXRtcF92YWx1ZSA9IGFwaWNfcmVhZChBUElDX1REQ1IpOworCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfVERDUiwgKHRtcF92YWx1ZQorCQkJCSYgfihBUElDX1REUl9ESVZfMSB8IEFQSUNfVERSX0RJVl9UTUJBU0UpKQorCQkJCXwgQVBJQ19URFJfRElWXzE2KTsKKworCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfVE1JQ1QsIGNsb2Nrcy9BUElDX0RJVklTT1IpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgc2V0dXBfQVBJQ190aW1lcih1bnNpZ25lZCBpbnQgY2xvY2tzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwkvKgorCSAqIFdhaXQgZm9yIElSUTAncyBzbGljZToKKwkgKi8KKwl3YWl0X3RpbWVyX3RpY2soKTsKKworCV9fc2V0dXBfQVBJQ19MVlRUKGNsb2Nrcyk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKy8qCisgKiBJbiB0aGlzIGZ1bmN0aW9uIHdlIGNhbGlicmF0ZSBBUElDIGJ1cyBjbG9ja3MgdG8gdGhlIGV4dGVybmFsCisgKiB0aW1lci4gVW5mb3J0dW5hdGVseSB3ZSBjYW5ub3QgdXNlIGppZmZpZXMgYW5kIHRoZSB0aW1lciBpcnEKKyAqIHRvIGNhbGlicmF0ZSwgc2luY2Ugc29tZSBsYXRlciBib290dXAgY29kZSBkZXBlbmRzIG9uIGdldHRpbmcKKyAqIHRoZSBmaXJzdCBpcnE/IFVnaC4KKyAqCisgKiBXZSB3YW50IHRvIGRvIHRoZSBjYWxpYnJhdGlvbiBvbmx5IG9uY2Ugc2luY2Ugd2UKKyAqIHdhbnQgdG8gaGF2ZSBsb2NhbCB0aW1lciBpcnFzIHN5bmNyb24uIENQVXMgY29ubmVjdGVkCisgKiBieSB0aGUgc2FtZSBBUElDIGJ1cyBoYXZlIHRoZSB2ZXJ5IHNhbWUgYnVzIGZyZXF1ZW5jeS4KKyAqIEFuZCB3ZSB3YW50IHRvIGhhdmUgaXJxcyBvZmYgYW55d2F5cywgbm8gYWNjaWRlbnRhbAorICogQVBJQyBpcnEgdGhhdCB3YXkuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgY2FsaWJyYXRlX0FQSUNfY2xvY2sodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgdDEgPSAwLCB0MiA9IDA7CisJbG9uZyB0dDEsIHR0MjsKKwlsb25nIHJlc3VsdDsKKwlpbnQgaTsKKwljb25zdCBpbnQgTE9PUFMgPSBIWi8xMDsKKworCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgImNhbGlicmF0aW5nIEFQSUMgdGltZXIgLi4uXG4iKTsKKworCS8qCisJICogUHV0IHdoYXRldmVyIGFyYml0cmFyeSAoYnV0IGxvbmcgZW5vdWdoKSB0aW1lb3V0CisJICogdmFsdWUgaW50byB0aGUgQVBJQyBjbG9jaywgd2UganVzdCB3YW50IHRvIGdldCB0aGUKKwkgKiBjb3VudGVyIHJ1bm5pbmcgZm9yIGNhbGlicmF0aW9uLgorCSAqLworCV9fc2V0dXBfQVBJQ19MVlRUKDEwMDAwMDAwMDApOworCisJLyoKKwkgKiBUaGUgdGltZXIgY2hpcCBjb3VudHMgZG93biB0byB6ZXJvLiBMZXQncyB3YWl0CisJICogZm9yIGEgd3JhcGFyb3VuZCB0byBzdGFydCBleGFjdCBtZWFzdXJlbWVudDoKKwkgKiAodGhlIGN1cnJlbnQgdGljayBtaWdodCBoYXZlIGJlZW4gYWxyZWFkeSBoYWxmIGRvbmUpCisJICovCisKKwl3YWl0X3RpbWVyX3RpY2soKTsKKworCS8qCisJICogV2Ugd3JhcHBlZCBhcm91bmQganVzdCBub3cuIExldCdzIHN0YXJ0OgorCSAqLworCWlmIChjcHVfaGFzX3RzYykKKwkJcmR0c2NsbCh0MSk7CisJdHQxID0gYXBpY19yZWFkKEFQSUNfVE1DQ1QpOworCisJLyoKKwkgKiBMZXQncyB3YWl0IExPT1BTIHdyYXByb3VuZHM6CisJICovCisJZm9yIChpID0gMDsgaSA8IExPT1BTOyBpKyspCisJCXdhaXRfdGltZXJfdGljaygpOworCisJdHQyID0gYXBpY19yZWFkKEFQSUNfVE1DQ1QpOworCWlmIChjcHVfaGFzX3RzYykKKwkJcmR0c2NsbCh0Mik7CisKKwkvKgorCSAqIFRoZSBBUElDIGJ1cyBjbG9jayBjb3VudGVyIGlzIDMyIGJpdHMgb25seSwgaXQKKwkgKiBtaWdodCBoYXZlIG92ZXJmbG93biwgYnV0IG5vdGUgdGhhdCB3ZSB1c2Ugc2lnbmVkCisJICogbG9uZ3MsIHRodXMgbm8gZXh0cmEgY2FyZSBuZWVkZWQuCisJICoKKwkgKiB1bmRlcmZsb3duIHRvIGJlIGV4YWN0LCBhcyB0aGUgdGltZXIgY291bnRzIGRvd24gOykKKwkgKi8KKworCXJlc3VsdCA9ICh0dDEtdHQyKSpBUElDX0RJVklTT1IvTE9PUFM7CisKKwlpZiAoY3B1X2hhc190c2MpCisJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgIi4uLi4uIENQVSBjbG9jayBzcGVlZCBpcyAiCisJCQkiJWxkLiUwNGxkIE1Iei5cbiIsCisJCQkoKGxvbmcpKHQyLXQxKS9MT09QUykvKDEwMDAwMDAvSFopLAorCQkJKChsb25nKSh0Mi10MSkvTE9PUFMpJSgxMDAwMDAwL0haKSk7CisKKwlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICIuLi4uLiBob3N0IGJ1cyBjbG9jayBzcGVlZCBpcyAiCisJCSIlbGQuJTA0bGQgTUh6LlxuIiwKKwkJcmVzdWx0LygxMDAwMDAwL0haKSwKKwkJcmVzdWx0JSgxMDAwMDAwL0haKSk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGNhbGlicmF0aW9uX3Jlc3VsdDsKKwordm9pZCBfX2luaXQgc2V0dXBfYm9vdF9BUElDX2Nsb2NrKHZvaWQpCit7CisJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiVXNpbmcgbG9jYWwgQVBJQyB0aW1lciBpbnRlcnJ1cHRzLlxuIik7CisJdXNpbmdfYXBpY190aW1lciA9IDE7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJY2FsaWJyYXRpb25fcmVzdWx0ID0gY2FsaWJyYXRlX0FQSUNfY2xvY2soKTsKKwkvKgorCSAqIE5vdyBzZXQgdXAgdGhlIHRpbWVyIGZvciByZWFsLgorCSAqLworCXNldHVwX0FQSUNfdGltZXIoY2FsaWJyYXRpb25fcmVzdWx0KTsKKworCWxvY2FsX2lycV9lbmFibGUoKTsKK30KKwordm9pZCBfX2luaXQgc2V0dXBfc2Vjb25kYXJ5X0FQSUNfY2xvY2sodm9pZCkKK3sKKwlzZXR1cF9BUElDX3RpbWVyKGNhbGlicmF0aW9uX3Jlc3VsdCk7Cit9CisKK3ZvaWQgX19pbml0IGRpc2FibGVfQVBJQ190aW1lcih2b2lkKQoreworCWlmICh1c2luZ19hcGljX3RpbWVyKSB7CisJCXVuc2lnbmVkIGxvbmcgdjsKKworCQl2ID0gYXBpY19yZWFkKEFQSUNfTFZUVCk7CisJCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUVCwgdiB8IEFQSUNfTFZUX01BU0tFRCk7CisJfQorfQorCit2b2lkIGVuYWJsZV9BUElDX3RpbWVyKHZvaWQpCit7CisJaWYgKHVzaW5nX2FwaWNfdGltZXIpIHsKKwkJdW5zaWduZWQgbG9uZyB2OworCisJCXYgPSBhcGljX3JlYWQoQVBJQ19MVlRUKTsKKwkJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlRULCB2ICYgfkFQSUNfTFZUX01BU0tFRCk7CisJfQorfQorCisvKgorICogdGhlIGZyZXF1ZW5jeSBvZiB0aGUgcHJvZmlsaW5nIHRpbWVyIGNhbiBiZSBjaGFuZ2VkCisgKiBieSB3cml0aW5nIGEgbXVsdGlwbGllciB2YWx1ZSBpbnRvIC9wcm9jL3Byb2ZpbGUuCisgKi8KK2ludCBzZXR1cF9wcm9maWxpbmdfdGltZXIodW5zaWduZWQgaW50IG11bHRpcGxpZXIpCit7CisJaW50IGk7CisKKwkvKgorCSAqIFNhbml0eSBjaGVjay4gW2F0IGxlYXN0IDUwMCBBUElDIGN5Y2xlcyBzaG91bGQgYmUKKwkgKiBiZXR3ZWVuIEFQSUMgaW50ZXJydXB0cyBhcyBhIHJ1bGUgb2YgdGh1bWIsIHRvIGF2b2lkCisJICogaXJxcyBmbG9vZGluZyB1c10KKwkgKi8KKwlpZiAoICghbXVsdGlwbGllcikgfHwgKGNhbGlicmF0aW9uX3Jlc3VsdC9tdWx0aXBsaWVyIDwgNTAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiAKKwkgKiBTZXQgdGhlIG5ldyBtdWx0aXBsaWVyIGZvciBlYWNoIENQVS4gQ1BVcyBkb24ndCBzdGFydCB1c2luZyB0aGUKKwkgKiBuZXcgdmFsdWVzIHVudGlsIHRoZSBuZXh0IHRpbWVyIGludGVycnVwdCBpbiB3aGljaCB0aGV5IGRvIHByb2Nlc3MKKwkgKiBhY2NvdW50aW5nLiBBdCB0aGF0IHRpbWUgdGhleSBhbHNvIGFkanVzdCB0aGVpciBBUElDIHRpbWVycworCSAqIGFjY29yZGluZ2x5LgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyArK2kpCisJCXBlcl9jcHUocHJvZl9tdWx0aXBsaWVyLCBpKSA9IG11bHRpcGxpZXI7CisKKwlyZXR1cm4gMDsKK30KKworI3VuZGVmIEFQSUNfRElWSVNPUgorCisvKgorICogTG9jYWwgdGltZXIgaW50ZXJydXB0IGhhbmRsZXIuIEl0IGRvZXMgYm90aCBwcm9maWxpbmcgYW5kCisgKiBwcm9jZXNzIHN0YXRpc3RpY3MvcmVzY2hlZHVsaW5nLgorICoKKyAqIFdlIGRvIHByb2ZpbGluZyBpbiBldmVyeSBsb2NhbCB0aWNrLCBzdGF0aXN0aWNzL3Jlc2NoZWR1bGluZworICogaGFwcGVuIG9ubHkgZXZlcnkgJ3Byb2ZpbGluZyBtdWx0aXBsaWVyJyB0aWNrcy4gVGhlIGRlZmF1bHQKKyAqIG11bHRpcGxpZXIgaXMgMSBhbmQgaXQgY2FuIGJlIGNoYW5nZWQgYnkgd3JpdGluZyB0aGUgbmV3IG11bHRpcGxpZXIKKyAqIHZhbHVlIGludG8gL3Byb2MvcHJvZmlsZS4KKyAqLworCitpbmxpbmUgdm9pZCBzbXBfbG9jYWxfdGltZXJfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJcHJvZmlsZV90aWNrKENQVV9QUk9GSUxJTkcsIHJlZ3MpOworCWlmICgtLXBlcl9jcHUocHJvZl9jb3VudGVyLCBjcHUpIDw9IDApIHsKKwkJLyoKKwkJICogVGhlIG11bHRpcGxpZXIgbWF5IGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHdlIGdvdAorCQkgKiB0byB0aGlzIHBvaW50IGFzIGEgcmVzdWx0IG9mIHRoZSB1c2VyIHdyaXRpbmcgdG8KKwkJICogL3Byb2MvcHJvZmlsZS4gSW4gdGhpcyBjYXNlIHdlIG5lZWQgdG8gYWRqdXN0IHRoZSBBUElDCisJCSAqIHRpbWVyIGFjY29yZGluZ2x5LgorCQkgKgorCQkgKiBJbnRlcnJ1cHRzIGFyZSBhbHJlYWR5IG1hc2tlZCBvZmYgYXQgdGhpcyBwb2ludC4KKwkJICovCisJCXBlcl9jcHUocHJvZl9jb3VudGVyLCBjcHUpID0gcGVyX2NwdShwcm9mX211bHRpcGxpZXIsIGNwdSk7CisJCWlmIChwZXJfY3B1KHByb2ZfY291bnRlciwgY3B1KSAhPQorCQkJCQlwZXJfY3B1KHByb2Zfb2xkX211bHRpcGxpZXIsIGNwdSkpIHsKKwkJCV9fc2V0dXBfQVBJQ19MVlRUKAorCQkJCQljYWxpYnJhdGlvbl9yZXN1bHQvCisJCQkJCXBlcl9jcHUocHJvZl9jb3VudGVyLCBjcHUpKTsKKwkJCXBlcl9jcHUocHJvZl9vbGRfbXVsdGlwbGllciwgY3B1KSA9CisJCQkJCQlwZXJfY3B1KHByb2ZfY291bnRlciwgY3B1KTsKKwkJfQorCisjaWZkZWYgQ09ORklHX1NNUAorCQl1cGRhdGVfcHJvY2Vzc190aW1lcyh1c2VyX21vZGUocmVncykpOworI2VuZGlmCisJfQorCisJLyoKKwkgKiBXZSB0YWtlIHRoZSAnbG9uZycgcmV0dXJuIHBhdGgsIGFuZCB0aGVyZSBldmVyeSBzdWJzeXN0ZW0KKwkgKiBncmFicyB0aGUgYXByb3ByaWF0ZSBsb2NrcyAoa2VybmVsIGxvY2svIGlycSBsb2NrKS4KKwkgKgorCSAqIHdlIG1pZ2h0IHdhbnQgdG8gZGVjb3VwbGUgcHJvZmlsaW5nIGZyb20gdGhlICdsb25nIHBhdGgnLAorCSAqIGFuZCBkbyB0aGUgcHJvZmlsaW5nIHRvdGFsbHkgaW4gYXNzZW1ibHkuCisJICoKKwkgKiBDdXJyZW50bHkgdGhpcyBpc24ndCB0b28gbXVjaCBvZiBhbiBpc3N1ZSAocGVyZm9ybWFuY2Ugd2lzZSksCisJICogd2UgY2FuIHRha2UgbW9yZSB0aGFuIDEwMEsgbG9jYWwgaXJxcyBwZXIgc2Vjb25kIG9uIGEgMTAwIE1IeiBQNS4KKwkgKi8KK30KKworLyoKKyAqIExvY2FsIEFQSUMgdGltZXIgaW50ZXJydXB0LiBUaGlzIGlzIHRoZSBtb3N0IG5hdHVyYWwgd2F5IGZvciBkb2luZworICogbG9jYWwgaW50ZXJydXB0cywgYnV0IGxvY2FsIHRpbWVyIGludGVycnVwdHMgY2FuIGJlIGVtdWxhdGVkIGJ5CisgKiBicm9hZGNhc3QgaW50ZXJydXB0cyB0b28uIFtpbiBjYXNlIHRoZSBodyBkb2Vzbid0IHN1cHBvcnQgQVBJQyB0aW1lcnNdCisgKgorICogWyBpZiBhIHNpbmdsZS1DUFUgc3lzdGVtIHJ1bnMgYW4gU01QIGtlcm5lbCB0aGVuIHdlIGNhbGwgdGhlIGxvY2FsCisgKiAgIGludGVycnVwdCBhcyB3ZWxsLiBUaHVzIHdlIGNhbm5vdCBpbmxpbmUgdGhlIGxvY2FsIGlycSAuLi4gXQorICovCisKK2Zhc3RjYWxsIHZvaWQgc21wX2FwaWNfdGltZXJfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwkvKgorCSAqIHRoZSBOTUkgZGVhZGxvY2stZGV0ZWN0b3IgdXNlcyB0aGlzLgorCSAqLworCXBlcl9jcHUoaXJxX3N0YXQsIGNwdSkuYXBpY190aW1lcl9pcnFzKys7CisKKwkvKgorCSAqIE5PVEUhIFdlJ2QgYmV0dGVyIEFDSyB0aGUgaXJxIGltbWVkaWF0ZWx5LAorCSAqIGJlY2F1c2UgdGltZXIgaGFuZGxpbmcgY2FuIGJlIHNsb3cuCisJICovCisJYWNrX0FQSUNfaXJxKCk7CisJLyoKKwkgKiB1cGRhdGVfcHJvY2Vzc190aW1lcygpIGV4cGVjdHMgdXMgdG8gaGF2ZSBkb25lIGlycV9lbnRlcigpLgorCSAqIEJlc2lkZXMsIGlmIHdlIGRvbid0IHRpbWVyIGludGVycnVwdHMgaWdub3JlIHRoZSBnbG9iYWwKKwkgKiBpbnRlcnJ1cHQgbG9jaywgd2hpY2ggaXMgdGhlIFdyb25nVGhpbmcgKHRtKSB0byBkby4KKwkgKi8KKwlpcnFfZW50ZXIoKTsKKwlzbXBfbG9jYWxfdGltZXJfaW50ZXJydXB0KHJlZ3MpOworCWlycV9leGl0KCk7Cit9CisKKy8qCisgKiBUaGlzIGludGVycnVwdCBzaG91bGQgX25ldmVyXyBoYXBwZW4gd2l0aCBvdXIgQVBJQy9TTVAgYXJjaGl0ZWN0dXJlCisgKi8KK2Zhc3RjYWxsIHZvaWQgc21wX3NwdXJpb3VzX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIHY7CisKKwlpcnFfZW50ZXIoKTsKKwkvKgorCSAqIENoZWNrIGlmIHRoaXMgcmVhbGx5IGlzIGEgc3B1cmlvdXMgaW50ZXJydXB0IGFuZCBBQ0sgaXQKKwkgKiBpZiBpdCBpcyBhIHZlY3RvcmVkIG9uZS4gIEp1c3QgaW4gY2FzZS4uLgorCSAqIFNwdXJpb3VzIGludGVycnVwdHMgc2hvdWxkIG5vdCBiZSBBQ0tlZC4KKwkgKi8KKwl2ID0gYXBpY19yZWFkKEFQSUNfSVNSICsgKChTUFVSSU9VU19BUElDX1ZFQ1RPUiAmIH4weDFmKSA+PiAxKSk7CisJaWYgKHYgJiAoMSA8PCAoU1BVUklPVVNfQVBJQ19WRUNUT1IgJiAweDFmKSkpCisJCWFja19BUElDX2lycSgpOworCisJLyogc2VlIHN3LWRldi1tYW4gdm9sIDMsIGNoYXB0ZXIgNy40LjEzLjUgKi8KKwlwcmludGsoS0VSTl9JTkZPICJzcHVyaW91cyBBUElDIGludGVycnVwdCBvbiBDUFUjJWQsIHNob3VsZCBuZXZlciBoYXBwZW4uXG4iLAorCQkJc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwlpcnFfZXhpdCgpOworfQorCisvKgorICogVGhpcyBpbnRlcnJ1cHQgc2hvdWxkIG5ldmVyIGhhcHBlbiB3aXRoIG91ciBBUElDL1NNUCBhcmNoaXRlY3R1cmUKKyAqLworCitmYXN0Y2FsbCB2b2lkIHNtcF9lcnJvcl9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyB2LCB2MTsKKworCWlycV9lbnRlcigpOworCS8qIEZpcnN0IHRpY2tsZSB0aGUgaGFyZHdhcmUsIG9ubHkgdGhlbiByZXBvcnQgd2hhdCB3ZW50IG9uLiAtLSBSRVcgKi8KKwl2ID0gYXBpY19yZWFkKEFQSUNfRVNSKTsKKwlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKKwl2MSA9IGFwaWNfcmVhZChBUElDX0VTUik7CisJYWNrX0FQSUNfaXJxKCk7CisJYXRvbWljX2luYygmaXJxX2Vycl9jb3VudCk7CisKKwkvKiBIZXJlIGlzIHdoYXQgdGhlIEFQSUMgZXJyb3IgYml0cyBtZWFuOgorCSAgIDA6IFNlbmQgQ1MgZXJyb3IKKwkgICAxOiBSZWNlaXZlIENTIGVycm9yCisJICAgMjogU2VuZCBhY2NlcHQgZXJyb3IKKwkgICAzOiBSZWNlaXZlIGFjY2VwdCBlcnJvcgorCSAgIDQ6IFJlc2VydmVkCisJICAgNTogU2VuZCBpbGxlZ2FsIHZlY3RvcgorCSAgIDY6IFJlY2VpdmVkIGlsbGVnYWwgdmVjdG9yCisJICAgNzogSWxsZWdhbCByZWdpc3RlciBhZGRyZXNzCisJKi8KKwlwcmludGsgKEtFUk5fREVCVUcgIkFQSUMgZXJyb3Igb24gQ1BVJWQ6ICUwMmx4KCUwMmx4KVxuIiwKKwkgICAgICAgIHNtcF9wcm9jZXNzb3JfaWQoKSwgdiAsIHYxKTsKKwlpcnFfZXhpdCgpOworfQorCisvKgorICogVGhpcyBpbml0aWFsaXplcyB0aGUgSU8tQVBJQyBhbmQgQVBJQyBoYXJkd2FyZSBpZiB0aGlzIGlzCisgKiBhIFVQIGtlcm5lbC4KKyAqLworaW50IF9faW5pdCBBUElDX2luaXRfdW5pcHJvY2Vzc29yICh2b2lkKQoreworCWlmIChlbmFibGVfbG9jYWxfYXBpYyA8IDApCisJCWNsZWFyX2JpdChYODZfRkVBVFVSRV9BUElDLCBib290X2NwdV9kYXRhLng4Nl9jYXBhYmlsaXR5KTsKKworCWlmICghc21wX2ZvdW5kX2NvbmZpZyAmJiAhY3B1X2hhc19hcGljKQorCQlyZXR1cm4gLTE7CisKKwkvKgorCSAqIENvbXBsYWluIGlmIHRoZSBCSU9TIHByZXRlbmRzIHRoZXJlIGlzIG9uZS4KKwkgKi8KKwlpZiAoIWNwdV9oYXNfYXBpYyAmJiBBUElDX0lOVEVHUkFURUQoYXBpY192ZXJzaW9uW2Jvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZF0pKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQklPUyBidWcsIGxvY2FsIEFQSUMgIyVkIG5vdCBkZXRlY3RlZCEuLi5cbiIsCisJCQlib290X2NwdV9waHlzaWNhbF9hcGljaWQpOworCQlyZXR1cm4gLTE7CisJfQorCisJdmVyaWZ5X2xvY2FsX0FQSUMoKTsKKworCWNvbm5lY3RfYnNwX0FQSUMoKTsKKworCXBoeXNfY3B1X3ByZXNlbnRfbWFwID0gcGh5c2lkX21hc2tfb2ZfcGh5c2lkKGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCk7CisKKwlzZXR1cF9sb2NhbF9BUElDKCk7CisKKwlpZiAobm1pX3dhdGNoZG9nID09IE5NSV9MT0NBTF9BUElDKQorCQljaGVja19ubWlfd2F0Y2hkb2coKTsKKyNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKKwlpZiAoc21wX2ZvdW5kX2NvbmZpZykKKwkJaWYgKCFza2lwX2lvYXBpY19zZXR1cCAmJiBucl9pb2FwaWNzKQorCQkJc2V0dXBfSU9fQVBJQygpOworI2VuZGlmCisJc2V0dXBfYm9vdF9BUElDX2Nsb2NrKCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvYXBtLmMgYi9hcmNoL2kzODYva2VybmVsL2FwbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NjQxYTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2FwbS5jCkBAIC0wLDAgKzEsMjQyOCBAQAorLyogLSotIGxpbnV4LWMgLSotCisgKiBBUE0gQklPUyBkcml2ZXIgZm9yIExpbnV4CisgKiBDb3B5cmlnaHQgMTk5NC0yMDAxIFN0ZXBoZW4gUm90aHdlbGwgKHNmckBjYW5iLmF1dWcub3JnLmF1KQorICoKKyAqIEluaXRpYWwgZGV2ZWxvcG1lbnQgb2YgdGhpcyBkcml2ZXIgd2FzIGZ1bmRlZCBieSBORUMgQXVzdHJhbGlhIFAvTAorICoJYW5kIE5FQyBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBPY3RvYmVyIDE5OTUsIFJpayBGYWl0aCAoZmFpdGhAY3MudW5jLmVkdSk6CisgKiAgICBNaW5vciBlbmhhbmNlbWVudHMgYW5kIHVwZGF0ZXMgKHRvIHRoZSBwYXRjaCBzZXQpIGZvciAxLjMueAorICogICAgRG9jdW1lbnRhdGlvbgorICogSmFudWFyeSAxOTk2LCBSaWsgRmFpdGggKGZhaXRoQGNzLnVuYy5lZHUpOgorICogICAgTWFrZSAvcHJvYy9hcG0gZWFzeSB0byBmb3JtYXQgKGJ1bXAgZHJpdmVyIHZlcnNpb24pCisgKiBNYXJjaCAxOTk2LCBSaWsgRmFpdGggKGZhaXRoQGNzLnVuYy5lZHUpOgorICogICAgUHJvaGliaXQgQVBNIEJJT1MgY2FsbHMgdW5sZXNzIGFwbV9lbmFibGVkLgorICogICAgKFRoYW5rcyB0byBVbHJpY2ggV2luZGwgPFVscmljaC5XaW5kbEByei51bmktcmVnZW5zYnVyZy5kZT4pCisgKiBBcHJpbCAxOTk2LCBTdGVwaGVuIFJvdGh3ZWxsIChzZnJAY2FuYi5hdXVnLm9yZy5hdSkKKyAqICAgIFZlcnNpb24gMS4wIGFuZCAxLjEKKyAqIE1heSAxOTk2LCBWZXJzaW9uIDEuMgorICogRmViIDE5OTgsIFZlcnNpb24gMS4zCisgKiBGZWIgMTk5OCwgVmVyc2lvbiAxLjQKKyAqIEF1ZyAxOTk4LCBWZXJzaW9uIDEuNQorICogU2VwIDE5OTgsIFZlcnNpb24gMS42CisgKiBOb3YgMTk5OCwgVmVyc2lvbiAxLjcKKyAqIEphbiAxOTk5LCBWZXJzaW9uIDEuOAorICogSmFuIDE5OTksIFZlcnNpb24gMS45CisgKiBPY3QgMTk5OSwgVmVyc2lvbiAxLjEwCisgKiBOb3YgMTk5OSwgVmVyc2lvbiAxLjExCisgKiBKYW4gMjAwMCwgVmVyc2lvbiAxLjEyCisgKiBGZWIgMjAwMCwgVmVyc2lvbiAxLjEzCisgKiBOb3YgMjAwMCwgVmVyc2lvbiAxLjE0CisgKiBPY3QgMjAwMSwgVmVyc2lvbiAxLjE1CisgKiBKYW4gMjAwMiwgVmVyc2lvbiAxLjE2CisgKiBPY3QgMjAwMiwgVmVyc2lvbiAxLjE2YWMKKyAqCisgKiBIaXN0b3J5OgorICogICAgMC42YjogZmlyc3QgdmVyc2lvbiBpbiBvZmZpY2lhbCBrZXJuZWwsIExpbnV4IDEuMy40NgorICogICAgMC43OiBjaGFuZ2VkIC9wcm9jL2FwbSBmb3JtYXQsIExpbnV4IDEuMy41OAorICogICAgMC44OiBmaXhlZCBnY2MgMi43LlsxMl0gY29tcGlsYXRpb24gcHJvYmxlbXMsIExpbnV4IDEuMy41OQorICogICAgMC45OiBvbmx5IGNhbGwgYmlvcyBpZiBiaW9zIGlzIHByZXNlbnQsIExpbnV4IDEuMy43MgorICogICAgMS4wOiB1c2UgZml4ZWQgZGV2aWNlIG51bWJlciwgY29uc29saWRhdGUgL3Byb2MvYXBtIGludG8gdGhpcyBmaWxlLAorICogICAgICAgICBMaW51eCAxLjMuODUKKyAqICAgIDEuMTogc3VwcG9ydCB1c2VyLXNwYWNlIHN0YW5kYnkgYW5kIHN1c3BlbmQsIHBvd2VyIG9mZiBhZnRlciBzeXN0ZW0KKyAqICAgICAgICAgaGFsdGVkLCBMaW51eCAxLjMuOTgKKyAqICAgIDEuMjogV2hlbiByZXNldHRpbmcgUlRDIGFmdGVyIHJlc3VtZSwgdGFrZSBjYXJlIHNvIHRoYXQgdGhlIHRpbWUKKyAqICAgICAgICAgaXMgb25seSBpbmNvcnJlY3QgYnkgMzAtNjBtUyAodnMuIDFTIHByZXZpb3VzbHkpIChHYWJvciBKLiBUb3RoCisgKiAgICAgICAgIDxqdG90aEBwcmluY2V0b24uZWR1Pik7IGltcHJvdmUgaW50ZXJhY3Rpb24gYmV0d2VlbgorICogICAgICAgICBzY3JlZW4tYmxhbmtpbmcgYW5kIGdwbSAoU3RlcGhlbiBSb3Rod2VsbCk7IExpbnV4IDEuOTkuNAorICogICAgMS4yYTpTaW1wbGUgY2hhbmdlIHRvIHN0b3AgbXlzdGVyaW91cyBidWcgcmVwb3J0cyB3aXRoIFNNUCBhbHNvIGFkZGVkCisgKgkgICBsZXZlbHMgdG8gdGhlIHByaW50ayBjYWxscy4gQVBNIGlzIG5vdCBkZWZpbmVkIGZvciBTTVAgbWFjaGluZXMuCisgKiAgICAgICAgIFRoZSBuZXcgcmVwbGFjbWVudCBmb3IgaXQgaXMsIGJ1dCBMaW51eCBkb2Vzbid0IHlldCBzdXBwb3J0IHRoaXMuCisgKiAgICAgICAgIEFsYW4gQ294IExpbnV4IDIuMS41NQorICogICAgMS4zOiBTZXQgdXAgYSB2YWxpZCBkYXRhIGRlc2NyaXB0b3IgMHg0MCBmb3IgYnVnZ3kgQklPUydzCisgKiAgICAxLjQ6IFVwZ3JhZGVkIHRvIHN1cHBvcnQgQVBNIDEuMi4gSW50ZWdyYXRlZCBUaGlua1BhZCBzdXNwZW5kIHBhdGNoIGJ5CisgKiAgICAgICAgIERlYW4gR2F1ZGV0IDxkZ2F1ZGV0QGFyY3RpYy5vcmc+LgorICogICAgICAgICBDLiBTY290dCBBbmFuaWFuIDxjYW5hbmlhbkBhbHVtbmkucHJpbmNldG9uLmVkdT4gTGludXggMi4xLjg3CisgKiAgICAxLjU6IEZpeCBzZWdtZW50IHJlZ2lzdGVyIHJlbG9hZGluZyAoaW4gY2FzZSBvZiBiYWQgc2VnbWVudHMgc2F2ZWQKKyAqICAgICAgICAgYWNyb3NzIEJJT1MgY2FsbCkuCisgKiAgICAgICAgIFN0ZXBoZW4gUm90aHdlbGwKKyAqICAgIDEuNjogQ29wZSB3aXRoIGNvbXBsaWVyL2Fzc2VtYmxlciBkaWZmZXJlbmNlcy4KKyAqICAgICAgICAgT25seSB0cnkgdG8gdHVybiBvZmYgdGhlIGZpcnN0IGRpc3BsYXkgZGV2aWNlLgorICogICAgICAgICBGaXggT09QUyBhdCBwb3dlciBvZmYgd2l0aCBubyBBUE0gQklPUyBieSBKYW4gRWNodGVybmFjaAorICogICAgICAgICAgICAgICAgICAgPGVjaHRlckBpbmZvcm1hdGlrLnVuaS1yb3N0b2NrLmRlPgorICogICAgICAgICBTdGVwaGVuIFJvdGh3ZWxsCisgKiAgICAxLjc6IE1vZGlmeSBkcml2ZXIncyBjYWNoZWQgY29weSBvZiB0aGUgZGlzYWJsZWQvZGlzZW5nYWdlZCBmbGFncworICogICAgICAgICB0byByZWZsZWN0IGN1cnJlbnQgc3RhdGUgb2YgQVBNIEJJT1MuCisgKiAgICAgICAgIENocmlzIFJhbmtpbiA8cmFua2luY0BiZWxsc291dGgubmV0PgorICogICAgICAgICBSZXNldCBpbnRlcnJ1cHQgMCB0aW1lciB0byAxMDBIeiBhZnRlciBzdXNwZW5kCisgKiAgICAgICAgIENoYWQgTWlsbGVyIDxjbWlsbGVyQHN1cmZzb3V0aC5jb20+CisgKiAgICAgICAgIEFkZCBDT05GSUdfQVBNX0lHTk9SRV9TVVNQRU5EX0JPVU5DRQorICogICAgICAgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAqICAgICAgICAgQWxsb3cgYm9vdCB0aW1lIGRpc2FibGluZyBvZiBBUE0KKyAqICAgICAgICAgTWFrZSBib290IG1lc3NhZ2VzIGZhciBsZXNzIHZlcmJvc2UgYnkgZGVmYXVsdAorICogICAgICAgICBNYWtlIGFzbSBzYWZlcgorICogICAgICAgICBTdGVwaGVuIFJvdGh3ZWxsCisgKiAgICAxLjg6IEFkZCBDT05GSUdfQVBNX1JUQ19JU19HTVQKKyAqICAgICAgICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisgKiAgICAgICAgIGNoYW5nZSBBUE1fTk9JTlRTIHRvIENPTkZJR19BUE1fQUxMT1dfSU5UUworICogICAgICAgICByZW1vdmUgZGVwZW5kZW5jeSBvbiBDT05GSUdfUFJPQ19GUworICogICAgICAgICBTdGVwaGVuIFJvdGh3ZWxsCisgKiAgICAxLjk6IEZpeCBzbWFsbCB0eXBvLiAgPGxhc2xvQHdvZGlwLm9wb2xlLnBsPgorICogICAgICAgICBUcnkgdG8gY29wZSB3aXRoIEJJT1MncyB0aGF0IG5lZWQgdG8gaGF2ZSBhbGwgZGlzcGxheQorICogICAgICAgICBkZXZpY2VzIGJsYW5rZWQgYW5kIG5vdCBqdXN0IHRoZSBmaXJzdCBvbmUuCisgKiAgICAgICAgIFJvc3MgUGF0ZXJzb24gPHJvc3NAc29pLmNpdHkuYWMudWs+CisgKiAgICAgICAgIEZpeCBzZWdtZW50IGxpbWl0IHNldHRpbmcgaXQgaGFzIGFsd2F5cyBiZWVuIHdyb25nIGFzCisgKiAgICAgICAgIHRoZSBzZWdtZW50cyBuZWVkZWQgdG8gaGF2ZSBieXRlIGdyYW51bGFyaXR5LgorICogICAgICAgICBNYXJrIGEgZmV3IHRoaW5ncyBfX2luaXQuCisgKiAgICAgICAgIEFkZCBoYWNrIHRvIGFsbG93IHBvd2VyIG9mZiBvZiBTTVAgc3lzdGVtcyBieSBwb3B1bGFyIHJlcXVlc3QuCisgKiAgICAgICAgIFVzZSBDT05GSUdfU01QIGluc3RlYWQgb2YgX19TTVBfXworICogICAgICAgICBJZ25vcmUgQk9VTkNFUyBmb3IgdGhyZWUgc2Vjb25kcy4KKyAqICAgICAgICAgU3RlcGhlbiBSb3Rod2VsbAorICogICAxLjEwOiBGaXggZm9yIFRoaW5rcGFkIHJldHVybiBjb2RlLgorICogICAgICAgICBNZXJnZSAyLjIgYW5kIDIuMyBkcml2ZXJzLgorICogICAgICAgICBSZW1vdmUgQVBNIGRlcGVuZGVuY2llcyBpbiBhcmNoL2kzODYva2VybmVsL3Byb2Nlc3MuYworICogICAgICAgICBSZW1vdmUgQVBNIGRlcGVuZGVuY2llcyBpbiBkcml2ZXJzL2NoYXIvc3lzcnEuYworICogICAgICAgICBSZXNldCB0aW1lIGFjcm9zcyBzdGFuZGJ5LgorICogICAgICAgICBBbGxvdyBtb3JlIGluaXRpdGlhbGlzYXRpb24gb24gU01QLgorICogICAgICAgICBSZW1vdmUgQ09ORklHX0FQTV9QT1dFUl9PRkYgYW5kIG1ha2UgaXQgYm9vdCB0aW1lCisgKiAgICAgICAgIGNvbmZpZ3VyYWJsZSAoZGVmYXVsdCBvbikuCisgKiAgICAgICAgIE1ha2UgZGVidWcgb25seSBhIGJvb3QgdGltZSBwYXJhbWV0ZXIgKHJlbW92ZSBBUE1fREVCVUcpLgorICogICAgICAgICBUcnkgdG8gYmxhbmsgYWxsIGRldmljZXMgb24gYW55IGVycm9yLgorICogICAxLjExOiBSZW1vdmUgQVBNIGRlcGVuZGVuY2llcyBpbiBkcml2ZXJzL2NoYXIvY29uc29sZS5jCisgKiAgICAgICAgIENoZWNrIG5yX3J1bm5pbmcgdG8gZGV0ZWN0IGlmIHdlIGFyZSBpZGxlIChmcm9tCisgKiAgICAgICAgIEJvcmlzbGF2IERlaWFub3YgPGJvcmlzbGF2QGxpeC5wb2x5dGVjaG5pcXVlLmZyPikKKyAqICAgICAgICAgRml4IGZvciBiaW9zZXMgdGhhdCBkb24ndCB6ZXJvIHRoZSB0b3AgcGFydCBvZiB0aGUKKyAqICAgICAgICAgZW50cnlwb2ludCBvZmZzZXQgKE1hcmlvIFNpdHRhIDxzaXR0YUBhbC51bmlwbW4uaXQ+KQorICogICAgICAgICAocmVwb3J0ZWQgYnkgUGFub3MgS2F0c2Fsb3VsaXMgPHRlcmFzQHdyaXRlbWUuY29tPikuCisgKiAgICAgICAgIFJlYWwgbW9kZSBwb3dlciBvZmYgcGF0Y2ggKFdhbHRlciBIb2ZtYW5uCisgKiAgICAgICAgIDxXYWx0ZXIuSG9mbWFubkBwaHlzaWsuc3R1ZC51bmktZXJsYW5nZW4uZGU+KS4KKyAqICAgMS4xMjogUmVtb3ZlIENPTkZJR19TTVAgYXMgdGhlIGNvbXBpbGVyIHdpbGwgb3B0aW1pemUKKyAqICAgICAgICAgdGhlIGNvZGUgYXdheSBhbnl3YXkgKHNtcF9udW1fY3B1cyA9PSAxIGluIFVQKQorICogICAgICAgICBub3RlZCBieSBBcnR1ciBTa2F3aW5hIDxza2F3aW5hQGdlb2NpdGllcy5jb20+LgorICogICAgICAgICBNYWtlIHBvd2VyIG9mZiB1bmRlciBTTVAgd29yayBhZ2Fpbi4KKyAqICAgICAgICAgRml4IHRoaW5rbyB3aXRoIGluaXRpYWwgZW5nYWdpbmcgb2YgQklPUy4KKyAqICAgICAgICAgTWFrZSBzdXJlIHBvd2VyIG9mZiBvbmx5IGhhcHBlbnMgb24gQ1BVIDAKKyAqICAgICAgICAgKFBhdWwgIlJ1c3R5IiBSdXNzZWxsIDxydXN0eUBydXN0Y29ycC5jb20uYXU+KS4KKyAqICAgICAgICAgRG8gZXJyb3Igbm90aWZpY2F0aW9uIHRvIHVzZXIgbW9kZSBpZiBCSU9TIGNhbGxzIGZhaWwuCisgKiAgICAgICAgIE1vdmUgZW50cnlwb2ludCBvZmZzZXQgZml4IHRvIC4uLmJvb3Qvc2V0dXAuUworICogICAgICAgICB3aGVyZSBpdCBiZWxvbmdzIChDb3Ntb3MgPGdpczg4NTY0QGNpcy5uY3R1LmVkdS50dz4pLgorICogICAgICAgICBSZW1vdmUgc21wLXBvd2VyLW9mZi4gU01QIHVzZXJzIG11c3Qgbm93IHNwZWNpZnkKKyAqICAgICAgICAgImFwbT1wb3dlci1vZmYiIG9uIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLiBTdWdnZXN0ZWQKKyAqICAgICAgICAgYnkgSmltIEF2ZXJhIDxqaW1hQGhhbC5jb20+LCBtb2RpZmllZCBieSBBbGFuIENveAorICogICAgICAgICA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPi4KKyAqICAgICAgICAgUmVnaXN0ZXIgdGhlIC9wcm9jL2FwbSBlbnRyeSBldmVuIG9uIFNNUCBzbyB0aGF0CisgKiAgICAgICAgIHNjcmlwdHMgdGhhdCBjaGVjayBmb3IgaXQgYmVmb3JlIGRvaW5nIHBvd2VyIG9mZgorICogICAgICAgICB3b3JrIChKaW0gQXZlcmEgPGppbWFAaGFsLmNvbT4pLgorICogICAxLjEzOiBDaGFuZ2VzIGZvciBuZXcgcG1fIGludGVyZmFjZXMgKEFuZHkgSGVucm9pZAorICogICAgICAgICA8YW5keV9oZW5yb2lkQHlhaG9vLmNvbT4pLgorICogICAgICAgICBNb2R1bGFyaXplIHRoZSBjb2RlLgorICogICAgICAgICBGaXggdGhlIFRoaW5rcGFkIChhZ2FpbikgOi0oIChDT05GSUdfQVBNX0lHTk9SRV9NVUxUSVBMRV9TVVNQRU5EUworICogICAgICAgICBpcyBub3cgdGhlIHdheSBsaWZlIHdvcmtzKS4KKyAqICAgICAgICAgRml4IHRoaW5rbyBpbiBzdXNwZW5kKCkgKHdyb25nIHJldHVybikuCisgKiAgICAgICAgIE5vdGlmeSBkcml2ZXJzIG9uIGNyaXRpY2FsIHN1c3BlbmQuCisgKiAgICAgICAgIE1ha2Uga2FwbWQgYWJzb3JiIG1vcmUgaWRsZSB0aW1lIChQYXZlbCBNYWNoZWsgPHBhdmVsQHN1c2UuY3o+CisgKiAgICAgICAgIG1vZGlmaWVkIGJ5IHNmcikuCisgKiAgICAgICAgIERpc2FibGUgaW50ZXJydXB0cyB3aGlsZSB3ZSBhcmUgc3VzcGVuZGVkIChBbmR5IEhlbnJvaWQKKyAqICAgICAgICAgPGFuZHlfaGVucm9pZEB5YWhvby5jb20+IGZpeGVkIGJ5IHNmcikuCisgKiAgICAgICAgIE1ha2UgcG93ZXIgb2ZmIHdvcmsgb24gU01QIGFnYWluIChUb255IEhveWxlCisgKiAgICAgICAgIDx0bWhAbWFnZW50YS1sb2dpYy5jb20+IGFuZCA8emxhdGtvQGlza29uLmhyPikgbW9kaWZpZWQgYnkgc2ZyLgorICogICAgICAgICBSZW1vdmUgQ09ORklHX0FQTV9TVVNQRU5EX0JPVU5DRS4gIFRoZSBib3VuY2UgaWdub3JlCisgKiAgICAgICAgIGludGVydmFsIGlzIG5vdyBjb25maWd1cmFibGUuCisgKiAgIDEuMTQ6IE1ha2UgY29ubmVjdGlvbiB2ZXJzaW9uIHBlcnNpc3QgYWNyb3NzIG1vZHVsZSB1bmxvYWQvbG9hZC4KKyAqICAgICAgICAgRW5hYmxlIGFuZCBlbmdhZ2UgcG93ZXIgbWFuYWdlbWVudCBlYXJsaWVyLgorICogICAgICAgICBEaXNlbmdhZ2UgcG93ZXIgbWFuYWdlbWVudCBvbiBtb2R1bGUgdW5sb2FkLgorICogICAgICAgICBDaGFuZ2VkIHRvIHVzZSB0aGUgc3lzcnEtcmVnaXN0ZXIgaGFjayBmb3IgcmVnaXN0ZXJpbmcgdGhlCisgKiAgICAgICAgIHBvd2VyIG9mZiBmdW5jdGlvbiBjYWxsZWQgYnkgbWFnaWMgc3lzcnEgYmFzZWQgdXBvbiBkaXNjdXNzaW9ucworICogICAgICAgICBpbiBpcmM6Ly9pcmMub3BlbnByb2plY3RzLm5ldC8ja2VybmVsbmV3YmllcworICogICAgICAgICAoQ3J1dGNoZXIgRHVubmF2YW50IDxjcnV0Y2hlcitrZXJuZWxAZGF0YXN0YWNrcy5jb20+KS4KKyAqICAgICAgICAgTWFrZSBDT05GSUdfQVBNX1JFQUxfTU9ERV9QT1dFUl9PRkYgcnVuIHRpbWUgY29uZmlndXJhYmxlLgorICogICAgICAgICAoQXJqYW4gdmFuIGRlIFZlbiA8YXJqYW52QHJlZGhhdC5jb20+KSBtb2RpZmllZCBieSBzZnIuCisgKiAgICAgICAgIFdvcmsgYXJvdW5kIGJ5dGUgc3dhcCBidWcgaW4gb25lIG9mIHRoZSBWYWlvJ3MgQklPUydzCisgKiAgICAgICAgIChNYXJjIEJvdWNoZXIgPG1hcmNAbWJzaS5jYT4pLgorICogICAgICAgICBFeHBvc2VkIHRoZSBkaXNhYmxlIGZsYWcgdG8gZG1pIHNvIHRoYXQgd2UgY2FuIGhhbmRsZSBrbm93bgorICogICAgICAgICBicm9rZW4gQVBNIChBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPikuCisgKiAgIDEuMTRhYzogSWYgdGhlIEJJT1Mgc2F5cyAiSSBzbG93ZWQgdGhlIENQVSBkb3duIiB0aGVuIGRvbid0IHNwaW4KKyAqICAgICAgICAgY2FsbGluZyBpdCAtIGluc3RlYWQgaWRsZS4gKEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+KQorICogICAgICAgICBJZiBhbiBBUE0gaWRsZSBmYWlscyBsb2cgaXQgYW5kIGlkbGUgc2Vuc2libHkKKyAqICAgMS4xNTogRG9uJ3QgcXVldWUgZXZlbnRzIHRvIGNsaWVudHMgd2hvIG9wZW4gdGhlIGRldmljZSBPX1dST05MWS4KKyAqICAgICAgICAgRG9uJ3QgZXhwZWN0IHJlcGxpZXMgZnJvbSBjbGllbnRzIHdobyBvcGVuIHRoZSBkZXZpY2UgT19SRE9OTFkuCisgKiAgICAgICAgIChJZGVhIGZyb20gVGhvbWFzIEhvb2QpCisgKiAgICAgICAgIE1pbm9yIHdhaXRxdWV1ZSBjbGVhbnVwcy4gKEpvaG4gRnJlbWxpbiA8Y2hpZWZAYmFuZGl0cy5vcmc+KQorICogICAxLjE2OiBGaXggaWRsZSBjYWxsaW5nLiAoQW5kcmVhcyBTdGVpbm1ldHogPGFzdEBkb21kdi5kZT4gZXQgYWwuKQorICogICAgICAgICBOb3RpZnkgbGlzdGVuZXJzIG9mIHN0YW5kYnkgb3Igc3VzcGVuZCBldmVudHMgYmVmb3JlIG5vdGlmeWluZworICogICAgICAgICBkcml2ZXJzLiBSZXR1cm4gRUJVU1kgdG8gaW9jdGwoKSBpZiBzdXNwZW5kIGlzIHJlamVjdGVkLgorICogICAgICAgICAoUnVzc2VsbCBLaW5nIDxybWtAYXJtLmxpbnV4Lm9yZy51az4gYW5kIFRob21hcyBIb29kKQorICogICAgICAgICBJZ25vcmUgZmlyc3QgcmVzdW1lIGFmdGVyIHdlIGdlbmVyYXRlIG91ciBvd24gcmVzdW1lIGV2ZW50CisgKiAgICAgICAgIGFmdGVyIGEgc3VzcGVuZCAoVGhvbWFzIEhvb2QpCisgKiAgICAgICAgIERhZW1vbml6ZSBub3cgZ2V0cyByaWQgb2Ygb3VyIGNvbnRyb2xsaW5nIHRlcm1pbmFsIChzZnIpLgorICogICAgICAgICBDT05GSUdfQVBNX0NQVV9JRExFIG5vdyBqdXN0IGFmZmVjdHMgdGhlIGRlZmF1bHQgdmFsdWUgb2YKKyAqICAgICAgICAgaWRsZV90aHJlc2hvbGQgKHNmcikuCisgKiAgICAgICAgIENoYW5nZSBuYW1lIG9mIGtlcm5lbCBhcG0gZGFlbW9uIChhcyBpdCBubyBsb25nZXIgaWRsZXMpIChzZnIpLgorICogICAxLjE2YWM6IEZpeCB1cCBTTVAgc3VwcG9ydCBzb21ld2hhdC4gWW91IGNhbiBub3cgZm9yY2UgU01QIG9uIGFuZCB3ZQorICoJICAgbWFrZSBfYWxsXyBBUE0gY2FsbHMgb24gdGhlIENQVSMwLiBGaXggdW5zYWZlIHNpZ24gYnVnLgorICoJICAgVE9ETzogZGV0ZXJtaW5lIGlmIGl0cyAiYm9vdCBDUFUiIG9yICJDUFUwIiB3ZSB3YW50IHRvIGxvY2sgdG8uCisgKgorICogQVBNIDEuMSBSZWZlcmVuY2U6CisgKgorICogICBJbnRlbCBDb3Jwb3JhdGlvbiwgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBZHZhbmNlZCBQb3dlciBNYW5hZ2VtZW50CisgKiAgIChBUE0pIEJJT1MgSW50ZXJmYWNlIFNwZWNpZmljYXRpb24sIFJldmlzaW9uIDEuMSwgU2VwdGVtYmVyIDE5OTMuCisgKiAgIEludGVsIE9yZGVyIE51bWJlciAyNDE3MDQtMDAxLiAgTWljcm9zb2Z0IFBhcnQgTnVtYmVyIDc4MS0xMTAtWDAxLgorICoKKyAqIFtUaGlzIGRvY3VtZW50IGlzIGF2YWlsYWJsZSBmcmVlIGZyb20gSW50ZWwgYnkgY2FsbGluZyA4MDAuNjI4Ljg2ODYgKGZheAorICogOTE2LjM1Ni42MTAwKSBvciA4MDAuNTQ4LjQ3MjU7IG9yIHZpYSBhbm9ueW1vdXMgZnRwIGZyb20KKyAqIGZ0cDovL2Z0cC5pbnRlbC5jb20vcHViL0lBTC9zb2Z0d2FyZV9zcGVjcy9hcG12MTEuZG9jLiAgSXQgaXMgYWxzbworICogYXZhaWxhYmxlIGZyb20gTWljcm9zb2Z0IGJ5IGNhbGxpbmcgMjA2Ljg4Mi44MDgwLl0KKyAqCisgKiBBUE0gMS4yIFJlZmVyZW5jZToKKyAqICAgSW50ZWwgQ29ycG9yYXRpb24sIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWR2YW5jZWQgUG93ZXIgTWFuYWdlbWVudAorICogICAoQVBNKSBCSU9TIEludGVyZmFjZSBTcGVjaWZpY2F0aW9uLCBSZXZpc2lvbiAxLjIsIEZlYnJ1YXJ5IDE5OTYuCisgKgorICogW1RoaXMgZG9jdW1lbnQgaXMgYXZhaWxhYmxlIGZyb20gTWljcm9zb2Z0IGF0OgorICogICAgaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL2h3ZGV2L2J1c2Jpb3MvYW1wXzEyLmh0bV0KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2FwbV9iaW9zLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vZGVzYy5oPgorCisjaW5jbHVkZSAiaW9fcG9ydHMuaCIKKworZXh0ZXJuIHNwaW5sb2NrX3QgaTgyNTNfbG9jazsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGdldF9jbW9zX3RpbWUodm9pZCk7CitleHRlcm4gdm9pZCBtYWNoaW5lX3JlYWxfcmVzdGFydCh1bnNpZ25lZCBjaGFyICosIGludCk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19BUE1fRElTUExBWV9CTEFOSykgJiYgZGVmaW5lZChDT05GSUdfVlQpCitleHRlcm4gaW50ICgqY29uc29sZV9ibGFua19ob29rKShpbnQpOworI2VuZGlmCisKKy8qCisgKiBUaGUgYXBtX2Jpb3MgZGV2aWNlIGlzIG9uZSBvZiB0aGUgbWlzYyBjaGFyIGRldmljZXMuCisgKiBUaGlzIGlzIGl0cyBtaW5vciBudW1iZXIuCisgKi8KKyNkZWZpbmUJQVBNX01JTk9SX0RFVgkxMzQKKworLyoKKyAqIFNlZSBEb2N1bWVudGF0aW9uL0NvbmZpZy5oZWxwIGZvciB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zLgorICoKKyAqIFZhcmlvdXMgb3B0aW9ucyBjYW4gYmUgY2hhbmdlZCBhdCBib290IHRpbWUgYXMgZm9sbG93czoKKyAqIChXZSBhbGxvdyB1bmRlcnNjb3JlcyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBtb2R1bGVzIGNvZGUpCisgKglhcG09b24vb2ZmCQkJZW5hYmxlL2Rpc2FibGUgQVBNCisgKgkgICAgW25vLV1hbGxvd1stX11pbnRzCQlhbGxvdyBpbnRlcnJ1cHRzIGR1cmluZyBCSU9TIGNhbGxzCisgKgkgICAgW25vLV1icm9rZW5bLV9dcHNyCQlCSU9TIGhhcyBhIGJyb2tlbiBHZXRQb3dlclN0YXR1cyBjYWxsCisgKgkgICAgW25vLV1yZWFsbW9kZVstX11wb3dlclstX11vZmYJc3dpdGNoIHRvIHJlYWwgbW9kZSBiZWZvcmUKKyAqCSAgICAJCQkJCXBvd2VyaW5nIG9mZgorICoJICAgIFtuby1dZGVidWcJCQlsb2cgc29tZSBkZWJ1Z2dpbmcgbWVzc2FnZXMKKyAqCSAgICBbbm8tXXBvd2VyWy1fXW9mZgkJcG93ZXIgb2ZmIG9uIHNodXRkb3duCisgKgkgICAgW25vLV1zbXAJCQlVc2UgYXBtIGV2ZW4gb24gYW4gU01QIGJveAorICoJICAgIGJvdW5jZVstX11pbnRlcnZhbD08bj4JbnVtYmVyIG9mIHRpY2tzIHRvIGlnbm9yZSBzdXNwZW5kCisgKgkgICAgCQkJCWJvdW5jZXMKKyAqICAgICAgICAgIGlkbGVbLV9ddGhyZXNob2xkPTxuPiAgICAgICBTeXN0ZW0gaWRsZSBwZXJjZW50YWdlIGFib3ZlIHdoaWNoIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZSBBUE0gQklPUyBpZGxlIGNhbGxzLiBTZXQgaXQgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAgdG8gZGlzYWJsZS4KKyAqICAgICAgICAgIGlkbGVbLV9dcGVyaW9kPTxuPiAgICAgICAgICBQZXJpb2QgKGluIDEvMTAwcyBvZiBhIHNlY29uZCkgb3ZlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHRoZSBpZGxlIHBlcmNlbnRhZ2UgaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGVkLgorICovCisKKy8qIEtOT1dOIFBST0JMRU0gTUFDSElORVM6CisgKgorICogVTogVEkgNDAwME0gVHJhdmVsTWF0ZTogQklPUyBpcyAqTk9UKiBBUE0gY29tcGxpYW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICBbQ29uZmlybWVkIGJ5IFRJIHJlcHJlc2VudGF0aXZlXQorICogPzogQUNFUiA0ODZEWDQvNzU6IHVzZXMgZHNlZyAwMDQwLCBpbiB2aW9sYXRpb24gb2YgQVBNIHNwZWNpZmljYXRpb24KKyAqICAgICAgICAgICAgICAgICAgICBbQ29uZmlybWVkIGJ5IEJJT1MgZGlzYXNzZW1ibHldCisgKiAgICAgICAgICAgICAgICAgICAgW1RoaXMgbWF5IHdvcmsgbm93IC4uLl0KKyAqIFA6IFRvc2hpYmEgMTk1MFM6IGJhdHRlcnkgbGlmZSBpbmZvcm1hdGlvbiBvbmx5IGdldHMgdXBkYXRlZCBhZnRlciByZXN1bWUKKyAqIFA6IE1pZHdlc3QgTWljcm8gU291bmRib29rIEVsaXRlIERYMi82NiBtb25vY2hyb21lOiBzY3JlZW4gYmxhbmtpbmcKKyAqIAlicm9rZW4gaW4gQklPUyBbUmVwb3J0ZWQgYnkgR2Fyc3QgUi4gUmVlc2UgPHJlZXNlQGlzbi5uZXQ+XQorICogPzogQWNlck5vdGUtOTUwOiBvb3BzIG9uIHJlYWRpbmcgL3Byb2MvYXBtIC0gd29ya2Fyb3VuZCBpcyBhIFdJUAorICogCU5lYWxlIEJhbmtzIDxuZWFsZUBsb3dlbmRhbGUuY29tLmF1PiBEZWNlbWJlciAyMDAwCisgKgorICogTGVnZW5kOiBVID0gdW51c2FibGUgd2l0aCBBUE0gcGF0Y2hlcworICogICAgICAgICBQID0gcGFydGlhbGx5IHVzYWJsZSB3aXRoIEFQTSBwYXRjaGVzCisgKi8KKworLyoKKyAqIERlZmluZSBhcyAxIHRvIG1ha2UgdGhlIGRyaXZlciBhbHdheXMgY2FsbCB0aGUgQVBNIEJJT1MgYnVzeQorICogcm91dGluZSBldmVuIGlmIHRoZSBjbG9jayB3YXMgbm90IHJlcG9ydGVkIGFzIHNsb3dlZCBieSB0aGUKKyAqIGlkbGUgcm91dGluZS4gIE90aGVyd2lzZSwgZGVmaW5lIGFzIDAuCisgKi8KKyNkZWZpbmUgQUxXQVlTX0NBTExfQlVTWSAgIDEKKworLyoKKyAqIERlZmluZSB0byBtYWtlIHRoZSBBUE0gQklPUyBjYWxscyB6ZXJvIGFsbCBkYXRhIHNlZ21lbnQgcmVnaXN0ZXJzIChzbworICogdGhhdCBhbiBpbmNvcnJlY3QgQklPUyBpbXBsZW1lbnRhdGlvbiB3aWxsIGNhdXNlIGEga2VybmVsIHBhbmljIGlmIGl0CisgKiB0cmllcyB0byB3cml0ZSB0byBhcmJpdHJhcnkgbWVtb3J5KS4KKyAqLworI2RlZmluZSBBUE1fWkVST19TRUdTCisKKyNpbmNsdWRlICJhcG0uaCIKKworLyoKKyAqIERlZmluZSB0byBtYWtlIGFsbCBfc2V0X2xpbWl0IGNhbGxzIHVzZSA2NGsgbGltaXRzLiAgVGhlIEFQTSAxLjEgQklPUyBpcworICogc3VwcG9zZWQgdG8gcHJvdmlkZSBsaW1pdCBpbmZvcm1hdGlvbiB0aGF0IGl0IHJlY29nbml6ZXMuICBNYW55IG1hY2hpbmVzCisgKiBkbyB0aGlzIGNvcnJlY3RseSwgYnV0IG1hbnkgb3RoZXJzIGRvIG5vdCByZXN0cmljdCB0aGVtc2VsdmVzIHRvIHRoZWlyCisgKiBjbGFpbWVkIGxpbWl0LiAgV2hlbiB0aGlzIGhhcHBlbnMsIHRoZXkgd2lsbCBjYXVzZSBhIHNlZ21lbnRhdGlvbgorICogdmlvbGF0aW9uIGluIHRoZSBrZXJuZWwgYXQgYm9vdCB0aW1lLiAgTW9zdCBCSU9TJ3MsIGhvd2V2ZXIsIHdpbGwKKyAqIHJlc3BlY3QgYSA2NGsgbGltaXQsIHNvIHdlIHVzZSB0aGF0LiAgSWYgeW91IHdhbnQgdG8gYmUgcGVkYW50aWMgYW5kCisgKiBob2xkIHlvdXIgQklPUyB0byBpdHMgY2xhaW1zLCB0aGVuIHVuZGVmaW5lIHRoaXMuCisgKi8KKyNkZWZpbmUgQVBNX1JFTEFYX1NFR01FTlRTCisKKy8qCisgKiBEZWZpbmUgdG8gcmUtaW5pdGlhbGl6ZSB0aGUgaW50ZXJydXB0IDAgdGltZXIgdG8gMTAwIEh6IGFmdGVyIGEgc3VzcGVuZC4KKyAqIFRoaXMgcGF0Y2hlZCBieSBDaGFkIE1pbGxlciA8Y21pbGxlckBzdXJmc291dGguY29tPiwgb3JpZ2luYWwgY29kZSBieQorICogRGF2aWQgQ2hlbiA8Y2hlbkBjdHBhMDQubWl0LmVkdT4KKyAqLworI3VuZGVmIElOSVRfVElNRVJfQUZURVJfU1VTUEVORAorCisjaWZkZWYgSU5JVF9USU1FUl9BRlRFUl9TVVNQRU5ECisjaW5jbHVkZSA8bGludXgvdGltZXguaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2VuZGlmCisKKy8qCisgKiBOZWVkIHRvIHBvbGwgdGhlIEFQTSBCSU9TIGV2ZXJ5IHNlY29uZAorICovCisjZGVmaW5lIEFQTV9DSEVDS19USU1FT1VUCShIWikKKworLyoKKyAqIElnbm9yZSBzdXNwZW5kIGV2ZW50cyBmb3IgdGhpcyBhbW91bnQgb2YgdGltZSBhZnRlciBhIHJlc3VtZQorICovCisjZGVmaW5lIERFRkFVTFRfQk9VTkNFX0lOVEVSVkFMCQkoMyAqIEhaKQorCisvKgorICogTWF4aW11bSBudW1iZXIgb2YgZXZlbnRzIHN0b3JlZAorICovCisjZGVmaW5lIEFQTV9NQVhfRVZFTlRTCQkyMAorCisvKgorICogVGhlIHBlci1maWxlIEFQTSBkYXRhCisgKi8KK3N0cnVjdCBhcG1fdXNlciB7CisJaW50CQltYWdpYzsKKwlzdHJ1Y3QgYXBtX3VzZXIgKgluZXh0OworCWludAkJc3VzZXI6IDE7CisJaW50CQl3cml0ZXI6IDE7CisJaW50CQlyZWFkZXI6IDE7CisJaW50CQlzdXNwZW5kX3dhaXQ6IDE7CisJaW50CQlzdXNwZW5kX3Jlc3VsdDsKKwlpbnQJCXN1c3BlbmRzX3BlbmRpbmc7CisJaW50CQlzdGFuZGJ5c19wZW5kaW5nOworCWludAkJc3VzcGVuZHNfcmVhZDsKKwlpbnQJCXN0YW5kYnlzX3JlYWQ7CisJaW50CQlldmVudF9oZWFkOworCWludAkJZXZlbnRfdGFpbDsKKwlhcG1fZXZlbnRfdAlldmVudHNbQVBNX01BWF9FVkVOVFNdOworfTsKKworLyoKKyAqIFRoZSBtYWdpYyBudW1iZXIgaW4gYXBtX3VzZXIKKyAqLworI2RlZmluZSBBUE1fQklPU19NQUdJQwkJMHg0MTAxCisKKy8qCisgKiBpZGxlIHBlcmNlbnRhZ2UgYWJvdmUgd2hpY2ggYmlvcyBpZGxlIGNhbGxzIGFyZSBkb25lCisgKi8KKyNpZmRlZiBDT05GSUdfQVBNX0NQVV9JRExFCisjZGVmaW5lIERFRkFVTFRfSURMRV9USFJFU0hPTEQJOTUKKyNlbHNlCisjZGVmaW5lIERFRkFVTFRfSURMRV9USFJFU0hPTEQJMTAwCisjZW5kaWYKKyNkZWZpbmUgREVGQVVMVF9JRExFX1BFUklPRAkoMTAwIC8gMykKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlcworICovCitzdGF0aWMgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nCW9mZnNldDsKKwl1bnNpZ25lZCBzaG9ydAlzZWdtZW50OworfQkJCQlhcG1fYmlvc19lbnRyeTsKK3N0YXRpYyBpbnQJCQljbG9ja19zbG93ZWQ7CitzdGF0aWMgaW50CQkJaWRsZV90aHJlc2hvbGQgPSBERUZBVUxUX0lETEVfVEhSRVNIT0xEOworc3RhdGljIGludAkJCWlkbGVfcGVyaW9kID0gREVGQVVMVF9JRExFX1BFUklPRDsKK3N0YXRpYyBpbnQJCQlzZXRfcG1faWRsZTsKK3N0YXRpYyBpbnQJCQlzdXNwZW5kc19wZW5kaW5nOworc3RhdGljIGludAkJCXN0YW5kYnlzX3BlbmRpbmc7CitzdGF0aWMgaW50CQkJaWdub3JlX3N5c19zdXNwZW5kOworc3RhdGljIGludAkJCWlnbm9yZV9ub3JtYWxfcmVzdW1lOworc3RhdGljIGludAkJCWJvdW5jZV9pbnRlcnZhbCA9IERFRkFVTFRfQk9VTkNFX0lOVEVSVkFMOworCisjaWZkZWYgQ09ORklHX0FQTV9SVENfSVNfR01UCisjCWRlZmluZQljbG9ja19jbW9zX2RpZmYJMAorIwlkZWZpbmUJZ290X2Nsb2NrX2RpZmYJMQorI2Vsc2UKK3N0YXRpYyBsb25nCQkJY2xvY2tfY21vc19kaWZmOworc3RhdGljIGludAkJCWdvdF9jbG9ja19kaWZmOworI2VuZGlmCitzdGF0aWMgaW50CQkJZGVidWc7CitzdGF0aWMgaW50CQkJc21wOworc3RhdGljIGludAkJCWFwbV9kaXNhYmxlZCA9IC0xOworI2lmZGVmIENPTkZJR19TTVAKK3N0YXRpYyBpbnQJCQlwb3dlcl9vZmY7CisjZWxzZQorc3RhdGljIGludAkJCXBvd2VyX29mZiA9IDE7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVBNX1JFQUxfTU9ERV9QT1dFUl9PRkYKK3N0YXRpYyBpbnQJCQlyZWFsbW9kZV9wb3dlcl9vZmYgPSAxOworI2Vsc2UKK3N0YXRpYyBpbnQJCQlyZWFsbW9kZV9wb3dlcl9vZmY7CisjZW5kaWYKK3N0YXRpYyBpbnQJCQlleGl0X2thcG1kOworc3RhdGljIGludAkJCWthcG1kX3J1bm5pbmc7CisjaWZkZWYgQ09ORklHX0FQTV9BTExPV19JTlRTCitzdGF0aWMgaW50CQkJYWxsb3dfaW50cyA9IDE7CisjZWxzZQorc3RhdGljIGludAkJCWFsbG93X2ludHM7CisjZW5kaWYKK3N0YXRpYyBpbnQJCQlicm9rZW5fcHNyOworCitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoYXBtX3dhaXRxdWV1ZSk7CitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoYXBtX3N1c3BlbmRfd2FpdHF1ZXVlKTsKK3N0YXRpYyBzdHJ1Y3QgYXBtX3VzZXIgKgl1c2VyX2xpc3Q7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHVzZXJfbGlzdF9sb2NrKTsKK3N0YXRpYyBzdHJ1Y3QgZGVzY19zdHJ1Y3QJYmFkX2Jpb3NfZGVzYyA9IHsgMCwgMHgwMDQwOTIwMCB9OworCitzdGF0aWMgY2hhcgkJCWRyaXZlcl92ZXJzaW9uW10gPSAiMS4xNmFjIjsJLyogbm8gc3BhY2VzICovCisKKy8qCisgKglBUE0gZXZlbnQgbmFtZXMgdGFrZW4gZnJvbSB0aGUgQVBNIDEuMiBzcGVjaWZpY2F0aW9uLiBUaGVzZSBhcmUKKyAqCXRoZSBtZXNzYWdlIGNvZGVzIHRoYXQgdGhlIEJJT1MgdXNlcyB0byB0ZWxsIHVzIGFib3V0IGV2ZW50cworICovCitzdGF0aWMgY2hhciAqCWFwbV9ldmVudF9uYW1lW10gPSB7CisJInN5c3RlbSBzdGFuZGJ5IiwKKwkic3lzdGVtIHN1c3BlbmQiLAorCSJub3JtYWwgcmVzdW1lIiwKKwkiY3JpdGljYWwgcmVzdW1lIiwKKwkibG93IGJhdHRlcnkiLAorCSJwb3dlciBzdGF0dXMgY2hhbmdlIiwKKwkidXBkYXRlIHRpbWUiLAorCSJjcml0aWNhbCBzdXNwZW5kIiwKKwkidXNlciBzdGFuZGJ5IiwKKwkidXNlciBzdXNwZW5kIiwKKwkic3lzdGVtIHN0YW5kYnkgcmVzdW1lIiwKKwkiY2FwYWJpbGl0aWVzIGNoYW5nZSIKK307CisjZGVmaW5lIE5SX0FQTV9FVkVOVF9OQU1FCVwKKwkJKHNpemVvZihhcG1fZXZlbnRfbmFtZSkgLyBzaXplb2YoYXBtX2V2ZW50X25hbWVbMF0pKQorCit0eXBlZGVmIHN0cnVjdCBsb29rdXBfdCB7CisJaW50CWtleTsKKwljaGFyICoJbXNnOworfSBsb29rdXBfdDsKKworLyoKKyAqCVRoZSBCSU9TIHJldHVybnMgYSBzZXQgb2Ygc3RhbmRhcmQgZXJyb3IgY29kZXMgaW4gQVggd2hlbiB0aGUKKyAqCWNhcnJ5IGZsYWcgaXMgc2V0LgorICovCisgCitzdGF0aWMgY29uc3QgbG9va3VwX3QgZXJyb3JfdGFibGVbXSA9IHsKKy8qIE4vQQl7IEFQTV9TVUNDRVNTLAkJIk9wZXJhdGlvbiBzdWNjZWVkZWQiIH0sICovCisJeyBBUE1fRElTQUJMRUQsCQkiUG93ZXIgbWFuYWdlbWVudCBkaXNhYmxlZCIgfSwKKwl7IEFQTV9DT05ORUNURUQsCSJSZWFsIG1vZGUgaW50ZXJmYWNlIGFscmVhZHkgY29ubmVjdGVkIiB9LAorCXsgQVBNX05PVF9DT05ORUNURUQsCSJJbnRlcmZhY2Ugbm90IGNvbm5lY3RlZCIgfSwKKwl7IEFQTV8xNl9DT05ORUNURUQsCSIxNiBiaXQgaW50ZXJmYWNlIGFscmVhZHkgY29ubmVjdGVkIiB9LAorLyogTi9BCXsgQVBNXzE2X1VOU1VQUE9SVEVELAkiMTYgYml0IGludGVyZmFjZSBub3Qgc3VwcG9ydGVkIiB9LCAqLworCXsgQVBNXzMyX0NPTk5FQ1RFRCwJIjMyIGJpdCBpbnRlcmZhY2UgYWxyZWFkeSBjb25uZWN0ZWQiIH0sCisJeyBBUE1fMzJfVU5TVVBQT1JURUQsCSIzMiBiaXQgaW50ZXJmYWNlIG5vdCBzdXBwb3J0ZWQiIH0sCisJeyBBUE1fQkFEX0RFVklDRSwJIlVucmVjb2duaXplZCBkZXZpY2UgSUQiIH0sCisJeyBBUE1fQkFEX1BBUkFNLAkiUGFyYW1ldGVyIG91dCBvZiByYW5nZSIgfSwKKwl7IEFQTV9OT1RfRU5HQUdFRCwJIkludGVyZmFjZSBub3QgZW5nYWdlZCIgfSwKKwl7IEFQTV9CQURfRlVOQ1RJT04sICAgICAiRnVuY3Rpb24gbm90IHN1cHBvcnRlZCIgfSwKKwl7IEFQTV9SRVNVTUVfRElTQUJMRUQsCSJSZXN1bWUgdGltZXIgZGlzYWJsZWQiIH0sCisJeyBBUE1fQkFEX1NUQVRFLAkiVW5hYmxlIHRvIGVudGVyIHJlcXVlc3RlZCBzdGF0ZSIgfSwKKy8qIE4vQQl7IEFQTV9OT19FVkVOVFMsCSJObyBldmVudHMgcGVuZGluZyIgfSwgKi8KKwl7IEFQTV9OT19FUlJPUiwJCSJCSU9TIGRpZCBub3Qgc2V0IGEgcmV0dXJuIGNvZGUiIH0sCisJeyBBUE1fTk9UX1BSRVNFTlQsCSJObyBBUE0gcHJlc2VudCIgfQorfTsKKyNkZWZpbmUgRVJST1JfQ09VTlQJKHNpemVvZihlcnJvcl90YWJsZSkvc2l6ZW9mKGxvb2t1cF90KSkKKworLyoqCisgKglhcG1fZXJyb3IJLQlkaXNwbGF5IGFuIEFQTSBlcnJvcgorICoJQHN0cjogaW5mb3JtYXRpb24gc3RyaW5nCisgKglAZXJyOiBBUE0gQklPUyByZXR1cm4gY29kZQorICoKKyAqCVdyaXRlIGEgbWVhbmluZ2Z1bCBsb2cgZW50cnkgdG8gdGhlIGtlcm5lbCBsb2cgaW4gdGhlIGV2ZW50IG9mCisgKglhbiBBUE0gZXJyb3IuCisgKi8KKyAKK3N0YXRpYyB2b2lkIGFwbV9lcnJvcihjaGFyICpzdHIsIGludCBlcnIpCit7CisJaW50CWk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRVJST1JfQ09VTlQ7IGkrKykKKwkJaWYgKGVycm9yX3RhYmxlW2ldLmtleSA9PSBlcnIpIGJyZWFrOworCWlmIChpIDwgRVJST1JfQ09VTlQpCisJCXByaW50ayhLRVJOX05PVElDRSAiYXBtOiAlczogJXNcbiIsIHN0ciwgZXJyb3JfdGFibGVbaV0ubXNnKTsKKwllbHNlCisJCXByaW50ayhLRVJOX05PVElDRSAiYXBtOiAlczogdW5rbm93biBlcnJvciBjb2RlICUjMi4yeFxuIiwKKwkJCXN0ciwgZXJyKTsKK30KKworLyoKKyAqIExvY2sgQVBNIGZ1bmN0aW9uYWxpdHkgdG8gcGh5c2ljYWwgQ1BVIDAKKyAqLworIAorI2lmZGVmIENPTkZJR19TTVAKKworc3RhdGljIGNwdW1hc2tfdCBhcG1fc2F2ZV9jcHVzKHZvaWQpCit7CisJY3B1bWFza190IHggPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CisJLyogU29tZSBiaW9zZXMgZG9uJ3QgbGlrZSBiZWluZyBjYWxsZWQgZnJvbSBDUFUgIT0gMCAqLworCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgY3B1bWFza19vZl9jcHUoMCkpOworCUJVR19PTihzbXBfcHJvY2Vzc29yX2lkKCkgIT0gMCk7CisJcmV0dXJuIHg7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcG1fcmVzdG9yZV9jcHVzKGNwdW1hc2tfdCBtYXNrKQoreworCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgbWFzayk7Cit9CisKKyNlbHNlCisKKy8qCisgKglObyBDUFUgbG9ja2Rvd24gbmVlZGVkIG9uIGEgdW5pcHJvY2Vzc29yCisgKi8KKyAKKyNkZWZpbmUgYXBtX3NhdmVfY3B1cygpCQkoY3VycmVudC0+Y3B1c19hbGxvd2VkKQorI2RlZmluZSBhcG1fcmVzdG9yZV9jcHVzKHgpCSh2b2lkKSh4KQorCisjZW5kaWYKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgYWN0dWFsIEJJT1MgY2FsbHMuICBEZXBlbmRpbmcgb24gQVBNX1pFUk9fU0VHUyBhbmQKKyAqIGFwbV9pbmZvLmFsbG93X2ludHMsIHdlIGFyZSBiZWluZyByZWFsbHkgcGFyYW5vaWQgaGVyZSEgIE5vdCBvbmx5CisgKiBhcmUgaW50ZXJydXB0cyBkaXNhYmxlZCwgYnV0IGFsbCB0aGUgc2VnbWVudCByZWdpc3RlcnMgKGV4Y2VwdCBTUykKKyAqIGFyZSBzYXZlZCBhbmQgemVyb2VkIHRoaXMgbWVhbnMgdGhhdCBpZiB0aGUgQklPUyB0cmllcyB0byByZWZlcmVuY2UKKyAqIGFueSBkYXRhIHdpdGhvdXQgZXhwbGljaXRseSBsb2FkaW5nIHRoZSBzZWdtZW50IHJlZ2lzdGVycywgdGhlIGtlcm5lbAorICogd2lsbCBmYXVsdCBpbW1lZGlhdGVseSByYXRoZXIgdGhhbiBoYXZlIHNvbWUgdW5mb3Jlc2VlbiBjaXJjdW1zdGFuY2VzCisgKiBmb3IgdGhlIHJlc3Qgb2YgdGhlIGtlcm5lbC4gIEFuZCBpdCB3aWxsIGJlIHZlcnkgb2J2aW91cyEgIDotKSBEb2luZworICogdGhpcyBkZXBlbmRzIG9uIENTIHJlZmVycmluZyB0byB0aGUgc2FtZSBwaHlzaWNhbCBtZW1vcnkgYXMgRFMgc28gdGhhdAorICogRFMgY2FuIGJlIHplcm9lZCBiZWZvcmUgdGhlIGNhbGwuIFVuZm9ydHVuYXRlbHksIHdlIGNhbid0IGRvIGFueXRoaW5nCisgKiBhYm91dCB0aGUgc3RhY2sgc2VnbWVudC9wb2ludGVyLiAgQWxzbywgd2UgdGVsbCB0aGUgY29tcGlsZXIgdGhhdAorICogZXZlcnl0aGluZyBjb3VsZCBjaGFuZ2UuCisgKgorICogQWxzbywgd2UgS05PVyB0aGF0IGZvciB0aGUgbm9uIGVycm9yIGNhc2Ugb2YgYXBtX2Jpb3NfY2FsbCwgdGhlcmUKKyAqIGlzIG5vIHVzZWZ1bCBkYXRhIHJldHVybmVkIGluIHRoZSBsb3cgb3JkZXIgOCBiaXRzIG9mIGVheC4KKyAqLworI2RlZmluZSBBUE1fRE9fQ0xJCVwKKwlpZiAoYXBtX2luZm8uYWxsb3dfaW50cykgXAorCQlsb2NhbF9pcnFfZW5hYmxlKCk7IFwKKwllbHNlIFwKKwkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKworI2lmZGVmIEFQTV9aRVJPX1NFR1MKKyMJZGVmaW5lIEFQTV9ERUNMX1NFR1MgXAorCQl1bnNpZ25lZCBpbnQgc2F2ZWRfZnM7IHVuc2lnbmVkIGludCBzYXZlZF9nczsKKyMJZGVmaW5lIEFQTV9ET19TQVZFX1NFR1MgXAorCQlzYXZlc2VnbWVudChmcywgc2F2ZWRfZnMpOyBzYXZlc2VnbWVudChncywgc2F2ZWRfZ3MpCisjCWRlZmluZSBBUE1fRE9fUkVTVE9SRV9TRUdTIFwKKwkJbG9hZHNlZ21lbnQoZnMsIHNhdmVkX2ZzKTsgbG9hZHNlZ21lbnQoZ3MsIHNhdmVkX2dzKQorI2Vsc2UKKyMJZGVmaW5lIEFQTV9ERUNMX1NFR1MKKyMJZGVmaW5lIEFQTV9ET19TQVZFX1NFR1MKKyMJZGVmaW5lIEFQTV9ET19SRVNUT1JFX1NFR1MKKyNlbmRpZgorCisvKioKKyAqCWFwbV9iaW9zX2NhbGwJLQlNYWtlIGFuIEFQTSBCSU9TIDMyYml0IGNhbGwKKyAqCUBmdW5jOiBBUE0gZnVuY3Rpb24gdG8gZXhlY3V0ZQorICoJQGVieF9pbjogRUJYIHJlZ2lzdGVyIGZvciBjYWxsIGVudHJ5CisgKglAZWN4X2luOiBFQ1ggcmVnaXN0ZXIgZm9yIGNhbGwgZW50cnkKKyAqCUBlYXg6IEVBWCByZWdpc3RlciByZXR1cm4KKyAqCUBlYng6IEVCWCByZWdpc3RlciByZXR1cm4KKyAqCUBlY3g6IEVDWCByZWdpc3RlciByZXR1cm4KKyAqCUBlZHg6IEVEWCByZWdpc3RlciByZXR1cm4KKyAqCUBlc2k6IEVTSSByZWdpc3RlciByZXR1cm4KKyAqCisgKglNYWtlIGFuIEFQTSBjYWxsIHVzaW5nIHRoZSAzMmJpdCBwcm90ZWN0ZWQgbW9kZSBpbnRlcmZhY2UuIFRoZQorICoJY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBrbm93aW5nIGlmIEFQTSBCSU9TIGlzIGNvbmZpZ3VyZWQgYW5kCisgKgllbmFibGVkLiBUaGlzIGNhbGwgY2FuIGRpc2FibGUgaW50ZXJydXB0cyBmb3IgYSBsb25nIHBlcmlvZCBvZgorICoJdGltZSBvbiBzb21lIGxhcHRvcHMuICBUaGUgcmV0dXJuIHZhbHVlIGlzIGluIEFIIGFuZCB0aGUgY2FycnkKKyAqCWZsYWcgaXMgbG9hZGVkIGludG8gQUwuICBJZiB0aGVyZSBpcyBhbiBlcnJvciwgdGhlbiB0aGUgZXJyb3IKKyAqCWNvZGUgaXMgcmV0dXJuZWQgaW4gQUggKGJpdHMgOC0xNSBvZiBlYXgpIGFuZCB0aGlzIGZ1bmN0aW9uCisgKglyZXR1cm5zIG5vbi16ZXJvLgorICovCisgCitzdGF0aWMgdTggYXBtX2Jpb3NfY2FsbCh1MzIgZnVuYywgdTMyIGVieF9pbiwgdTMyIGVjeF9pbiwKKwl1MzIgKmVheCwgdTMyICplYngsIHUzMiAqZWN4LCB1MzIgKmVkeCwgdTMyICplc2kpCit7CisJQVBNX0RFQ0xfU0VHUworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCWNwdW1hc2tfdAkJY3B1czsKKwlpbnQJCQljcHU7CisJc3RydWN0IGRlc2Nfc3RydWN0CXNhdmVfZGVzY180MDsKKworCWNwdXMgPSBhcG1fc2F2ZV9jcHVzKCk7CisJCisJY3B1ID0gZ2V0X2NwdSgpOworCXNhdmVfZGVzY180MCA9IHBlcl9jcHUoY3B1X2dkdF90YWJsZSwgY3B1KVsweDQwIC8gOF07CisJcGVyX2NwdShjcHVfZ2R0X3RhYmxlLCBjcHUpWzB4NDAgLyA4XSA9IGJhZF9iaW9zX2Rlc2M7CisKKwlsb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKTsKKwlBUE1fRE9fQ0xJOworCUFQTV9ET19TQVZFX1NFR1M7CisJYXBtX2Jpb3NfY2FsbF9hc20oZnVuYywgZWJ4X2luLCBlY3hfaW4sIGVheCwgZWJ4LCBlY3gsIGVkeCwgZXNpKTsKKwlBUE1fRE9fUkVTVE9SRV9TRUdTOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlwZXJfY3B1KGNwdV9nZHRfdGFibGUsIGNwdSlbMHg0MCAvIDhdID0gc2F2ZV9kZXNjXzQwOworCXB1dF9jcHUoKTsKKwlhcG1fcmVzdG9yZV9jcHVzKGNwdXMpOworCQorCXJldHVybiAqZWF4ICYgMHhmZjsKK30KKworLyoqCisgKglhcG1fYmlvc19jYWxsX3NpbXBsZQktCW1ha2UgYSBzaW1wbGUgQVBNIEJJT1MgMzJiaXQgY2FsbAorICoJQGZ1bmM6IEFQTSBmdW5jdGlvbiB0byBpbnZva2UKKyAqCUBlYnhfaW46IEVCWCByZWdpc3RlciB2YWx1ZSBmb3IgQklPUyBjYWxsCisgKglAZWN4X2luOiBFQ1ggcmVnaXN0ZXIgdmFsdWUgZm9yIEJJT1MgY2FsbAorICoJQGVheDogRUFYIHJlZ2lzdGVyIG9uIHJldHVybiBmcm9tIHRoZSBCSU9TIGNhbGwKKyAqCisgKglNYWtlIGEgQklPUyBjYWxsIHRoYXQgZG9lcyBvbmx5IHJldHVybnMgb25lIHZhbHVlLCBvciBqdXN0IHN0YXR1cy4KKyAqCUlmIHRoZXJlIGlzIGFuIGVycm9yLCB0aGVuIHRoZSBlcnJvciBjb2RlIGlzIHJldHVybmVkIGluIEFICisgKgkoYml0cyA4LTE1IG9mIGVheCkgYW5kIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBub24temVyby4gVGhpcyBpcworICoJdXNlZCBmb3Igc2ltcGxlciBCSU9TIG9wZXJhdGlvbnMuIFRoaXMgY2FsbCBtYXkgaG9sZCBpbnRlcnJ1cHRzCisgKglvZmYgZm9yIGEgbG9uZyB0aW1lIG9uIHNvbWUgbGFwdG9wcy4KKyAqLworCitzdGF0aWMgdTggYXBtX2Jpb3NfY2FsbF9zaW1wbGUodTMyIGZ1bmMsIHUzMiBlYnhfaW4sIHUzMiBlY3hfaW4sIHUzMiAqZWF4KQoreworCXU4CQkJZXJyb3I7CisJQVBNX0RFQ0xfU0VHUworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCWNwdW1hc2tfdAkJY3B1czsKKwlpbnQJCQljcHU7CisJc3RydWN0IGRlc2Nfc3RydWN0CXNhdmVfZGVzY180MDsKKworCisJY3B1cyA9IGFwbV9zYXZlX2NwdXMoKTsKKwkKKwljcHUgPSBnZXRfY3B1KCk7CisJc2F2ZV9kZXNjXzQwID0gcGVyX2NwdShjcHVfZ2R0X3RhYmxlLCBjcHUpWzB4NDAgLyA4XTsKKwlwZXJfY3B1KGNwdV9nZHRfdGFibGUsIGNwdSlbMHg0MCAvIDhdID0gYmFkX2Jpb3NfZGVzYzsKKworCWxvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpOworCUFQTV9ET19DTEk7CisJQVBNX0RPX1NBVkVfU0VHUzsKKwllcnJvciA9IGFwbV9iaW9zX2NhbGxfc2ltcGxlX2FzbShmdW5jLCBlYnhfaW4sIGVjeF9pbiwgZWF4KTsKKwlBUE1fRE9fUkVTVE9SRV9TRUdTOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlfX2dldF9jcHVfdmFyKGNwdV9nZHRfdGFibGUpWzB4NDAgLyA4XSA9IHNhdmVfZGVzY180MDsKKwlwdXRfY3B1KCk7CisJYXBtX3Jlc3RvcmVfY3B1cyhjcHVzKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICoJYXBtX2RyaXZlcl92ZXJzaW9uCS0JQVBNIGRyaXZlciB2ZXJzaW9uCisgKglAdmFsOglsb2FkZWQgd2l0aCB0aGUgQVBNIHZlcnNpb24gb24gcmV0dXJuCisgKgorICoJUmV0cmlldmUgdGhlIEFQTSB2ZXJzaW9uIHN1cHBvcnRlZCBieSB0aGUgQklPUy4gVGhpcyBpcyBvbmx5CisgKglzdXBwb3J0ZWQgZm9yIEFQTSAxLjEgb3IgaGlnaGVyLiBBbiBlcnJvciBpbmRpY2F0ZXMgQVBNIDEuMCBpcworICoJcHJvYmFibHkgcHJlc2VudC4KKyAqCisgKglPbiBlbnRyeSB2YWwgc2hvdWxkIHBvaW50IHRvIGEgdmFsdWUgaW5kaWNhdGluZyB0aGUgQVBNIGRyaXZlcgorICoJdmVyc2lvbiB3aXRoIHRoZSBoaWdoIGJ5dGUgYmVpbmcgdGhlIG1ham9yIGFuZCB0aGUgbG93IGJ5dGUgdGhlCisgKgltaW5vciBudW1iZXIgYm90aCBpbiBCQ0QKKyAqCisgKglPbiByZXR1cm4gaXQgd2lsbCBob2xkIHRoZSBCSU9TIHJldmlzaW9uIHN1cHBvcnRlZCBpbiB0aGUKKyAqCXNhbWUgZm9ybWF0LgorICovCisKK3N0YXRpYyBpbnQgYXBtX2RyaXZlcl92ZXJzaW9uKHVfc2hvcnQgKnZhbCkKK3sKKwl1MzIJZWF4OworCisJaWYgKGFwbV9iaW9zX2NhbGxfc2ltcGxlKEFQTV9GVU5DX1ZFUlNJT04sIDAsICp2YWwsICZlYXgpKQorCQlyZXR1cm4gKGVheCA+PiA4KSAmIDB4ZmY7CisJKnZhbCA9IGVheDsKKwlyZXR1cm4gQVBNX1NVQ0NFU1M7Cit9CisKKy8qKgorICoJYXBtX2dldF9ldmVudAktCWdldCBhbiBBUE0gZXZlbnQgZnJvbSB0aGUgQklPUworICoJQGV2ZW50OiBwb2ludGVyIHRvIHRoZSBldmVudAorICoJQGluZm86IHBvaW50IHRvIHRoZSBldmVudCBpbmZvcm1hdGlvbgorICoKKyAqCVRoZSBBUE0gQklPUyBwcm92aWRlcyBhIHBvbGxlZCBpbmZvcm1hdGlvbiBmb3IgZXZlbnQKKyAqCXJlcG9ydGluZy4gVGhlIEJJT1MgZXhwZWN0cyB0byBiZSBwb2xsZWQgYXQgbGVhc3QgZXZlcnkgc2Vjb25kCisgKgl3aGVuIGV2ZW50cyBhcmUgcGVuZGluZy4gV2hlbiBhIG1lc3NhZ2UgaXMgZm91bmQgdGhlIGNhbGxlciBzaG91bGQKKyAqCXBvbGwgdW50aWwgbm8gbW9yZSBtZXNzYWdlcyBhcmUgcHJlc2VudC4gIEhvd2V2ZXIsIHRoaXMgY2F1c2VzCisgKglwcm9ibGVtcyBvbiBzb21lIGxhcHRvcHMgd2hlcmUgYSBzdXNwZW5kIGV2ZW50IG5vdGlmaWNhdGlvbiBpcworICoJbm90IGNsZWFyZWQgdW50aWwgaXQgaXMgYWNrbm93bGVkZ2VkLgorICoKKyAqCUFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgaW4gdGhlIGluZm8gcG9pbnRlciwgcHJvdmlkaW5nCisgKgl0aGF0IEFQTSAxLjIgaXMgaW4gdXNlLiBJZiBubyBtZXNzZ2VzIGFyZSBwZW5kaW5nIHRoZSB2YWx1ZSAweDgwCisgKglpcyByZXR1cm5lZCAoTm8gcG93ZXIgbWFuYWdlbWVudCBldmVudHMgcGVuZGluZykuCisgKi8KKyAKK3N0YXRpYyBpbnQgYXBtX2dldF9ldmVudChhcG1fZXZlbnRfdCAqZXZlbnQsIGFwbV9ldmVudGluZm9fdCAqaW5mbykKK3sKKwl1MzIJZWF4OworCXUzMgllYng7CisJdTMyCWVjeDsKKwl1MzIJZHVtbXk7CisKKwlpZiAoYXBtX2Jpb3NfY2FsbChBUE1fRlVOQ19HRVRfRVZFTlQsIDAsIDAsICZlYXgsICZlYngsICZlY3gsCisJCQkmZHVtbXksICZkdW1teSkpCisJCXJldHVybiAoZWF4ID4+IDgpICYgMHhmZjsKKwkqZXZlbnQgPSBlYng7CisJaWYgKGFwbV9pbmZvLmNvbm5lY3Rpb25fdmVyc2lvbiA8IDB4MDEwMikKKwkJKmluZm8gPSB+MDsgLyogaW5kaWNhdGUgaW5mbyBub3QgdmFsaWQgKi8KKwllbHNlCisJCSppbmZvID0gZWN4OworCXJldHVybiBBUE1fU1VDQ0VTUzsKK30KKworLyoqCisgKglzZXRfcG93ZXJfc3RhdGUJLQlzZXQgdGhlIHBvd2VyIG1hbmFnZW1lbnQgc3RhdGUKKyAqCUB3aGF0OiB3aGljaCBpdGVtcyB0byB0cmFuc2l0aW9uCisgKglAc3RhdGU6IHN0YXRlIHRvIHRyYW5zaXRpb24gdG8KKyAqCisgKglSZXF1ZXN0IGFuIEFQTSBjaGFuZ2Ugb2Ygc3RhdGUgZm9yIG9uZSBvciBtb3JlIHN5c3RlbSBkZXZpY2VzLiBUaGUKKyAqCXByb2Nlc3NvciBzdGF0ZSBtdXN0IGJlIHRyYW5zaXRpb25lZCBsYXN0IG9mIGFsbC4gd2hhdCBob2xkcyB0aGUKKyAqCWNsYXNzIG9mIGRldmljZSBpbiB0aGUgdXBwZXIgYnl0ZSBhbmQgdGhlIGRldmljZSBudW1iZXIgKDB4RkYgZm9yCisgKglhbGwpIGZvciB0aGUgb2JqZWN0IHRvIGJlIHRyYW5zaXRpb25lZC4KKyAqCisgKglUaGUgc3RhdGUgaG9sZHMgdGhlIHN0YXRlIHRvIHRyYW5zaXRpb24gdG8sIHdoaWNoIG1heSBpbiBmYWN0CisgKgliZSBhbiBhY2NlcHRhbmNlIG9mIGEgQklPUyByZXF1ZXN0ZWQgc3RhdGUgY2hhbmdlLgorICovCisgCitzdGF0aWMgaW50IHNldF9wb3dlcl9zdGF0ZSh1X3Nob3J0IHdoYXQsIHVfc2hvcnQgc3RhdGUpCit7CisJdTMyCWVheDsKKworCWlmIChhcG1fYmlvc19jYWxsX3NpbXBsZShBUE1fRlVOQ19TRVRfU1RBVEUsIHdoYXQsIHN0YXRlLCAmZWF4KSkKKwkJcmV0dXJuIChlYXggPj4gOCkgJiAweGZmOworCXJldHVybiBBUE1fU1VDQ0VTUzsKK30KKworLyoqCisgKglzZXRfc3lzdGVtX3Bvd2VyX3N0YXRlIC0gc2V0IHN5c3RlbSB3aWRlIHBvd2VyIHN0YXRlCisgKglAc3RhdGU6IHdoaWNoIHN0YXRlIHRvIGVudGVyCisgKgorICoJVHJhbnNpdGlvbiB0aGUgZW50aXJlIHN5c3RlbSBpbnRvIGEgbmV3IEFQTSBwb3dlciBzdGF0ZS4KKyAqLworIAorc3RhdGljIGludCBzZXRfc3lzdGVtX3Bvd2VyX3N0YXRlKHVfc2hvcnQgc3RhdGUpCit7CisJcmV0dXJuIHNldF9wb3dlcl9zdGF0ZShBUE1fREVWSUNFX0FMTCwgc3RhdGUpOworfQorCisvKioKKyAqCWFwbV9kb19pZGxlCS0JcGVyZm9ybSBwb3dlciBzYXZpbmcKKyAqCisgKglUaGlzIGZ1bmN0aW9uIG5vdGlmaWVzIHRoZSBCSU9TIHRoYXQgdGhlIHByb2Nlc3NvciBpcyAoaW4gdGhlIHZpZXcKKyAqCW9mIHRoZSBPUykgaWRsZS4gSXQgcmV0dXJucyAtMSBpbiB0aGUgZXZlbnQgdGhhdCB0aGUgQklPUyByZWZ1c2VzCisgKgl0byBoYW5kbGUgdGhlIGlkbGUgcmVxdWVzdC4gT24gYSBzdWNjZXNzIHRoZSBmdW5jdGlvbiByZXR1cm5zIDEKKyAqCWlmIHRoZSBCSU9TIGRpZCBjbG9jayBzbG93aW5nIG9yIDAgb3RoZXJ3aXNlLgorICovCisgCitzdGF0aWMgaW50IGFwbV9kb19pZGxlKHZvaWQpCit7CisJdTMyCWVheDsKKworCWlmIChhcG1fYmlvc19jYWxsX3NpbXBsZShBUE1fRlVOQ19JRExFLCAwLCAwLCAmZWF4KSkgeworCQlzdGF0aWMgdW5zaWduZWQgbG9uZyB0OworCisJCS8qIFRoaXMgYWx3YXlzIGZhaWxzIG9uIHNvbWUgU01QIGJvYXJkcyBydW5uaW5nIFVQIGtlcm5lbHMuCisJCSAqIE9ubHkgcmVwb3J0IHRoZSBmYWlsdXJlIHRoZSBmaXJzdCA1IHRpbWVzLgorCQkgKi8KKwkJaWYgKCsrdCA8IDUpCisJCXsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJhcG1fZG9faWRsZSBmYWlsZWQgKCVkKVxuIiwKKwkJCQkJKGVheCA+PiA4KSAmIDB4ZmYpOworCQkJdCA9IGppZmZpZXM7CisJCX0KKwkJcmV0dXJuIC0xOworCX0KKwljbG9ja19zbG93ZWQgPSAoYXBtX2luZm8uYmlvcy5mbGFncyAmIEFQTV9JRExFX1NMT1dTX0NMT0NLKSAhPSAwOworCXJldHVybiBjbG9ja19zbG93ZWQ7Cit9CisKKy8qKgorICoJYXBtX2RvX2J1c3kJLQlpbmZvcm0gdGhlIEJJT1MgdGhlIENQVSBpcyBidXN5CisgKgorICoJUmVxdWVzdCB0aGF0IHRoZSBCSU9TIGJyaW5ncyB0aGUgQ1BVIGJhY2sgdG8gZnVsbCBwZXJmb3JtYW5jZS4gCisgKi8KKyAKK3N0YXRpYyB2b2lkIGFwbV9kb19idXN5KHZvaWQpCit7CisJdTMyCWR1bW15OworCisJaWYgKGNsb2NrX3Nsb3dlZCB8fCBBTFdBWVNfQ0FMTF9CVVNZKSB7CisJCSh2b2lkKSBhcG1fYmlvc19jYWxsX3NpbXBsZShBUE1fRlVOQ19CVVNZLCAwLCAwLCAmZHVtbXkpOworCQljbG9ja19zbG93ZWQgPSAwOworCX0KK30KKworLyoKKyAqIElmIG5vIHByb2Nlc3MgaGFzIHJlYWxseSBiZWVuIGludGVyZXN0ZWQgaW4KKyAqIHRoZSBDUFUgZm9yIHNvbWUgdGltZSwgd2Ugd2FudCB0byBjYWxsIEJJT1MKKyAqIHBvd2VyIG1hbmFnZW1lbnQgLSB3ZSBwcm9iYWJseSB3YW50CisgKiB0byBjb25zZXJ2ZSBwb3dlci4KKyAqLworI2RlZmluZSBJRExFX0NBTENfTElNSVQgICAoSFogKiAxMDApCisjZGVmaW5lIElETEVfTEVBS1lfTUFYICAgIDE2CisKK3N0YXRpYyB2b2lkICgqb3JpZ2luYWxfcG1faWRsZSkodm9pZCk7CisKK2V4dGVybiB2b2lkIGRlZmF1bHRfaWRsZSh2b2lkKTsKKworLyoqCisgKiBhcG1fY3B1X2lkbGUJCS0JY3B1IGlkbGluZyBmb3IgQVBNIGNhcGFibGUgTGludXgKKyAqCisgKiBUaGlzIGlzIHRoZSBpZGxpbmcgZnVuY3Rpb24gdGhlIGtlcm5lbCBleGVjdXRlcyB3aGVuIEFQTSBpcyBhdmFpbGFibGUuIEl0IAorICogdHJpZXMgdG8gZG8gQklPUyBwb3dlcm1hbmFnZW1lbnQgYmFzZWQgb24gdGhlIGF2ZXJhZ2Ugc3lzdGVtIGlkbGUgdGltZS4KKyAqIEZ1cnRoZXJtb3JlIGl0IGNhbGxzIHRoZSBzeXN0ZW0gZGVmYXVsdCBpZGxlIHJvdXRpbmUuCisgKi8KKworc3RhdGljIHZvaWQgYXBtX2NwdV9pZGxlKHZvaWQpCit7CisJc3RhdGljIGludCB1c2VfYXBtX2lkbGU7IC8qID0gMCAqLworCXN0YXRpYyB1bnNpZ25lZCBpbnQgbGFzdF9qaWZmaWVzOyAvKiA9IDAgKi8KKwlzdGF0aWMgdW5zaWduZWQgaW50IGxhc3Rfc3RpbWU7IC8qID0gMCAqLworCisJaW50IGFwbV9pZGxlX2RvbmUgPSAwOworCXVuc2lnbmVkIGludCBqaWZmaWVzX3NpbmNlX2xhc3RfY2hlY2sgPSBqaWZmaWVzIC0gbGFzdF9qaWZmaWVzOworCXVuc2lnbmVkIGludCBidWNrZXQ7CisKK3JlY2FsYzoKKwlpZiAoamlmZmllc19zaW5jZV9sYXN0X2NoZWNrID4gSURMRV9DQUxDX0xJTUlUKSB7CisJCXVzZV9hcG1faWRsZSA9IDA7CisJCWxhc3RfamlmZmllcyA9IGppZmZpZXM7CisJCWxhc3Rfc3RpbWUgPSBjdXJyZW50LT5zdGltZTsKKwl9IGVsc2UgaWYgKGppZmZpZXNfc2luY2VfbGFzdF9jaGVjayA+IGlkbGVfcGVyaW9kKSB7CisJCXVuc2lnbmVkIGludCBpZGxlX3BlcmNlbnRhZ2U7CisKKwkJaWRsZV9wZXJjZW50YWdlID0gY3VycmVudC0+c3RpbWUgLSBsYXN0X3N0aW1lOworCQlpZGxlX3BlcmNlbnRhZ2UgKj0gMTAwOworCQlpZGxlX3BlcmNlbnRhZ2UgLz0gamlmZmllc19zaW5jZV9sYXN0X2NoZWNrOworCQl1c2VfYXBtX2lkbGUgPSAoaWRsZV9wZXJjZW50YWdlID4gaWRsZV90aHJlc2hvbGQpOworCQlpZiAoYXBtX2luZm8uZm9yYmlkX2lkbGUpCisJCQl1c2VfYXBtX2lkbGUgPSAwOworCQlsYXN0X2ppZmZpZXMgPSBqaWZmaWVzOworCQlsYXN0X3N0aW1lID0gY3VycmVudC0+c3RpbWU7CisJfQorCisJYnVja2V0ID0gSURMRV9MRUFLWV9NQVg7CisKKwl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKSB7CisJCWlmICh1c2VfYXBtX2lkbGUpIHsKKwkJCXVuc2lnbmVkIGludCB0OworCisJCQl0ID0gamlmZmllczsKKwkJCXN3aXRjaCAoYXBtX2RvX2lkbGUoKSkgeworCQkJY2FzZSAwOiBhcG1faWRsZV9kb25lID0gMTsKKwkJCQlpZiAodCAhPSBqaWZmaWVzKSB7CisJCQkJCWlmIChidWNrZXQpIHsKKwkJCQkJCWJ1Y2tldCA9IElETEVfTEVBS1lfTUFYOworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKGJ1Y2tldCkgeworCQkJCQlidWNrZXQtLTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAxOiBhcG1faWRsZV9kb25lID0gMTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6IC8qIEJJT1MgcmVmdXNlZCAqLworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChvcmlnaW5hbF9wbV9pZGxlKQorCQkJb3JpZ2luYWxfcG1faWRsZSgpOworCQllbHNlCisJCQlkZWZhdWx0X2lkbGUoKTsKKwkJamlmZmllc19zaW5jZV9sYXN0X2NoZWNrID0gamlmZmllcyAtIGxhc3RfamlmZmllczsKKwkJaWYgKGppZmZpZXNfc2luY2VfbGFzdF9jaGVjayA+IGlkbGVfcGVyaW9kKQorCQkJZ290byByZWNhbGM7CisJfQorCisJaWYgKGFwbV9pZGxlX2RvbmUpCisJCWFwbV9kb19idXN5KCk7Cit9CisKKy8qKgorICoJYXBtX3Bvd2VyX29mZgktCWFzayB0aGUgQklPUyB0byBwb3dlciBvZmYKKyAqCisgKglIYW5kbGUgdGhlIHBvd2VyIG9mZiBzZXF1ZW5jZS4gVGhpcyBpcyB0aGUgb25lIHBpZWNlIG9mIGNvZGUgd2UKKyAqCXdpbGwgZXhlY3V0ZSBldmVuIG9uIFNNUCBtYWNoaW5lcy4gSW4gb3JkZXIgdG8gZGVhbCB3aXRoIEJJT1MKKyAqCWJ1Z3Mgd2Ugc3VwcG9ydCByZWFsIG1vZGUgQVBNIEJJT1MgcG93ZXIgb2ZmIGNhbGxzLiBXZSBhbHNvIG1ha2UKKyAqCXRoZSBTTVAgY2FsbCBvbiBDUFUwIGFzIHNvbWUgc3lzdGVtcyB3aWxsIG9ubHkgaG9ub3VyIHRoaXMgY2FsbAorICoJb24gdGhlaXIgZmlyc3QgY3B1LgorICovCisgCitzdGF0aWMgdm9pZCBhcG1fcG93ZXJfb2ZmKHZvaWQpCit7CisJdW5zaWduZWQgY2hhcglwb19iaW9zX2NhbGxbXSA9IHsKKwkJMHhiOCwgMHgwMCwgMHgxMCwJLyogbW92dyAgJDB4MTAwMCxheCAgKi8KKwkJMHg4ZSwgMHhkMCwJCS8qIG1vdncgIGF4LHNzICAgICAgICovCisJCTB4YmMsIDB4MDAsIDB4ZjAsCS8qIG1vdncgICQweGYwMDAsc3AgICovCisJCTB4YjgsIDB4MDcsIDB4NTMsCS8qIG1vdncgICQweDUzMDcsYXggICovCisJCTB4YmIsIDB4MDEsIDB4MDAsCS8qIG1vdncgICQweDAwMDEsYnggICovCisJCTB4YjksIDB4MDMsIDB4MDAsCS8qIG1vdncgICQweDAwMDMsY3ggICovCisJCTB4Y2QsIDB4MTUJCS8qIGludCAgICQweDE1ICAgICAgICovCisJfTsKKworCS8qCisJICogVGhpcyBtYXkgYmUgY2FsbGVkIG9uIGFuIFNNUCBtYWNoaW5lLgorCSAqLworI2lmZGVmIENPTkZJR19TTVAKKwkvKiBTb21lIGJpb3NlcyBkb24ndCBsaWtlIGJlaW5nIGNhbGxlZCBmcm9tIENQVSAhPSAwICovCisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjcHVtYXNrX29mX2NwdSgwKSk7CisJQlVHX09OKHNtcF9wcm9jZXNzb3JfaWQoKSAhPSAwKTsKKyNlbmRpZgorCWlmIChhcG1faW5mby5yZWFsbW9kZV9wb3dlcl9vZmYpCisJeworCQkodm9pZClhcG1fc2F2ZV9jcHVzKCk7CisJCW1hY2hpbmVfcmVhbF9yZXN0YXJ0KHBvX2Jpb3NfY2FsbCwgc2l6ZW9mKHBvX2Jpb3NfY2FsbCkpOworCX0KKwllbHNlCisJCSh2b2lkKSBzZXRfc3lzdGVtX3Bvd2VyX3N0YXRlKEFQTV9TVEFURV9PRkYpOworfQorCisjaWZkZWYgQ09ORklHX0FQTV9ET19FTkFCTEUKKworLyoqCisgKglhcG1fZW5hYmxlX3Bvd2VyX21hbmFnZW1lbnQgLSBlbmFibGUgQklPUyBBUE0gcG93ZXIgbWFuYWdlbWVudAorICoJQGVuYWJsZTogZW5hYmxlIHllcy9ubworICoKKyAqCUVuYWJsZSBvciBkaXNhYmxlIHRoZSBBUE0gQklPUyBwb3dlciBzZXJ2aWNlcy4gCisgKi8KKyAKK3N0YXRpYyBpbnQgYXBtX2VuYWJsZV9wb3dlcl9tYW5hZ2VtZW50KGludCBlbmFibGUpCit7CisJdTMyCWVheDsKKworCWlmICgoZW5hYmxlID09IDApICYmIChhcG1faW5mby5iaW9zLmZsYWdzICYgQVBNX0JJT1NfRElTRU5HQUdFRCkpCisJCXJldHVybiBBUE1fTk9UX0VOR0FHRUQ7CisJaWYgKGFwbV9iaW9zX2NhbGxfc2ltcGxlKEFQTV9GVU5DX0VOQUJMRV9QTSwgQVBNX0RFVklDRV9CQUxMLAorCQkJZW5hYmxlLCAmZWF4KSkKKwkJcmV0dXJuIChlYXggPj4gOCkgJiAweGZmOworCWlmIChlbmFibGUpCisJCWFwbV9pbmZvLmJpb3MuZmxhZ3MgJj0gfkFQTV9CSU9TX0RJU0FCTEVEOworCWVsc2UKKwkJYXBtX2luZm8uYmlvcy5mbGFncyB8PSBBUE1fQklPU19ESVNBQkxFRDsKKwlyZXR1cm4gQVBNX1NVQ0NFU1M7Cit9CisjZW5kaWYKKworLyoqCisgKglhcG1fZ2V0X3Bvd2VyX3N0YXR1cwktCWdldCBjdXJyZW50IHBvd2VyIHN0YXRlCisgKglAc3RhdHVzOiByZXR1cm5lZCBzdGF0dXMKKyAqCUBiYXQ6IGJhdHRlcnkgaW5mbworICoJQGxpZmU6IGVzdGltYXRlZCBsaWZlCisgKgorICoJT2J0YWluIHRoZSBjdXJyZW50IHBvd2VyIHN0YXR1cyBmcm9tIHRoZSBBUE0gQklPUy4gV2UgcmV0dXJuIGEKKyAqCXN0YXR1cyB3aGljaCBnaXZlcyB0aGUgcm91Z2ggYmF0dGVyeSBzdGF0dXMsIGFuZCBjdXJyZW50IHBvd2VyCisgKglzb3VyY2UuIFRoZSBiYXQgdmFsdWUgcmV0dXJuZWQgZ2l2ZSBhbiBlc3RpbWF0ZSBhcyBhIHBlcmNlbnRhZ2UKKyAqCW9mIGxpZmUgYW5kIGEgc3RhdHVzIHZhbHVlIGZvciB0aGUgYmF0dGVyeS4gVGhlIGVzdGltYXRlZCBsaWZlCisgKglpZiByZXBvcnRlZCBpcyBhIGxpZmV0aW1lIGluIHNlY29kbmRzL21pbnV0ZXMgYXQgY3VycmVudCBwb3d3ZXIKKyAqCWNvbnN1bXB0aW9uLgorICovCisgCitzdGF0aWMgaW50IGFwbV9nZXRfcG93ZXJfc3RhdHVzKHVfc2hvcnQgKnN0YXR1cywgdV9zaG9ydCAqYmF0LCB1X3Nob3J0ICpsaWZlKQoreworCXUzMgllYXg7CisJdTMyCWVieDsKKwl1MzIJZWN4OworCXUzMgllZHg7CisJdTMyCWR1bW15OworCisJaWYgKGFwbV9pbmZvLmdldF9wb3dlcl9zdGF0dXNfYnJva2VuKQorCQlyZXR1cm4gQVBNXzMyX1VOU1VQUE9SVEVEOworCWlmIChhcG1fYmlvc19jYWxsKEFQTV9GVU5DX0dFVF9TVEFUVVMsIEFQTV9ERVZJQ0VfQUxMLCAwLAorCQkJJmVheCwgJmVieCwgJmVjeCwgJmVkeCwgJmR1bW15KSkKKwkJcmV0dXJuIChlYXggPj4gOCkgJiAweGZmOworCSpzdGF0dXMgPSBlYng7CisJKmJhdCA9IGVjeDsKKwlpZiAoYXBtX2luZm8uZ2V0X3Bvd2VyX3N0YXR1c19zd2FiaW5taW51dGVzKSB7CisJCSpsaWZlID0gc3dhYjE2KCh1MTYpZWR4KTsKKwkJKmxpZmUgfD0gMHg4MDAwOworCX0gZWxzZQorCQkqbGlmZSA9IGVkeDsKKwlyZXR1cm4gQVBNX1NVQ0NFU1M7Cit9CisKKyNpZiAwCitzdGF0aWMgaW50IGFwbV9nZXRfYmF0dGVyeV9zdGF0dXModV9zaG9ydCB3aGljaCwgdV9zaG9ydCAqc3RhdHVzLAorCQkJCSAgdV9zaG9ydCAqYmF0LCB1X3Nob3J0ICpsaWZlLCB1X3Nob3J0ICpuYmF0KQoreworCXUzMgllYXg7CisJdTMyCWVieDsKKwl1MzIJZWN4OworCXUzMgllZHg7CisJdTMyCWVzaTsKKworCWlmIChhcG1faW5mby5jb25uZWN0aW9uX3ZlcnNpb24gPCAweDAxMDIpIHsKKwkJLyogcHJldGVuZCB3ZSBvbmx5IGhhdmUgb25lIGJhdHRlcnkuICovCisJCWlmICh3aGljaCAhPSAxKQorCQkJcmV0dXJuIEFQTV9CQURfREVWSUNFOworCQkqbmJhdCA9IDE7CisJCXJldHVybiBhcG1fZ2V0X3Bvd2VyX3N0YXR1cyhzdGF0dXMsIGJhdCwgbGlmZSk7CisJfQorCisJaWYgKGFwbV9iaW9zX2NhbGwoQVBNX0ZVTkNfR0VUX1NUQVRVUywgKDB4ODAwMCB8ICh3aGljaCkpLCAwLCAmZWF4LAorCQkJJmVieCwgJmVjeCwgJmVkeCwgJmVzaSkpCisJCXJldHVybiAoZWF4ID4+IDgpICYgMHhmZjsKKwkqc3RhdHVzID0gZWJ4OworCSpiYXQgPSBlY3g7CisJKmxpZmUgPSBlZHg7CisJKm5iYXQgPSBlc2k7CisJcmV0dXJuIEFQTV9TVUNDRVNTOworfQorI2VuZGlmCisKKy8qKgorICoJYXBtX2VuZ2FnZV9wb3dlcl9tYW5hZ2VtZW50CS0JZW5hYmxlIFBNIG9uIGEgZGV2aWNlCisgKglAZGV2aWNlOiBpZGVudGl0eSBvZiBkZXZpY2UKKyAqCUBlbmFibGU6IG9uL29mZgorICoKKyAqCUFjdGl2YXRlIG9yIGRlYWN0aXZlIHBvd2VyIG1hbmFnZW1lbnQgb24gZWl0aGVyIGEgc3BlY2lmaWMgZGV2aWNlCisgKglvciB0aGUgZW50aXJlIHN5c3RlbSAoJUFQTV9ERVZJQ0VfQUxMKS4KKyAqLworIAorc3RhdGljIGludCBhcG1fZW5nYWdlX3Bvd2VyX21hbmFnZW1lbnQodV9zaG9ydCBkZXZpY2UsIGludCBlbmFibGUpCit7CisJdTMyCWVheDsKKworCWlmICgoZW5hYmxlID09IDApICYmIChkZXZpY2UgPT0gQVBNX0RFVklDRV9BTEwpCisJICAgICYmIChhcG1faW5mby5iaW9zLmZsYWdzICYgQVBNX0JJT1NfRElTQUJMRUQpKQorCQlyZXR1cm4gQVBNX0RJU0FCTEVEOworCWlmIChhcG1fYmlvc19jYWxsX3NpbXBsZShBUE1fRlVOQ19FTkdBR0VfUE0sIGRldmljZSwgZW5hYmxlLCAmZWF4KSkKKwkJcmV0dXJuIChlYXggPj4gOCkgJiAweGZmOworCWlmIChkZXZpY2UgPT0gQVBNX0RFVklDRV9BTEwpIHsKKwkJaWYgKGVuYWJsZSkKKwkJCWFwbV9pbmZvLmJpb3MuZmxhZ3MgJj0gfkFQTV9CSU9TX0RJU0VOR0FHRUQ7CisJCWVsc2UKKwkJCWFwbV9pbmZvLmJpb3MuZmxhZ3MgfD0gQVBNX0JJT1NfRElTRU5HQUdFRDsKKwl9CisJcmV0dXJuIEFQTV9TVUNDRVNTOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfQVBNX0RJU1BMQVlfQkxBTkspICYmIGRlZmluZWQoQ09ORklHX1ZUKQorCisvKioKKyAqCWFwbV9jb25zb2xlX2JsYW5rCS0JYmxhbmsgdGhlIGRpc3BsYXkKKyAqCUBibGFuazogb24vb2ZmCisgKgorICoJQXR0ZW1wdCB0byBibGFuayB0aGUgY29uc29sZSwgZmlyc3RseSBieSBibGFua2luZyBqdXN0IHZpZGVvIGRldmljZQorICoJemVybywgYW5kIGlmIHRoYXQgZmFpbHMgKHNvbWUgQklPU2VzIGRvbid0IHN1cHBvcnQgaXQpIHRoZW4gaXQgYmxhbmtzCisgKglhbGwgdmlkZW8gZGV2aWNlcy4gVHlwaWNhbGx5IHRoZSBCSU9TIHdpbGwgZG8gbGFwdG9wIGJhY2tsaWdodCBhbmQKKyAqCW1vbml0b3IgcG93ZXJkb3duIGZvciB1cy4KKyAqLworIAorc3RhdGljIGludCBhcG1fY29uc29sZV9ibGFuayhpbnQgYmxhbmspCit7CisJaW50CWVycm9yOworCXVfc2hvcnQJc3RhdGU7CisKKwlzdGF0ZSA9IGJsYW5rID8gQVBNX1NUQVRFX1NUQU5EQlkgOiBBUE1fU1RBVEVfUkVBRFk7CisJLyogQmxhbmsgdGhlIGZpcnN0IGRpc3BsYXkgZGV2aWNlICovCisJZXJyb3IgPSBzZXRfcG93ZXJfc3RhdGUoMHgxMDAsIHN0YXRlKTsKKwlpZiAoKGVycm9yICE9IEFQTV9TVUNDRVNTKSAmJiAoZXJyb3IgIT0gQVBNX05PX0VSUk9SKSkgeworCQkvKiB0cnkgdG8gYmxhbmsgdGhlbSBhbGwgaW5zdGVhZCAqLworCQllcnJvciA9IHNldF9wb3dlcl9zdGF0ZSgweDFmZiwgc3RhdGUpOworCQlpZiAoKGVycm9yICE9IEFQTV9TVUNDRVNTKSAmJiAoZXJyb3IgIT0gQVBNX05PX0VSUk9SKSkKKwkJCS8qIHRyeSB0byBibGFuayBkZXZpY2Ugb25lIGluc3RlYWQgKi8KKwkJCWVycm9yID0gc2V0X3Bvd2VyX3N0YXRlKDB4MTAxLCBzdGF0ZSk7CisJfQorCWlmICgoZXJyb3IgPT0gQVBNX1NVQ0NFU1MpIHx8IChlcnJvciA9PSBBUE1fTk9fRVJST1IpKQorCQlyZXR1cm4gMTsKKwlpZiAoZXJyb3IgPT0gQVBNX05PVF9FTkdBR0VEKSB7CisJCXN0YXRpYyBpbnQgdHJpZWQ7CisJCWludCBlbmdfZXJyb3I7CisJCWlmICh0cmllZCsrID09IDApIHsKKwkJCWVuZ19lcnJvciA9IGFwbV9lbmdhZ2VfcG93ZXJfbWFuYWdlbWVudChBUE1fREVWSUNFX0FMTCwgMSk7CisJCQlpZiAoZW5nX2Vycm9yKSB7CisJCQkJYXBtX2Vycm9yKCJzZXQgZGlzcGxheSIsIGVycm9yKTsKKwkJCQlhcG1fZXJyb3IoImVuZ2FnZSBpbnRlcmZhY2UiLCBlbmdfZXJyb3IpOworCQkJCXJldHVybiAwOworCQkJfSBlbHNlCisJCQkJcmV0dXJuIGFwbV9jb25zb2xlX2JsYW5rKGJsYW5rKTsKKwkJfQorCX0KKwlhcG1fZXJyb3IoInNldCBkaXNwbGF5IiwgZXJyb3IpOworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgcXVldWVfZW1wdHkoc3RydWN0IGFwbV91c2VyICphcykKK3sKKwlyZXR1cm4gYXMtPmV2ZW50X2hlYWQgPT0gYXMtPmV2ZW50X3RhaWw7Cit9CisKK3N0YXRpYyBhcG1fZXZlbnRfdCBnZXRfcXVldWVkX2V2ZW50KHN0cnVjdCBhcG1fdXNlciAqYXMpCit7CisJYXMtPmV2ZW50X3RhaWwgPSAoYXMtPmV2ZW50X3RhaWwgKyAxKSAlIEFQTV9NQVhfRVZFTlRTOworCXJldHVybiBhcy0+ZXZlbnRzW2FzLT5ldmVudF90YWlsXTsKK30KKworc3RhdGljIHZvaWQgcXVldWVfZXZlbnQoYXBtX2V2ZW50X3QgZXZlbnQsIHN0cnVjdCBhcG1fdXNlciAqc2VuZGVyKQoreworCXN0cnVjdCBhcG1fdXNlciAqCWFzOworCisJc3Bpbl9sb2NrKCZ1c2VyX2xpc3RfbG9jayk7CisJaWYgKHVzZXJfbGlzdCA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwlmb3IgKGFzID0gdXNlcl9saXN0OyBhcyAhPSBOVUxMOyBhcyA9IGFzLT5uZXh0KSB7CisJCWlmICgoYXMgPT0gc2VuZGVyKSB8fCAoIWFzLT5yZWFkZXIpKQorCQkJY29udGludWU7CisJCWFzLT5ldmVudF9oZWFkID0gKGFzLT5ldmVudF9oZWFkICsgMSkgJSBBUE1fTUFYX0VWRU5UUzsKKwkJaWYgKGFzLT5ldmVudF9oZWFkID09IGFzLT5ldmVudF90YWlsKSB7CisJCQlzdGF0aWMgaW50IG5vdGlmaWVkOworCisJCQlpZiAobm90aWZpZWQrKyA9PSAwKQorCQkJICAgIHByaW50ayhLRVJOX0VSUiAiYXBtOiBhbiBldmVudCBxdWV1ZSBvdmVyZmxvd2VkXG4iKTsKKwkJCWFzLT5ldmVudF90YWlsID0gKGFzLT5ldmVudF90YWlsICsgMSkgJSBBUE1fTUFYX0VWRU5UUzsKKwkJfQorCQlhcy0+ZXZlbnRzW2FzLT5ldmVudF9oZWFkXSA9IGV2ZW50OworCQlpZiAoKCFhcy0+c3VzZXIpIHx8ICghYXMtPndyaXRlcikpCisJCQljb250aW51ZTsKKwkJc3dpdGNoIChldmVudCkgeworCQljYXNlIEFQTV9TWVNfU1VTUEVORDoKKwkJY2FzZSBBUE1fVVNFUl9TVVNQRU5EOgorCQkJYXMtPnN1c3BlbmRzX3BlbmRpbmcrKzsKKwkJCXN1c3BlbmRzX3BlbmRpbmcrKzsKKwkJCWJyZWFrOworCisJCWNhc2UgQVBNX1NZU19TVEFOREJZOgorCQljYXNlIEFQTV9VU0VSX1NUQU5EQlk6CisJCQlhcy0+c3RhbmRieXNfcGVuZGluZysrOworCQkJc3RhbmRieXNfcGVuZGluZysrOworCQkJYnJlYWs7CisJCX0KKwl9CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZhcG1fd2FpdHF1ZXVlKTsKK291dDoKKwlzcGluX3VubG9jaygmdXNlcl9saXN0X2xvY2spOworfQorCitzdGF0aWMgdm9pZCBzZXRfdGltZSh2b2lkKQoreworCWlmIChnb3RfY2xvY2tfZGlmZikgewkvKiBNdXN0IGtub3cgdGltZSB6b25lIGluIG9yZGVyIHRvIHNldCBjbG9jayAqLworCQl4dGltZS50dl9zZWMgPSBnZXRfY21vc190aW1lKCkgKyBjbG9ja19jbW9zX2RpZmY7CisJCXh0aW1lLnR2X25zZWMgPSAwOyAKKwl9IAorfQorCitzdGF0aWMgdm9pZCBnZXRfdGltZV9kaWZmKHZvaWQpCit7CisjaWZuZGVmIENPTkZJR19BUE1fUlRDX0lTX0dNVAorCS8qCisJICogRXN0aW1hdGUgdGltZSB6b25lIHNvIHRoYXQgc2V0X3RpbWUgY2FuIHVwZGF0ZSB0aGUgY2xvY2sKKwkgKi8KKwljbG9ja19jbW9zX2RpZmYgPSAtZ2V0X2Ntb3NfdGltZSgpOworCWNsb2NrX2Ntb3NfZGlmZiArPSBnZXRfc2Vjb25kcygpOworCWdvdF9jbG9ja19kaWZmID0gMTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCByZWluaXRfdGltZXIodm9pZCkKK3sKKyNpZmRlZiBJTklUX1RJTUVSX0FGVEVSX1NVU1BFTkQKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCWV4dGVybiBzcGlubG9ja190IGk4MjUzX2xvY2s7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTgyNTNfbG9jaywgZmxhZ3MpOworCS8qIHNldCB0aGUgY2xvY2sgdG8gMTAwIEh6ICovCisJb3V0Yl9wKDB4MzQsIFBJVF9NT0RFKTsJCS8qIGJpbmFyeSwgbW9kZSAyLCBMU0IvTVNCLCBjaCAwICovCisJdWRlbGF5KDEwKTsKKwlvdXRiX3AoTEFUQ0ggJiAweGZmLCBQSVRfQ0gwKTsJLyogTFNCICovCisJdWRlbGF5KDEwKTsKKwlvdXRiKExBVENIID4+IDgsIFBJVF9DSDApOwkvKiBNU0IgKi8KKwl1ZGVsYXkoMTApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmk4MjUzX2xvY2ssIGZsYWdzKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IHN1c3BlbmQoaW50IHZldG9hYmxlKQoreworCWludAkJZXJyOworCXN0cnVjdCBhcG1fdXNlcgkqYXM7CisKKwlpZiAocG1fc2VuZF9hbGwoUE1fU1VTUEVORCwgKHZvaWQgKikzKSkgeworCQkvKiBWZXRvZWQgKi8KKwkJaWYgKHZldG9hYmxlKSB7CisJCQlpZiAoYXBtX2luZm8uY29ubmVjdGlvbl92ZXJzaW9uID4gMHgxMDApCisJCQkJc2V0X3N5c3RlbV9wb3dlcl9zdGF0ZShBUE1fU1RBVEVfUkVKRUNUKTsKKwkJCWVyciA9IC1FQlVTWTsKKwkJCWlnbm9yZV9zeXNfc3VzcGVuZCA9IDA7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhcG06IHN1c3BlbmQgd2FzIHZldG9lZC5cbiIpOworCQkJZ290byBvdXQ7CisJCX0KKwkJcHJpbnRrKEtFUk5fQ1JJVCAiYXBtOiBzdXNwZW5kIHdhcyB2ZXRvZWQsIGJ1dCBzdXNwZW5kaW5nIGFueXdheS5cbiIpOworCX0KKworCWRldmljZV9zdXNwZW5kKFBNU0dfU1VTUEVORCk7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlkZXZpY2VfcG93ZXJfZG93bihQTVNHX1NVU1BFTkQpOworCisJLyogc2VyaWFsaXplIHdpdGggdGhlIHRpbWVyIGludGVycnVwdCAqLworCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOworCisJLyogcHJvdGVjdCBhZ2FpbnN0IGFjY2VzcyB0byB0aW1lciBjaGlwIHJlZ2lzdGVycyAqLworCXNwaW5fbG9jaygmaTgyNTNfbG9jayk7CisKKwlnZXRfdGltZV9kaWZmKCk7CisJLyoKKwkgKiBJcnEgc3BpbmxvY2sgbXVzdCBiZSBkcm9wcGVkIGFyb3VuZCBzZXRfc3lzdGVtX3Bvd2VyX3N0YXRlLgorCSAqIFdlJ2xsIHVuZG8gYW55IHRpbWVyIGNoYW5nZXMgZHVlIHRvIGludGVycnVwdHMgYmVsb3cuCisJICovCisJc3Bpbl91bmxvY2soJmk4MjUzX2xvY2spOworCXdyaXRlX3NlcXVubG9jaygmeHRpbWVfbG9jayk7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJc2F2ZV9wcm9jZXNzb3Jfc3RhdGUoKTsKKwllcnIgPSBzZXRfc3lzdGVtX3Bvd2VyX3N0YXRlKEFQTV9TVEFURV9TVVNQRU5EKTsKKwlyZXN0b3JlX3Byb2Nlc3Nvcl9zdGF0ZSgpOworCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwl3cml0ZV9zZXFsb2NrKCZ4dGltZV9sb2NrKTsKKwlzcGluX2xvY2soJmk4MjUzX2xvY2spOworCXJlaW5pdF90aW1lcigpOworCXNldF90aW1lKCk7CisJaWdub3JlX25vcm1hbF9yZXN1bWUgPSAxOworCisJc3Bpbl91bmxvY2soJmk4MjUzX2xvY2spOworCXdyaXRlX3NlcXVubG9jaygmeHRpbWVfbG9jayk7CisKKwlpZiAoZXJyID09IEFQTV9OT19FUlJPUikKKwkJZXJyID0gQVBNX1NVQ0NFU1M7CisJaWYgKGVyciAhPSBBUE1fU1VDQ0VTUykKKwkJYXBtX2Vycm9yKCJzdXNwZW5kIiwgZXJyKTsKKwllcnIgPSAoZXJyID09IEFQTV9TVUNDRVNTKSA/IDAgOiAtRUlPOworCWRldmljZV9wb3dlcl91cCgpOworCWxvY2FsX2lycV9lbmFibGUoKTsKKwlkZXZpY2VfcmVzdW1lKCk7CisJcG1fc2VuZF9hbGwoUE1fUkVTVU1FLCAodm9pZCAqKTApOworCXF1ZXVlX2V2ZW50KEFQTV9OT1JNQUxfUkVTVU1FLCBOVUxMKTsKKyBvdXQ6CisJc3Bpbl9sb2NrKCZ1c2VyX2xpc3RfbG9jayk7CisJZm9yIChhcyA9IHVzZXJfbGlzdDsgYXMgIT0gTlVMTDsgYXMgPSBhcy0+bmV4dCkgeworCQlhcy0+c3VzcGVuZF93YWl0ID0gMDsKKwkJYXMtPnN1c3BlbmRfcmVzdWx0ID0gZXJyOworCX0KKwlzcGluX3VubG9jaygmdXNlcl9saXN0X2xvY2spOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmYXBtX3N1c3BlbmRfd2FpdHF1ZXVlKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBzdGFuZGJ5KHZvaWQpCit7CisJaW50CWVycjsKKworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJZGV2aWNlX3Bvd2VyX2Rvd24oUE1TR19TVVNQRU5EKTsKKwkvKiBzZXJpYWxpemUgd2l0aCB0aGUgdGltZXIgaW50ZXJydXB0ICovCisJd3JpdGVfc2VxbG9jaygmeHRpbWVfbG9jayk7CisJLyogSWYgbmVlZGVkLCBub3RpZnkgZHJpdmVycyBoZXJlICovCisJZ2V0X3RpbWVfZGlmZigpOworCXdyaXRlX3NlcXVubG9jaygmeHRpbWVfbG9jayk7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJZXJyID0gc2V0X3N5c3RlbV9wb3dlcl9zdGF0ZShBUE1fU1RBVEVfU1RBTkRCWSk7CisJaWYgKChlcnIgIT0gQVBNX1NVQ0NFU1MpICYmIChlcnIgIT0gQVBNX05PX0VSUk9SKSkKKwkJYXBtX2Vycm9yKCJzdGFuZGJ5IiwgZXJyKTsKKworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJZGV2aWNlX3Bvd2VyX3VwKCk7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworfQorCitzdGF0aWMgYXBtX2V2ZW50X3QgZ2V0X2V2ZW50KHZvaWQpCit7CisJaW50CQllcnJvcjsKKwlhcG1fZXZlbnRfdAlldmVudDsKKwlhcG1fZXZlbnRpbmZvX3QJaW5mbzsKKworCXN0YXRpYyBpbnQgbm90aWZpZWQ7CisKKwkvKiB3ZSBkb24ndCB1c2UgdGhlIGV2ZW50aW5mbyAqLworCWVycm9yID0gYXBtX2dldF9ldmVudCgmZXZlbnQsICZpbmZvKTsKKwlpZiAoZXJyb3IgPT0gQVBNX1NVQ0NFU1MpCisJCXJldHVybiBldmVudDsKKworCWlmICgoZXJyb3IgIT0gQVBNX05PX0VWRU5UUykgJiYgKG5vdGlmaWVkKysgPT0gMCkpCisJCWFwbV9lcnJvcigiZ2V0X2V2ZW50IiwgZXJyb3IpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2V2ZW50cyh2b2lkKQoreworCWFwbV9ldmVudF90CQlldmVudDsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZwlsYXN0X3Jlc3VtZTsKKwlzdGF0aWMgaW50CQlpZ25vcmVfYm91bmNlOworCisJd2hpbGUgKChldmVudCA9IGdldF9ldmVudCgpKSAhPSAwKSB7CisJCWlmIChkZWJ1ZykgeworCQkJaWYgKGV2ZW50IDw9IE5SX0FQTV9FVkVOVF9OQU1FKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJhcG06IHJlY2VpdmVkICVzIG5vdGlmeVxuIiwKKwkJCQkgICAgICAgYXBtX2V2ZW50X25hbWVbZXZlbnQgLSAxXSk7CisJCQllbHNlCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgImFwbTogcmVjZWl2ZWQgdW5rbm93biAiCisJCQkJICAgICAgICJldmVudCAweCUwMnhcbiIsIGV2ZW50KTsKKwkJfQorCQlpZiAoaWdub3JlX2JvdW5jZQorCQkgICAgJiYgKChqaWZmaWVzIC0gbGFzdF9yZXN1bWUpID4gYm91bmNlX2ludGVydmFsKSkKKwkJCWlnbm9yZV9ib3VuY2UgPSAwOworCisJCXN3aXRjaCAoZXZlbnQpIHsKKwkJY2FzZSBBUE1fU1lTX1NUQU5EQlk6CisJCWNhc2UgQVBNX1VTRVJfU1RBTkRCWToKKwkJCXF1ZXVlX2V2ZW50KGV2ZW50LCBOVUxMKTsKKwkJCWlmIChzdGFuZGJ5c19wZW5kaW5nIDw9IDApCisJCQkJc3RhbmRieSgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBUE1fVVNFUl9TVVNQRU5EOgorI2lmZGVmIENPTkZJR19BUE1fSUdOT1JFX1VTRVJfU1VTUEVORAorCQkJaWYgKGFwbV9pbmZvLmNvbm5lY3Rpb25fdmVyc2lvbiA+IDB4MTAwKQorCQkJCXNldF9zeXN0ZW1fcG93ZXJfc3RhdGUoQVBNX1NUQVRFX1JFSkVDVCk7CisJCQlicmVhazsKKyNlbmRpZgorCQljYXNlIEFQTV9TWVNfU1VTUEVORDoKKwkJCWlmIChpZ25vcmVfYm91bmNlKSB7CisJCQkJaWYgKGFwbV9pbmZvLmNvbm5lY3Rpb25fdmVyc2lvbiA+IDB4MTAwKQorCQkJCQlzZXRfc3lzdGVtX3Bvd2VyX3N0YXRlKEFQTV9TVEFURV9SRUpFQ1QpOworCQkJCWJyZWFrOworCQkJfQorCQkJLyoKKwkJCSAqIElmIHdlIGFyZSBhbHJlYWR5IHByb2Nlc3NpbmcgYSBTVVNQRU5ELAorCQkJICogdGhlbiBmdXJ0aGVyIFNVU1BFTkQgZXZlbnRzIGZyb20gdGhlIEJJT1MKKwkJCSAqIHdpbGwgYmUgaWdub3JlZC4gIFdlIGFsc28gcmV0dXJuIGhlcmUgdG8KKwkJCSAqIGNvcGUgd2l0aCB0aGUgZmFjdCB0aGF0IHRoZSBUaGlua3BhZHMga2VlcAorCQkJICogc2VuZGluZyBhIFNVU1BFTkQgZXZlbnQgdW50aWwgc29tZXRoaW5nIGVsc2UKKwkJCSAqIGhhcHBlbnMhCisJCQkgKi8KKwkJCWlmIChpZ25vcmVfc3lzX3N1c3BlbmQpCisJCQkJcmV0dXJuOworCQkJaWdub3JlX3N5c19zdXNwZW5kID0gMTsKKwkJCXF1ZXVlX2V2ZW50KGV2ZW50LCBOVUxMKTsKKwkJCWlmIChzdXNwZW5kc19wZW5kaW5nIDw9IDApCisJCQkJKHZvaWQpIHN1c3BlbmQoMSk7CisJCQlicmVhazsKKworCQljYXNlIEFQTV9OT1JNQUxfUkVTVU1FOgorCQljYXNlIEFQTV9DUklUSUNBTF9SRVNVTUU6CisJCWNhc2UgQVBNX1NUQU5EQllfUkVTVU1FOgorCQkJaWdub3JlX3N5c19zdXNwZW5kID0gMDsKKwkJCWxhc3RfcmVzdW1lID0gamlmZmllczsKKwkJCWlnbm9yZV9ib3VuY2UgPSAxOworCQkJaWYgKChldmVudCAhPSBBUE1fTk9STUFMX1JFU1VNRSkKKwkJCSAgICB8fCAoaWdub3JlX25vcm1hbF9yZXN1bWUgPT0gMCkpIHsKKwkJCQl3cml0ZV9zZXFsb2NrX2lycSgmeHRpbWVfbG9jayk7CisJCQkJc2V0X3RpbWUoKTsKKwkJCQl3cml0ZV9zZXF1bmxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKKwkJCQlkZXZpY2VfcmVzdW1lKCk7CisJCQkJcG1fc2VuZF9hbGwoUE1fUkVTVU1FLCAodm9pZCAqKTApOworCQkJCXF1ZXVlX2V2ZW50KGV2ZW50LCBOVUxMKTsKKwkJCX0KKwkJCWlnbm9yZV9ub3JtYWxfcmVzdW1lID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgQVBNX0NBUEFCSUxJVFlfQ0hBTkdFOgorCQljYXNlIEFQTV9MT1dfQkFUVEVSWToKKwkJY2FzZSBBUE1fUE9XRVJfU1RBVFVTX0NIQU5HRToKKwkJCXF1ZXVlX2V2ZW50KGV2ZW50LCBOVUxMKTsKKwkJCS8qIElmIG5lZWRlZCwgbm90aWZ5IGRyaXZlcnMgaGVyZSAqLworCQkJYnJlYWs7CisKKwkJY2FzZSBBUE1fVVBEQVRFX1RJTUU6CisJCQl3cml0ZV9zZXFsb2NrX2lycSgmeHRpbWVfbG9jayk7CisJCQlzZXRfdGltZSgpOworCQkJd3JpdGVfc2VxdW5sb2NrX2lycSgmeHRpbWVfbG9jayk7CisJCQlicmVhazsKKworCQljYXNlIEFQTV9DUklUSUNBTF9TVVNQRU5EOgorCQkJLyoKKwkJCSAqIFdlIGFyZSBub3QgYWxsb3dlZCB0byByZWplY3QgYSBjcml0aWNhbCBzdXNwZW5kLgorCQkJICovCisJCQkodm9pZCkgc3VzcGVuZCgwKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBhcG1fZXZlbnRfaGFuZGxlcih2b2lkKQoreworCXN0YXRpYyBpbnQJcGVuZGluZ19jb3VudCA9IDQ7CisJaW50CQllcnI7CisKKwlpZiAoKHN0YW5kYnlzX3BlbmRpbmcgPiAwKSB8fCAoc3VzcGVuZHNfcGVuZGluZyA+IDApKSB7CisJCWlmICgoYXBtX2luZm8uY29ubmVjdGlvbl92ZXJzaW9uID4gMHgxMDApICYmCisJCQkJKHBlbmRpbmdfY291bnQtLSA8PSAwKSkgeworCQkJcGVuZGluZ19jb3VudCA9IDQ7CisJCQlpZiAoZGVidWcpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgImFwbTogc2V0dGluZyBzdGF0ZSBidXN5XG4iKTsKKwkJCWVyciA9IHNldF9zeXN0ZW1fcG93ZXJfc3RhdGUoQVBNX1NUQVRFX0JVU1kpOworCQkJaWYgKGVycikKKwkJCQlhcG1fZXJyb3IoImJ1c3kiLCBlcnIpOworCQl9CisJfSBlbHNlCisJCXBlbmRpbmdfY291bnQgPSA0OworCWNoZWNrX2V2ZW50cygpOworfQorCisvKgorICogVGhpcyBpcyB0aGUgQVBNIHRocmVhZCBtYWluIGxvb3AuCisgKi8KKworc3RhdGljIHZvaWQgYXBtX21haW5sb29wKHZvaWQpCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwlhZGRfd2FpdF9xdWV1ZSgmYXBtX3dhaXRxdWV1ZSwgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJZm9yICg7OykgeworCQlzY2hlZHVsZV90aW1lb3V0KEFQTV9DSEVDS19USU1FT1VUKTsKKwkJaWYgKGV4aXRfa2FwbWQpCisJCQlicmVhazsKKwkJLyoKKwkJICogT2ssIGNoZWNrIGFsbCBldmVudHMsIGNoZWNrIGZvciBpZGxlIChhbmQgbWFyayB1cyBzbGVlcGluZworCQkgKiBzbyBhcyBub3QgdG8gY291bnQgdG93YXJkcyB0aGUgbG9hZCBhdmVyYWdlKS4uCisJCSAqLworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlhcG1fZXZlbnRfaGFuZGxlcigpOworCX0KKwlyZW1vdmVfd2FpdF9xdWV1ZSgmYXBtX3dhaXRxdWV1ZSwgJndhaXQpOworfQorCitzdGF0aWMgaW50IGNoZWNrX2FwbV91c2VyKHN0cnVjdCBhcG1fdXNlciAqYXMsIGNvbnN0IGNoYXIgKmZ1bmMpCit7CisJaWYgKChhcyA9PSBOVUxMKSB8fCAoYXMtPm1hZ2ljICE9IEFQTV9CSU9TX01BR0lDKSkgeworCQlwcmludGsoS0VSTl9FUlIgImFwbTogJXMgcGFzc2VkIGJhZCBmaWxwXG4iLCBmdW5jKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBkb19yZWFkKHN0cnVjdCBmaWxlICpmcCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGFwbV91c2VyICoJYXM7CisJaW50CQkJaTsKKwlhcG1fZXZlbnRfdAkJZXZlbnQ7CisKKwlhcyA9IGZwLT5wcml2YXRlX2RhdGE7CisJaWYgKGNoZWNrX2FwbV91c2VyKGFzLCAicmVhZCIpKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAoKGludCljb3VudCA8IHNpemVvZihhcG1fZXZlbnRfdCkpCisJCXJldHVybiAtRUlOVkFMOworCWlmICgocXVldWVfZW1wdHkoYXMpKSAmJiAoZnAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkKKwkJcmV0dXJuIC1FQUdBSU47CisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGFwbV93YWl0cXVldWUsICFxdWV1ZV9lbXB0eShhcykpOworCWkgPSBjb3VudDsKKwl3aGlsZSAoKGkgPj0gc2l6ZW9mKGV2ZW50KSkgJiYgIXF1ZXVlX2VtcHR5KGFzKSkgeworCQlldmVudCA9IGdldF9xdWV1ZWRfZXZlbnQoYXMpOworCQlpZiAoY29weV90b191c2VyKGJ1ZiwgJmV2ZW50LCBzaXplb2YoZXZlbnQpKSkgeworCQkJaWYgKGkgPCBjb3VudCkKKwkJCQlicmVhazsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXN3aXRjaCAoZXZlbnQpIHsKKwkJY2FzZSBBUE1fU1lTX1NVU1BFTkQ6CisJCWNhc2UgQVBNX1VTRVJfU1VTUEVORDoKKwkJCWFzLT5zdXNwZW5kc19yZWFkKys7CisJCQlicmVhazsKKworCQljYXNlIEFQTV9TWVNfU1RBTkRCWToKKwkJY2FzZSBBUE1fVVNFUl9TVEFOREJZOgorCQkJYXMtPnN0YW5kYnlzX3JlYWQrKzsKKwkJCWJyZWFrOworCQl9CisJCWJ1ZiArPSBzaXplb2YoZXZlbnQpOworCQlpIC09IHNpemVvZihldmVudCk7CisJfQorCWlmIChpIDwgY291bnQpCisJCXJldHVybiBjb3VudCAtIGk7CisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGRvX3BvbGwoc3RydWN0IGZpbGUgKmZwLCBwb2xsX3RhYmxlICogd2FpdCkKK3sKKwlzdHJ1Y3QgYXBtX3VzZXIgKiBhczsKKworCWFzID0gZnAtPnByaXZhdGVfZGF0YTsKKwlpZiAoY2hlY2tfYXBtX3VzZXIoYXMsICJwb2xsIikpCisJCXJldHVybiAwOworCXBvbGxfd2FpdChmcCwgJmFwbV93YWl0cXVldWUsIHdhaXQpOworCWlmICghcXVldWVfZW1wdHkoYXMpKQorCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb19pb2N0bChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgICB1X2ludCBjbWQsIHVfbG9uZyBhcmcpCit7CisJc3RydWN0IGFwbV91c2VyICoJYXM7CisKKwlhcyA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlpZiAoY2hlY2tfYXBtX3VzZXIoYXMsICJpb2N0bCIpKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAoKCFhcy0+c3VzZXIpIHx8ICghYXMtPndyaXRlcikpCisJCXJldHVybiAtRVBFUk07CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEFQTV9JT0NfU1RBTkRCWToKKwkJaWYgKGFzLT5zdGFuZGJ5c19yZWFkID4gMCkgeworCQkJYXMtPnN0YW5kYnlzX3JlYWQtLTsKKwkJCWFzLT5zdGFuZGJ5c19wZW5kaW5nLS07CisJCQlzdGFuZGJ5c19wZW5kaW5nLS07CisJCX0gZWxzZQorCQkJcXVldWVfZXZlbnQoQVBNX1VTRVJfU1RBTkRCWSwgYXMpOworCQlpZiAoc3RhbmRieXNfcGVuZGluZyA8PSAwKQorCQkJc3RhbmRieSgpOworCQlicmVhazsKKwljYXNlIEFQTV9JT0NfU1VTUEVORDoKKwkJaWYgKGFzLT5zdXNwZW5kc19yZWFkID4gMCkgeworCQkJYXMtPnN1c3BlbmRzX3JlYWQtLTsKKwkJCWFzLT5zdXNwZW5kc19wZW5kaW5nLS07CisJCQlzdXNwZW5kc19wZW5kaW5nLS07CisJCX0gZWxzZQorCQkJcXVldWVfZXZlbnQoQVBNX1VTRVJfU1VTUEVORCwgYXMpOworCQlpZiAoc3VzcGVuZHNfcGVuZGluZyA8PSAwKSB7CisJCQlyZXR1cm4gc3VzcGVuZCgxKTsKKwkJfSBlbHNlIHsKKwkJCWFzLT5zdXNwZW5kX3dhaXQgPSAxOworCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGFwbV9zdXNwZW5kX3dhaXRxdWV1ZSwKKwkJCQkJYXMtPnN1c3BlbmRfd2FpdCA9PSAwKTsKKwkJCXJldHVybiBhcy0+c3VzcGVuZF9yZXN1bHQ7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRvX3JlbGVhc2Uoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlzdHJ1Y3QgYXBtX3VzZXIgKglhczsKKworCWFzID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWlmIChjaGVja19hcG1fdXNlcihhcywgInJlbGVhc2UiKSkKKwkJcmV0dXJuIDA7CisJZmlscC0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlpZiAoYXMtPnN0YW5kYnlzX3BlbmRpbmcgPiAwKSB7CisJCXN0YW5kYnlzX3BlbmRpbmcgLT0gYXMtPnN0YW5kYnlzX3BlbmRpbmc7CisJCWlmIChzdGFuZGJ5c19wZW5kaW5nIDw9IDApCisJCQlzdGFuZGJ5KCk7CisJfQorCWlmIChhcy0+c3VzcGVuZHNfcGVuZGluZyA+IDApIHsKKwkJc3VzcGVuZHNfcGVuZGluZyAtPSBhcy0+c3VzcGVuZHNfcGVuZGluZzsKKwkJaWYgKHN1c3BlbmRzX3BlbmRpbmcgPD0gMCkKKwkJCSh2b2lkKSBzdXNwZW5kKDEpOworCX0KKyAgCXNwaW5fbG9jaygmdXNlcl9saXN0X2xvY2spOworCWlmICh1c2VyX2xpc3QgPT0gYXMpCisJCXVzZXJfbGlzdCA9IGFzLT5uZXh0OworCWVsc2UgeworCQlzdHJ1Y3QgYXBtX3VzZXIgKglhczE7CisKKwkJZm9yIChhczEgPSB1c2VyX2xpc3Q7CisJCSAgICAgKGFzMSAhPSBOVUxMKSAmJiAoYXMxLT5uZXh0ICE9IGFzKTsKKwkJICAgICBhczEgPSBhczEtPm5leHQpCisJCQk7CisJCWlmIChhczEgPT0gTlVMTCkKKwkJCXByaW50ayhLRVJOX0VSUiAiYXBtOiBmaWxwIG5vdCBpbiB1c2VyIGxpc3RcbiIpOworCQllbHNlCisJCQlhczEtPm5leHQgPSBhcy0+bmV4dDsKKwl9CisJc3Bpbl91bmxvY2soJnVzZXJfbGlzdF9sb2NrKTsKKwlrZnJlZShhcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZG9fb3BlbihzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCXN0cnVjdCBhcG1fdXNlciAqCWFzOworCisJYXMgPSAoc3RydWN0IGFwbV91c2VyICopa21hbGxvYyhzaXplb2YoKmFzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGFzID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhcG06IGNhbm5vdCBhbGxvY2F0ZSBzdHJ1Y3Qgb2Ygc2l6ZSAlZCBieXRlc1xuIiwKKwkJICAgICAgIHNpemVvZigqYXMpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWFzLT5tYWdpYyA9IEFQTV9CSU9TX01BR0lDOworCWFzLT5ldmVudF90YWlsID0gYXMtPmV2ZW50X2hlYWQgPSAwOworCWFzLT5zdXNwZW5kc19wZW5kaW5nID0gYXMtPnN0YW5kYnlzX3BlbmRpbmcgPSAwOworCWFzLT5zdXNwZW5kc19yZWFkID0gYXMtPnN0YW5kYnlzX3JlYWQgPSAwOworCS8qCisJICogWFhYIC0gdGhpcyBpcyBhIHRpbnkgYml0IGJyb2tlbiwgd2hlbiB3ZSBjb25zaWRlciBCU0QKKyAgICAgICAgICogcHJvY2VzcyBhY2NvdW50aW5nLiBJZiB0aGUgZGV2aWNlIGlzIG9wZW5lZCBieSByb290LCB3ZQorCSAqIGluc3RhbnRseSBmbGFnIHRoYXQgd2UgdXNlZCBzdXBlcnVzZXIgcHJpdnMuIFdobyBrbm93cywKKwkgKiB3ZSBtaWdodCBjbG9zZSB0aGUgZGV2aWNlIGltbWVkaWF0ZWx5IHdpdGhvdXQgZG9pbmcgYQorCSAqIHByaXZpbGVnZWQgb3BlcmF0aW9uIC0tIGNldmFucworCSAqLworCWFzLT5zdXNlciA9IGNhcGFibGUoQ0FQX1NZU19BRE1JTik7CisJYXMtPndyaXRlciA9IChmaWxwLT5mX21vZGUgJiBGTU9ERV9XUklURSkgPT0gRk1PREVfV1JJVEU7CisJYXMtPnJlYWRlciA9IChmaWxwLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA9PSBGTU9ERV9SRUFEOworCXNwaW5fbG9jaygmdXNlcl9saXN0X2xvY2spOworCWFzLT5uZXh0ID0gdXNlcl9saXN0OworCXVzZXJfbGlzdCA9IGFzOworCXNwaW5fdW5sb2NrKCZ1c2VyX2xpc3RfbG9jayk7CisJZmlscC0+cHJpdmF0ZV9kYXRhID0gYXM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXBtX2dldF9pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBmcG9zLCBpbnQgbGVuZ3RoKQoreworCWNoYXIgKgkJcDsKKwl1bnNpZ25lZCBzaG9ydAlieDsKKwl1bnNpZ25lZCBzaG9ydAljeDsKKwl1bnNpZ25lZCBzaG9ydAlkeDsKKwlpbnQJCWVycm9yOworCXVuc2lnbmVkIHNob3J0ICBhY19saW5lX3N0YXR1cyA9IDB4ZmY7CisJdW5zaWduZWQgc2hvcnQgIGJhdHRlcnlfc3RhdHVzID0gMHhmZjsKKwl1bnNpZ25lZCBzaG9ydCAgYmF0dGVyeV9mbGFnICAgPSAweGZmOworCWludAkJcGVyY2VudGFnZSAgICAgPSAtMTsKKwlpbnQgICAgICAgICAgICAgdGltZV91bml0cyAgICAgPSAtMTsKKwljaGFyICAgICAgICAgICAgKnVuaXRzICAgICAgICAgPSAiPyI7CisKKwlwID0gYnVmOworCisJaWYgKChudW1fb25saW5lX2NwdXMoKSA9PSAxKSAmJgorCSAgICAhKGVycm9yID0gYXBtX2dldF9wb3dlcl9zdGF0dXMoJmJ4LCAmY3gsICZkeCkpKSB7CisJCWFjX2xpbmVfc3RhdHVzID0gKGJ4ID4+IDgpICYgMHhmZjsKKwkJYmF0dGVyeV9zdGF0dXMgPSBieCAmIDB4ZmY7CisJCWlmICgoY3ggJiAweGZmKSAhPSAweGZmKQorCQkJcGVyY2VudGFnZSA9IGN4ICYgMHhmZjsKKworCQlpZiAoYXBtX2luZm8uY29ubmVjdGlvbl92ZXJzaW9uID4gMHgxMDApIHsKKwkJCWJhdHRlcnlfZmxhZyA9IChjeCA+PiA4KSAmIDB4ZmY7CisJCQlpZiAoZHggIT0gMHhmZmZmKSB7CisJCQkJdW5pdHMgPSAoZHggJiAweDgwMDApID8gIm1pbiIgOiAic2VjIjsKKwkJCQl0aW1lX3VuaXRzID0gZHggJiAweDdmZmY7CisJCQl9CisJCX0KKwl9CisJLyogQXJndW1lbnRzLCB3aXRoIHN5bWJvbHMgZnJvbSBsaW51eC9hcG1fYmlvcy5oLiAgSW5mb3JtYXRpb24gaXMKKwkgICBmcm9tIHRoZSBHZXQgUG93ZXIgU3RhdHVzICgweDBhKSBjYWxsIHVubGVzcyBvdGhlcndpc2Ugbm90ZWQuCisKKwkgICAwKSBMaW51eCBkcml2ZXIgdmVyc2lvbiAodGhpcyB3aWxsIGNoYW5nZSBpZiBmb3JtYXQgY2hhbmdlcykKKwkgICAxKSBBUE0gQklPUyBWZXJzaW9uLiAgVXN1YWxseSAxLjAsIDEuMSBvciAxLjIuCisJICAgMikgQVBNIGZsYWdzIGZyb20gQVBNIEluc3RhbGxhdGlvbiBDaGVjayAoMHgwMCk6CisJICAgICAgYml0IDA6IEFQTV8xNl9CSVRfU1VQUE9SVAorCSAgICAgIGJpdCAxOiBBUE1fMzJfQklUX1NVUFBPUlQKKwkgICAgICBiaXQgMjogQVBNX0lETEVfU0xPV1NfQ0xPQ0sKKwkgICAgICBiaXQgMzogQVBNX0JJT1NfRElTQUJMRUQKKwkgICAgICBiaXQgNDogQVBNX0JJT1NfRElTRU5HQUdFRAorCSAgIDMpIEFDIGxpbmUgc3RhdHVzCisJICAgICAgMHgwMDogT2ZmLWxpbmUKKwkgICAgICAweDAxOiBPbi1saW5lCisJICAgICAgMHgwMjogT24gYmFja3VwIHBvd2VyIChCSU9TID49IDEuMSBvbmx5KQorCSAgICAgIDB4ZmY6IFVua25vd24KKwkgICA0KSBCYXR0ZXJ5IHN0YXR1cworCSAgICAgIDB4MDA6IEhpZ2gKKwkgICAgICAweDAxOiBMb3cKKwkgICAgICAweDAyOiBDcml0aWNhbAorCSAgICAgIDB4MDM6IENoYXJnaW5nCisJICAgICAgMHgwNDogU2VsZWN0ZWQgYmF0dGVyeSBub3QgcHJlc2VudCAoQklPUyA+PSAxLjIgb25seSkKKwkgICAgICAweGZmOiBVbmtub3duCisJICAgNSkgQmF0dGVyeSBmbGFnCisJICAgICAgYml0IDA6IEhpZ2gKKwkgICAgICBiaXQgMTogTG93CisJICAgICAgYml0IDI6IENyaXRpY2FsCisJICAgICAgYml0IDM6IENoYXJnaW5nCisJICAgICAgYml0IDc6IE5vIHN5c3RlbSBiYXR0ZXJ5CisJICAgICAgMHhmZjogVW5rbm93bgorCSAgIDYpIFJlbWFpbmluZyBiYXR0ZXJ5IGxpZmUgKHBlcmNlbnRhZ2Ugb2YgY2hhcmdlKToKKwkgICAgICAwLTEwMDogdmFsaWQKKwkgICAgICAtMTogVW5rbm93bgorCSAgIDcpIFJlbWFpbmluZyBiYXR0ZXJ5IGxpZmUgKHRpbWUgdW5pdHMpOgorCSAgICAgIE51bWJlciBvZiByZW1haW5pbmcgbWludXRlcyBvciBzZWNvbmRzCisJICAgICAgLTE6IFVua25vd24KKwkgICA4KSBtaW4gPSBtaW51dGVzOyBzZWMgPSBzZWNvbmRzICovCisKKwlwICs9IHNwcmludGYocCwgIiVzICVkLiVkIDB4JTAyeCAweCUwMnggMHglMDJ4IDB4JTAyeCAlZCUlICVkICVzXG4iLAorCQkgICAgIGRyaXZlcl92ZXJzaW9uLAorCQkgICAgIChhcG1faW5mby5iaW9zLnZlcnNpb24gPj4gOCkgJiAweGZmLAorCQkgICAgIGFwbV9pbmZvLmJpb3MudmVyc2lvbiAmIDB4ZmYsCisJCSAgICAgYXBtX2luZm8uYmlvcy5mbGFncywKKwkJICAgICBhY19saW5lX3N0YXR1cywKKwkJICAgICBiYXR0ZXJ5X3N0YXR1cywKKwkJICAgICBiYXR0ZXJ5X2ZsYWcsCisJCSAgICAgcGVyY2VudGFnZSwKKwkJICAgICB0aW1lX3VuaXRzLAorCQkgICAgIHVuaXRzKTsKKworCXJldHVybiBwIC0gYnVmOworfQorCitzdGF0aWMgaW50IGFwbSh2b2lkICp1bnVzZWQpCit7CisJdW5zaWduZWQgc2hvcnQJYng7CisJdW5zaWduZWQgc2hvcnQJY3g7CisJdW5zaWduZWQgc2hvcnQJZHg7CisJaW50CQllcnJvcjsKKwljaGFyICoJCXBvd2VyX3N0YXQ7CisJY2hhciAqCQliYXRfc3RhdDsKKworCWthcG1kX3J1bm5pbmcgPSAxOworCisJZGFlbW9uaXplKCJrYXBtZCIpOworCisJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CisKKyNpZmRlZiBDT05GSUdfU01QCisJLyogMjAwMi8wOC8wMSAtIFdUCisJICogVGhpcyBpcyB0byBhdm9pZCByYW5kb20gY3Jhc2hlcyBhdCBib290IHRpbWUgZHVyaW5nIGluaXRpYWxpemF0aW9uCisJICogb24gU01QIHN5c3RlbXMgaW4gY2FzZSBvZiAiYXBtPXBvd2VyLW9mZiIgbW9kZS4gU2VlbiBvbiBBU1VTIEE3TTI2NkQuCisJICogU29tZSBiaW9zZXMgZG9uJ3QgbGlrZSBiZWluZyBjYWxsZWQgZnJvbSBDUFUgIT0gMC4KKwkgKiBNZXRob2Qgc3VnZ2VzdGVkIGJ5IEluZ28gTW9sbmFyLgorCSAqLworCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgY3B1bWFza19vZl9jcHUoMCkpOworCUJVR19PTihzbXBfcHJvY2Vzc29yX2lkKCkgIT0gMCk7CisjZW5kaWYKKworCWlmIChhcG1faW5mby5jb25uZWN0aW9uX3ZlcnNpb24gPT0gMCkgeworCQlhcG1faW5mby5jb25uZWN0aW9uX3ZlcnNpb24gPSBhcG1faW5mby5iaW9zLnZlcnNpb247CisJCWlmIChhcG1faW5mby5jb25uZWN0aW9uX3ZlcnNpb24gPiAweDEwMCkgeworCQkJLyoKKwkJCSAqIFdlIG9ubHkgc3VwcG9ydCBCSU9TcyB1cCB0byB2ZXJzaW9uIDEuMgorCQkJICovCisJCQlpZiAoYXBtX2luZm8uY29ubmVjdGlvbl92ZXJzaW9uID4gMHgwMTAyKQorCQkJCWFwbV9pbmZvLmNvbm5lY3Rpb25fdmVyc2lvbiA9IDB4MDEwMjsKKwkJCWVycm9yID0gYXBtX2RyaXZlcl92ZXJzaW9uKCZhcG1faW5mby5jb25uZWN0aW9uX3ZlcnNpb24pOworCQkJaWYgKGVycm9yICE9IEFQTV9TVUNDRVNTKSB7CisJCQkJYXBtX2Vycm9yKCJkcml2ZXIgdmVyc2lvbiIsIGVycm9yKTsKKwkJCQkvKiBGYWxsIGJhY2sgdG8gYW4gQVBNIDEuMCBjb25uZWN0aW9uLiAqLworCQkJCWFwbV9pbmZvLmNvbm5lY3Rpb25fdmVyc2lvbiA9IDB4MTAwOworCQkJfQorCQl9CisJfQorCisJaWYgKGRlYnVnKQorCQlwcmludGsoS0VSTl9JTkZPICJhcG06IENvbm5lY3Rpb24gdmVyc2lvbiAlZC4lZFxuIiwKKwkJCShhcG1faW5mby5jb25uZWN0aW9uX3ZlcnNpb24gPj4gOCkgJiAweGZmLAorCQkJYXBtX2luZm8uY29ubmVjdGlvbl92ZXJzaW9uICYgMHhmZik7CisKKyNpZmRlZiBDT05GSUdfQVBNX0RPX0VOQUJMRQorCWlmIChhcG1faW5mby5iaW9zLmZsYWdzICYgQVBNX0JJT1NfRElTQUJMRUQpIHsKKwkJLyoKKwkJICogVGhpcyBjYWxsIGNhdXNlcyBteSBORUMgVWx0cmFMaXRlIFZlcnNhIDMzL0MgdG8gaGFuZyBpZiBpdAorCQkgKiBpcyBib290ZWQgd2l0aCBQTSBkaXNhYmxlZCBidXQgbm90IGluIHRoZSBkb2NraW5nIHN0YXRpb24uCisJCSAqIFVuZm9ydHVuYXRlIC4uLgorCQkgKi8KKwkJZXJyb3IgPSBhcG1fZW5hYmxlX3Bvd2VyX21hbmFnZW1lbnQoMSk7CisJCWlmIChlcnJvcikgeworCQkJYXBtX2Vycm9yKCJlbmFibGUgcG93ZXIgbWFuYWdlbWVudCIsIGVycm9yKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKyNlbmRpZgorCisJaWYgKChhcG1faW5mby5iaW9zLmZsYWdzICYgQVBNX0JJT1NfRElTRU5HQUdFRCkKKwkgICAgJiYgKGFwbV9pbmZvLmNvbm5lY3Rpb25fdmVyc2lvbiA+IDB4MDEwMCkpIHsKKwkJZXJyb3IgPSBhcG1fZW5nYWdlX3Bvd2VyX21hbmFnZW1lbnQoQVBNX0RFVklDRV9BTEwsIDEpOworCQlpZiAoZXJyb3IpIHsKKwkJCWFwbV9lcnJvcigiZW5nYWdlIHBvd2VyIG1hbmFnZW1lbnQiLCBlcnJvcik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlpZiAoZGVidWcgJiYgKG51bV9vbmxpbmVfY3B1cygpID09IDEgfHwgc21wICkpIHsKKwkJZXJyb3IgPSBhcG1fZ2V0X3Bvd2VyX3N0YXR1cygmYngsICZjeCwgJmR4KTsKKwkJaWYgKGVycm9yKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiYXBtOiBwb3dlciBzdGF0dXMgbm90IGF2YWlsYWJsZVxuIik7CisJCWVsc2UgeworCQkJc3dpdGNoICgoYnggPj4gOCkgJiAweGZmKSB7CisJCQljYXNlIDA6IHBvd2VyX3N0YXQgPSAib2ZmIGxpbmUiOyBicmVhazsKKwkJCWNhc2UgMTogcG93ZXJfc3RhdCA9ICJvbiBsaW5lIjsgYnJlYWs7CisJCQljYXNlIDI6IHBvd2VyX3N0YXQgPSAib24gYmFja3VwIHBvd2VyIjsgYnJlYWs7CisJCQlkZWZhdWx0OiBwb3dlcl9zdGF0ID0gInVua25vd24iOyBicmVhazsKKwkJCX0KKwkJCXN3aXRjaCAoYnggJiAweGZmKSB7CisJCQljYXNlIDA6IGJhdF9zdGF0ID0gImhpZ2giOyBicmVhazsKKwkJCWNhc2UgMTogYmF0X3N0YXQgPSAibG93IjsgYnJlYWs7CisJCQljYXNlIDI6IGJhdF9zdGF0ID0gImNyaXRpY2FsIjsgYnJlYWs7CisJCQljYXNlIDM6IGJhdF9zdGF0ID0gImNoYXJnaW5nIjsgYnJlYWs7CisJCQlkZWZhdWx0OiBiYXRfc3RhdCA9ICJ1bmtub3duIjsgYnJlYWs7CisJCQl9CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgImFwbTogQUMgJXMsIGJhdHRlcnkgc3RhdHVzICVzLCBiYXR0ZXJ5IGxpZmUgIiwKKwkJCSAgICAgICBwb3dlcl9zdGF0LCBiYXRfc3RhdCk7CisJCQlpZiAoKGN4ICYgMHhmZikgPT0gMHhmZikKKwkJCQlwcmludGsoInVua25vd25cbiIpOworCQkJZWxzZQorCQkJCXByaW50aygiJWQlJVxuIiwgY3ggJiAweGZmKTsKKwkJCWlmIChhcG1faW5mby5jb25uZWN0aW9uX3ZlcnNpb24gPiAweDEwMCkgeworCQkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkgICAgICAgImFwbTogYmF0dGVyeSBmbGFnIDB4JTAyeCwgYmF0dGVyeSBsaWZlICIsCisJCQkJICAgICAgIChjeCA+PiA4KSAmIDB4ZmYpOworCQkJCWlmIChkeCA9PSAweGZmZmYpCisJCQkJCXByaW50aygidW5rbm93blxuIik7CisJCQkJZWxzZQorCQkJCQlwcmludGsoIiVkICVzXG4iLCBkeCAmIDB4N2ZmZiwKKwkJCQkJCShkeCAmIDB4ODAwMCkgPworCQkJCQkJIm1pbnV0ZXMiIDogInNlY29uZHMiKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIEluc3RhbGwgb3VyIHBvd2VyIG9mZiBoYW5kbGVyLi4gKi8KKwlpZiAocG93ZXJfb2ZmKQorCQlwbV9wb3dlcl9vZmYgPSBhcG1fcG93ZXJfb2ZmOworCisJaWYgKG51bV9vbmxpbmVfY3B1cygpID09IDEgfHwgc21wKSB7CisjaWYgZGVmaW5lZChDT05GSUdfQVBNX0RJU1BMQVlfQkxBTkspICYmIGRlZmluZWQoQ09ORklHX1ZUKQorCQljb25zb2xlX2JsYW5rX2hvb2sgPSBhcG1fY29uc29sZV9ibGFuazsKKyNlbmRpZgorCQlhcG1fbWFpbmxvb3AoKTsKKyNpZiBkZWZpbmVkKENPTkZJR19BUE1fRElTUExBWV9CTEFOSykgJiYgZGVmaW5lZChDT05GSUdfVlQpCisJCWNvbnNvbGVfYmxhbmtfaG9vayA9IE5VTEw7CisjZW5kaWYKKwl9CisJa2FwbWRfcnVubmluZyA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworI2lmbmRlZiBNT0RVTEUKK3N0YXRpYyBpbnQgX19pbml0IGFwbV9zZXR1cChjaGFyICpzdHIpCit7CisJaW50CWludmVydDsKKworCXdoaWxlICgoc3RyICE9IE5VTEwpICYmICgqc3RyICE9ICdcMCcpKSB7CisJCWlmIChzdHJuY21wKHN0ciwgIm9mZiIsIDMpID09IDApCisJCQlhcG1fZGlzYWJsZWQgPSAxOworCQlpZiAoc3RybmNtcChzdHIsICJvbiIsIDIpID09IDApCisJCQlhcG1fZGlzYWJsZWQgPSAwOworCQlpZiAoKHN0cm5jbXAoc3RyLCAiYm91bmNlLWludGVydmFsPSIsIDE2KSA9PSAwKSB8fAorCQkgICAgKHN0cm5jbXAoc3RyLCAiYm91bmNlX2ludGVydmFsPSIsIDE2KSA9PSAwKSkKKwkJCWJvdW5jZV9pbnRlcnZhbCA9IHNpbXBsZV9zdHJ0b2woc3RyICsgMTYsIE5VTEwsIDApOworCQlpZiAoKHN0cm5jbXAoc3RyLCAiaWRsZS10aHJlc2hvbGQ9IiwgMTUpID09IDApIHx8CisJCSAgICAoc3RybmNtcChzdHIsICJpZGxlX3RocmVzaG9sZD0iLCAxNSkgPT0gMCkpCisJCQlpZGxlX3RocmVzaG9sZCA9IHNpbXBsZV9zdHJ0b2woc3RyICsgMTUsIE5VTEwsIDApOworCQlpZiAoKHN0cm5jbXAoc3RyLCAiaWRsZS1wZXJpb2Q9IiwgMTIpID09IDApIHx8CisJCSAgICAoc3RybmNtcChzdHIsICJpZGxlX3BlcmlvZD0iLCAxMikgPT0gMCkpCisJCQlpZGxlX3BlcmlvZCA9IHNpbXBsZV9zdHJ0b2woc3RyICsgMTIsIE5VTEwsIDApOworCQlpbnZlcnQgPSAoc3RybmNtcChzdHIsICJuby0iLCAzKSA9PSAwKSB8fAorCQkJKHN0cm5jbXAoc3RyLCAibm9fIiwgMykgPT0gMCk7CisJCWlmIChpbnZlcnQpCisJCQlzdHIgKz0gMzsKKwkJaWYgKHN0cm5jbXAoc3RyLCAiZGVidWciLCA1KSA9PSAwKQorCQkJZGVidWcgPSAhaW52ZXJ0OworCQlpZiAoKHN0cm5jbXAoc3RyLCAicG93ZXItb2ZmIiwgOSkgPT0gMCkgfHwKKwkJICAgIChzdHJuY21wKHN0ciwgInBvd2VyX29mZiIsIDkpID09IDApKQorCQkJcG93ZXJfb2ZmID0gIWludmVydDsKKwkJaWYgKHN0cm5jbXAoc3RyLCAic21wIiwgMykgPT0gMCkKKwkJeworCQkJc21wID0gIWludmVydDsKKwkJCWlkbGVfdGhyZXNob2xkID0gMTAwOworCQl9CisJCWlmICgoc3RybmNtcChzdHIsICJhbGxvdy1pbnRzIiwgMTApID09IDApIHx8CisJCSAgICAoc3RybmNtcChzdHIsICJhbGxvd19pbnRzIiwgMTApID09IDApKQorIAkJCWFwbV9pbmZvLmFsbG93X2ludHMgPSAhaW52ZXJ0OworCQlpZiAoKHN0cm5jbXAoc3RyLCAiYnJva2VuLXBzciIsIDEwKSA9PSAwKSB8fAorCQkgICAgKHN0cm5jbXAoc3RyLCAiYnJva2VuX3BzciIsIDEwKSA9PSAwKSkKKwkJCWFwbV9pbmZvLmdldF9wb3dlcl9zdGF0dXNfYnJva2VuID0gIWludmVydDsKKwkJaWYgKChzdHJuY21wKHN0ciwgInJlYWxtb2RlLXBvd2VyLW9mZiIsIDE4KSA9PSAwKSB8fAorCQkgICAgKHN0cm5jbXAoc3RyLCAicmVhbG1vZGVfcG93ZXJfb2ZmIiwgMTgpID09IDApKQorCQkJYXBtX2luZm8ucmVhbG1vZGVfcG93ZXJfb2ZmID0gIWludmVydDsKKwkJc3RyID0gc3RyY2hyKHN0ciwgJywnKTsKKwkJaWYgKHN0ciAhPSBOVUxMKQorCQkJc3RyICs9IHN0cnNwbihzdHIsICIsIFx0Iik7CisJfQorCXJldHVybiAxOworfQorCitfX3NldHVwKCJhcG09IiwgYXBtX3NldHVwKTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhcG1fYmlvc19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkucmVhZAkJPSBkb19yZWFkLAorCS5wb2xsCQk9IGRvX3BvbGwsCisJLmlvY3RsCQk9IGRvX2lvY3RsLAorCS5vcGVuCQk9IGRvX29wZW4sCisJLnJlbGVhc2UJPSBkb19yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGFwbV9kZXZpY2UgPSB7CisJQVBNX01JTk9SX0RFViwKKwkiYXBtX2Jpb3MiLAorCSZhcG1fYmlvc19mb3BzCit9OworCisKKy8qIFNpbXBsZSAicHJpbnQgaWYgdHJ1ZSIgY2FsbGJhY2sgKi8KK3N0YXRpYyBpbnQgX19pbml0IHByaW50X2lmX3RydWUoc3RydWN0IGRtaV9zeXN0ZW1faWQgKmQpCit7CisJcHJpbnRrKCIlc1xuIiwgZC0+aWRlbnQpOworCXJldHVybiAwOworfQorCisvKgorICogU29tZSBCaW9zZXMgZW5hYmxlIHRoZSBQUy8yIG1vdXNlICh0b3VjaHBhZCkgYXQgcmVzdW1lLCBldmVuIGlmIGl0IHdhcworICogZGlzYWJsZWQgYmVmb3JlIHRoZSBzdXNwZW5kLiBMaW51eCB1c2VkIHRvIGdldCB0ZXJyaWJseSBjb25mdXNlZCBieSB0aGF0LgorICovCitzdGF0aWMgaW50IF9faW5pdCBicm9rZW5fcHMyX3Jlc3VtZShzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICIlcyBtYWNoaW5lIGRldGVjdGVkLiBNb3VzZXBhZCBSZXN1bWUgQnVnIHdvcmthcm91bmQgaG9wZWZ1bGx5IG5vdCBuZWVkZWQuXG4iLCBkLT5pZGVudCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFNvbWUgYmlvc2VzIGhhdmUgYSBicm9rZW4gcHJvdGVjdGVkIG1vZGUgcG93ZXJvZmYgYW5kIG5lZWQgdG8gdXNlIHJlYWxtb2RlICovCitzdGF0aWMgaW50IF9faW5pdCBzZXRfcmVhbG1vZGVfcG93ZXJfb2ZmKHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQoreworCWlmIChhcG1faW5mby5yZWFsbW9kZV9wb3dlcl9vZmYgPT0gMCkgeworCQlhcG1faW5mby5yZWFsbW9kZV9wb3dlcl9vZmYgPSAxOworCQlwcmludGsoS0VSTl9JTkZPICIlcyBiaW9zIGRldGVjdGVkLiBVc2luZyByZWFsbW9kZSBwb3dlcm9mZiBvbmx5LlxuIiwgZC0+aWRlbnQpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogU29tZSBsYXB0b3BzIHJlcXVpcmUgaW50ZXJydXB0cyB0byBiZSBlbmFibGVkIGR1cmluZyBBUE0gY2FsbHMgKi8KK3N0YXRpYyBpbnQgX19pbml0IHNldF9hcG1faW50cyhzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZCkKK3sKKwlpZiAoYXBtX2luZm8uYWxsb3dfaW50cyA9PSAwKSB7CisJCWFwbV9pbmZvLmFsbG93X2ludHMgPSAxOworCQlwcmludGsoS0VSTl9JTkZPICIlcyBtYWNoaW5lIGRldGVjdGVkLiBFbmFibGluZyBpbnRlcnJ1cHRzIGR1cmluZyBBUE0gY2FsbHMuXG4iLCBkLT5pZGVudCk7CisJfQorCXJldHVybiAwOworfQorCisvKiBTb21lIEFQTSBiaW9zZXMgY29ycnVwdCBtZW1vcnkgb3IganVzdCBwbGFpbiBkbyBub3Qgd29yayAqLworc3RhdGljIGludCBfX2luaXQgYXBtX2lzX2hvcmtlZChzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZCkKK3sKKwlpZiAoYXBtX2luZm8uZGlzYWJsZWQgPT0gMCkgeworCQlhcG1faW5mby5kaXNhYmxlZCA9IDE7CisJCXByaW50ayhLRVJOX0lORk8gIiVzIG1hY2hpbmUgZGV0ZWN0ZWQuIERpc2FibGluZyBBUE0uXG4iLCBkLT5pZGVudCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhcG1faXNfaG9ya2VkX2Q4NTBtZChzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZCkKK3sKKwlpZiAoYXBtX2luZm8uZGlzYWJsZWQgPT0gMCkgeworCQlhcG1faW5mby5kaXNhYmxlZCA9IDE7CisJCXByaW50ayhLRVJOX0lORk8gIiVzIG1hY2hpbmUgZGV0ZWN0ZWQuIERpc2FibGluZyBBUE0uXG4iLCBkLT5pZGVudCk7CisJCXByaW50ayhLRVJOX0lORk8gIlRoaXMgYnVnIGlzIGZpeGVkIGluIGJpb3MgUDE1IHdoaWNoIGlzIGF2YWlsYWJsZSBmb3IgXG4iKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZG93bmxvYWQgZnJvbSBzdXBwb3J0LmludGVsLmNvbSBcbiIpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogU29tZSBBUE0gYmlvc2VzIGhhbmcgb24gQVBNIGlkbGUgY2FsbHMgKi8KK3N0YXRpYyBpbnQgX19pbml0IGFwbV9saWtlc190b19tZWx0KHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQoreworCWlmIChhcG1faW5mby5mb3JiaWRfaWRsZSA9PSAwKSB7CisJCWFwbV9pbmZvLmZvcmJpZF9pZGxlID0gMTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgbWFjaGluZSBkZXRlY3RlZC4gRGlzYWJsaW5nIEFQTSBpZGxlIGNhbGxzLlxuIiwgZC0+aWRlbnQpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICBDaGVjayBmb3IgY2x1ZSBmcmVlIEJJT1MgaW1wbGVtZW50YXRpb25zIHdobyB1c2UKKyAqICB0aGUgZm9sbG93aW5nIFFBIHRlY2huaXF1ZQorICoKKyAqICAgICAgWyBXcml0ZSBCSU9TIENvZGUgXTwtLS0tLS0KKyAqICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICBeCisgKiAgICAgIDwgRG9lcyBpdCBDb21waWxlID4tLS0tTi0tCisgKiAgICAgICAgICAgICAgIHxZICAgICAgICAgICAgICAgXgorICoJPCBEb2VzIGl0IEJvb3QgV2luOTggPi1OLS0KKyAqICAgICAgICAgICAgICAgfFkKKyAqICAgICAgICAgICBbU2hpcCBJdF0KKyAqCisgKglQaG9lbml4IEEwNCAgMDgvMjQvMjAwMCBpcyBrbm93biBiYWQgKERlbGwgSW5zcGlyb24gNTAwMGUpCisgKglQaG9lbml4IEEwNyAgMDkvMjkvMjAwMCBpcyBrbm93biBnb29kIChEZWxsIEluc3Bpcm9uIDUwMDApCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGJyb2tlbl9hcG1fcG93ZXIoc3RydWN0IGRtaV9zeXN0ZW1faWQgKmQpCit7CisJYXBtX2luZm8uZ2V0X3Bvd2VyX3N0YXR1c19icm9rZW4gPSAxOworCXByaW50ayhLRVJOX1dBUk5JTkcgIkJJT1Mgc3RyaW5ncyBzdWdnZXN0IEFQTSBidWdzLCBkaXNhYmxpbmcgcG93ZXIgc3RhdHVzIHJlcG9ydGluZy5cbiIpOworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBiaW9zIHN3YXBzIHRoZSBBUE0gbWludXRlIHJlcG9ydGluZyBieXRlcyBvdmVyIChNYW55IHNvbnkgbGFwdG9wcworICogaGF2ZSB0aGlzIHByb2JsZW0pLgorICovCitzdGF0aWMgaW50IF9faW5pdCBzd2FiX2FwbV9wb3dlcl9pbl9taW51dGVzKHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQoreworCWFwbV9pbmZvLmdldF9wb3dlcl9zdGF0dXNfc3dhYmlubWludXRlcyA9IDE7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiQklPUyBzdHJpbmdzIHN1Z2dlc3QgQVBNIHJlcG9ydHMgYmF0dGVyeSBsaWZlIGluIG1pbnV0ZXMgYW5kIHdyb25nIGJ5dGUgb3JkZXIuXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIF9faW5pdGRhdGEgYXBtX2RtaV90YWJsZVtdID0geworCXsKKwkJcHJpbnRfaWZfdHJ1ZSwKKwkJS0VSTl9XQVJOSU5HICJJQk0gVDIzIC0gQklPUyAxLjAzYisgYW5kIGNvbnRyb2xsZXIgZmlybXdhcmUgMS4wMisgbWF5IGJlIG5lZWRlZCBmb3IgTGludXggQVBNLiIsCisJCXsJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiSUJNIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwgIjFBRVQzOFdXICgxLjAxYikiKSwgfSwKKwl9LAorCXsJLyogSGFuZGxlIHByb2JsZW1zIHdpdGggQVBNIG9uIHRoZSBDNjAwICovCisJCWJyb2tlbl9wczJfcmVzdW1lLCAiRGVsbCBMYXRpdHVkZSBDNjAwIiwKKwkJewlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkxhdGl0dWRlIEM2MDAiKSwgfSwKKwl9LAorCXsJLyogQWxsb3cgaW50ZXJydXB0cyBkdXJpbmcgc3VzcGVuZCBvbiBEZWxsIExhdGl0dWRlIGxhcHRvcHMqLworCQlzZXRfYXBtX2ludHMsICJEZWxsIExhdGl0dWRlIiwKKwkJewlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIENvbXB1dGVyIENvcnBvcmF0aW9uIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkxhdGl0dWRlIEM1MTAiKSwgfQorCX0sCisJewkvKiBBUE0gY3Jhc2hlcyAqLworCQlhcG1faXNfaG9ya2VkLCAiRGVsbCBJbnNwaXJvbiAyNTAwIiwKKwkJewlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIENvbXB1dGVyIENvcnBvcmF0aW9uIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkluc3Bpcm9uIDI1MDAiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19WRU5ET1IsIlBob2VuaXggVGVjaG5vbG9naWVzIExURCIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX1ZFUlNJT04sIkExMSIpLCB9LAorCX0sCisJewkvKiBBbGxvdyBpbnRlcnJ1cHRzIGR1cmluZyBzdXNwZW5kIG9uIERlbGwgSW5zcGlyb24gbGFwdG9wcyovCisJCXNldF9hcG1faW50cywgIkRlbGwgSW5zcGlyb24iLCB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIENvbXB1dGVyIENvcnBvcmF0aW9uIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkluc3Bpcm9uIDQwMDAiKSwgfSwKKwl9LAorCXsJLyogSGFuZGxlIHByb2JsZW1zIHdpdGggQVBNIG9uIEluc3Bpcm9uIDUwMDBlICovCisJCWJyb2tlbl9hcG1fcG93ZXIsICJEZWxsIEluc3Bpcm9uIDUwMDBlIiwKKwkJewlETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCAiUGhvZW5peCBUZWNobm9sb2dpZXMgTFREIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwgIkEwNCIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX0RBVEUsICIwOC8yNC8yMDAwIiksIH0sCisJfSwKKwl7CS8qIEhhbmRsZSBwcm9ibGVtcyB3aXRoIEFQTSBvbiBJbnNwaXJvbiAyNTAwICovCisJCWJyb2tlbl9hcG1fcG93ZXIsICJEZWxsIEluc3Bpcm9uIDI1MDAiLAorCQl7CURNSV9NQVRDSChETUlfQklPU19WRU5ET1IsICJQaG9lbml4IFRlY2hub2xvZ2llcyBMVEQiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCAiQTEyIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfREFURSwgIjAyLzA0LzIwMDIiKSwgfSwKKwl9LAorCXsJLyogQVBNIGNyYXNoZXMgKi8KKwkJYXBtX2lzX2hvcmtlZCwgIkRlbGwgRGltZW5zaW9uIDQxMDAiLAorCQl7CURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgQ29tcHV0ZXIgQ29ycG9yYXRpb24iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiWFBTLVoiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19WRU5ET1IsIkludGVsIENvcnAuIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwiQTExIiksIH0sCisJfSwKKwl7CS8qIEFsbG93IGludGVycnVwdHMgZHVyaW5nIHN1c3BlbmQgb24gQ29tcGFxIExhcHRvcHMqLworCQlzZXRfYXBtX2ludHMsICJDb21wYXEgMTJYTDEyNSIsCisJCXsJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiQ29tcGFxIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkNvbXBhcSBQQyIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwgIlBob2VuaXggVGVjaG5vbG9naWVzIExURCIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX1ZFUlNJT04sIjQuMDYiKSwgfSwKKwl9LAorCXsJLyogQWxsb3cgaW50ZXJydXB0cyBkdXJpbmcgQVBNIG9yIHRoZSBjbG9jayBnb2VzIHNsb3cgKi8KKwkJc2V0X2FwbV9pbnRzLCAiQVNVU1RlSyIsCisJCXsJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiQVNVU1RlSyBDb21wdXRlciBJbmMuIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkw4NDAwSyBzZXJpZXMgTm90ZWJvb2sgUEMiKSwgfSwKKwl9LAorCXsJLyogQVBNIGJsb3dzIG9uIHNodXRkb3duICovCisJCWFwbV9pc19ob3JrZWQsICJBQklUIEtYNy0zMzNbUl0iLAorCQl7CURNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQUJJVCIpLAorCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiVlQ4MzY3LTgyMzNBIChLWDctMzMzW1JdKSIpLCB9LAorCX0sCisJewkvKiBBUE0gY3Jhc2hlcyAqLworCQlhcG1faXNfaG9ya2VkLCAiVHJpZ2VtIERlbGhpMyIsCisJCXsJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiVHJpR2VtIENvbXB1dGVyLCBJbmMiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiRGVsaGkzIiksIH0sCisJfSwKKwl7CS8qIEFQTSBjcmFzaGVzICovCisJCWFwbV9pc19ob3JrZWQsICJGdWppdHN1LVNpZW1lbnMiLAorCQl7CURNSV9NQVRDSChETUlfQklPU19WRU5ET1IsICJob2VuaXgvRlVKSVRTVSBTSUVNRU5TIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwgIlZlcnNpb24xLjAxIiksIH0sCisJfSwKKwl7CS8qIEFQTSBjcmFzaGVzICovCisJCWFwbV9pc19ob3JrZWRfZDg1MG1kLCAiSW50ZWwgRDg1ME1EIiwKKwkJewlETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCAiSW50ZWwgQ29ycC4iKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCAiTVY4NTAxMEEuODZBLjAwMTYuUDA3LjAyMDEyNTE1MzYiKSwgfSwKKwl9LAorCXsJLyogQVBNIGNyYXNoZXMgKi8KKwkJYXBtX2lzX2hvcmtlZCwgIkludGVsIEQ4MTBFTU8iLAorCQl7CURNSV9NQVRDSChETUlfQklPU19WRU5ET1IsICJJbnRlbCBDb3JwLiIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX1ZFUlNJT04sICJNTzgxMDEwQS44NkEuMDAwOC5QMDQuMDAwNDE3MDgwMCIpLCB9LAorCX0sCisJewkvKiBBUE0gY3Jhc2hlcyAqLworCQlhcG1faXNfaG9ya2VkLCAiRGVsbCBYUFMtWiIsCisJCXsJRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwgIkludGVsIENvcnAuIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwgIkExMSIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJYUFMtWiIpLCB9LAorCX0sCisJewkvKiBBUE0gY3Jhc2hlcyAqLworCQlhcG1faXNfaG9ya2VkLCAiU2hhcnAgUEMtUEovQVgiLAorCQl7CURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIlNIQVJQIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlBDLVBKL0FYIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCJTeXN0ZW1Tb2Z0IiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwiVmVyc2lvbiBSMi4wOCIpLCB9LAorCX0sCisJewkvKiBBUE0gY3Jhc2hlcyAqLworCQlhcG1faXNfaG9ya2VkLCAiRGVsbCBJbnNwaXJvbiAyNTAwIiwKKwkJewlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIENvbXB1dGVyIENvcnBvcmF0aW9uIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkluc3Bpcm9uIDI1MDAiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19WRU5ET1IsIlBob2VuaXggVGVjaG5vbG9naWVzIExURCIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX1ZFUlNJT04sIkExMSIpLCB9LAorCX0sCisJewkvKiBBUE0gaWRsZSBoYW5ncyAqLworCQlhcG1fbGlrZXNfdG9fbWVsdCwgIkphYmlsIEFNRCIsCisJCXsJRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwgIkFtZXJpY2FuIE1lZ2F0cmVuZHMgSW5jLiIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX1ZFUlNJT04sICIwQUFTTlAwNiIpLCB9LAorCX0sCisJewkvKiBBUE0gaWRsZSBoYW5ncyAqLworCQlhcG1fbGlrZXNfdG9fbWVsdCwgIkFNSSBCaW9zIiwKKwkJewlETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCAiQW1lcmljYW4gTWVnYXRyZW5kcyBJbmMuIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwgIjBBQVNOUDA1IiksIH0sCisJfSwKKwl7CS8qIEhhbmRsZSBwcm9ibGVtcyB3aXRoIEFQTSBvbiBTb255IFZhaW8gUENHLU41MDVYKERFKSAqLworCQlzd2FiX2FwbV9wb3dlcl9pbl9taW51dGVzLCAiU29ueSBWQUlPIiwKKwkJewlETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCAiUGhvZW5peCBUZWNobm9sb2dpZXMgTFREIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwgIlIwMjA2SCIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX0RBVEUsICIwOC8yMy85OSIpLCB9LAorCX0sCisJewkvKiBIYW5kbGUgcHJvYmxlbXMgd2l0aCBBUE0gb24gU29ueSBWYWlvIFBDRy1ONTA1VlggKi8KKwkJc3dhYl9hcG1fcG93ZXJfaW5fbWludXRlcywgIlNvbnkgVkFJTyIsCisJCXsJRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwgIlBob2VuaXggVGVjaG5vbG9naWVzIExURCIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX1ZFUlNJT04sICJXMkswNkgwIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfREFURSwgIjAyLzAzLzAwIiksIH0sCisJfSwKKwl7CS8qIEhhbmRsZSBwcm9ibGVtcyB3aXRoIEFQTSBvbiBTb255IFZhaW8gUENHLVhHMjkgKi8KKwkJc3dhYl9hcG1fcG93ZXJfaW5fbWludXRlcywgIlNvbnkgVkFJTyIsCisJCXsJRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwgIlBob2VuaXggVGVjaG5vbG9naWVzIExURCIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX1ZFUlNJT04sICJSMDExN0EwIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfREFURSwgIjA0LzI1LzAwIiksIH0sCisJfSwKKwl7CS8qIEhhbmRsZSBwcm9ibGVtcyB3aXRoIEFQTSBvbiBTb255IFZhaW8gUENHLVo2MDBORSAqLworCQlzd2FiX2FwbV9wb3dlcl9pbl9taW51dGVzLCAiU29ueSBWQUlPIiwKKwkJewlETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCAiUGhvZW5peCBUZWNobm9sb2dpZXMgTFREIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwgIlIwMTIxWjEiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19EQVRFLCAiMDUvMTEvMDAiKSwgfSwKKwl9LAorCXsJLyogSGFuZGxlIHByb2JsZW1zIHdpdGggQVBNIG9uIFNvbnkgVmFpbyBQQ0ctWjYwME5FICovCisJCXN3YWJfYXBtX3Bvd2VyX2luX21pbnV0ZXMsICJTb255IFZBSU8iLAorCQl7CURNSV9NQVRDSChETUlfQklPU19WRU5ET1IsICJQaG9lbml4IFRlY2hub2xvZ2llcyBMVEQiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCAiV01FMDFaMSIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX0RBVEUsICIwOC8xMS8wMCIpLCB9LAorCX0sCisJewkvKiBIYW5kbGUgcHJvYmxlbXMgd2l0aCBBUE0gb24gU29ueSBWYWlvIFBDRy1aNjAwTEVLKERFKSAqLworCQlzd2FiX2FwbV9wb3dlcl9pbl9taW51dGVzLCAiU29ueSBWQUlPIiwKKwkJewlETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCAiUGhvZW5peCBUZWNobm9sb2dpZXMgTFREIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwgIlIwMjA2WjMiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19EQVRFLCAiMTIvMjUvMDAiKSwgfSwKKwl9LAorCXsJLyogSGFuZGxlIHByb2JsZW1zIHdpdGggQVBNIG9uIFNvbnkgVmFpbyBQQ0ctWjUwNUxTICovCisJCXN3YWJfYXBtX3Bvd2VyX2luX21pbnV0ZXMsICJTb255IFZBSU8iLAorCQl7CURNSV9NQVRDSChETUlfQklPU19WRU5ET1IsICJQaG9lbml4IFRlY2hub2xvZ2llcyBMVEQiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCAiUjAyMDNEMCIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX0RBVEUsICIwNS8xMi8wMCIpLCB9LAorCX0sCisJewkvKiBIYW5kbGUgcHJvYmxlbXMgd2l0aCBBUE0gb24gU29ueSBWYWlvIFBDRy1aNTA1TFMgKi8KKwkJc3dhYl9hcG1fcG93ZXJfaW5fbWludXRlcywgIlNvbnkgVkFJTyIsCisJCXsJRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwgIlBob2VuaXggVGVjaG5vbG9naWVzIExURCIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX1ZFUlNJT04sICJSMDIwM1ozIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfREFURSwgIjA4LzI1LzAwIiksIH0sCisJfSwKKwl7CS8qIEhhbmRsZSBwcm9ibGVtcyB3aXRoIEFQTSBvbiBTb255IFZhaW8gUENHLVo1MDVMUyAod2l0aCB1cGRhdGVkIEJJT1MpICovCisJCXN3YWJfYXBtX3Bvd2VyX2luX21pbnV0ZXMsICJTb255IFZBSU8iLAorCQl7CURNSV9NQVRDSChETUlfQklPU19WRU5ET1IsICJQaG9lbml4IFRlY2hub2xvZ2llcyBMVEQiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCAiUjAyMDlaMyIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX0RBVEUsICIwNS8xMi8wMSIpLCB9LAorCX0sCisJewkvKiBIYW5kbGUgcHJvYmxlbXMgd2l0aCBBUE0gb24gU29ueSBWYWlvIFBDRy1GMTA0SyAqLworCQlzd2FiX2FwbV9wb3dlcl9pbl9taW51dGVzLCAiU29ueSBWQUlPIiwKKwkJewlETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCAiUGhvZW5peCBUZWNobm9sb2dpZXMgTFREIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwgIlIwMjA0SzIiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19EQVRFLCAiMDgvMjgvMDAiKSwgfSwKKwl9LAorCisJewkvKiBIYW5kbGUgcHJvYmxlbXMgd2l0aCBBUE0gb24gU29ueSBWYWlvIFBDRy1DMVZOL0MxVkUgKi8KKwkJc3dhYl9hcG1fcG93ZXJfaW5fbWludXRlcywgIlNvbnkgVkFJTyIsCisJCXsJRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwgIlBob2VuaXggVGVjaG5vbG9naWVzIExURCIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX1ZFUlNJT04sICJSMDIwOFAxIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfREFURSwgIjExLzA5LzAwIiksIH0sCisJfSwKKwl7CS8qIEhhbmRsZSBwcm9ibGVtcyB3aXRoIEFQTSBvbiBTb255IFZhaW8gUENHLUMxVkUgKi8KKwkJc3dhYl9hcG1fcG93ZXJfaW5fbWludXRlcywgIlNvbnkgVkFJTyIsCisJCXsJRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwgIlBob2VuaXggVGVjaG5vbG9naWVzIExURCIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX1ZFUlNJT04sICJSMDIwNFAxIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfREFURSwgIjA5LzEyLzAwIiksIH0sCisJfSwKKwl7CS8qIEhhbmRsZSBwcm9ibGVtcyB3aXRoIEFQTSBvbiBTb255IFZhaW8gUENHLUMxVkUgKi8KKwkJc3dhYl9hcG1fcG93ZXJfaW5fbWludXRlcywgIlNvbnkgVkFJTyIsCisJCXsJRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwgIlBob2VuaXggVGVjaG5vbG9naWVzIExURCIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX1ZFUlNJT04sICJXWFBPMVozIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfREFURSwgIjEwLzI2LzAxIiksIH0sCisJfSwKKwl7CS8qIGJyb2tlbiBQTSBwb3dlcm9mZiBiaW9zICovCisJCXNldF9yZWFsbW9kZV9wb3dlcl9vZmYsICJBd2FyZCBTb2Z0d2FyZSB2NC42MCBQR01BIiwKKwkJewlETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCAiQXdhcmQgU29mdHdhcmUgSW50ZXJuYXRpb25hbCwgSW5jLiIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX1ZFUlNJT04sICI0LjYwIFBHTUEiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19EQVRFLCAiMTM0NTI2MTg0IiksIH0sCisJfSwKKworCS8qIEdlbmVyaWMgcGVyIHZlbmRvciBBUE0gc2V0dGluZ3MgICovCisKKwl7CS8qIEFsbG93IGludGVycnVwdHMgZHVyaW5nIHN1c3BlbmQgb24gSUJNIGxhcHRvcHMgKi8KKwkJc2V0X2FwbV9pbnRzLCAiSUJNIiwKKwkJewlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJJQk0iKSwgfSwKKwl9LAorCisJeyB9Cit9OworCisvKgorICogSnVzdCBzdGFydCB0aGUgQVBNIHRocmVhZC4gV2UgZG8gTk9UIHdhbnQgdG8gZG8gQVBNIEJJT1MKKyAqIGNhbGxzIGZyb20gYW55dGhpbmcgYnV0IHRoZSBBUE0gdGhyZWFkLCBpZiBmb3Igbm8gb3RoZXIgcmVhc29uCisgKiB0aGFuIHRoZSBmYWN0IHRoYXQgd2UgZG9uJ3QgdHJ1c3QgdGhlIEFQTSBCSU9TLiBUaGlzIHdheSwKKyAqIG1vc3QgY29tbW9uIEFQTSBCSU9TIHByb2JsZW1zIHRoYXQgbGVhZCB0byBwcm90ZWN0aW9uIGVycm9ycworICogZXRjIHdpbGwgaGF2ZSBhdCBsZWFzdCBzb21lIGxldmVsIG9mIGJlaW5nIGNvbnRhaW5lZC4uLgorICoKKyAqIEluIHNob3J0LCBpZiBzb21ldGhpbmcgYmFkIGhhcHBlbnMsIGF0IGxlYXN0IHdlIGhhdmUgYSBjaG9pY2UKKyAqIG9mIGp1c3Qga2lsbGluZyB0aGUgYXBtIHRocmVhZC4uCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGFwbV9pbml0KHZvaWQpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICphcG1fcHJvYzsKKwlpbnQgcmV0OworCWludCBpOworCisJZG1pX2NoZWNrX3N5c3RlbShhcG1fZG1pX3RhYmxlKTsKKworCWlmIChhcG1faW5mby5iaW9zLnZlcnNpb24gPT0gMCkgeworCQlwcmludGsoS0VSTl9JTkZPICJhcG06IEJJT1Mgbm90IGZvdW5kLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlwcmludGsoS0VSTl9JTkZPCisJCSJhcG06IEJJT1MgdmVyc2lvbiAlZC4lZCBGbGFncyAweCUwMnggKERyaXZlciB2ZXJzaW9uICVzKVxuIiwKKwkJKChhcG1faW5mby5iaW9zLnZlcnNpb24gPj4gOCkgJiAweGZmKSwKKwkJKGFwbV9pbmZvLmJpb3MudmVyc2lvbiAmIDB4ZmYpLAorCQlhcG1faW5mby5iaW9zLmZsYWdzLAorCQlkcml2ZXJfdmVyc2lvbik7CisJaWYgKChhcG1faW5mby5iaW9zLmZsYWdzICYgQVBNXzMyX0JJVF9TVVBQT1JUKSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gImFwbTogbm8gMzIgYml0IEJJT1Mgc3VwcG9ydFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChhbGxvd19pbnRzKQorCQlhcG1faW5mby5hbGxvd19pbnRzID0gMTsKKwlpZiAoYnJva2VuX3BzcikKKwkJYXBtX2luZm8uZ2V0X3Bvd2VyX3N0YXR1c19icm9rZW4gPSAxOworCWlmIChyZWFsbW9kZV9wb3dlcl9vZmYpCisJCWFwbV9pbmZvLnJlYWxtb2RlX3Bvd2VyX29mZiA9IDE7CisJLyogVXNlciBjYW4gb3ZlcnJpZGUsIGJ1dCBkZWZhdWx0IGlzIHRvIHRydXN0IERNSSAqLworCWlmIChhcG1fZGlzYWJsZWQgIT0gLTEpCisJCWFwbV9pbmZvLmRpc2FibGVkID0gYXBtX2Rpc2FibGVkOworCisJLyoKKwkgKiBGaXggZm9yIHRoZSBDb21wYXEgQ29udHVyYSAzLzI1YyB3aGljaCByZXBvcnRzIEJJT1MgdmVyc2lvbiAwLjEKKwkgKiBidXQgaXMgcmVwb3J0ZWRseSBhIDEuMCBCSU9TLgorCSAqLworCWlmIChhcG1faW5mby5iaW9zLnZlcnNpb24gPT0gMHgwMDEpCisJCWFwbV9pbmZvLmJpb3MudmVyc2lvbiA9IDB4MTAwOworCisJLyogQklPUyA8IDEuMiBkb2Vzbid0IHNldCBjc2VnXzE2X2xlbiAqLworCWlmIChhcG1faW5mby5iaW9zLnZlcnNpb24gPCAweDEwMikKKwkJYXBtX2luZm8uYmlvcy5jc2VnXzE2X2xlbiA9IDA7IC8qIDY0ayAqLworCisJaWYgKGRlYnVnKSB7CisJCXByaW50ayhLRVJOX0lORk8gImFwbTogZW50cnkgJXg6JWx4IGNzZWcxNiAleCBkc2VnICV4IiwKKwkJCWFwbV9pbmZvLmJpb3MuY3NlZywgYXBtX2luZm8uYmlvcy5vZmZzZXQsCisJCQlhcG1faW5mby5iaW9zLmNzZWdfMTYsIGFwbV9pbmZvLmJpb3MuZHNlZyk7CisJCWlmIChhcG1faW5mby5iaW9zLnZlcnNpb24gPiAweDEwMCkKKwkJCXByaW50aygiIGNzZWcgbGVuICV4LCBkc2VnIGxlbiAleCIsCisJCQkJYXBtX2luZm8uYmlvcy5jc2VnX2xlbiwKKwkJCQlhcG1faW5mby5iaW9zLmRzZWdfbGVuKTsKKwkJaWYgKGFwbV9pbmZvLmJpb3MudmVyc2lvbiA+IDB4MTAxKQorCQkJcHJpbnRrKCIgY3NlZzE2IGxlbiAleCIsIGFwbV9pbmZvLmJpb3MuY3NlZ18xNl9sZW4pOworCQlwcmludGsoIlxuIik7CisJfQorCisJaWYgKGFwbV9pbmZvLmRpc2FibGVkKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiYXBtOiBkaXNhYmxlZCBvbiB1c2VyIHJlcXVlc3QuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmICgobnVtX29ubGluZV9jcHVzKCkgPiAxKSAmJiAhcG93ZXJfb2ZmICYmICFzbXApIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJhcG06IGRpc2FibGVkIC0gQVBNIGlzIG5vdCBTTVAgc2FmZS5cbiIpOworCQlhcG1faW5mby5kaXNhYmxlZCA9IDE7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAoUE1fSVNfQUNUSVZFKCkpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJhcG06IG92ZXJyaWRkZW4gYnkgQUNQSS5cbiIpOworCQlhcG1faW5mby5kaXNhYmxlZCA9IDE7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlwbV9hY3RpdmUgPSAxOworCisJLyoKKwkgKiBTZXQgdXAgYSBzZWdtZW50IHRoYXQgcmVmZXJlbmNlcyB0aGUgcmVhbCBtb2RlIHNlZ21lbnQgMHg0MAorCSAqIHRoYXQgZXh0ZW5kcyB1cCB0byB0aGUgZW5kIG9mIHBhZ2UgemVybyAodGhhdCB3ZSBoYXZlIHJlc2VydmVkKS4KKwkgKiBUaGlzIGlzIGZvciBidWdneSBCSU9TJ3MgdGhhdCByZWZlciB0byAocmVhbCBtb2RlKSBzZWdtZW50IDB4NDAKKwkgKiBldmVuIHRob3VnaCB0aGV5IGFyZSBjYWxsZWQgaW4gcHJvdGVjdGVkIG1vZGUuCisJICovCisJc2V0X2Jhc2UoYmFkX2Jpb3NfZGVzYywgX192YSgodW5zaWduZWQgbG9uZykweDQwIDw8IDQpKTsKKwlfc2V0X2xpbWl0KChjaGFyICopJmJhZF9iaW9zX2Rlc2MsIDQwOTUgLSAoMHg0MCA8PCA0KSk7CisKKwlhcG1fYmlvc19lbnRyeS5vZmZzZXQgPSBhcG1faW5mby5iaW9zLm9mZnNldDsKKwlhcG1fYmlvc19lbnRyeS5zZWdtZW50ID0gQVBNX0NTOworCisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgeworCQlzZXRfYmFzZShwZXJfY3B1KGNwdV9nZHRfdGFibGUsIGkpW0FQTV9DUyA+PiAzXSwKKwkJCSBfX3ZhKCh1bnNpZ25lZCBsb25nKWFwbV9pbmZvLmJpb3MuY3NlZyA8PCA0KSk7CisJCXNldF9iYXNlKHBlcl9jcHUoY3B1X2dkdF90YWJsZSwgaSlbQVBNX0NTXzE2ID4+IDNdLAorCQkJIF9fdmEoKHVuc2lnbmVkIGxvbmcpYXBtX2luZm8uYmlvcy5jc2VnXzE2IDw8IDQpKTsKKwkJc2V0X2Jhc2UocGVyX2NwdShjcHVfZ2R0X3RhYmxlLCBpKVtBUE1fRFMgPj4gM10sCisJCQkgX192YSgodW5zaWduZWQgbG9uZylhcG1faW5mby5iaW9zLmRzZWcgPDwgNCkpOworI2lmbmRlZiBBUE1fUkVMQVhfU0VHTUVOVFMKKwkJaWYgKGFwbV9pbmZvLmJpb3MudmVyc2lvbiA9PSAweDEwMCkgeworI2VuZGlmCisJCQkvKiBGb3IgQVNVUyBtb3RoZXJib2FyZCwgQXdhcmQgQklPUyByZXYgMTEwIChhbmQgb3RoZXJzPykgKi8KKwkJCV9zZXRfbGltaXQoKGNoYXIgKikmcGVyX2NwdShjcHVfZ2R0X3RhYmxlLCBpKVtBUE1fQ1MgPj4gM10sIDY0ICogMTAyNCAtIDEpOworCQkJLyogRm9yIHNvbWUgdW5rbm93biBtYWNoaW5lLiAqLworCQkJX3NldF9saW1pdCgoY2hhciAqKSZwZXJfY3B1KGNwdV9nZHRfdGFibGUsIGkpW0FQTV9DU18xNiA+PiAzXSwgNjQgKiAxMDI0IC0gMSk7CisJCQkvKiBGb3IgdGhlIERFQyBIaW5vdGUgVWx0cmEgQ1Q0NzUgKGFuZCBvdGhlcnM/KSAqLworCQkJX3NldF9saW1pdCgoY2hhciAqKSZwZXJfY3B1KGNwdV9nZHRfdGFibGUsIGkpW0FQTV9EUyA+PiAzXSwgNjQgKiAxMDI0IC0gMSk7CisjaWZuZGVmIEFQTV9SRUxBWF9TRUdNRU5UUworCQl9IGVsc2UgeworCQkJX3NldF9saW1pdCgoY2hhciAqKSZwZXJfY3B1KGNwdV9nZHRfdGFibGUsIGkpW0FQTV9DUyA+PiAzXSwKKwkJCQkoYXBtX2luZm8uYmlvcy5jc2VnX2xlbiAtIDEpICYgMHhmZmZmKTsKKwkJCV9zZXRfbGltaXQoKGNoYXIgKikmcGVyX2NwdShjcHVfZ2R0X3RhYmxlLCBpKVtBUE1fQ1NfMTYgPj4gM10sCisJCQkJKGFwbV9pbmZvLmJpb3MuY3NlZ18xNl9sZW4gLSAxKSAmIDB4ZmZmZik7CisJCQlfc2V0X2xpbWl0KChjaGFyICopJnBlcl9jcHUoY3B1X2dkdF90YWJsZSwgaSlbQVBNX0RTID4+IDNdLAorCQkJCShhcG1faW5mby5iaW9zLmRzZWdfbGVuIC0gMSkgJiAweGZmZmYpOworCQkgICAgICAvKiB3b3JrYXJvdW5kIGZvciBicm9rZW4gQklPU2VzICovCisJICAgICAgICAgICAgICAgIGlmIChhcG1faW5mby5iaW9zLmNzZWdfbGVuIDw9IGFwbV9pbmZvLmJpb3Mub2Zmc2V0KQorICAgICAgICAJICAgICAgICAgICAgICAgIF9zZXRfbGltaXQoKGNoYXIgKikmcGVyX2NwdShjcHVfZ2R0X3RhYmxlLCBpKVtBUE1fQ1MgPj4gM10sIDY0ICogMTAyNCAtMSk7CisgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcG1faW5mby5iaW9zLmRzZWdfbGVuIDw9IDB4NDApIHsgLyogMHg0MCAqIDRrQiA9PSA2NGtCICovCisgICAgICAgICAgICAgICAgICAgICAgICAJLyogZm9yIHRoZSBCSU9TIHRoYXQgYXNzdW1lcyBncmFudWxhcml0eSA9IDEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIAlwZXJfY3B1KGNwdV9nZHRfdGFibGUsIGkpW0FQTV9EUyA+PiAzXS5iIHw9IDB4ODAwMDAwOworICAgICAgICAgICAgICAgICAgICAgICAgCXByaW50ayhLRVJOX05PVElDRSAiYXBtOiB3ZSBzZXQgdGhlIGdyYW51bGFyaXR5IG9mIGRzZWcuXG4iKTsKKyAgICAgICAgCSAgICAgICAgfQorCQl9CisjZW5kaWYKKwl9CisKKwlhcG1fcHJvYyA9IGNyZWF0ZV9wcm9jX2luZm9fZW50cnkoImFwbSIsIDAsIE5VTEwsIGFwbV9nZXRfaW5mbyk7CisJaWYgKGFwbV9wcm9jKQorCQlhcG1fcHJvYy0+b3duZXIgPSBUSElTX01PRFVMRTsKKworCXJldCA9IGtlcm5lbF90aHJlYWQoYXBtLCBOVUxMLCBDTE9ORV9LRVJORUwgfCBTSUdDSExEKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImFwbTogZGlzYWJsZWQgLSBVbmFibGUgdG8gc3RhcnQga2VybmVsIHRocmVhZC5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAobnVtX29ubGluZV9jcHVzKCkgPiAxICYmICFzbXAgKSB7CisJCXByaW50ayhLRVJOX05PVElDRQorCQkgICAiYXBtOiBkaXNhYmxlZCAtIEFQTSBpcyBub3QgU01QIHNhZmUgKHBvd2VyIG9mZiBhY3RpdmUpLlxuIik7CisJCXJldHVybiAwOworCX0KKworCW1pc2NfcmVnaXN0ZXIoJmFwbV9kZXZpY2UpOworCisJaWYgKEhaICE9IDEwMCkKKwkJaWRsZV9wZXJpb2QgPSAoaWRsZV9wZXJpb2QgKiBIWikgLyAxMDA7CisJaWYgKGlkbGVfdGhyZXNob2xkIDwgMTAwKSB7CisJCW9yaWdpbmFsX3BtX2lkbGUgPSBwbV9pZGxlOworCQlwbV9pZGxlICA9IGFwbV9jcHVfaWRsZTsKKwkJc2V0X3BtX2lkbGUgPSAxOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYXBtX2V4aXQodm9pZCkKK3sKKwlpbnQJZXJyb3I7CisKKwlpZiAoc2V0X3BtX2lkbGUpIHsKKwkJcG1faWRsZSA9IG9yaWdpbmFsX3BtX2lkbGU7CisJCS8qCisJCSAqIFdlIGFyZSBhYm91dCB0byB1bmxvYWQgdGhlIGN1cnJlbnQgaWRsZSB0aHJlYWQgcG0gY2FsbGJhY2sKKwkJICogKHBtX2lkbGUpLCBXYWl0IGZvciBhbGwgcHJvY2Vzc29ycyB0byB1cGRhdGUgY2FjaGVkL2xvY2FsCisJCSAqIGNvcGllcyBvZiBwbV9pZGxlIGJlZm9yZSBwcm9jZWVkaW5nLgorCQkgKi8KKwkJY3B1X2lkbGVfd2FpdCgpOworCX0KKwlpZiAoKChhcG1faW5mby5iaW9zLmZsYWdzICYgQVBNX0JJT1NfRElTRU5HQUdFRCkgPT0gMCkKKwkgICAgJiYgKGFwbV9pbmZvLmNvbm5lY3Rpb25fdmVyc2lvbiA+IDB4MDEwMCkpIHsKKwkJZXJyb3IgPSBhcG1fZW5nYWdlX3Bvd2VyX21hbmFnZW1lbnQoQVBNX0RFVklDRV9BTEwsIDApOworCQlpZiAoZXJyb3IpCisJCQlhcG1fZXJyb3IoImRpc2VuZ2FnZSBwb3dlciBtYW5hZ2VtZW50IiwgZXJyb3IpOworCX0KKwltaXNjX2RlcmVnaXN0ZXIoJmFwbV9kZXZpY2UpOworCXJlbW92ZV9wcm9jX2VudHJ5KCJhcG0iLCBOVUxMKTsKKwlpZiAocG93ZXJfb2ZmKQorCQlwbV9wb3dlcl9vZmYgPSBOVUxMOworCWV4aXRfa2FwbWQgPSAxOworCXdoaWxlIChrYXBtZF9ydW5uaW5nKQorCQlzY2hlZHVsZSgpOworCXBtX2FjdGl2ZSA9IDA7Cit9CisKK21vZHVsZV9pbml0KGFwbV9pbml0KTsKK21vZHVsZV9leGl0KGFwbV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiU3RlcGhlbiBSb3Rod2VsbCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBZHZhbmNlZCBQb3dlciBNYW5hZ2VtZW50Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7Cittb2R1bGVfcGFyYW0oZGVidWcsIGJvb2wsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkVuYWJsZSBkZWJ1ZyBtb2RlIik7Cittb2R1bGVfcGFyYW0ocG93ZXJfb2ZmLCBib29sLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MocG93ZXJfb2ZmLCAiRW5hYmxlIHBvd2VyIG9mZiIpOworbW9kdWxlX3BhcmFtKGJvdW5jZV9pbnRlcnZhbCwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoYm91bmNlX2ludGVydmFsLAorCQkiU2V0IHRoZSBudW1iZXIgb2YgdGlja3MgdG8gaWdub3JlIHN1c3BlbmQgYm91bmNlcyIpOworbW9kdWxlX3BhcmFtKGFsbG93X2ludHMsIGJvb2wsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhhbGxvd19pbnRzLCAiQWxsb3cgaW50ZXJydXB0cyBkdXJpbmcgQklPUyBjYWxscyIpOworbW9kdWxlX3BhcmFtKGJyb2tlbl9wc3IsIGJvb2wsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhicm9rZW5fcHNyLCAiQklPUyBoYXMgYSBicm9rZW4gR2V0UG93ZXJTdGF0dXMgY2FsbCIpOworbW9kdWxlX3BhcmFtKHJlYWxtb2RlX3Bvd2VyX29mZiwgYm9vbCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJlYWxtb2RlX3Bvd2VyX29mZiwKKwkJIlN3aXRjaCB0byByZWFsIG1vZGUgYmVmb3JlIHBvd2VyaW5nIG9mZiIpOworbW9kdWxlX3BhcmFtKGlkbGVfdGhyZXNob2xkLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpZGxlX3RocmVzaG9sZCwKKwkiU3lzdGVtIGlkbGUgcGVyY2VudGFnZSBhYm92ZSB3aGljaCB0byBtYWtlIEFQTSBCSU9TIGlkbGUgY2FsbHMiKTsKK21vZHVsZV9wYXJhbShpZGxlX3BlcmlvZCwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaWRsZV9wZXJpb2QsCisJIlBlcmlvZCAoaW4gc2VjLzEwMCkgb3ZlciB3aGljaCB0byBjYWN1bGF0ZSB0aGUgaWRsZSBwZXJjZW50YWdlIik7Cittb2R1bGVfcGFyYW0oc21wLCBib29sLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0Moc21wLAorCSJTZXQgdGhpcyB0byBlbmFibGUgQVBNIHVzZSBvbiBhbiBTTVAgcGxhdGZvcm0uIFVzZSB3aXRoIGNhdXRpb24gb24gb2xkZXIgc3lzdGVtcyIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoQVBNX01JTk9SX0RFVik7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL2kzODYva2VybmVsL2FzbS1vZmZzZXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZkNjZlMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtMCwwICsxLDcyIEBACisvKgorICogR2VuZXJhdGUgZGVmaW5pdGlvbnMgbmVlZGVkIGJ5IGFzc2VtYmx5IGxhbmd1YWdlIG1vZHVsZXMuCisgKiBUaGlzIGNvZGUgZ2VuZXJhdGVzIHJhdyBhc20gb3V0cHV0IHdoaWNoIGlzIHBvc3QtcHJvY2Vzc2VkCisgKiB0byBleHRyYWN0IGFuZCBmb3JtYXQgdGhlIHJlcXVpcmVkIGRhdGEuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSA8YXNtL3Vjb250ZXh0Lmg+CisjaW5jbHVkZSAic2lnZnJhbWUuaCIKKyNpbmNsdWRlIDxhc20vZml4bWFwLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgorCisjZGVmaW5lIERFRklORShzeW0sIHZhbCkgXAorICAgICAgICBhc20gdm9sYXRpbGUoIlxuLT4iICNzeW0gIiAlMCAiICN2YWwgOiA6ICJpIiAodmFsKSkKKworI2RlZmluZSBCTEFOSygpIGFzbSB2b2xhdGlsZSgiXG4tPiIgOiA6ICkKKworI2RlZmluZSBPRkZTRVQoc3ltLCBzdHIsIG1lbSkgXAorCURFRklORShzeW0sIG9mZnNldG9mKHN0cnVjdCBzdHIsIG1lbSkpOworCit2b2lkIGZvbyh2b2lkKQoreworCU9GRlNFVChTSUdDT05URVhUX2VheCwgc2lnY29udGV4dCwgZWF4KTsKKwlPRkZTRVQoU0lHQ09OVEVYVF9lYngsIHNpZ2NvbnRleHQsIGVieCk7CisJT0ZGU0VUKFNJR0NPTlRFWFRfZWN4LCBzaWdjb250ZXh0LCBlY3gpOworCU9GRlNFVChTSUdDT05URVhUX2VkeCwgc2lnY29udGV4dCwgZWR4KTsKKwlPRkZTRVQoU0lHQ09OVEVYVF9lc2ksIHNpZ2NvbnRleHQsIGVzaSk7CisJT0ZGU0VUKFNJR0NPTlRFWFRfZWRpLCBzaWdjb250ZXh0LCBlZGkpOworCU9GRlNFVChTSUdDT05URVhUX2VicCwgc2lnY29udGV4dCwgZWJwKTsKKwlPRkZTRVQoU0lHQ09OVEVYVF9lc3AsIHNpZ2NvbnRleHQsIGVzcCk7CisJT0ZGU0VUKFNJR0NPTlRFWFRfZWlwLCBzaWdjb250ZXh0LCBlaXApOworCUJMQU5LKCk7CisKKwlPRkZTRVQoQ1BVSU5GT194ODYsIGNwdWluZm9feDg2LCB4ODYpOworCU9GRlNFVChDUFVJTkZPX3g4Nl92ZW5kb3IsIGNwdWluZm9feDg2LCB4ODZfdmVuZG9yKTsKKwlPRkZTRVQoQ1BVSU5GT194ODZfbW9kZWwsIGNwdWluZm9feDg2LCB4ODZfbW9kZWwpOworCU9GRlNFVChDUFVJTkZPX3g4Nl9tYXNrLCBjcHVpbmZvX3g4NiwgeDg2X21hc2spOworCU9GRlNFVChDUFVJTkZPX2hhcmRfbWF0aCwgY3B1aW5mb194ODYsIGhhcmRfbWF0aCk7CisJT0ZGU0VUKENQVUlORk9fY3B1aWRfbGV2ZWwsIGNwdWluZm9feDg2LCBjcHVpZF9sZXZlbCk7CisJT0ZGU0VUKENQVUlORk9feDg2X2NhcGFiaWxpdHksIGNwdWluZm9feDg2LCB4ODZfY2FwYWJpbGl0eSk7CisJT0ZGU0VUKENQVUlORk9feDg2X3ZlbmRvcl9pZCwgY3B1aW5mb194ODYsIHg4Nl92ZW5kb3JfaWQpOworCUJMQU5LKCk7CisKKwlPRkZTRVQoVElfdGFzaywgdGhyZWFkX2luZm8sIHRhc2spOworCU9GRlNFVChUSV9leGVjX2RvbWFpbiwgdGhyZWFkX2luZm8sIGV4ZWNfZG9tYWluKTsKKwlPRkZTRVQoVElfZmxhZ3MsIHRocmVhZF9pbmZvLCBmbGFncyk7CisJT0ZGU0VUKFRJX3N0YXR1cywgdGhyZWFkX2luZm8sIHN0YXR1cyk7CisJT0ZGU0VUKFRJX2NwdSwgdGhyZWFkX2luZm8sIGNwdSk7CisJT0ZGU0VUKFRJX3ByZWVtcHRfY291bnQsIHRocmVhZF9pbmZvLCBwcmVlbXB0X2NvdW50KTsKKwlPRkZTRVQoVElfYWRkcl9saW1pdCwgdGhyZWFkX2luZm8sIGFkZHJfbGltaXQpOworCU9GRlNFVChUSV9yZXN0YXJ0X2Jsb2NrLCB0aHJlYWRfaW5mbywgcmVzdGFydF9ibG9jayk7CisJQkxBTksoKTsKKworCU9GRlNFVChFWEVDX0RPTUFJTl9oYW5kbGVyLCBleGVjX2RvbWFpbiwgaGFuZGxlcik7CisJT0ZGU0VUKFJUX1NJR0ZSQU1FX3NpZ2NvbnRleHQsIHJ0X3NpZ2ZyYW1lLCB1Yy51Y19tY29udGV4dCk7CisJQkxBTksoKTsKKworCU9GRlNFVChwYmVfYWRkcmVzcywgcGJlLCBhZGRyZXNzKTsKKwlPRkZTRVQocGJlX29yaWdfYWRkcmVzcywgcGJlLCBvcmlnX2FkZHJlc3MpOworCU9GRlNFVChwYmVfbmV4dCwgcGJlLCBuZXh0KTsKKworCS8qIE9mZnNldCBmcm9tIHRoZSBzeXNlbnRlciBzdGFjayB0byB0c3MuZXNwMCAqLworCURFRklORShUU1Nfc3lzZW50ZXJfZXNwMCwgb2Zmc2V0b2Yoc3RydWN0IHRzc19zdHJ1Y3QsIGVzcDApIC0KKwkJIHNpemVvZihzdHJ1Y3QgdHNzX3N0cnVjdCkpOworCisJREVGSU5FKFBBR0VfU0laRV9hc20sIFBBR0VfU0laRSk7CisJREVGSU5FKFZTWVNDQUxMX0JBU0UsIF9fZml4X3RvX3ZpcnQoRklYX1ZTWVNDQUxMKSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2Jvb3RmbGFnLmMgYi9hcmNoL2kzODYva2VybmVsL2Jvb3RmbGFnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMzMGVkMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYm9vdGZsYWcuYwpAQCAtMCwwICsxLDk5IEBACisvKgorICoJSW1wbGVtZW50ICdTaW1wbGUgQm9vdCBGbGFnIFNwZWNpZmljYXRpb24gMi4wJworICovCisKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+CisKKworI2RlZmluZSBTQkZfUkVTRVJWRUQgKDB4NzgpCisjZGVmaW5lIFNCRl9QTlBPUyAgICAoMTw8MCkKKyNkZWZpbmUgU0JGX0JPT1RJTkcgICgxPDwxKQorI2RlZmluZSBTQkZfRElBRyAgICAgKDE8PDIpCisjZGVmaW5lIFNCRl9QQVJJVFkgICAoMTw8NykKKworCitpbnQgc2JmX3BvcnQgX19pbml0ZGF0YSA9IC0xOwkvKiBzZXQgdmlhIGFjcGlfYm9vdF9pbml0KCkgKi8KKworCitzdGF0aWMgaW50IF9faW5pdCBwYXJpdHkodTggdikKK3sKKwlpbnQgeCA9IDA7CisJaW50IGk7CisJCisJZm9yKGk9MDtpPDg7aSsrKQorCXsKKwkJeF49KHYmMSk7CisJCXY+Pj0xOworCX0KKwlyZXR1cm4geDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHNiZl93cml0ZSh1OCB2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaWYoc2JmX3BvcnQgIT0gLTEpCisJeworCQl2ICY9IH5TQkZfUEFSSVRZOworCQlpZighcGFyaXR5KHYpKQorCQkJdnw9U0JGX1BBUklUWTsKKworCQlwcmludGsoS0VSTl9JTkZPICJTaW1wbGUgQm9vdCBGbGFnIGF0IDB4JXggc2V0IHRvIDB4JXhcbiIsIHNiZl9wb3J0LCB2KTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjX2xvY2ssIGZsYWdzKTsKKwkJQ01PU19XUklURSh2LCBzYmZfcG9ydCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Y19sb2NrLCBmbGFncyk7CisJfQorfQorCitzdGF0aWMgdTggX19pbml0IHNiZl9yZWFkKHZvaWQpCit7CisJdTggdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWlmKHNiZl9wb3J0ID09IC0xKQorCQlyZXR1cm4gMDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjX2xvY2ssIGZsYWdzKTsKKwl2ID0gQ01PU19SRUFEKHNiZl9wb3J0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGNfbG9jaywgZmxhZ3MpOworCXJldHVybiB2OworfQorCitzdGF0aWMgaW50IF9faW5pdCBzYmZfdmFsdWVfdmFsaWQodTggdikKK3sKKwlpZih2JlNCRl9SRVNFUlZFRCkJCS8qIFJlc2VydmVkIGJpdHMgKi8KKwkJcmV0dXJuIDA7CisJaWYoIXBhcml0eSh2KSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNiZl9pbml0KHZvaWQpCit7CisJdTggdjsKKwlpZihzYmZfcG9ydCA9PSAtMSkKKwkJcmV0dXJuIDA7CisJdiA9IHNiZl9yZWFkKCk7CisJaWYoIXNiZl92YWx1ZV92YWxpZCh2KSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiU2ltcGxlIEJvb3QgRmxhZyB2YWx1ZSAweCV4IHJlYWQgZnJvbSBDTU9TIFJBTSB3YXMgaW52YWxpZFxuIix2KTsKKworCXYgJj0gflNCRl9SRVNFUlZFRDsKKwl2ICY9IH5TQkZfQk9PVElORzsKKwl2ICY9IH5TQkZfRElBRzsKKyNpZiBkZWZpbmVkKENPTkZJR19JU0FQTlApCisJdiB8PSBTQkZfUE5QT1M7CisjZW5kaWYKKwlzYmZfd3JpdGUodik7CisJcmV0dXJuIDA7Cit9CisKK21vZHVsZV9pbml0KHNiZl9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L01ha2VmaWxlIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEwYWVjZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L01ha2VmaWxlCkBAIC0wLDAgKzEsMTkgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHg4Ni1jb21wYXRpYmxlIENQVSBkZXRhaWxzIGFuZCBxdWlya3MKKyMKKworb2JqLXkJOj0JY29tbW9uLm8gcHJvYy5vCisKK29iai15CSs9CWFtZC5vCitvYmoteQkrPQljeXJpeC5vCitvYmoteQkrPQljZW50YXVyLm8KK29iai15CSs9CXRyYW5zbWV0YS5vCitvYmoteQkrPQlpbnRlbC5vIGludGVsX2NhY2hlaW5mby5vCitvYmoteQkrPQlyaXNlLm8KK29iai15CSs9CW5leGdlbi5vCitvYmoteQkrPQl1bWMubworCitvYmotJChDT05GSUdfWDg2X01DRSkJKz0JbWNoZWNrLworCitvYmotJChDT05GSUdfTVRSUikJKz0gCW10cnIvCitvYmotJChDT05GSUdfQ1BVX0ZSRVEpCSs9CWNwdWZyZXEvCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9hbWQuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2FtZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlOTQ1ODUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9hbWQuYwpAQCAtMCwwICsxLDI0OSBAQAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworI2luY2x1ZGUgImNwdS5oIgorCisvKgorICoJQiBzdGVwIEFNRCBLNiBiZWZvcmUgQiA5NzMweHh4eCBoYXZlIGhhcmR3YXJlIGJ1Z3MgdGhhdCBjYW4gY2F1c2UKKyAqCW1pc2V4ZWN1dGlvbiBvZiBjb2RlIHVuZGVyIExpbnV4LiBPd25lcnMgb2Ygc3VjaCBwcm9jZXNzb3JzIHNob3VsZAorICoJY29udGFjdCBBTUQgZm9yIHByZWNpc2UgZGV0YWlscyBhbmQgYSBDUFUgc3dhcC4KKyAqCisgKglTZWUJaHR0cDovL3d3dy5tdWx0aW1hbmlhLmNvbS9wb3Vsb3QvazZidWcuaHRtbAorICoJCWh0dHA6Ly93d3cuYW1kLmNvbS9LNi9rNmRvY3MvcmV2Z2QuaHRtbAorICoKKyAqCVRoZSBmb2xsb3dpbmcgdGVzdCBpcyBlcm0uLiBpbnRlcmVzdGluZy4gQU1EIG5lZ2xlY3RlZCB0byB1cAorICoJdGhlIGNoaXAgc2V0dGluZyB3aGVuIGZpeGluZyB0aGUgYnVnIGJ1dCB0aGV5IGFsc28gdHdlYWtlZCBzb21lCisgKglwZXJmb3JtYW5jZSBhdCB0aGUgc2FtZSB0aW1lLi4KKyAqLworIAorZXh0ZXJuIHZvaWQgdmlkZSh2b2lkKTsKK19fYXNtX18oIi5hbGlnbiA0XG52aWRlOiByZXQiKTsKKworc3RhdGljIHZvaWQgX19pbml0IGluaXRfYW1kKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKKwl1MzIgbCwgaDsKKwlpbnQgbWJ5dGVzID0gbnVtX3BoeXNwYWdlcyA+PiAoMjAtUEFHRV9TSElGVCk7CisJaW50IHI7CisKKwkvKgorCSAqCUZJWE1FOiBXZSBzaG91bGQgaGFuZGxlIHRoZSBLNSBoZXJlLiBTZXQgdXAgdGhlIHdyaXRlCisJICoJcmFuZ2UgYW5kIGFsc28gdHVybiBvbiBNU1IgODMgYml0cyA0IGFuZCAzMSAod3JpdGUgYWxsb2MsCisJICoJbm8gYnVzIHBpcGVsaW5lKQorCSAqLworCisJLyogQml0IDMxIGluIG5vcm1hbCBDUFVJRCB1c2VkIGZvciBub25zdGFuZGFyZCAzRE5vdyBJRDsKKwkgICAzRE5vdyBpcyBJRGQgYnkgYml0IDMxIGluIGV4dGVuZGVkIENQVUlEICgxKjMyKzMxKSBhbnl3YXkgKi8KKwljbGVhcl9iaXQoMCozMiszMSwgYy0+eDg2X2NhcGFiaWxpdHkpOworCQorCXIgPSBnZXRfbW9kZWxfbmFtZShjKTsKKworCXN3aXRjaChjLT54ODYpCisJeworCQljYXNlIDQ6CisJCS8qCisJCSAqIEdlbmVyYWwgU3lzdGVtcyBCSU9TZW4gYWxpYXMgdGhlIGNwdSBmcmVxdWVuY3kgcmVnaXN0ZXJzCisJCSAqIG9mIHRoZSBFbGFuIGF0IDB4MDAwZGYwMDAuIFVuZm9ydHVhbnRseSwgb25lIG9mIHRoZSBMaW51eAorCQkgKiBkcml2ZXJzIHN1YnNlcXVlbnRseSBwb2tlcyBpdCwgYW5kIGNoYW5nZXMgdGhlIENQVSBzcGVlZC4KKwkJICogV29ya2Fyb3VuZCA6IFJlbW92ZSB0aGUgdW5uZWVkZWQgYWxpYXMuCisJCSAqLworI2RlZmluZSBDQkFSCQkoMHhmZmZjKSAvKiBDb25maWd1cmF0aW9uIEJhc2UgQWRkcmVzcyAgKDMyLWJpdCkgKi8KKyNkZWZpbmUgQ0JBUl9FTkIJKDB4ODAwMDAwMDApCisjZGVmaW5lIENCQVJfS0VZCSgwWDAwMDAwMENCKQorCQkJaWYgKGMtPng4Nl9tb2RlbD09OSB8fCBjLT54ODZfbW9kZWwgPT0gMTApIHsKKwkJCQlpZiAoaW5sIChDQkFSKSAmIENCQVJfRU5CKQorCQkJCQlvdXRsICgwIHwgQ0JBUl9LRVksIENCQVIpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgNToKKwkJCWlmKCBjLT54ODZfbW9kZWwgPCA2ICkKKwkJCXsKKwkJCQkvKiBCYXNlZCBvbiBBTUQgZG9jIDIwNzM0UiAtIEp1bmUgMjAwMCAqLworCQkJCWlmICggYy0+eDg2X21vZGVsID09IDAgKSB7CisJCQkJCWNsZWFyX2JpdChYODZfRkVBVFVSRV9BUElDLCBjLT54ODZfY2FwYWJpbGl0eSk7CisJCQkJCXNldF9iaXQoWDg2X0ZFQVRVUkVfUEdFLCBjLT54ODZfY2FwYWJpbGl0eSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJCisJCQlpZiAoIGMtPng4Nl9tb2RlbCA9PSA2ICYmIGMtPng4Nl9tYXNrID09IDEgKSB7CisJCQkJY29uc3QgaW50IEs2X0JVR19MT09QID0gMTAwMDAwMDsKKwkJCQlpbnQgbjsKKwkJCQl2b2lkICgqZl92aWRlKSh2b2lkKTsKKwkJCQl1bnNpZ25lZCBsb25nIGQsIGQyOworCQkJCQorCQkJCXByaW50ayhLRVJOX0lORk8gIkFNRCBLNiBzdGVwcGluZyBCIGRldGVjdGVkIC0gIik7CisJCQkJCisJCQkJLyoKKwkJCQkgKiBJdCBsb29rcyBsaWtlIEFNRCBmaXhlZCB0aGUgMi42LjIgYnVnIGFuZCBpbXByb3ZlZCBpbmRpcmVjdCAKKwkJCQkgKiBjYWxscyBhdCB0aGUgc2FtZSB0aW1lLgorCQkJCSAqLworCisJCQkJbiA9IEs2X0JVR19MT09QOworCQkJCWZfdmlkZSA9IHZpZGU7CisJCQkJcmR0c2NsKGQpOworCQkJCXdoaWxlIChuLS0pIAorCQkJCQlmX3ZpZGUoKTsKKwkJCQlyZHRzY2woZDIpOworCQkJCWQgPSBkMi1kOworCQkJCQorCQkJCS8qIEtub2NrIHRoZXNlIHR3byBsaW5lcyBvdXQgaWYgaXQgZGVidWdzIG91dCBvayAqLworCQkJCXByaW50ayhLRVJOX0lORk8gIkFNRCBLNiBzdGVwcGluZyBCIGRldGVjdGVkIC0gIik7CisJCQkJLyogLS0gY3V0IGhlcmUgLS0gKi8KKwkJCQlpZiAoZCA+IDIwKks2X0JVR19MT09QKSAKKwkJCQkJcHJpbnRrKCJzeXN0ZW0gc3RhYmlsaXR5IG1heSBiZSBpbXBhaXJlZCB3aGVuIG1vcmUgdGhhbiAzMiBNQiBhcmUgdXNlZC5cbiIpOworCQkJCWVsc2UgCisJCQkJCXByaW50aygicHJvYmFibHkgT0sgKGFmdGVyIEI5NzMweHh4eCkuXG4iKTsKKwkJCQlwcmludGsoS0VSTl9JTkZPICJQbGVhc2Ugc2VlIGh0dHA6Ly9tZW1icmVzLmx5Y29zLmZyL3BvdWxvdC9rNmJ1Zy5odG1sXG4iKTsKKwkJCX0KKworCQkJLyogSzYgd2l0aCBvbGQgc3R5bGUgV0hDUiAqLworCQkJaWYgKGMtPng4Nl9tb2RlbCA8IDggfHwKKwkJCSAgIChjLT54ODZfbW9kZWw9PSA4ICYmIGMtPng4Nl9tYXNrIDwgOCkpIHsKKwkJCQkvKiBXZSBjYW4gb25seSB3cml0ZSBhbGxvY2F0ZSBvbiB0aGUgbG93IDUwOE1iICovCisJCQkJaWYobWJ5dGVzPjUwOCkKKwkJCQkJbWJ5dGVzPTUwODsKKworCQkJCXJkbXNyKE1TUl9LNl9XSENSLCBsLCBoKTsKKwkJCQlpZiAoKGwmMHgwMDAwRkZGRik9PTApIHsKKwkJCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCQkJbD0oMTw8MCl8KChtYnl0ZXMvNCk8PDEpOworCQkJCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCQkJCXdiaW52ZCgpOworCQkJCQl3cm1zcihNU1JfSzZfV0hDUiwgbCwgaCk7CisJCQkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiRW5hYmxpbmcgb2xkIHN0eWxlIEs2IHdyaXRlIGFsbG9jYXRpb24gZm9yICVkIE1iXG4iLAorCQkJCQkJbWJ5dGVzKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICgoYy0+eDg2X21vZGVsID09IDggJiYgYy0+eDg2X21hc2sgPjcpIHx8CisJCQkgICAgIGMtPng4Nl9tb2RlbCA9PSA5IHx8IGMtPng4Nl9tb2RlbCA9PSAxMykgeworCQkJCS8qIFRoZSBtb3JlIHNlcmlvdXMgY2hpcHMgLi4gKi8KKworCQkJCWlmKG1ieXRlcz40MDkyKQorCQkJCQltYnl0ZXM9NDA5MjsKKworCQkJCXJkbXNyKE1TUl9LNl9XSENSLCBsLCBoKTsKKwkJCQlpZiAoKGwmMHhGRkZGMDAwMCk9PTApIHsKKwkJCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCQkJbD0oKG1ieXRlcz4+Mik8PDIyKXwoMTw8MTYpOworCQkJCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCQkJCXdiaW52ZCgpOworCQkJCQl3cm1zcihNU1JfSzZfV0hDUiwgbCwgaCk7CisJCQkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiRW5hYmxpbmcgbmV3IHN0eWxlIEs2IHdyaXRlIGFsbG9jYXRpb24gZm9yICVkIE1iXG4iLAorCQkJCQkJbWJ5dGVzKTsKKwkJCQl9CisKKwkJCQkvKiAgU2V0IE1UUlIgY2FwYWJpbGl0eSBmbGFnIGlmIGFwcHJvcHJpYXRlICovCisJCQkJaWYgKGMtPng4Nl9tb2RlbCA9PSAxMyB8fCBjLT54ODZfbW9kZWwgPT0gOSB8fAorCQkJCSAgIChjLT54ODZfbW9kZWwgPT0gOCAmJiBjLT54ODZfbWFzayA+PSA4KSkKKwkJCQkJc2V0X2JpdChYODZfRkVBVFVSRV9LNl9NVFJSLCBjLT54ODZfY2FwYWJpbGl0eSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIDY6IC8qIEFuIEF0aGxvbi9EdXJvbiAqLworIAorCQkJLyogQml0IDE1IG9mIEF0aGxvbiBzcGVjaWZpYyBNU1IgMTUsIG5lZWRzIHRvIGJlIDAKKyAJCQkgKiB0byBlbmFibGUgU1NFIG9uIFBhbG9taW5vL01vcmdhbi9CYXJ0b24gQ1BVJ3MuCisJCQkgKiBJZiB0aGUgQklPUyBkaWRuJ3QgZW5hYmxlIGl0IGFscmVhZHksIGVuYWJsZSBpdCBoZXJlLgorCQkJICovCisJCQlpZiAoYy0+eDg2X21vZGVsID49IDYgJiYgYy0+eDg2X21vZGVsIDw9IDEwKSB7CisJCQkJaWYgKCFjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX1hNTSkpIHsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiRW5hYmxpbmcgZGlzYWJsZWQgSzcvU1NFIFN1cHBvcnQuXG4iKTsKKwkJCQkJcmRtc3IoTVNSX0s3X0hXQ1IsIGwsIGgpOworCQkJCQlsICY9IH4weDAwMDA4MDAwOworCQkJCQl3cm1zcihNU1JfSzdfSFdDUiwgbCwgaCk7CisJCQkJCXNldF9iaXQoWDg2X0ZFQVRVUkVfWE1NLCBjLT54ODZfY2FwYWJpbGl0eSk7CisJCQkJfQorCQkJfQorCisJCQkvKiBJdCdzIGJlZW4gZGV0ZXJtaW5lZCBieSBBTUQgdGhhdCBBdGhsb25zIHNpbmNlIG1vZGVsIDggc3RlcHBpbmcgMQorCQkJICogYXJlIG1vcmUgcm9idXN0IHdpdGggQ0xLX0NUTCBzZXQgdG8gMjAweHh4eHggaW5zdGVhZCBvZiA2MDB4eHh4eAorCQkJICogQXMgcGVyIEFNRCB0ZWNobmljYWwgbm90ZSAyNzIxMiAwLjIKKwkJCSAqLworCQkJaWYgKChjLT54ODZfbW9kZWwgPT0gOCAmJiBjLT54ODZfbWFzaz49MSkgfHwgKGMtPng4Nl9tb2RlbCA+IDgpKSB7CisJCQkJcmRtc3IoTVNSX0s3X0NMS19DVEwsIGwsIGgpOworCQkJCWlmICgobCAmIDB4ZmZmMDAwMDApICE9IDB4MjAwMDAwMDApIHsKKwkJCQkJcHJpbnRrICgiQ1BVOiBDTEtfQ1RMIE1TUiB3YXMgJXguIFJlcHJvZ3JhbW1pbmcgdG8gJXhcbiIsIGwsCisJCQkJCQkoKGwgJiAweDAwMGZmZmZmKXwweDIwMDAwMDAwKSk7CisJCQkJCXdybXNyKE1TUl9LN19DTEtfQ1RMLCAobCAmIDB4MDAwZmZmZmYpfDB4MjAwMDAwMDAsIGgpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCX0KKworCXN3aXRjaCAoYy0+eDg2KSB7CisJY2FzZSAxNToKKwkJc2V0X2JpdChYODZfRkVBVFVSRV9LOCwgYy0+eDg2X2NhcGFiaWxpdHkpOworCQlicmVhazsKKwljYXNlIDY6CisJCXNldF9iaXQoWDg2X0ZFQVRVUkVfSzcsIGMtPng4Nl9jYXBhYmlsaXR5KTsgCisJCWJyZWFrOworCX0KKworCWRpc3BsYXlfY2FjaGVpbmZvKGMpOworCWRldGVjdF9odChjKTsKKworI2lmZGVmIENPTkZJR19YODZfSFQKKwkvKiBBTUQgZHVhbCBjb3JlIGxvb2tzIGxpa2UgSFQgYnV0IGlzbid0IHJlYWxseS4gSGlkZSBpdCBmcm9tIHRoZQorCSAgIHNjaGVkdWxlci4gVGhpcyB3b3JrcyBhcm91bmQgcHJvYmxlbXMgd2l0aCB0aGUgZG9tYWluIHNjaGVkdWxlci4KKwkgICBBbHNvIHByb2JhYmx5IGdpdmVzIHNsaWdodGx5IGJldHRlciBzY2hlZHVsaW5nIGFuZCBkaXNhYmxlcworCSAgIFNNVCBuaWNlIHdoaWNoIGlzIGhhcm1mdWwgb24gZHVhbCBjb3JlLgorCSAgIFRCRCB0dW5lIHRoZSBkb21haW4gc2NoZWR1bGVyIGZvciBkdWFsIGNvcmUuICovCisJaWYgKGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfQ01QX0xFR0FDWSkpCisJCXNtcF9udW1fc2libGluZ3MgPSAxOworI2VuZGlmCisKKwlpZiAoY3B1aWRfZWF4KDB4ODAwMDAwMDApID49IDB4ODAwMDAwMDgpIHsKKwkJYy0+eDg2X251bV9jb3JlcyA9IChjcHVpZF9lY3goMHg4MDAwMDAwOCkgJiAweGZmKSArIDE7CisJCWlmIChjLT54ODZfbnVtX2NvcmVzICYgKGMtPng4Nl9udW1fY29yZXMgLSAxKSkKKwkJCWMtPng4Nl9udW1fY29yZXMgPSAxOworCX0KK30KKworc3RhdGljIHVuc2lnbmVkIGludCBhbWRfc2l6ZV9jYWNoZShzdHJ1Y3QgY3B1aW5mb194ODYgKiBjLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwkvKiBBTUQgZXJyYXRhIFQxMyAob3JkZXIgIzIxOTIyKSAqLworCWlmICgoYy0+eDg2ID09IDYpKSB7CisJCWlmIChjLT54ODZfbW9kZWwgPT0gMyAmJiBjLT54ODZfbWFzayA9PSAwKQkvKiBEdXJvbiBSZXYgQTAgKi8KKwkJCXNpemUgPSA2NDsKKwkJaWYgKGMtPng4Nl9tb2RlbCA9PSA0ICYmCisJCSAgICAoYy0+eDg2X21hc2s9PTAgfHwgYy0+eDg2X21hc2s9PTEpKQkvKiBUYmlyZCByZXYgQTEvQTIgKi8KKwkJCXNpemUgPSAyNTY7CisJfQorCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3RydWN0IGNwdV9kZXYgYW1kX2NwdV9kZXYgX19pbml0ZGF0YSA9IHsKKwkuY192ZW5kb3IJPSAiQU1EIiwKKwkuY19pZGVudCAJPSB7ICJBdXRoZW50aWNBTUQiIH0sCisJLmNfbW9kZWxzID0geworCQl7IC52ZW5kb3IgPSBYODZfVkVORE9SX0FNRCwgLmZhbWlseSA9IDQsIC5tb2RlbF9uYW1lcyA9CisJCSAgeworCQkJICBbM10gPSAiNDg2IERYLzIiLAorCQkJICBbN10gPSAiNDg2IERYLzItV0IiLAorCQkJICBbOF0gPSAiNDg2IERYLzQiLCAKKwkJCSAgWzldID0gIjQ4NiBEWC80LVdCIiwgCisJCQkgIFsxNF0gPSAiQW01eDg2LVdUIiwKKwkJCSAgWzE1XSA9ICJBbTV4ODYtV0IiIAorCQkgIH0KKwkJfSwKKwl9LAorCS5jX2luaXQJCT0gaW5pdF9hbWQsCisJLmNfaWRlbnRpZnkJPSBnZW5lcmljX2lkZW50aWZ5LAorCS5jX3NpemVfY2FjaGUJPSBhbWRfc2l6ZV9jYWNoZSwKK307CisKK2ludCBfX2luaXQgYW1kX2luaXRfY3B1KHZvaWQpCit7CisJY3B1X2RldnNbWDg2X1ZFTkRPUl9BTURdID0gJmFtZF9jcHVfZGV2OworCXJldHVybiAwOworfQorCisvL2Vhcmx5X2FyY2hfaW5pdGNhbGwoYW1kX2luaXRfY3B1KTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NlbnRhdXIuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NlbnRhdXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTQ4MTRlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY2VudGF1ci5jCkBAIC0wLDAgKzEsNDc2IEBACisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSA8YXNtL2U4MjAuaD4KKyNpbmNsdWRlICJjcHUuaCIKKworI2lmZGVmIENPTkZJR19YODZfT09TVE9SRQorCitzdGF0aWMgdTMyIF9faW5pdCBwb3dlcjIodTMyIHgpCit7CisJdTMyIHM9MTsKKwl3aGlsZShzPD14KQorCQlzPDw9MTsKKwlyZXR1cm4gcz4+PTE7Cit9CisKKworLyoKKyAqCVNldCB1cCBhbiBhY3R1YWwgTUNSCisgKi8KKyAKK3N0YXRpYyB2b2lkIF9faW5pdCBjZW50YXVyX21jcl9pbnNlcnQoaW50IHJlZywgdTMyIGJhc2UsIHUzMiBzaXplLCBpbnQga2V5KQoreworCXUzMiBsbywgaGk7CisJCisJaGkgPSBiYXNlICYgfjB4RkZGOworCWxvID0gfihzaXplLTEpOwkJLyogU2l6ZSBpcyBhIHBvd2VyIG9mIDIgc28gdGhpcyBtYWtlcyBhIG1hc2sgKi8KKwlsbyAmPSB+MHhGRkY7CQkvKiBSZW1vdmUgdGhlIGN0cmwgdmFsdWUgYml0cyAqLworCWxvIHw9IGtleTsJCS8qIEF0dHJpYnV0ZSB3ZSB3aXNoIHRvIHNldCAqLworCXdybXNyKHJlZytNU1JfSURUX01DUjAsIGxvLCBoaSk7CisJbXRycl9jZW50YXVyX3JlcG9ydF9tY3IocmVnLCBsbywgaGkpOwkvKiBUZWxsIHRoZSBtdHJyIGRyaXZlciAqLworfQorCisvKgorICoJRmlndXJlIHdoYXQgd2UgY2FuIGNvdmVyIHdpdGggTUNSJ3MKKyAqCisgKglTaG9ydGN1dDogV2Uga25vdyB5b3UgY2FuJ3QgcHV0IDRHaWcgb2YgUkFNIG9uIGEgd2luY2hpcAorICovCisKK3N0YXRpYyB1MzIgX19pbml0IHJhbXRvcCh2b2lkKQkJLyogMTYzODggKi8KK3sKKwlpbnQgaTsKKwl1MzIgdG9wID0gMDsKKwl1MzIgY2xpcCA9IDB4RkZGRkZGRkZVTDsKKwkKKwlmb3IgKGkgPSAwOyBpIDwgZTgyMC5ucl9tYXA7IGkrKykgeworCQl1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQ7CisKKwkJaWYgKGU4MjAubWFwW2ldLmFkZHIgPiAweEZGRkZGRkZGVUwpCisJCQljb250aW51ZTsKKwkJLyoKKwkJICoJRG9uJ3QgTUNSIG92ZXIgcmVzZXJ2ZWQgc3BhY2UuIElnbm9yZSB0aGUgSVNBIGhvbGUKKwkJICoJd2UgZnJvYiBhcm91bmQgdGhhdCBjYXRhc3Ryb3BoeSBhbHJlYWR5CisJCSAqLworCQkgCQkJCisJCWlmIChlODIwLm1hcFtpXS50eXBlID09IEU4MjBfUkVTRVJWRUQpCisJCXsKKwkJCWlmKGU4MjAubWFwW2ldLmFkZHIgPj0gMHgxMDAwMDBVTCAmJiBlODIwLm1hcFtpXS5hZGRyIDwgY2xpcCkKKwkJCQljbGlwID0gZTgyMC5tYXBbaV0uYWRkcjsKKwkJCWNvbnRpbnVlOworCQl9CisJCXN0YXJ0ID0gZTgyMC5tYXBbaV0uYWRkcjsKKwkJZW5kID0gZTgyMC5tYXBbaV0uYWRkciArIGU4MjAubWFwW2ldLnNpemU7CisJCWlmIChzdGFydCA+PSBlbmQpCisJCQljb250aW51ZTsKKwkJaWYgKGVuZCA+IHRvcCkKKwkJCXRvcCA9IGVuZDsKKwl9CisJLyogRXZlcnl0aGluZyBiZWxvdyAndG9wJyBzaG91bGQgYmUgUkFNIGV4Y2VwdCBmb3IgdGhlIElTQSBob2xlLgorCSAgIEJlY2F1c2Ugb2YgdGhlIGxpbWl0ZWQgTUNSJ3Mgd2Ugd2FudCB0byBtYXAgTlYvQUNQSSBpbnRvIG91cgorCSAgIE1DUiByYW5nZSBmb3IgZ3VuayBpbiBSQU0gCisJICAgCisJICAgQ2xpcCBtaWdodCBjYXVzZSB1cyB0byBNQ1IgaW5zdWZmaWNpZW50IFJBTSBidXQgdGhhdCBpcyBhbgorCSAgIGFjY2VwdGFibGUgZmFpbHVyZSBtb2RlIGFuZCBzaG91bGQgb25seSBiaXRlIG9ic2N1cmUgYm94ZXMgd2l0aAorCSAgIGEgVkVTQSBob2xlIGF0IDE1TWIKKwkgICAKKwkgICBUaGUgc2Vjb25kIGNhc2UgQ2xpcCBzb21ldGltZXMga2lja3MgaW4gaXMgd2hlbiB0aGUgRUJEQSBpcyBtYXJrZWQKKwkgICBhcyByZXNlcnZlZC4gQWdhaW4gd2UgZmFpbCBzYWZlIHdpdGggcmVhc29uYWJsZSByZXN1bHRzCisJKi8KKwkKKwlpZih0b3A+Y2xpcCkKKwkJdG9wPWNsaXA7CisJCQorCXJldHVybiB0b3A7Cit9CisKKy8qCisgKglDb21wdXRlIGEgc2V0IG9mIE1DUidzIHRvIGdpdmUgbWF4aW11bSBjb3ZlcmFnZQorICovCisKK3N0YXRpYyBpbnQgX19pbml0IGNlbnRhdXJfbWNyX2NvbXB1dGUoaW50IG5yLCBpbnQga2V5KQoreworCXUzMiBtZW0gPSByYW10b3AoKTsKKwl1MzIgcm9vdCA9IHBvd2VyMihtZW0pOworCXUzMiBiYXNlID0gcm9vdDsKKwl1MzIgdG9wID0gcm9vdDsKKwl1MzIgZmxvb3IgPSAwOworCWludCBjdCA9IDA7CisJCisJd2hpbGUoY3Q8bnIpCisJeworCQl1MzIgZnNwYWNlID0gMDsKKworCQkvKgorCQkgKglGaW5kIHRoZSBsYXJnZXN0IGJsb2NrIHdlIHdpbGwgZmlsbCBnb2luZyB1cHdhcmRzCisJCSAqLworCisJCXUzMiBoaWdoID0gcG93ZXIyKG1lbS10b3ApOwkKKworCQkvKgorCQkgKglGaW5kIHRoZSBsYXJnZXN0IGJsb2NrIHdlIHdpbGwgZmlsbCBnb2luZyBkb3dud2FyZHMKKwkJICovCisKKwkJdTMyIGxvdyA9IGJhc2UvMjsKKworCQkvKgorCQkgKglEb24ndCBmaWxsIGJlbG93IDFNYiBnb2luZyBkb3dud2FyZHMgYXMgdGhlcmUKKwkJICoJaXMgYW4gSVNBIGhvbGUgaW4gdGhlIHdheS4KKwkJICovCQkKKwkJIAorCQlpZihiYXNlIDw9IDEwMjQqMTAyNCkKKwkJCWxvdyA9IDA7CisJCQkKKwkJLyoKKwkJICoJU2VlIGhvdyBtdWNoIHNwYWNlIHdlIGNvdWxkIGNvdmVyIGJ5IGZpbGxpbmcgYmVsb3cKKwkJICoJdGhlIElTQSBob2xlCisJCSAqLworCQkgCisJCWlmKGZsb29yID09IDApCisJCQlmc3BhY2UgPSA1MTIqMTAyNDsKKwkJZWxzZSBpZihmbG9vciA9PTUxMioxMDI0KQorCQkJZnNwYWNlID0gMTI4KjEwMjQ7CisKKwkJLyogQW5kIGZvcmdldCBST00gc3BhY2UgKi8KKwkJCisJCS8qCisJCSAqCU5vdyBpbnN0YWxsIHRoZSBsYXJnZXN0IGNvdmVyYWdlIHdlIGdldAorCQkgKi8KKwkJIAorCQlpZihmc3BhY2UgPiBoaWdoICYmIGZzcGFjZSA+IGxvdykKKwkJeworCQkJY2VudGF1cl9tY3JfaW5zZXJ0KGN0LCBmbG9vciwgZnNwYWNlLCBrZXkpOworCQkJZmxvb3IgKz0gZnNwYWNlOworCQl9CisJCWVsc2UgaWYoaGlnaCA+IGxvdykKKwkJeworCQkJY2VudGF1cl9tY3JfaW5zZXJ0KGN0LCB0b3AsIGhpZ2gsIGtleSk7CisJCQl0b3AgKz0gaGlnaDsKKwkJfQorCQllbHNlIGlmKGxvdyA+IDApCisJCXsKKwkJCWJhc2UgLT0gbG93OworCQkJY2VudGF1cl9tY3JfaW5zZXJ0KGN0LCBiYXNlLCBsb3csIGtleSk7CisJCX0KKwkJZWxzZSBicmVhazsKKwkJY3QrKzsKKwl9CisJLyoKKwkgKglXZSBsb2FkZWQgY3QgdmFsdWVzLiBXZSBub3cgbmVlZCB0byBzZXQgdGhlIG1hc2suIFRoZSBjYWxsZXIKKwkgKgltdXN0IGRvIHRoaXMgYml0LgorCSAqLworCSAKKwlyZXR1cm4gY3Q7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBjZW50YXVyX2NyZWF0ZV9vcHRpbWFsX21jcih2b2lkKQoreworCWludCBpOworCS8qCisJICoJQWxsb2NhdGUgdXAgdG8gNiBtY3JzIHRvIG1hcmsgYXMgbXVjaCBvZiByYW0gYXMgcG9zc2libGUKKwkgKglhcyB3cml0ZSBjb21iaW5pbmcgYW5kIHdlYWsgd3JpdGUgb3JkZXJlZC4KKwkgKgorCSAqCVRvIGV4cGVyaW1lbnQgd2l0aDogTGludXggbmV2ZXIgdXNlcyBzdGFjayBvcGVyYXRpb25zIGZvciAKKwkgKgltbWlvIHNwYWNlcyBzbyB3ZSBjb3VsZCBnbG9iYWxseSBlbmFibGUgc3RhY2sgb3BlcmF0aW9uIHdjCisJICoKKwkgKglMb2FkIHRoZSByZWdpc3RlcnMgd2l0aCB0eXBlIDMxIC0gZnVsbCB3cml0ZSBjb21iaW5pbmcsIGFsbAorCSAqCXdyaXRlcyB3ZWFrbHkgb3JkZXJlZC4KKwkgKi8KKwlpbnQgdXNlZCA9IGNlbnRhdXJfbWNyX2NvbXB1dGUoNiwgMzEpOworCisJLyoKKwkgKglXaXBlIHVudXNlZCBNQ1JzCisJICovCisJIAorCWZvcihpPXVzZWQ7aTw4O2krKykKKwkJd3Jtc3IoTVNSX0lEVF9NQ1IwK2ksIDAsIDApOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgd2luY2hpcDJfY3JlYXRlX29wdGltYWxfbWNyKHZvaWQpCit7CisJdTMyIGxvLCBoaTsKKwlpbnQgaTsKKworCS8qCisJICoJQWxsb2NhdGUgdXAgdG8gNiBtY3JzIHRvIG1hcmsgYXMgbXVjaCBvZiByYW0gYXMgcG9zc2libGUKKwkgKglhcyB3cml0ZSBjb21iaW5pbmcsIHdlYWsgc3RvcmUgb3JkZXJlZC4KKwkgKgorCSAqCUxvYWQgdGhlIHJlZ2lzdGVycyB3aXRoIHR5cGUgMjUKKwkgKgkJOAktCXdlYWsgd3JpdGUgb3JkZXJpbmcKKwkgKgkJMTYJLQl3ZWFrIHJlYWQgb3JkZXJpbmcKKwkgKgkJMQktCXdyaXRlIGNvbWJpbmluZworCSAqLworCisJaW50IHVzZWQgPSBjZW50YXVyX21jcl9jb21wdXRlKDYsIDI1KTsKKwkKKwkvKgorCSAqCU1hcmsgdGhlIHJlZ2lzdGVycyB3ZSBhcmUgdXNpbmcuCisJICovCisJIAorCXJkbXNyKE1TUl9JRFRfTUNSX0NUUkwsIGxvLCBoaSk7CisJZm9yKGk9MDtpPHVzZWQ7aSsrKQorCQlsb3w9MTw8KDkraSk7CisJd3Jtc3IoTVNSX0lEVF9NQ1JfQ1RSTCwgbG8sIGhpKTsKKwkKKwkvKgorCSAqCVdpcGUgdW51c2VkIE1DUnMKKwkgKi8KKwkgCisJZm9yKGk9dXNlZDtpPDg7aSsrKQorCQl3cm1zcihNU1JfSURUX01DUjAraSwgMCwgMCk7Cit9CisKKy8qCisgKglIYW5kbGUgdGhlIE1DUiBrZXkgb24gdGhlIFdpbmNoaXAgMi4KKyAqLworCitzdGF0aWMgdm9pZCBfX2luaXQgd2luY2hpcDJfdW5wcm90ZWN0X21jcih2b2lkKQoreworCXUzMiBsbywgaGk7CisJdTMyIGtleTsKKwkKKwlyZG1zcihNU1JfSURUX01DUl9DVFJMLCBsbywgaGkpOworCWxvJj1+MHgxQzA7CS8qIGJsYW5rIGJpdHMgOC02ICovCisJa2V5ID0gKGxvPj4xNykgJiA3OworCWxvIHw9IGtleTw8NjsJLyogcmVwbGFjZSB3aXRoIHVubG9jayBrZXkgKi8KKwl3cm1zcihNU1JfSURUX01DUl9DVFJMLCBsbywgaGkpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgd2luY2hpcDJfcHJvdGVjdF9tY3Iodm9pZCkKK3sKKwl1MzIgbG8sIGhpOworCQorCXJkbXNyKE1TUl9JRFRfTUNSX0NUUkwsIGxvLCBoaSk7CisJbG8mPX4weDFDMDsJLyogYmxhbmsgYml0cyA4LTYgKi8KKwl3cm1zcihNU1JfSURUX01DUl9DVFJMLCBsbywgaGkpOworfQorI2VuZGlmIC8qIENPTkZJR19YODZfT09TVE9SRSAqLworCisjZGVmaW5lIEFDRV9QUkVTRU5UCSgxIDw8IDYpCisjZGVmaW5lIEFDRV9FTkFCTEVECSgxIDw8IDcpCisjZGVmaW5lIEFDRV9GQ1IJCSgxIDw8IDI4KQkvKiBNU1JfVklBX0ZDUiAqLworCisjZGVmaW5lIFJOR19QUkVTRU5UCSgxIDw8IDIpCisjZGVmaW5lIFJOR19FTkFCTEVECSgxIDw8IDMpCisjZGVmaW5lIFJOR19FTkFCTEUJKDEgPDwgNikJLyogTVNSX1ZJQV9STkcgKi8KKworc3RhdGljIHZvaWQgX19pbml0IGluaXRfYzMoc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworCXUzMiAgbG8sIGhpOworCisJLyogVGVzdCBmb3IgQ2VudGF1ciBFeHRlbmRlZCBGZWF0dXJlIEZsYWdzIHByZXNlbmNlICovCisJaWYgKGNwdWlkX2VheCgweEMwMDAwMDAwKSA+PSAweEMwMDAwMDAxKSB7CisJCXUzMiB0bXAgPSBjcHVpZF9lZHgoMHhDMDAwMDAwMSk7CisKKwkJLyogZW5hYmxlIEFDRSB1bml0LCBpZiBwcmVzZW50IGFuZCBkaXNhYmxlZCAqLworCQlpZiAoKHRtcCAmIChBQ0VfUFJFU0VOVCB8IEFDRV9FTkFCTEVEKSkgPT0gQUNFX1BSRVNFTlQpIHsKKwkJCXJkbXNyIChNU1JfVklBX0ZDUiwgbG8sIGhpKTsKKwkJCWxvIHw9IEFDRV9GQ1I7CQkvKiBlbmFibGUgQUNFIHVuaXQgKi8KKwkJCXdybXNyIChNU1JfVklBX0ZDUiwgbG8sIGhpKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIkNQVTogRW5hYmxlZCBBQ0UgaC93IGNyeXB0b1xuIik7CisJCX0KKworCQkvKiBlbmFibGUgUk5HIHVuaXQsIGlmIHByZXNlbnQgYW5kIGRpc2FibGVkICovCisJCWlmICgodG1wICYgKFJOR19QUkVTRU5UIHwgUk5HX0VOQUJMRUQpKSA9PSBSTkdfUFJFU0VOVCkgeworCQkJcmRtc3IgKE1TUl9WSUFfUk5HLCBsbywgaGkpOworCQkJbG8gfD0gUk5HX0VOQUJMRTsJLyogZW5hYmxlIFJORyB1bml0ICovCisJCQl3cm1zciAoTVNSX1ZJQV9STkcsIGxvLCBoaSk7CisJCQlwcmludGsoS0VSTl9JTkZPICJDUFU6IEVuYWJsZWQgaC93IFJOR1xuIik7CisJCX0KKworCQkvKiBzdG9yZSBDZW50YXVyIEV4dGVuZGVkIEZlYXR1cmUgRmxhZ3MgYXMKKwkJICogd29yZCA1IG9mIHRoZSBDUFUgY2FwYWJpbGl0eSBiaXQgYXJyYXkKKwkJICovCisJCWMtPng4Nl9jYXBhYmlsaXR5WzVdID0gY3B1aWRfZWR4KDB4QzAwMDAwMDEpOworCX0KKworCS8qIEN5cml4IElJSSBmYW1pbHkgbmVlZHMgQ1g4ICYgUEdFIGV4cGxpY2l0eSBlbmFibGVkLiAqLworCWlmIChjLT54ODZfbW9kZWwgPj02ICYmIGMtPng4Nl9tb2RlbCA8PSA5KSB7CisJCXJkbXNyIChNU1JfVklBX0ZDUiwgbG8sIGhpKTsKKwkJbG8gfD0gKDE8PDEgfCAxPDw3KTsKKwkJd3Jtc3IgKE1TUl9WSUFfRkNSLCBsbywgaGkpOworCQlzZXRfYml0KFg4Nl9GRUFUVVJFX0NYOCwgYy0+eDg2X2NhcGFiaWxpdHkpOworCX0KKworCS8qIEJlZm9yZSBOZWhlbWlhaCwgdGhlIEMzJ3MgaGFkIDNkTk9XISAqLworCWlmIChjLT54ODZfbW9kZWwgPj02ICYmIGMtPng4Nl9tb2RlbCA8OSkKKwkJc2V0X2JpdChYODZfRkVBVFVSRV8zRE5PVywgYy0+eDg2X2NhcGFiaWxpdHkpOworCisJZ2V0X21vZGVsX25hbWUoYyk7CisJZGlzcGxheV9jYWNoZWluZm8oYyk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBpbml0X2NlbnRhdXIoc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworCWVudW0geworCQlFQ1g4PTE8PDEsCisJCUVJRVJSSU5UPTE8PDIsCisJCURQTT0xPDwzLAorCQlETUNFPTE8PDQsCisJCURTVFBDTEs9MTw8NSwKKwkJRUxJTkVBUj0xPDw2LAorCQlEU01DPTE8PDcsCisJCURUTE9DSz0xPDw4LAorCQlFRENUTEI9MTw8OCwKKwkJRU1NWD0xPDw5LAorCQlEUERDPTE8PDExLAorCQlFQlJQUkVEPTE8PDEyLAorCQlESUM9MTw8MTMsCisJCUREQz0xPDwxNCwKKwkJRE5BPTE8PDE1LAorCQlFUkVUU1RLPTE8PDE2LAorCQlFMk1NWD0xPDwxOSwKKwkJRUFNRDNEPTE8PDIwLAorCX07CisKKwljaGFyICpuYW1lOworCXUzMiAgZmNyX3NldD0wOworCXUzMiAgZmNyX2Nscj0wOworCXUzMiAgbG8saGksbmV3bG87CisJdTMyICBhYSxiYixjYyxkZDsKKworCS8qIEJpdCAzMSBpbiBub3JtYWwgQ1BVSUQgdXNlZCBmb3Igbm9uc3RhbmRhcmQgM0ROb3cgSUQ7CisJICAgM0ROb3cgaXMgSURkIGJ5IGJpdCAzMSBpbiBleHRlbmRlZCBDUFVJRCAoMSozMiszMSkgYW55d2F5ICovCisJY2xlYXJfYml0KDAqMzIrMzEsIGMtPng4Nl9jYXBhYmlsaXR5KTsKKworCXN3aXRjaCAoYy0+eDg2KSB7CisKKwkJY2FzZSA1OgorCQkJc3dpdGNoKGMtPng4Nl9tb2RlbCkgeworCQkJY2FzZSA0OgorCQkJCW5hbWU9IkM2IjsKKwkJCQlmY3Jfc2V0PUVDWDh8RFNNQ3xFRENUTEJ8RU1NWHxFUkVUU1RLOworCQkJCWZjcl9jbHI9RFBEQzsKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIkRpc2FibGluZyBidWdnZWQgVFNDLlxuIik7CisJCQkJY2xlYXJfYml0KFg4Nl9GRUFUVVJFX1RTQywgYy0+eDg2X2NhcGFiaWxpdHkpOworI2lmZGVmIENPTkZJR19YODZfT09TVE9SRQorCQkJCWNlbnRhdXJfY3JlYXRlX29wdGltYWxfbWNyKCk7CisJCQkJLyogRW5hYmxlCisJCQkJCXdyaXRlIGNvbWJpbmluZyBvbiBub24tc3RhY2ssIG5vbi1zdHJpbmcKKwkJCQkJd3JpdGUgY29tYmluaW5nIG9uIHN0cmluZywgYWxsIHR5cGVzCisJCQkJCXdlYWsgd3JpdGUgb3JkZXJpbmcgCisJCQkJCQorCQkJCSAgIFRoZSBDNiBvcmlnaW5hbCBsYWNrcyB3ZWFrIHJlYWQgb3JkZXIgCisJCQkJICAgCisJCQkJICAgTm90ZSAweDEyMCBpcyB3cml0ZSBvbmx5IG9uIFdpbmNoaXAgMSAqLworCQkJCSAgIAorCQkJCXdybXNyKE1TUl9JRFRfTUNSX0NUUkwsIDB4MDFGMDAwMUYsIDApOworI2VuZGlmCQkJCQorCQkJCWJyZWFrOworCQkJY2FzZSA4OgorCQkJCXN3aXRjaChjLT54ODZfbWFzaykgeworCQkJCWRlZmF1bHQ6CisJCQkJCW5hbWU9IjIiOworCQkJCQlicmVhazsKKwkJCQljYXNlIDcgLi4uIDk6CisJCQkJCW5hbWU9IjJBIjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAxMCAuLi4gMTU6CisJCQkJCW5hbWU9IjJCIjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWZjcl9zZXQ9RUNYOHxEU01DfERUTE9DS3xFTU1YfEVCUlBSRUR8RVJFVFNUS3xFMk1NWHxFQU1EM0Q7CisJCQkJZmNyX2Nscj1EUERDOworI2lmZGVmIENPTkZJR19YODZfT09TVE9SRQorCQkJCXdpbmNoaXAyX3VucHJvdGVjdF9tY3IoKTsKKwkJCQl3aW5jaGlwMl9jcmVhdGVfb3B0aW1hbF9tY3IoKTsKKwkJCQlyZG1zcihNU1JfSURUX01DUl9DVFJMLCBsbywgaGkpOworCQkJCS8qIEVuYWJsZQorCQkJCQl3cml0ZSBjb21iaW5pbmcgb24gbm9uLXN0YWNrLCBub24tc3RyaW5nCisJCQkJCXdyaXRlIGNvbWJpbmluZyBvbiBzdHJpbmcsIGFsbCB0eXBlcworCQkJCQl3ZWFrIHdyaXRlIG9yZGVyaW5nIAorCQkJCSovCisJCQkJbG98PTMxOwkJCQkKKwkJCQl3cm1zcihNU1JfSURUX01DUl9DVFJMLCBsbywgaGkpOworCQkJCXdpbmNoaXAyX3Byb3RlY3RfbWNyKCk7CisjZW5kaWYKKwkJCQlicmVhazsKKwkJCWNhc2UgOToKKwkJCQluYW1lPSIzIjsKKwkJCQlmY3Jfc2V0PUVDWDh8RFNNQ3xEVExPQ0t8RU1NWHxFQlJQUkVEfEVSRVRTVEt8RTJNTVh8RUFNRDNEOworCQkJCWZjcl9jbHI9RFBEQzsKKyNpZmRlZiBDT05GSUdfWDg2X09PU1RPUkUKKwkJCQl3aW5jaGlwMl91bnByb3RlY3RfbWNyKCk7CisJCQkJd2luY2hpcDJfY3JlYXRlX29wdGltYWxfbWNyKCk7CisJCQkJcmRtc3IoTVNSX0lEVF9NQ1JfQ1RSTCwgbG8sIGhpKTsKKwkJCQkvKiBFbmFibGUKKwkJCQkJd3JpdGUgY29tYmluaW5nIG9uIG5vbi1zdGFjaywgbm9uLXN0cmluZworCQkJCQl3cml0ZSBjb21iaW5pbmcgb24gc3RyaW5nLCBhbGwgdHlwZXMKKwkJCQkJd2VhayB3cml0ZSBvcmRlcmluZyAKKwkJCQkqLworCQkJCWxvfD0zMTsJCQkJCisJCQkJd3Jtc3IoTVNSX0lEVF9NQ1JfQ1RSTCwgbG8sIGhpKTsKKwkJCQl3aW5jaGlwMl9wcm90ZWN0X21jcigpOworI2VuZGlmCisJCQkJYnJlYWs7CisJCQljYXNlIDEwOgorCQkJCW5hbWU9IjQiOworCQkJCS8qIG5vIGluZm8gb24gdGhlIFdDNCB5ZXQgKi8KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJbmFtZT0iPz8iOworCQkJfQorCisJCQlyZG1zcihNU1JfSURUX0ZDUjEsIGxvLCBoaSk7CisJCQluZXdsbz0obG98ZmNyX3NldCkgJiAofmZjcl9jbHIpOworCisJCQlpZiAobmV3bG8hPWxvKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiQ2VudGF1ciBGQ1Igd2FzIDB4JVggbm93IDB4JVhcbiIsIGxvLCBuZXdsbyApOworCQkJCXdybXNyKE1TUl9JRFRfRkNSMSwgbmV3bG8sIGhpICk7CisJCQl9IGVsc2UgeworCQkJCXByaW50ayhLRVJOX0lORk8gIkNlbnRhdXIgRkNSIGlzIDB4JVhcbiIsbG8pOworCQkJfQorCQkJLyogRW11bGF0ZSBNVFJScyB1c2luZyBDZW50YXVyJ3MgTUNSLiAqLworCQkJc2V0X2JpdChYODZfRkVBVFVSRV9DRU5UQVVSX01DUiwgYy0+eDg2X2NhcGFiaWxpdHkpOworCQkJLyogUmVwb3J0IENYOCAqLworCQkJc2V0X2JpdChYODZfRkVBVFVSRV9DWDgsIGMtPng4Nl9jYXBhYmlsaXR5KTsKKwkJCS8qIFNldCAzRE5vdyEgb24gV2luY2hpcCAyIGFuZCBhYm92ZS4gKi8KKwkJCWlmIChjLT54ODZfbW9kZWwgPj04KQorCQkJCXNldF9iaXQoWDg2X0ZFQVRVUkVfM0ROT1csIGMtPng4Nl9jYXBhYmlsaXR5KTsKKwkJCS8qIFNlZSBpZiB3ZSBjYW4gZmluZCBvdXQgc29tZSBtb3JlLiAqLworCQkJaWYgKCBjcHVpZF9lYXgoMHg4MDAwMDAwMCkgPj0gMHg4MDAwMDAwNSApIHsKKwkJCQkvKiBZZXMsIHdlIGNhbi4gKi8KKwkJCQljcHVpZCgweDgwMDAwMDA1LCZhYSwmYmIsJmNjLCZkZCk7CisJCQkJLyogQWRkIEwxIGRhdGEgYW5kIGNvZGUgY2FjaGUgc2l6ZXMuICovCisJCQkJYy0+eDg2X2NhY2hlX3NpemUgPSAoY2M+PjI0KSsoZGQ+PjI0KTsKKwkJCX0KKwkJCXNwcmludGYoIGMtPng4Nl9tb2RlbF9pZCwgIldpbkNoaXAgJXMiLCBuYW1lICk7CisJCQlicmVhazsKKworCQljYXNlIDY6CisJCQlpbml0X2MzKGMpOworCQkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGNlbnRhdXJfc2l6ZV9jYWNoZShzdHJ1Y3QgY3B1aW5mb194ODYgKiBjLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwkvKiBWSUEgQzMgQ1BVcyAoNjcwLTY4RikgbmVlZCBmdXJ0aGVyIHNoaWZ0aW5nLiAqLworCWlmICgoYy0+eDg2ID09IDYpICYmICgoYy0+eDg2X21vZGVsID09IDcpIHx8IChjLT54ODZfbW9kZWwgPT0gOCkpKQorCQlzaXplID4+PSA4OworCisJLyogVklBIGFsc28gc2NyZXdlZCB1cCBOZWhlbWlhaCBzdGVwcGluZyAxLCBhbmQgbWFkZQorCSAgIGl0IHJldHVybiAnNjVLQicgaW5zdGVhZCBvZiAnNjRLQicKKwkgICAtIE5vdGUsIGl0IHNlZW1zIHRoaXMgbWF5IG9ubHkgYmUgaW4gZW5naW5lZXJpbmcgc2FtcGxlcy4gKi8KKwlpZiAoKGMtPng4Nj09NikgJiYgKGMtPng4Nl9tb2RlbD09OSkgJiYgKGMtPng4Nl9tYXNrPT0xKSAmJiAoc2l6ZT09NjUpKQorCQlzaXplIC09MTsKKworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3RydWN0IGNwdV9kZXYgY2VudGF1cl9jcHVfZGV2IF9faW5pdGRhdGEgPSB7CisJLmNfdmVuZG9yCT0gIkNlbnRhdXIiLAorCS5jX2lkZW50CT0geyAiQ2VudGF1ckhhdWxzIiB9LAorCS5jX2luaXQJCT0gaW5pdF9jZW50YXVyLAorCS5jX3NpemVfY2FjaGUJPSBjZW50YXVyX3NpemVfY2FjaGUsCit9OworCitpbnQgX19pbml0IGNlbnRhdXJfaW5pdF9jcHUodm9pZCkKK3sKKwljcHVfZGV2c1tYODZfVkVORE9SX0NFTlRBVVJdID0gJmNlbnRhdXJfY3B1X2RldjsKKwlyZXR1cm4gMDsKK30KKworLy9lYXJseV9hcmNoX2luaXRjYWxsKGNlbnRhdXJfaW5pdF9jcHUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY2hhbmdlbG9nIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY2hhbmdlbG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZjc2YjgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jaGFuZ2Vsb2cKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqICBFbmhhbmNlZCBDUFUgdHlwZSBkZXRlY3Rpb24gYnkgTWlrZSBKYWdkaXMsIFBhdHJpY2sgU3QuIEplYW4KKyAqICBhbmQgTWFydGluIE1hcmVzLCBOb3ZlbWJlciAxOTk3LgorICoKKyAqICBGb3JjZSBDeXJpeCA2eDg2KE1YKSBhbmQgTSBJSSBwcm9jZXNzb3JzIHRvIHJlcG9ydCBNVFJSIGNhcGFiaWxpdHkKKyAqICBhbmQgQ3lyaXggImNvbWEgYnVnIiByZWNvZ25pdGlvbiBieQorICogIFpvbHThbiBC9nN69nJt6W55aSA8emJvc3pvckBtYWlsLmV4dGVybmV0Lmh1PiBGZWJydWFyeSAxOTk5LgorICogCisgKiAgRm9yY2UgQ2VudGF1ciBDNiBwcm9jZXNzb3JzIHRvIHJlcG9ydCBNVFJSIGNhcGFiaWxpdHkuCisgKiAgQmFydCBIYXJ0Z2VycyA8YmFydEBldHBtb2QucGh5cy50dWUubmw+LCBNYXkgMTk5OS4KKyAqCisgKiAgSW50ZWwgTW9iaWxlIFBlbnRpdW0gSUkgZGV0ZWN0aW9uIGZpeC4gU2VhbiBHaWxsZXksIEp1bmUgMTk5OS4KKyAqCisgKiAgSURUIFdpbmNoaXAgdHdlYWtzLCBtaXNjIGNsZWFuIHVwcy4KKyAqICBEYXZlIEpvbmVzIDxkYXZlakBzdXNlLmRlPiwgQXVndXN0IDE5OTkKKyAqCisgKiAgQmV0dGVyIGRldGVjdGlvbiBvZiBDZW50YXVyL0lEVCBXaW5DaGlwIG1vZGVscy4KKyAqICBCYXJ0IEhhcnRnZXJzIDxiYXJ0QGV0cG1vZC5waHlzLnR1ZS5ubD4sIEF1Z3VzdCAxOTk5LgorICoKKyAqICBDbGVhbmVkIHVwIGNhY2hlLWRldGVjdGlvbiBjb2RlCisgKiAgRGF2ZSBKb25lcyA8ZGF2ZWpAc3VzZS5kZT4sIE9jdG9iZXIgMTk5OQorICoKKyAqICBBZGRlZCBwcm9wZXIgTDIgY2FjaGUgZGV0ZWN0aW9uIGZvciBDb3BwZXJtaW5lCisgKiAgRHJhZ2FuIFN0YW5jZXZpYyA8dmlzaXRvckB2YWxpbnV4LmNvbT4sIE9jdG9iZXIgMTk5OQorICoKKyAqICBBZGRlZCB0aGUgb3JpZ2luYWwgYXJyYXkgZm9yIGNhcGFiaWxpdHkgZmxhZ3MgYnV0IGZvcmdvdCB0byBjcmVkaXQgCisgKiAgbXlzZWxmIDopICh+MTk5OCkgRml4ZWQvY2xlYW5lZCB1cCBzb21lIGNwdV9tb2RlbF9pbmZvIGFuZCBvdGhlciBzdHVmZgorICogIEphdWRlciBIbyA8amF1ZGVyaG9AY2FydW1iYS5jb20+LCBKYW51YXJ5IDIwMDAKKyAqCisgKiAgRGV0ZWN0aW9uIGZvciBDZWxlcm9uIGNvcHBlcm1pbmUsIGlkZW50aWZ5X2NwdSgpIG92ZXJoYXVsZWQsCisgKiAgYW5kIGEgZmV3IG90aGVyIGNsZWFuIHVwcy4KKyAqICBEYXZlIEpvbmVzIDxkYXZlakBzdXNlLmRlPiwgQXByaWwgMjAwMAorICoKKyAqICBQZW50aXVtIElJSSBGWFNSLCBTU0Ugc3VwcG9ydAorICogIEdlbmVyYWwgRlBVIHN0YXRlIGhhbmRsaW5nIGNsZWFudXBzCisgKiAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPiwgTWF5IDIwMDAKKyAqCisgKiAgQWRkZWQgcHJvcGVyIENhc2NhZGVzIENQVSBhbmQgTDIgY2FjaGUgZGV0ZWN0aW9uIGZvciBDYXNjYWRlcworICogIGFuZCA4LXdheSB0eXBlIGNhY2hlIGhhcHB5IGJ1bmNoIGZyb20gSW50ZWw6XikKKyAqICBEcmFnYW4gU3RhbmNldmljIDx2aXNpdG9yQHZhbGludXguY29tPiwgTWF5IDIwMDAgCisgKgorICogIEZvcndhcmQgcG9ydCBBTUQgRHVyb24gZXJyYXRhIFQxMyBmcm9tIDIuMi4xN3ByZQorICogIERhdmUgSm9uZXMgPGRhdmVqQHN1c2UuZGU+LCBBdWd1c3QgMjAwMAorICoKKyAqICBGb3J3YXJkIHBvcnQgbG90cyBvZiBmaXhlcy9pbXByb3ZlbWVudHMgZnJvbSAyLjIuMThwcmUKKyAqICBDeXJpeCBJSUksIFBlbnRpdW0gSVYgc3VwcG9ydC4KKyAqICBEYXZlIEpvbmVzIDxkYXZlakBzdXNlLmRlPiwgT2N0b2JlciAyMDAwCisgKgorICogIE1hc3NpdmUgY2xlYW51cCBvZiBDUFUgZGV0ZWN0aW9uIGFuZCBidWcgaGFuZGxpbmc7CisgKiAgVHJhbnNtZXRhIENQVSBkZXRlY3Rpb24sCisgKiAgSC4gUGV0ZXIgQW52aW4gPGhwYUB6eXRvci5jb20+LCBOb3ZlbWJlciAyMDAwCisgKgorICogIFZJQSBDMyBTdXBwb3J0LgorICogIERhdmUgSm9uZXMgPGRhdmVqQHN1c2UuZGU+LCBNYXJjaCAyMDAxCisgKgorICogIEFNRCBBdGhsb24vRHVyb24vVGh1bmRlcmJpcmQgYmx1ZXNtb2tlIHN1cHBvcnQuCisgKiAgRGF2ZSBKb25lcyA8ZGF2ZWpAc3VzZS5kZT4sIEFwcmlsIDIwMDEuCisgKgorICogIENhY2hlU2l6ZSBidWcgd29ya2Fyb3VuZCB1cGRhdGVzIGZvciBBTUQsIEludGVsICYgVklBIEN5cml4LgorICogIERhdmUgSm9uZXMgPGRhdmVqQHN1c2UuZGU+LCBTZXB0ZW1iZXIsIE9jdG9iZXIgMjAwMS4KKyAqCisgKi8KKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY29tbW9uLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmQ1ZDgyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY29tbW9uLmMKQEAgLTAsMCArMSw2MzQgQEAKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9pMzg3Lmg+CisjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgorI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQworI2luY2x1ZGUgPGFzbS9tcHNwZWMuaD4KKyNpbmNsdWRlIDxhc20vYXBpYy5oPgorI2luY2x1ZGUgPG1hY2hfYXBpYy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJjcHUuaCIKKworREVGSU5FX1BFUl9DUFUoc3RydWN0IGRlc2Nfc3RydWN0LCBjcHVfZ2R0X3RhYmxlW0dEVF9FTlRSSUVTXSk7CitFWFBPUlRfUEVSX0NQVV9TWU1CT0woY3B1X2dkdF90YWJsZSk7CisKK0RFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGNoYXIsIGNwdV8xNmJpdF9zdGFja1tDUFVfMTZCSVRfU1RBQ0tfU0laRV0pOworRVhQT1JUX1BFUl9DUFVfU1lNQk9MKGNwdV8xNmJpdF9zdGFjayk7CisKK3N0YXRpYyBpbnQgY2FjaGVzaXplX292ZXJyaWRlIF9faW5pdGRhdGEgPSAtMTsKK3N0YXRpYyBpbnQgZGlzYWJsZV94ODZfZnhzciBfX2luaXRkYXRhID0gMDsKK3N0YXRpYyBpbnQgZGlzYWJsZV94ODZfc2VyaWFsX25yIF9faW5pdGRhdGEgPSAxOworCitzdHJ1Y3QgY3B1X2RldiAqIGNwdV9kZXZzW1g4Nl9WRU5ET1JfTlVNXSA9IHt9OworCitleHRlcm4gdm9pZCBtY2hlY2tfaW5pdChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpOworCitleHRlcm4gaW50IGRpc2FibGVfcHNlOworCitzdGF0aWMgdm9pZCBkZWZhdWx0X2luaXQoc3RydWN0IGNwdWluZm9feDg2ICogYykKK3sKKwkvKiBOb3QgbXVjaCB3ZSBjYW4gZG8gaGVyZS4uLiAqLworCS8qIENoZWNrIGlmIGF0IGxlYXN0IGl0IGhhcyBjcHVpZCAqLworCWlmIChjLT5jcHVpZF9sZXZlbCA9PSAtMSkgeworCQkvKiBObyBjcHVpZC4gSXQgbXVzdCBiZSBhbiBhbmNpZW50IENQVSAqLworCQlpZiAoYy0+eDg2ID09IDQpCisJCQlzdHJjcHkoYy0+eDg2X21vZGVsX2lkLCAiNDg2Iik7CisJCWVsc2UgaWYgKGMtPng4NiA9PSAzKQorCQkJc3RyY3B5KGMtPng4Nl9tb2RlbF9pZCwgIjM4NiIpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBjcHVfZGV2IGRlZmF1bHRfY3B1ID0geworCS5jX2luaXQJPSBkZWZhdWx0X2luaXQsCit9Oworc3RhdGljIHN0cnVjdCBjcHVfZGV2ICogdGhpc19jcHUgPSAmZGVmYXVsdF9jcHU7CisKK3N0YXRpYyBpbnQgX19pbml0IGNhY2hlc2l6ZV9zZXR1cChjaGFyICpzdHIpCit7CisJZ2V0X29wdGlvbiAoJnN0ciwgJmNhY2hlc2l6ZV9vdmVycmlkZSk7CisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJjYWNoZXNpemU9IiwgY2FjaGVzaXplX3NldHVwKTsKKworaW50IF9faW5pdCBnZXRfbW9kZWxfbmFtZShzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJdW5zaWduZWQgaW50ICp2OworCWNoYXIgKnAsICpxOworCisJaWYgKGNwdWlkX2VheCgweDgwMDAwMDAwKSA8IDB4ODAwMDAwMDQpCisJCXJldHVybiAwOworCisJdiA9ICh1bnNpZ25lZCBpbnQgKikgYy0+eDg2X21vZGVsX2lkOworCWNwdWlkKDB4ODAwMDAwMDIsICZ2WzBdLCAmdlsxXSwgJnZbMl0sICZ2WzNdKTsKKwljcHVpZCgweDgwMDAwMDAzLCAmdls0XSwgJnZbNV0sICZ2WzZdLCAmdls3XSk7CisJY3B1aWQoMHg4MDAwMDAwNCwgJnZbOF0sICZ2WzldLCAmdlsxMF0sICZ2WzExXSk7CisJYy0+eDg2X21vZGVsX2lkWzQ4XSA9IDA7CisKKwkvKiBJbnRlbCBjaGlwcyByaWdodC1qdXN0aWZ5IHRoaXMgc3RyaW5nIGZvciBzb21lIGR1bWIgcmVhc29uOworCSAgIHVuZG8gdGhhdCBicmFpbiBkYW1hZ2UgKi8KKwlwID0gcSA9ICZjLT54ODZfbW9kZWxfaWRbMF07CisJd2hpbGUgKCAqcCA9PSAnICcgKQorCSAgICAgcCsrOworCWlmICggcCAhPSBxICkgeworCSAgICAgd2hpbGUgKCAqcCApCisJCSAgKnErKyA9ICpwKys7CisJICAgICB3aGlsZSAoIHEgPD0gJmMtPng4Nl9tb2RlbF9pZFs0OF0gKQorCQkgICpxKysgPSAnXDAnOwkvKiBaZXJvLXBhZCB0aGUgcmVzdCAqLworCX0KKworCXJldHVybiAxOworfQorCisKK3ZvaWQgX19pbml0IGRpc3BsYXlfY2FjaGVpbmZvKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKKwl1bnNpZ25lZCBpbnQgbiwgZHVtbXksIGVjeCwgZWR4LCBsMnNpemU7CisKKwluID0gY3B1aWRfZWF4KDB4ODAwMDAwMDApOworCisJaWYgKG4gPj0gMHg4MDAwMDAwNSkgeworCQljcHVpZCgweDgwMDAwMDA1LCAmZHVtbXksICZkdW1teSwgJmVjeCwgJmVkeCk7CisJCXByaW50ayhLRVJOX0lORk8gIkNQVTogTDEgSSBDYWNoZTogJWRLICglZCBieXRlcy9saW5lKSwgRCBjYWNoZSAlZEsgKCVkIGJ5dGVzL2xpbmUpXG4iLAorCQkJZWR4Pj4yNCwgZWR4JjB4RkYsIGVjeD4+MjQsIGVjeCYweEZGKTsKKwkJYy0+eDg2X2NhY2hlX3NpemU9KGVjeD4+MjQpKyhlZHg+PjI0KTsJCisJfQorCisJaWYgKG4gPCAweDgwMDAwMDA2KQkvKiBTb21lIGNoaXBzIGp1c3QgaGFzIGEgbGFyZ2UgTDEuICovCisJCXJldHVybjsKKworCWVjeCA9IGNwdWlkX2VjeCgweDgwMDAwMDA2KTsKKwlsMnNpemUgPSBlY3ggPj4gMTY7CisJCisJLyogZG8gcHJvY2Vzc29yLXNwZWNpZmljIGNhY2hlIHJlc2l6aW5nICovCisJaWYgKHRoaXNfY3B1LT5jX3NpemVfY2FjaGUpCisJCWwyc2l6ZSA9IHRoaXNfY3B1LT5jX3NpemVfY2FjaGUoYyxsMnNpemUpOworCisJLyogQWxsb3cgdXNlciB0byBvdmVycmlkZSBhbGwgdGhpcyBpZiBuZWNlc3NhcnkuICovCisJaWYgKGNhY2hlc2l6ZV9vdmVycmlkZSAhPSAtMSkKKwkJbDJzaXplID0gY2FjaGVzaXplX292ZXJyaWRlOworCisJaWYgKCBsMnNpemUgPT0gMCApCisJCXJldHVybjsJCS8qIEFnYWluLCBubyBMMiBjYWNoZSBpcyBwb3NzaWJsZSAqLworCisJYy0+eDg2X2NhY2hlX3NpemUgPSBsMnNpemU7CisKKwlwcmludGsoS0VSTl9JTkZPICJDUFU6IEwyIENhY2hlOiAlZEsgKCVkIGJ5dGVzL2xpbmUpXG4iLAorCSAgICAgICBsMnNpemUsIGVjeCAmIDB4RkYpOworfQorCisvKiBOYW1pbmcgY29udmVudGlvbiBzaG91bGQgYmU6IDxOYW1lPiBbKDxDb2RlbmFtZT4pXSAqLworLyogVGhpcyB0YWJsZSBvbmx5IGlzIHVzZWQgdW5sZXNzIGluaXRfPHZlbmRvcj4oKSBiZWxvdyBkb2Vzbid0IHNldCBpdDsgKi8KKy8qIGluIHBhcnRpY3VsYXIsIGlmIENQVUlEIGxldmVscyAweDgwMDAwMDAyLi40IGFyZSBzdXBwb3J0ZWQsIHRoaXMgaXNuJ3QgdXNlZCAqLworCisvKiBMb29rIHVwIENQVSBuYW1lcyBieSB0YWJsZSBsb29rdXAuICovCitzdGF0aWMgY2hhciBfX2luaXQgKnRhYmxlX2xvb2t1cF9tb2RlbChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJc3RydWN0IGNwdV9tb2RlbF9pbmZvICppbmZvOworCisJaWYgKCBjLT54ODZfbW9kZWwgPj0gMTYgKQorCQlyZXR1cm4gTlVMTDsJLyogUmFuZ2UgY2hlY2sgKi8KKworCWlmICghdGhpc19jcHUpCisJCXJldHVybiBOVUxMOworCisJaW5mbyA9IHRoaXNfY3B1LT5jX21vZGVsczsKKworCXdoaWxlIChpbmZvICYmIGluZm8tPmZhbWlseSkgeworCQlpZiAoaW5mby0+ZmFtaWx5ID09IGMtPng4NikKKwkJCXJldHVybiBpbmZvLT5tb2RlbF9uYW1lc1tjLT54ODZfbW9kZWxdOworCQlpbmZvKys7CisJfQorCXJldHVybiBOVUxMOwkJLyogTm90IGZvdW5kICovCit9CisKKwordm9pZCBfX2luaXQgZ2V0X2NwdV92ZW5kb3Ioc3RydWN0IGNwdWluZm9feDg2ICpjLCBpbnQgZWFybHkpCit7CisJY2hhciAqdiA9IGMtPng4Nl92ZW5kb3JfaWQ7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgWDg2X1ZFTkRPUl9OVU07IGkrKykgeworCQlpZiAoY3B1X2RldnNbaV0pIHsKKwkJCWlmICghc3RyY21wKHYsY3B1X2RldnNbaV0tPmNfaWRlbnRbMF0pIHx8CisJCQkgICAgKGNwdV9kZXZzW2ldLT5jX2lkZW50WzFdICYmIAorCQkJICAgICAhc3RyY21wKHYsY3B1X2RldnNbaV0tPmNfaWRlbnRbMV0pKSkgeworCQkJCWMtPng4Nl92ZW5kb3IgPSBpOworCQkJCWlmICghZWFybHkpCisJCQkJCXRoaXNfY3B1ID0gY3B1X2RldnNbaV07CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9CisKKworc3RhdGljIGludCBfX2luaXQgeDg2X2Z4c3Jfc2V0dXAoY2hhciAqIHMpCit7CisJZGlzYWJsZV94ODZfZnhzciA9IDE7CisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJub2Z4c3IiLCB4ODZfZnhzcl9zZXR1cCk7CisKKworLyogU3RhbmRhcmQgbWFjcm8gdG8gc2VlIGlmIGEgc3BlY2lmaWMgZmxhZyBpcyBjaGFuZ2VhYmxlICovCitzdGF0aWMgaW5saW5lIGludCBmbGFnX2lzX2NoYW5nZWFibGVfcCh1MzIgZmxhZykKK3sKKwl1MzIgZjEsIGYyOworCisJYXNtKCJwdXNoZmxcblx0IgorCSAgICAicHVzaGZsXG5cdCIKKwkgICAgInBvcGwgJTBcblx0IgorCSAgICAibW92bCAlMCwlMVxuXHQiCisJICAgICJ4b3JsICUyLCUwXG5cdCIKKwkgICAgInB1c2hsICUwXG5cdCIKKwkgICAgInBvcGZsXG5cdCIKKwkgICAgInB1c2hmbFxuXHQiCisJICAgICJwb3BsICUwXG5cdCIKKwkgICAgInBvcGZsXG5cdCIKKwkgICAgOiAiPSZyIiAoZjEpLCAiPSZyIiAoZjIpCisJICAgIDogImlyIiAoZmxhZykpOworCisJcmV0dXJuICgoZjFeZjIpICYgZmxhZykgIT0gMDsKK30KKworCisvKiBQcm9iZSBmb3IgdGhlIENQVUlEIGluc3RydWN0aW9uICovCitzdGF0aWMgaW50IF9faW5pdCBoYXZlX2NwdWlkX3Aodm9pZCkKK3sKKwlyZXR1cm4gZmxhZ19pc19jaGFuZ2VhYmxlX3AoWDg2X0VGTEFHU19JRCk7Cit9CisKKy8qIERvIG1pbmltdW0gQ1BVIGRldGVjdGlvbiBlYXJseS4KKyAgIEZpZWxkcyByZWFsbHkgbmVlZGVkOiB2ZW5kb3IsIGNwdWlkX2xldmVsLCBmYW1pbHksIG1vZGVsLCBtYXNrLCBjYWNoZSBhbGlnbm1lbnQuCisgICBUaGUgb3RoZXJzIGFyZSBub3QgdG91Y2hlZCB0byBhdm9pZCB1bndhbnRlZCBzaWRlIGVmZmVjdHMuICovCitzdGF0aWMgdm9pZCBfX2luaXQgZWFybHlfY3B1X2RldGVjdCh2b2lkKQoreworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICZib290X2NwdV9kYXRhOworCisJYy0+eDg2X2NhY2hlX2FsaWdubWVudCA9IDMyOworCisJaWYgKCFoYXZlX2NwdWlkX3AoKSkKKwkJcmV0dXJuOworCisJLyogR2V0IHZlbmRvciBuYW1lICovCisJY3B1aWQoMHgwMDAwMDAwMCwgJmMtPmNwdWlkX2xldmVsLAorCSAgICAgIChpbnQgKikmYy0+eDg2X3ZlbmRvcl9pZFswXSwKKwkgICAgICAoaW50ICopJmMtPng4Nl92ZW5kb3JfaWRbOF0sCisJICAgICAgKGludCAqKSZjLT54ODZfdmVuZG9yX2lkWzRdKTsKKworCWdldF9jcHVfdmVuZG9yKGMsIDEpOworCisJYy0+eDg2ID0gNDsKKwlpZiAoYy0+Y3B1aWRfbGV2ZWwgPj0gMHgwMDAwMDAwMSkgeworCQl1MzIganVuaywgdGZtcywgY2FwMCwgbWlzYzsKKwkJY3B1aWQoMHgwMDAwMDAwMSwgJnRmbXMsICZtaXNjLCAmanVuaywgJmNhcDApOworCQljLT54ODYgPSAodGZtcyA+PiA4KSAmIDE1OworCQljLT54ODZfbW9kZWwgPSAodGZtcyA+PiA0KSAmIDE1OworCQlpZiAoYy0+eDg2ID09IDB4ZikgeworCQkJYy0+eDg2ICs9ICh0Zm1zID4+IDIwKSAmIDB4ZmY7CisJCQljLT54ODZfbW9kZWwgKz0gKCh0Zm1zID4+IDE2KSAmIDB4RikgPDwgNDsKKwkJfQorCQljLT54ODZfbWFzayA9IHRmbXMgJiAxNTsKKwkJaWYgKGNhcDAgJiAoMTw8MTkpKQorCQkJYy0+eDg2X2NhY2hlX2FsaWdubWVudCA9ICgobWlzYyA+PiA4KSAmIDB4ZmYpICogODsKKwl9CisKKwllYXJseV9pbnRlbF93b3JrYXJvdW5kKGMpOworfQorCit2b2lkIF9faW5pdCBnZW5lcmljX2lkZW50aWZ5KHN0cnVjdCBjcHVpbmZvX3g4NiAqIGMpCit7CisJdTMyIHRmbXMsIHhsdmw7CisJaW50IGp1bms7CisKKwlpZiAoaGF2ZV9jcHVpZF9wKCkpIHsKKwkJLyogR2V0IHZlbmRvciBuYW1lICovCisJCWNwdWlkKDB4MDAwMDAwMDAsICZjLT5jcHVpZF9sZXZlbCwKKwkJICAgICAgKGludCAqKSZjLT54ODZfdmVuZG9yX2lkWzBdLAorCQkgICAgICAoaW50ICopJmMtPng4Nl92ZW5kb3JfaWRbOF0sCisJCSAgICAgIChpbnQgKikmYy0+eDg2X3ZlbmRvcl9pZFs0XSk7CisJCQorCQlnZXRfY3B1X3ZlbmRvcihjLCAwKTsKKwkJLyogSW5pdGlhbGl6ZSB0aGUgc3RhbmRhcmQgc2V0IG9mIGNhcGFiaWxpdGllcyAqLworCQkvKiBOb3RlIHRoYXQgdGhlIHZlbmRvci1zcGVjaWZpYyBjb2RlIGJlbG93IG1pZ2h0IG92ZXJyaWRlICovCisJCisJCS8qIEludGVsLWRlZmluZWQgZmxhZ3M6IGxldmVsIDB4MDAwMDAwMDEgKi8KKwkJaWYgKCBjLT5jcHVpZF9sZXZlbCA+PSAweDAwMDAwMDAxICkgeworCQkJdTMyIGNhcGFiaWxpdHksIGV4Y2FwOworCQkJY3B1aWQoMHgwMDAwMDAwMSwgJnRmbXMsICZqdW5rLCAmZXhjYXAsICZjYXBhYmlsaXR5KTsKKwkJCWMtPng4Nl9jYXBhYmlsaXR5WzBdID0gY2FwYWJpbGl0eTsKKwkJCWMtPng4Nl9jYXBhYmlsaXR5WzRdID0gZXhjYXA7CisJCQljLT54ODYgPSAodGZtcyA+PiA4KSAmIDE1OworCQkJYy0+eDg2X21vZGVsID0gKHRmbXMgPj4gNCkgJiAxNTsKKwkJCWlmIChjLT54ODYgPT0gMHhmKSB7CisJCQkJYy0+eDg2ICs9ICh0Zm1zID4+IDIwKSAmIDB4ZmY7CisJCQkJYy0+eDg2X21vZGVsICs9ICgodGZtcyA+PiAxNikgJiAweEYpIDw8IDQ7CisJCQl9IAorCQkJYy0+eDg2X21hc2sgPSB0Zm1zICYgMTU7CisJCX0gZWxzZSB7CisJCQkvKiBIYXZlIENQVUlEIGxldmVsIDAgb25seSAtIHVuaGVhcmQgb2YgKi8KKwkJCWMtPng4NiA9IDQ7CisJCX0KKworCQkvKiBBTUQtZGVmaW5lZCBmbGFnczogbGV2ZWwgMHg4MDAwMDAwMSAqLworCQl4bHZsID0gY3B1aWRfZWF4KDB4ODAwMDAwMDApOworCQlpZiAoICh4bHZsICYgMHhmZmZmMDAwMCkgPT0gMHg4MDAwMDAwMCApIHsKKwkJCWlmICggeGx2bCA+PSAweDgwMDAwMDAxICkgeworCQkJCWMtPng4Nl9jYXBhYmlsaXR5WzFdID0gY3B1aWRfZWR4KDB4ODAwMDAwMDEpOworCQkJCWMtPng4Nl9jYXBhYmlsaXR5WzZdID0gY3B1aWRfZWN4KDB4ODAwMDAwMDEpOworCQkJfQorCQkJaWYgKCB4bHZsID49IDB4ODAwMDAwMDQgKQorCQkJCWdldF9tb2RlbF9uYW1lKGMpOyAvKiBEZWZhdWx0IG5hbWUgKi8KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0IHNxdWFzaF90aGVfc3R1cGlkX3NlcmlhbF9udW1iZXIoc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworCWlmIChjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX1BOKSAmJiBkaXNhYmxlX3g4Nl9zZXJpYWxfbnIgKSB7CisJCS8qIERpc2FibGUgcHJvY2Vzc29yIHNlcmlhbCBudW1iZXIgKi8KKwkJdW5zaWduZWQgbG9uZyBsbyxoaTsKKwkJcmRtc3IoTVNSX0lBMzJfQkJMX0NSX0NUTCxsbyxoaSk7CisJCWxvIHw9IDB4MjAwMDAwOworCQl3cm1zcihNU1JfSUEzMl9CQkxfQ1JfQ1RMLGxvLGhpKTsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJDUFUgc2VyaWFsIG51bWJlciBkaXNhYmxlZC5cbiIpOworCQljbGVhcl9iaXQoWDg2X0ZFQVRVUkVfUE4sIGMtPng4Nl9jYXBhYmlsaXR5KTsKKworCQkvKiBEaXNhYmxpbmcgdGhlIHNlcmlhbCBudW1iZXIgbWF5IGFmZmVjdCB0aGUgY3B1aWQgbGV2ZWwgKi8KKwkJYy0+Y3B1aWRfbGV2ZWwgPSBjcHVpZF9lYXgoMCk7CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCB4ODZfc2VyaWFsX25yX3NldHVwKGNoYXIgKnMpCit7CisJZGlzYWJsZV94ODZfc2VyaWFsX25yID0gMDsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoInNlcmlhbG51bWJlciIsIHg4Nl9zZXJpYWxfbnJfc2V0dXApOworCisKKworLyoKKyAqIFRoaXMgZG9lcyB0aGUgaGFyZCB3b3JrIG9mIGFjdHVhbGx5IHBpY2tpbmcgYXBhcnQgdGhlIENQVSBzdHVmZi4uLgorICovCit2b2lkIF9faW5pdCBpZGVudGlmeV9jcHUoc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworCWludCBpOworCisJYy0+bG9vcHNfcGVyX2ppZmZ5ID0gbG9vcHNfcGVyX2ppZmZ5OworCWMtPng4Nl9jYWNoZV9zaXplID0gLTE7CisJYy0+eDg2X3ZlbmRvciA9IFg4Nl9WRU5ET1JfVU5LTk9XTjsKKwljLT5jcHVpZF9sZXZlbCA9IC0xOwkvKiBDUFVJRCBub3QgZGV0ZWN0ZWQgKi8KKwljLT54ODZfbW9kZWwgPSBjLT54ODZfbWFzayA9IDA7CS8qIFNvIGZhciB1bmtub3duLi4uICovCisJYy0+eDg2X3ZlbmRvcl9pZFswXSA9ICdcMCc7IC8qIFVuc2V0ICovCisJYy0+eDg2X21vZGVsX2lkWzBdID0gJ1wwJzsgIC8qIFVuc2V0ICovCisJYy0+eDg2X251bV9jb3JlcyA9IDE7CisJbWVtc2V0KCZjLT54ODZfY2FwYWJpbGl0eSwgMCwgc2l6ZW9mIGMtPng4Nl9jYXBhYmlsaXR5KTsKKworCWlmICghaGF2ZV9jcHVpZF9wKCkpIHsKKwkJLyogRmlyc3Qgb2YgYWxsLCBkZWNpZGUgaWYgdGhpcyBpcyBhIDQ4NiBvciBoaWdoZXIgKi8KKwkJLyogSXQncyBhIDQ4NiBpZiB3ZSBjYW4gbW9kaWZ5IHRoZSBBQyBmbGFnICovCisJCWlmICggZmxhZ19pc19jaGFuZ2VhYmxlX3AoWDg2X0VGTEFHU19BQykgKQorCQkJYy0+eDg2ID0gNDsKKwkJZWxzZQorCQkJYy0+eDg2ID0gMzsKKwl9CisKKwlnZW5lcmljX2lkZW50aWZ5KGMpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIkNQVTogQWZ0ZXIgZ2VuZXJpYyBpZGVudGlmeSwgY2FwczoiKTsKKwlmb3IgKGkgPSAwOyBpIDwgTkNBUElOVFM7IGkrKykKKwkJcHJpbnRrKCIgJTA4bHgiLCBjLT54ODZfY2FwYWJpbGl0eVtpXSk7CisJcHJpbnRrKCJcbiIpOworCisJaWYgKHRoaXNfY3B1LT5jX2lkZW50aWZ5KSB7CisJCXRoaXNfY3B1LT5jX2lkZW50aWZ5KGMpOworCisJCXByaW50ayhLRVJOX0RFQlVHICJDUFU6IEFmdGVyIHZlbmRvciBpZGVudGlmeSwgY2FwczoiKTsKKwkJZm9yIChpID0gMDsgaSA8IE5DQVBJTlRTOyBpKyspCisJCQlwcmludGsoIiAlMDhseCIsIGMtPng4Nl9jYXBhYmlsaXR5W2ldKTsKKwkJcHJpbnRrKCJcbiIpOworCX0KKworCS8qCisJICogVmVuZG9yLXNwZWNpZmljIGluaXRpYWxpemF0aW9uLiAgSW4gdGhpcyBzZWN0aW9uIHdlCisJICogY2Fub25pY2FsaXplIHRoZSBmZWF0dXJlIGZsYWdzLCBtZWFuaW5nIGlmIHRoZXJlIGFyZQorCSAqIGZlYXR1cmVzIGEgY2VydGFpbiBDUFUgc3VwcG9ydHMgd2hpY2ggQ1BVSUQgZG9lc24ndAorCSAqIHRlbGwgdXMsIENQVUlEIGNsYWltaW5nIGluY29ycmVjdCBmbGFncywgb3Igb3RoZXIgYnVncywKKwkgKiB3ZSBoYW5kbGUgdGhlbSBoZXJlLgorCSAqCisJICogQXQgdGhlIGVuZCBvZiB0aGlzIHNlY3Rpb24sIGMtPng4Nl9jYXBhYmlsaXR5IGJldHRlcgorCSAqIGluZGljYXRlIHRoZSBmZWF0dXJlcyB0aGlzIENQVSBnZW51aW5lbHkgc3VwcG9ydHMhCisJICovCisJaWYgKHRoaXNfY3B1LT5jX2luaXQpCisJCXRoaXNfY3B1LT5jX2luaXQoYyk7CisKKwkvKiBEaXNhYmxlIHRoZSBQTiBpZiBhcHByb3ByaWF0ZSAqLworCXNxdWFzaF90aGVfc3R1cGlkX3NlcmlhbF9udW1iZXIoYyk7CisKKwkvKgorCSAqIFRoZSB2ZW5kb3Itc3BlY2lmaWMgZnVuY3Rpb25zIG1pZ2h0IGhhdmUgY2hhbmdlZCBmZWF0dXJlcy4gIE5vdworCSAqIHdlIGRvICJnZW5lcmljIGNoYW5nZXMuIgorCSAqLworCisJLyogVFNDIGRpc2FibGVkPyAqLworCWlmICggdHNjX2Rpc2FibGUgKQorCQljbGVhcl9iaXQoWDg2X0ZFQVRVUkVfVFNDLCBjLT54ODZfY2FwYWJpbGl0eSk7CisKKwkvKiBGWFNSIGRpc2FibGVkPyAqLworCWlmIChkaXNhYmxlX3g4Nl9meHNyKSB7CisJCWNsZWFyX2JpdChYODZfRkVBVFVSRV9GWFNSLCBjLT54ODZfY2FwYWJpbGl0eSk7CisJCWNsZWFyX2JpdChYODZfRkVBVFVSRV9YTU0sIGMtPng4Nl9jYXBhYmlsaXR5KTsKKwl9CisKKwlpZiAoZGlzYWJsZV9wc2UpCisJCWNsZWFyX2JpdChYODZfRkVBVFVSRV9QU0UsIGMtPng4Nl9jYXBhYmlsaXR5KTsKKworCS8qIElmIHRoZSBtb2RlbCBuYW1lIGlzIHN0aWxsIHVuc2V0LCBkbyB0YWJsZSBsb29rdXAuICovCisJaWYgKCAhYy0+eDg2X21vZGVsX2lkWzBdICkgeworCQljaGFyICpwOworCQlwID0gdGFibGVfbG9va3VwX21vZGVsKGMpOworCQlpZiAoIHAgKQorCQkJc3RyY3B5KGMtPng4Nl9tb2RlbF9pZCwgcCk7CisJCWVsc2UKKwkJCS8qIExhc3QgcmVzb3J0Li4uICovCisJCQlzcHJpbnRmKGMtPng4Nl9tb2RlbF9pZCwgIiUwMngvJTAyeCIsCisJCQkJYy0+eDg2X3ZlbmRvciwgYy0+eDg2X21vZGVsKTsKKwl9CisKKwkvKiBOb3cgdGhlIGZlYXR1cmUgZmxhZ3MgYmV0dGVyIHJlZmxlY3QgYWN0dWFsIENQVSBmZWF0dXJlcyEgKi8KKworCXByaW50ayhLRVJOX0RFQlVHICJDUFU6IEFmdGVyIGFsbCBpbml0cywgY2FwczoiKTsKKwlmb3IgKGkgPSAwOyBpIDwgTkNBUElOVFM7IGkrKykKKwkJcHJpbnRrKCIgJTA4bHgiLCBjLT54ODZfY2FwYWJpbGl0eVtpXSk7CisJcHJpbnRrKCJcbiIpOworCisJLyoKKwkgKiBPbiBTTVAsIGJvb3RfY3B1X2RhdGEgaG9sZHMgdGhlIGNvbW1vbiBmZWF0dXJlIHNldCBiZXR3ZWVuCisJICogYWxsIENQVXM7IHNvIG1ha2Ugc3VyZSB0aGF0IHdlIGluZGljYXRlIHdoaWNoIGZlYXR1cmVzIGFyZQorCSAqIGNvbW1vbiBiZXR3ZWVuIHRoZSBDUFVzLiAgVGhlIGZpcnN0IHRpbWUgdGhpcyByb3V0aW5lIGdldHMKKwkgKiBleGVjdXRlZCwgYyA9PSAmYm9vdF9jcHVfZGF0YS4KKwkgKi8KKwlpZiAoIGMgIT0gJmJvb3RfY3B1X2RhdGEgKSB7CisJCS8qIEFORCB0aGUgYWxyZWFkeSBhY2N1bXVsYXRlZCBmbGFncyB3aXRoIHRoZXNlICovCisJCWZvciAoIGkgPSAwIDsgaSA8IE5DQVBJTlRTIDsgaSsrICkKKwkJCWJvb3RfY3B1X2RhdGEueDg2X2NhcGFiaWxpdHlbaV0gJj0gYy0+eDg2X2NhcGFiaWxpdHlbaV07CisJfQorCisJLyogSW5pdCBNYWNoaW5lIENoZWNrIEV4Y2VwdGlvbiBpZiBhdmFpbGFibGUuICovCisjaWZkZWYgQ09ORklHX1g4Nl9NQ0UKKwltY2hlY2tfaW5pdChjKTsKKyNlbmRpZgorfQorCisjaWZkZWYgQ09ORklHX1g4Nl9IVAordm9pZCBfX2luaXQgZGV0ZWN0X2h0KHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKKwl1MzIgCWVheCwgZWJ4LCBlY3gsIGVkeDsKKwlpbnQgCWluZGV4X2xzYiwgaW5kZXhfbXNiLCB0bXA7CisJaW50IAljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlpZiAoIWNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfSFQpKQorCQlyZXR1cm47CisKKwljcHVpZCgxLCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKKwlzbXBfbnVtX3NpYmxpbmdzID0gKGVieCAmIDB4ZmYwMDAwKSA+PiAxNjsKKworCWlmIChzbXBfbnVtX3NpYmxpbmdzID09IDEpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAgIkNQVTogSHlwZXItVGhyZWFkaW5nIGlzIGRpc2FibGVkXG4iKTsKKwl9IGVsc2UgaWYgKHNtcF9udW1fc2libGluZ3MgPiAxICkgeworCQlpbmRleF9sc2IgPSAwOworCQlpbmRleF9tc2IgPSAzMTsKKworCQlpZiAoc21wX251bV9zaWJsaW5ncyA+IE5SX0NQVVMpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNQVTogVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIHRoZSBzaWJsaW5ncyAlZCIsIHNtcF9udW1fc2libGluZ3MpOworCQkJc21wX251bV9zaWJsaW5ncyA9IDE7CisJCQlyZXR1cm47CisJCX0KKwkJdG1wID0gc21wX251bV9zaWJsaW5nczsKKwkJd2hpbGUgKCh0bXAgJiAxKSA9PSAwKSB7CisJCQl0bXAgPj49MSA7CisJCQlpbmRleF9sc2IrKzsKKwkJfQorCQl0bXAgPSBzbXBfbnVtX3NpYmxpbmdzOworCQl3aGlsZSAoKHRtcCAmIDB4ODAwMDAwMDAgKSA9PSAwKSB7CisJCQl0bXAgPDw9MSA7CisJCQlpbmRleF9tc2ItLTsKKwkJfQorCQlpZiAoaW5kZXhfbHNiICE9IGluZGV4X21zYiApCisJCQlpbmRleF9tc2IrKzsKKwkJcGh5c19wcm9jX2lkW2NwdV0gPSBwaHlzX3BrZ19pZCgoZWJ4ID4+IDI0KSAmIDB4RkYsIGluZGV4X21zYik7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAgIkNQVTogUGh5c2ljYWwgUHJvY2Vzc29yIElEOiAlZFxuIiwKKwkJICAgICAgIHBoeXNfcHJvY19pZFtjcHVdKTsKKwl9Cit9CisjZW5kaWYKKwordm9pZCBfX2luaXQgcHJpbnRfY3B1X2luZm8oc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworCWNoYXIgKnZlbmRvciA9IE5VTEw7CisKKwlpZiAoYy0+eDg2X3ZlbmRvciA8IFg4Nl9WRU5ET1JfTlVNKQorCQl2ZW5kb3IgPSB0aGlzX2NwdS0+Y192ZW5kb3I7CisJZWxzZSBpZiAoYy0+Y3B1aWRfbGV2ZWwgPj0gMCkKKwkJdmVuZG9yID0gYy0+eDg2X3ZlbmRvcl9pZDsKKworCWlmICh2ZW5kb3IgJiYgc3RybmNtcChjLT54ODZfbW9kZWxfaWQsIHZlbmRvciwgc3RybGVuKHZlbmRvcikpKQorCQlwcmludGsoIiVzICIsIHZlbmRvcik7CisKKwlpZiAoIWMtPng4Nl9tb2RlbF9pZFswXSkKKwkJcHJpbnRrKCIlZDg2IiwgYy0+eDg2KTsKKwllbHNlCisJCXByaW50aygiJXMiLCBjLT54ODZfbW9kZWxfaWQpOworCisJaWYgKGMtPng4Nl9tYXNrIHx8IGMtPmNwdWlkX2xldmVsID49IDApIAorCQlwcmludGsoIiBzdGVwcGluZyAlMDJ4XG4iLCBjLT54ODZfbWFzayk7CisJZWxzZQorCQlwcmludGsoIlxuIik7Cit9CisKK2NwdW1hc2tfdCBjcHVfaW5pdGlhbGl6ZWQgX19pbml0ZGF0YSA9IENQVV9NQVNLX05PTkU7CisKKy8qIFRoaXMgaXMgaGFja3kuIDopCisgKiBXZSdyZSBlbXVsYXRpbmcgZnV0dXJlIGJlaGF2aW9yLgorICogSW4gdGhlIGZ1dHVyZSwgdGhlIGNwdS1zcGVjaWZpYyBpbml0IGZ1bmN0aW9ucyB3aWxsIGJlIGNhbGxlZCBpbXBsaWNpdGx5CisgKiB2aWEgdGhlIG1hZ2ljIG9mIGluaXRjYWxscy4KKyAqIFRoZXkgd2lsbCBpbnNlcnQgdGhlbXNlbHZlcyBpbnRvIHRoZSBjcHVfZGV2cyBzdHJ1Y3R1cmUuCisgKiBUaGVuLCB3aGVuIGNwdV9pbml0KCkgaXMgY2FsbGVkLCB3ZSBjYW4ganVzdCBpdGVyYXRlIG92ZXIgdGhhdCBhcnJheS4KKyAqLworCitleHRlcm4gaW50IGludGVsX2NwdV9pbml0KHZvaWQpOworZXh0ZXJuIGludCBjeXJpeF9pbml0X2NwdSh2b2lkKTsKK2V4dGVybiBpbnQgbnNjX2luaXRfY3B1KHZvaWQpOworZXh0ZXJuIGludCBhbWRfaW5pdF9jcHUodm9pZCk7CitleHRlcm4gaW50IGNlbnRhdXJfaW5pdF9jcHUodm9pZCk7CitleHRlcm4gaW50IHRyYW5zbWV0YV9pbml0X2NwdSh2b2lkKTsKK2V4dGVybiBpbnQgcmlzZV9pbml0X2NwdSh2b2lkKTsKK2V4dGVybiBpbnQgbmV4Z2VuX2luaXRfY3B1KHZvaWQpOworZXh0ZXJuIGludCB1bWNfaW5pdF9jcHUodm9pZCk7CisKK3ZvaWQgX19pbml0IGVhcmx5X2NwdV9pbml0KHZvaWQpCit7CisJaW50ZWxfY3B1X2luaXQoKTsKKwljeXJpeF9pbml0X2NwdSgpOworCW5zY19pbml0X2NwdSgpOworCWFtZF9pbml0X2NwdSgpOworCWNlbnRhdXJfaW5pdF9jcHUoKTsKKwl0cmFuc21ldGFfaW5pdF9jcHUoKTsKKwlyaXNlX2luaXRfY3B1KCk7CisJbmV4Z2VuX2luaXRfY3B1KCk7CisJdW1jX2luaXRfY3B1KCk7CisJZWFybHlfY3B1X2RldGVjdCgpOworCisjaWZkZWYgQ09ORklHX0RFQlVHX1BBR0VBTExPQworCS8qIHBzZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIG9uLXRoZS1mbHkgdW5tYXBwaW5nLAorCSAqIGRpc2FibGUgaXQgZXZlbiBpZiB0aGUgY3B1cyBjbGFpbSB0byBzdXBwb3J0IGl0LgorCSAqLworCWNsZWFyX2JpdChYODZfRkVBVFVSRV9QU0UsIGJvb3RfY3B1X2RhdGEueDg2X2NhcGFiaWxpdHkpOworCWRpc2FibGVfcHNlID0gMTsKKyNlbmRpZgorfQorLyoKKyAqIGNwdV9pbml0KCkgaW5pdGlhbGl6ZXMgc3RhdGUgdGhhdCBpcyBwZXItQ1BVLiBTb21lIGRhdGEgaXMgYWxyZWFkeQorICogaW5pdGlhbGl6ZWQgKG5hdHVyYWxseSkgaW4gdGhlIGJvb3RzdHJhcCBwcm9jZXNzLCBzdWNoIGFzIHRoZSBHRFQKKyAqIGFuZCBJRFQuIFdlIHJlbG9hZCB0aGVtIG5ldmVydGhlbGVzcywgdGhpcyBmdW5jdGlvbiBhY3RzIGFzIGEKKyAqICdDUFUgc3RhdGUgYmFycmllcicsIG5vdGhpbmcgc2hvdWxkIGdldCBhY3Jvc3MuCisgKi8KK3ZvaWQgX19pbml0IGNwdV9pbml0ICh2b2lkKQoreworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJc3RydWN0IHRzc19zdHJ1Y3QgKiB0ID0gJnBlcl9jcHUoaW5pdF90c3MsIGNwdSk7CisJc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnRocmVhZCA9ICZjdXJyZW50LT50aHJlYWQ7CisJX191MzIgc3RrMTZfb2ZmID0gKF9fdTMyKSZwZXJfY3B1KGNwdV8xNmJpdF9zdGFjaywgY3B1KTsKKworCWlmIChjcHVfdGVzdF9hbmRfc2V0KGNwdSwgY3B1X2luaXRpYWxpemVkKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJDUFUjJWQgYWxyZWFkeSBpbml0aWFsaXplZCFcbiIsIGNwdSk7CisJCWZvciAoOzspIGxvY2FsX2lycV9lbmFibGUoKTsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiSW5pdGlhbGl6aW5nIENQVSMlZFxuIiwgY3B1KTsKKworCWlmIChjcHVfaGFzX3ZtZSB8fCBjcHVfaGFzX3RzYyB8fCBjcHVfaGFzX2RlKQorCQljbGVhcl9pbl9jcjQoWDg2X0NSNF9WTUV8WDg2X0NSNF9QVkl8WDg2X0NSNF9UU0R8WDg2X0NSNF9ERSk7CisJaWYgKHRzY19kaXNhYmxlICYmIGNwdV9oYXNfdHNjKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiRGlzYWJsaW5nIFRTQy4uLlxuIik7CisJCS8qKioqIEZJWC1IUEE6IERPRVMgVEhJUyBSRUFMTFkgQkVMT05HIEhFUkU/ICoqKiovCisJCWNsZWFyX2JpdChYODZfRkVBVFVSRV9UU0MsIGJvb3RfY3B1X2RhdGEueDg2X2NhcGFiaWxpdHkpOworCQlzZXRfaW5fY3I0KFg4Nl9DUjRfVFNEKTsKKwl9CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIHBlci1DUFUgR0RUIHdpdGggdGhlIGJvb3QgR0RULAorCSAqIGFuZCBzZXQgdXAgdGhlIEdEVCBkZXNjcmlwdG9yOgorCSAqLworCW1lbWNweSgmcGVyX2NwdShjcHVfZ2R0X3RhYmxlLCBjcHUpLCBjcHVfZ2R0X3RhYmxlLAorCSAgICAgICBHRFRfU0laRSk7CisKKwkvKiBTZXQgdXAgR0RUIGVudHJ5IGZvciAxNmJpdCBzdGFjayAqLworCSooX191NjQgKikmKHBlcl9jcHUoY3B1X2dkdF90YWJsZSwgY3B1KVtHRFRfRU5UUllfRVNQRklYX1NTXSkgfD0KKwkJKCgoKF9fdTY0KXN0azE2X29mZikgPDwgMTYpICYgMHgwMDAwMDBmZmZmZmYwMDAwVUxMKSB8CisJCSgoKChfX3U2NClzdGsxNl9vZmYpIDw8IDMyKSAmIDB4ZmYwMDAwMDAwMDAwMDAwMFVMTCkgfAorCQkoQ1BVXzE2QklUX1NUQUNLX1NJWkUgLSAxKTsKKworCWNwdV9nZHRfZGVzY3JbY3B1XS5zaXplID0gR0RUX1NJWkUgLSAxOworCWNwdV9nZHRfZGVzY3JbY3B1XS5hZGRyZXNzID0KKwkgICAgKHVuc2lnbmVkIGxvbmcpJnBlcl9jcHUoY3B1X2dkdF90YWJsZSwgY3B1KTsKKworCS8qCisJICogU2V0IHVwIHRoZSBwZXItdGhyZWFkIFRMUyBkZXNjcmlwdG9yIGNhY2hlOgorCSAqLworCW1lbWNweSh0aHJlYWQtPnRsc19hcnJheSwgJnBlcl9jcHUoY3B1X2dkdF90YWJsZSwgY3B1KSwKKwkJR0RUX0VOVFJZX1RMU19FTlRSSUVTICogOCk7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibGdkdCAlMCIgOiA6ICJtIiAoY3B1X2dkdF9kZXNjcltjcHVdKSk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oImxpZHQgJTAiIDogOiAibSIgKGlkdF9kZXNjcikpOworCisJLyoKKwkgKiBEZWxldGUgTlQKKwkgKi8KKwlfX2FzbV9fKCJwdXNoZmwgOyBhbmRsICQweGZmZmZiZmZmLCglZXNwKSA7IHBvcGZsIik7CisKKwkvKgorCSAqIFNldCB1cCBhbmQgbG9hZCB0aGUgcGVyLUNQVSBUU1MgYW5kIExEVAorCSAqLworCWF0b21pY19pbmMoJmluaXRfbW0ubW1fY291bnQpOworCWN1cnJlbnQtPmFjdGl2ZV9tbSA9ICZpbml0X21tOworCWlmIChjdXJyZW50LT5tbSkKKwkJQlVHKCk7CisJZW50ZXJfbGF6eV90bGIoJmluaXRfbW0sIGN1cnJlbnQpOworCisJbG9hZF9lc3AwKHQsIHRocmVhZCk7CisJc2V0X3Rzc19kZXNjKGNwdSx0KTsKKwlsb2FkX1RSX2Rlc2MoKTsKKwlsb2FkX0xEVCgmaW5pdF9tbS5jb250ZXh0KTsKKworCS8qIFNldCB1cCBkb3VibGVmYXVsdCBUU1MgcG9pbnRlciBpbiB0aGUgR0RUICovCisJX19zZXRfdHNzX2Rlc2MoY3B1LCBHRFRfRU5UUllfRE9VQkxFRkFVTFRfVFNTLCAmZG91YmxlZmF1bHRfdHNzKTsKKworCS8qIENsZWFyICVmcyBhbmQgJWdzLiAqLworCWFzbSB2b2xhdGlsZSAoInhvcmwgJWVheCwgJWVheDsgbW92bCAlZWF4LCAlZnM7IG1vdmwgJWVheCwgJWdzIik7CisKKwkvKiBDbGVhciBhbGwgNiBkZWJ1ZyByZWdpc3RlcnM6ICovCisKKyNkZWZpbmUgQ0QocmVnaXN0ZXIpIF9fYXNtX18oIm1vdmwgJTAsJSVkYiIgI3JlZ2lzdGVyIDo6InIiKDApICk7CisKKwlDRCgwKTsgQ0QoMSk7IENEKDIpOyBDRCgzKTsgLyogbm8gZGI0IGFuZCBkYjUgKi87IENEKDYpOyBDRCg3KTsKKworI3VuZGVmIENECisKKwkvKgorCSAqIEZvcmNlIEZQVSBpbml0aWFsaXphdGlvbjoKKwkgKi8KKwljdXJyZW50X3RocmVhZF9pbmZvKCktPnN0YXR1cyA9IDA7CisJY2xlYXJfdXNlZF9tYXRoKCk7CisJbXhjc3JfZmVhdHVyZV9tYXNrX2luaXQoKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdS5oIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWExZDRmMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdS5oCkBAIC0wLDAgKzEsMzAgQEAKKworc3RydWN0IGNwdV9tb2RlbF9pbmZvIHsKKwlpbnQgdmVuZG9yOworCWludCBmYW1pbHk7CisJY2hhciAqbW9kZWxfbmFtZXNbMTZdOworfTsKKworLyogYXR0ZW1wdCB0byBjb25zb2xpZGF0ZSBjcHUgYXR0cmlidXRlcyAqLworc3RydWN0IGNwdV9kZXYgeworCWNoYXIJKiBjX3ZlbmRvcjsKKworCS8qIHNvbWUgaGF2ZSB0d28gcG9zc2liaWxpdGllcyBmb3IgY3B1aWQgc3RyaW5nICovCisJY2hhcgkqIGNfaWRlbnRbMl07CQorCisJc3RydWN0CQljcHVfbW9kZWxfaW5mbyBjX21vZGVsc1s0XTsKKworCXZvaWQJCSgqY19pbml0KShzdHJ1Y3QgY3B1aW5mb194ODYgKiBjKTsKKwl2b2lkCQkoKmNfaWRlbnRpZnkpKHN0cnVjdCBjcHVpbmZvX3g4NiAqIGMpOworCXVuc2lnbmVkIGludAkoKmNfc2l6ZV9jYWNoZSkoc3RydWN0IGNwdWluZm9feDg2ICogYywgdW5zaWduZWQgaW50IHNpemUpOworfTsKKworZXh0ZXJuIHN0cnVjdCBjcHVfZGV2ICogY3B1X2RldnMgW1g4Nl9WRU5ET1JfTlVNXTsKKworZXh0ZXJuIGludCBnZXRfbW9kZWxfbmFtZShzdHJ1Y3QgY3B1aW5mb194ODYgKmMpOworZXh0ZXJuIHZvaWQgZGlzcGxheV9jYWNoZWluZm8oc3RydWN0IGNwdWluZm9feDg2ICpjKTsKKworZXh0ZXJuIHZvaWQgZ2VuZXJpY19pZGVudGlmeShzdHJ1Y3QgY3B1aW5mb194ODYgKiBjKTsKKworZXh0ZXJuIHZvaWQgZWFybHlfaW50ZWxfd29ya2Fyb3VuZChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpOworCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL0tjb25maWcgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI1ZmZkNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvS2NvbmZpZwpAQCAtMCwwICsxLDIzMSBAQAorIworIyBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKKyMKKworbWVudSAiQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nIgorCitzb3VyY2UgImRyaXZlcnMvY3B1ZnJlcS9LY29uZmlnIgorCitpZiBDUFVfRlJFUQorCitjb21tZW50ICJDUFVGcmVxIHByb2Nlc3NvciBkcml2ZXJzIgorCitjb25maWcgWDg2X0FDUElfQ1BVRlJFUQorCXRyaXN0YXRlICJBQ1BJIFByb2Nlc3NvciBQLVN0YXRlcyBkcml2ZXIiCisJc2VsZWN0IENQVV9GUkVRX1RBQkxFCisJZGVwZW5kcyBvbiBBQ1BJX1BST0NFU1NPUgorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIGFkZHMgYSBDUFVGcmVxIGRyaXZlciB3aGljaCB1dGlsaXplcyB0aGUgQUNQSQorCSAgUHJvY2Vzc29yIFBlcmZvcm1hbmNlIFN0YXRlcy4KKworCSAgRm9yIGRldGFpbHMsIHRha2UgYSBsb29rIGF0IDxmaWxlOkRvY3VtZW50YXRpb24vY3B1LWZyZXEvPi4KKworCSAgSWYgaW4gZG91YnQsIHNheSBOLgorCitjb25maWcgRUxBTl9DUFVGUkVRCisJdHJpc3RhdGUgIkFNRCBFbGFuIgorCXNlbGVjdCBDUFVfRlJFUV9UQUJMRQorCWRlcGVuZHMgb24gWDg2X0VMQU4KKwktLS1oZWxwLS0tCisJICBUaGlzIGFkZHMgdGhlIENQVUZyZXEgZHJpdmVyIGZvciBBTUQgRWxhbiBTQzQwMCBhbmQgU0M0MTAKKwkgIHByb2Nlc3NvcnMuCisKKwkgIFlvdSBuZWVkIHRvIHNwZWNpZnkgdGhlIHByb2Nlc3NvciBtYXhpbXVtIHNwZWVkIGFzIGJvb3QKKwkgIHBhcmFtZXRlcjogZWxhbmZyZXE9bWF4c3BlZWQgKGluIGtIeikgb3IgYXMgbW9kdWxlCisJICBwYXJhbWV0ZXIgIm1heF9mcmVxIi4KKworCSAgRm9yIGRldGFpbHMsIHRha2UgYSBsb29rIGF0IDxmaWxlOkRvY3VtZW50YXRpb24vY3B1LWZyZXEvPi4KKworCSAgSWYgaW4gZG91YnQsIHNheSBOLgorCitjb25maWcgWDg2X1BPV0VSTk9XX0s2CisJdHJpc3RhdGUgIkFNRCBNb2JpbGUgSzYtMi9LNi0zIFBvd2VyTm93ISIKKwlzZWxlY3QgQ1BVX0ZSRVFfVEFCTEUKKwloZWxwCisJICBUaGlzIGFkZHMgdGhlIENQVUZyZXEgZHJpdmVyIGZvciBtb2JpbGUgQU1EIEs2LTIrIGFuZCBtb2JpbGUKKwkgIEFNRCBLNi0zKyBwcm9jZXNzb3JzLgorCisJICBGb3IgZGV0YWlscywgdGFrZSBhIGxvb2sgYXQgPGZpbGU6RG9jdW1lbnRhdGlvbi9jcHUtZnJlcS8+LgorCisJICBJZiBpbiBkb3VidCwgc2F5IE4uCisKK2NvbmZpZyBYODZfUE9XRVJOT1dfSzcKKwl0cmlzdGF0ZSAiQU1EIE1vYmlsZSBBdGhsb24vRHVyb24gUG93ZXJOb3chIgorCXNlbGVjdCBDUFVfRlJFUV9UQUJMRQorCWhlbHAKKwkgIFRoaXMgYWRkcyB0aGUgQ1BVRnJlcSBkcml2ZXIgZm9yIG1vYmlsZSBBTUQgSzcgbW9iaWxlIHByb2Nlc3NvcnMuCisKKwkgIEZvciBkZXRhaWxzLCB0YWtlIGEgbG9vayBhdCA8ZmlsZTpEb2N1bWVudGF0aW9uL2NwdS1mcmVxLz4uCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgTi4KKworY29uZmlnIFg4Nl9QT1dFUk5PV19LN19BQ1BJCisJYm9vbAorCWRlcGVuZHMgb24gWDg2X1BPV0VSTk9XX0s3ICYmIEFDUElfUFJPQ0VTU09SCisJZGVwZW5kcyBvbiAhKFg4Nl9QT1dFUk5PV19LNyA9IHkgJiYgQUNQSV9QUk9DRVNTT1IgPSBtKQorCWRlZmF1bHQgeQorCitjb25maWcgWDg2X1BPV0VSTk9XX0s4CisJdHJpc3RhdGUgIkFNRCBPcHRlcm9uL0F0aGxvbjY0IFBvd2VyTm93ISIKKwlzZWxlY3QgQ1BVX0ZSRVFfVEFCTEUKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFRoaXMgYWRkcyB0aGUgQ1BVRnJlcSBkcml2ZXIgZm9yIG1vYmlsZSBBTUQgT3B0ZXJvbi9BdGhsb242NCBwcm9jZXNzb3JzLgorCisJICBGb3IgZGV0YWlscywgdGFrZSBhIGxvb2sgYXQgPGZpbGU6RG9jdW1lbnRhdGlvbi9jcHUtZnJlcS8+LgorCisJICBJZiBpbiBkb3VidCwgc2F5IE4uCisKK2NvbmZpZyBYODZfUE9XRVJOT1dfSzhfQUNQSQorCWJvb2wKKwlkZXBlbmRzIG9uIFg4Nl9QT1dFUk5PV19LOCAmJiBBQ1BJX1BST0NFU1NPUgorCWRlcGVuZHMgb24gIShYODZfUE9XRVJOT1dfSzggPSB5ICYmIEFDUElfUFJPQ0VTU09SID0gbSkKKwlkZWZhdWx0IHkKKworY29uZmlnIFg4Nl9HWF9TVVNQTU9ECisJdHJpc3RhdGUgIkN5cml4IE1lZGlhR1gvTmF0U2VtaSBHZW9kZSBTdXNwZW5kIE1vZHVsYXRpb24iCisJaGVscAorCSBUaGlzIGFkZCB0aGUgQ1BVRnJlcSBkcml2ZXIgZm9yIE5hdFNlbWkgR2VvZGUgcHJvY2Vzc29ycyB3aGljaAorCSBzdXBwb3J0IHN1c3BlbmQgbW9kdWxhdGlvbi4KKworCSBGb3IgZGV0YWlscywgdGFrZSBhIGxvb2sgYXQgPGZpbGU6RG9jdW1lbnRhdGlvbi9jcHUtZnJlcS8+LgorCisJIElmIGluIGRvdWJ0LCBzYXkgTi4KKworY29uZmlnIFg4Nl9TUEVFRFNURVBfQ0VOVFJJTk8KKwl0cmlzdGF0ZSAiSW50ZWwgRW5oYW5jZWQgU3BlZWRTdGVwIgorCXNlbGVjdCBDUFVfRlJFUV9UQUJMRQorCXNlbGVjdCBYODZfU1BFRURTVEVQX0NFTlRSSU5PX1RBQkxFIGlmICghWDg2X1NQRUVEU1RFUF9DRU5UUklOT19BQ1BJKQorCWhlbHAKKwkgIFRoaXMgYWRkcyB0aGUgQ1BVRnJlcSBkcml2ZXIgZm9yIEVuaGFuY2VkIFNwZWVkU3RlcCBlbmFibGVkCisJICBtb2JpbGUgQ1BVcy4gIFRoaXMgbWVhbnMgSW50ZWwgUGVudGl1bSBNIChDZW50cmlubykgQ1BVcy4gSG93ZXZlciwKKwkgIHlvdSBhbHNvIG5lZWQgdG8gc2F5IFkgdG8gIlVzZSBBQ1BJIHRhYmxlcyB0byBkZWNvZGUuLi4iIGJlbG93CisJICBbd2hpY2ggbWlnaHQgaW1wbHkgZW5hYmxpbmcgQUNQSV0gaWYgeW91IHdhbnQgdG8gdXNlIHRoaXMgZHJpdmVyCisJICBvbiBub24tQmFuaWFzIENQVXMuCisJICAKKwkgIEZvciBkZXRhaWxzLCB0YWtlIGEgbG9vayBhdCA8ZmlsZTpEb2N1bWVudGF0aW9uL2NwdS1mcmVxLz4uCisJICAKKwkgIElmIGluIGRvdWJ0LCBzYXkgTi4KKworY29uZmlnIFg4Nl9TUEVFRFNURVBfQ0VOVFJJTk9fQUNQSQorCWJvb2wgIlVzZSBBQ1BJIHRhYmxlcyB0byBkZWNvZGUgdmFsaWQgZnJlcXVlbmN5L3ZvbHRhZ2UgcGFpcnMiCisJZGVwZW5kcyBvbiBYODZfU1BFRURTVEVQX0NFTlRSSU5PICYmIEFDUElfUFJPQ0VTU09SCisJZGVwZW5kcyBvbiAhKFg4Nl9TUEVFRFNURVBfQ0VOVFJJTk8gPSB5ICYmIEFDUElfUFJPQ0VTU09SID0gbSkKKwlkZWZhdWx0IHkKKwloZWxwCisJICBVc2UgcHJpbWFyaWx5IHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBpbiB0aGUgQklPUyBBQ1BJIHRhYmxlcworCSAgdG8gZGV0ZXJtaW5lIHZhbGlkIENQVSBmcmVxdWVuY3kgYW5kIHZvbHRhZ2UgcGFpcmluZ3MuIEl0IGlzCisJICByZXF1aXJlZCBmb3IgdGhlIGRyaXZlciB0byB3b3JrIG9uIG5vbi1CYW5pYXMgQ1BVcy4KKworCSAgSWYgaW4gZG91YnQsIHNheSBZLgorCitjb25maWcgWDg2X1NQRUVEU1RFUF9DRU5UUklOT19UQUJMRQorCWJvb2wgIkJ1aWx0LWluIHRhYmxlcyBmb3IgQmFuaWFzIENQVXMiCisJZGVwZW5kcyBvbiBYODZfU1BFRURTVEVQX0NFTlRSSU5PCisJZGVmYXVsdCB5CisJaGVscAorCSAgVXNlIGJ1aWx0LWluIHRhYmxlcyBmb3IgQmFuaWFzIENQVXMgaWYgQUNQSSBlbmNvZGluZworCSAgaXMgbm90IGF2YWlsYWJsZS4KKworCSAgSWYgaW4gZG91YnQsIHNheSBOLgorCitjb25maWcgWDg2X1NQRUVEU1RFUF9JQ0gKKwl0cmlzdGF0ZSAiSW50ZWwgU3BlZWRzdGVwIG9uIElDSC1NIGNoaXBzZXRzIChpb3BvcnQgaW50ZXJmYWNlKSIKKwlzZWxlY3QgQ1BVX0ZSRVFfVEFCTEUKKwloZWxwCisJICBUaGlzIGFkZHMgdGhlIENQVUZyZXEgZHJpdmVyIGZvciBjZXJ0YWluIG1vYmlsZSBJbnRlbCBQZW50aXVtIElJSQorCSAgKENvcHBlcm1pbmUpLCBhbGwgbW9iaWxlIEludGVsIFBlbnRpdW0gSUlJLU0gKFR1YWxhdGluKSBhbmQgYWxsCisJICBtb2JpbGUgSW50ZWwgUGVudGl1bSA0IFA0LU0gb24gc3lzdGVtcyB3aGljaCBoYXZlIGFuIEludGVsIElDSDIsIAorCSAgSUNIMyBvciBJQ0g0IHNvdXRoYnJpZGdlLgorCisJICBGb3IgZGV0YWlscywgdGFrZSBhIGxvb2sgYXQgPGZpbGU6RG9jdW1lbnRhdGlvbi9jcHUtZnJlcS8+LgorCisJICBJZiBpbiBkb3VidCwgc2F5IE4uCisKK2NvbmZpZyBYODZfU1BFRURTVEVQX1NNSQorCXRyaXN0YXRlICJJbnRlbCBTcGVlZFN0ZXAgb24gNDQwQlgvWlgvTVggY2hpcHNldHMgKFNNSSBpbnRlcmZhY2UpIgorCXNlbGVjdCBDUFVfRlJFUV9UQUJMRQorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJaGVscAorCSAgVGhpcyBhZGRzIHRoZSBDUFVGcmVxIGRyaXZlciBmb3IgY2VydGFpbiBtb2JpbGUgSW50ZWwgUGVudGl1bSBJSUkKKwkgIChDb3BwZXJtaW5lKSwgYWxsIG1vYmlsZSBJbnRlbCBQZW50aXVtIElJSS1NIChUdWFsYXRpbikgIAorCSAgb24gc3lzdGVtcyB3aGljaCBoYXZlIGFuIEludGVsIDQ0MEJYL1pYL01YIHNvdXRoYnJpZGdlLgorCisJICBGb3IgZGV0YWlscywgdGFrZSBhIGxvb2sgYXQgPGZpbGU6RG9jdW1lbnRhdGlvbi9jcHUtZnJlcS8+LgorCisJICBJZiBpbiBkb3VidCwgc2F5IE4uCisKK2NvbmZpZyBYODZfUDRfQ0xPQ0tNT0QKKwl0cmlzdGF0ZSAiSW50ZWwgUGVudGl1bSA0IGNsb2NrIG1vZHVsYXRpb24iCisJc2VsZWN0IENQVV9GUkVRX1RBQkxFCisJaGVscAorCSAgVGhpcyBhZGRzIHRoZSBDUFVGcmVxIGRyaXZlciBmb3IgSW50ZWwgUGVudGl1bSA0IC8gWEVPTgorCSAgcHJvY2Vzc29ycy4KKworCSAgRm9yIGRldGFpbHMsIHRha2UgYSBsb29rIGF0IDxmaWxlOkRvY3VtZW50YXRpb24vY3B1LWZyZXEvPi4KKworCSAgSWYgaW4gZG91YnQsIHNheSBOLgorCitjb25maWcgWDg2X0NQVUZSRVFfTkZPUkNFMgorCXRyaXN0YXRlICJuVmlkaWEgbkZvcmNlMiBGU0IgY2hhbmdpbmciCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBUaGlzIGFkZHMgdGhlIENQVUZyZXEgZHJpdmVyIGZvciBGU0IgY2hhbmdpbmcgb24gblZpZGlhIG5Gb3JjZTIKKwkgIHBsYXRmb3Jtcy4KKworCSAgRm9yIGRldGFpbHMsIHRha2UgYSBsb29rIGF0IDxmaWxlOkRvY3VtZW50YXRpb24vY3B1LWZyZXEvPi4KKworCSAgSWYgaW4gZG91YnQsIHNheSBOLgorCitjb25maWcgWDg2X0xPTkdSVU4KKwl0cmlzdGF0ZSAiVHJhbnNtZXRhIExvbmdSdW4iCisJaGVscAorCSAgVGhpcyBhZGRzIHRoZSBDUFVGcmVxIGRyaXZlciBmb3IgVHJhbnNtZXRhIENydXNvZSBhbmQgRWZmaWNlb24gcHJvY2Vzc29ycworCSAgd2hpY2ggc3VwcG9ydCBMb25nUnVuLgorCisJICBGb3IgZGV0YWlscywgdGFrZSBhIGxvb2sgYXQgPGZpbGU6RG9jdW1lbnRhdGlvbi9jcHUtZnJlcS8+LgorCisJICBJZiBpbiBkb3VidCwgc2F5IE4uCisKK2NvbmZpZyBYODZfTE9OR0hBVUwKKwl0cmlzdGF0ZSAiVklBIEN5cml4IElJSSBMb25naGF1bCIKKwlzZWxlY3QgQ1BVX0ZSRVFfVEFCTEUKKwloZWxwCisJICBUaGlzIGFkZHMgdGhlIENQVUZyZXEgZHJpdmVyIGZvciBWSUEgU2FtdWVsL0N5cml4SUlJLCAKKwkgIFZJQSBDeXJpeCBTYW11ZWwvQzMsIFZJQSBDeXJpeCBFenJhIGFuZCBWSUEgQ3lyaXggRXpyYS1UIAorCSAgcHJvY2Vzc29ycy4KKworCSAgRm9yIGRldGFpbHMsIHRha2UgYSBsb29rIGF0IDxmaWxlOkRvY3VtZW50YXRpb24vY3B1LWZyZXEvPi4KKworCSAgSWYgaW4gZG91YnQsIHNheSBOLgorCitjb21tZW50ICJzaGFyZWQgb3B0aW9ucyIKKworY29uZmlnIFg4Nl9BQ1BJX0NQVUZSRVFfUFJPQ19JTlRGCisgICAgICAgIGJvb2wgIi9wcm9jL2FjcGkvcHJvY2Vzc29yLy4uL3BlcmZvcm1hbmNlIGludGVyZmFjZSAoZGVwcmVjYXRlZCkiCisJZGVwZW5kcyBvbiBQUk9DX0ZTCisJZGVwZW5kcyBvbiBYODZfQUNQSV9DUFVGUkVRIHx8IFg4Nl9TUEVFRFNURVBfQ0VOVFJJTk9fQUNQSSB8fCBYODZfUE9XRVJOT1dfSzdfQUNQSSB8fCBYODZfUE9XRVJOT1dfSzhfQUNQSQorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyB0aGUgZGVwcmVjYXRlZCAvcHJvYy9hY3BpL3Byb2Nlc3Nvci8uLi9wZXJmb3JtYW5jZSAKKwkgIGludGVyZmFjZS4gV2hpbGUgaXQgaXMgaGVscGZ1bCBmb3IgZGVidWdnaW5nLCB0aGUgZ2VuZXJpYywKKwkgIGNyb3NzLWFyY2hpdGVjdHVyZSBjcHVmcmVxIGludGVyZmFjZXMgc2hvdWxkIGJlIHVzZWQuCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgTi4KKworY29uZmlnIFg4Nl9TUEVFRFNURVBfTElCCisJdHJpc3RhdGUKKwlkZWZhdWx0IFg4Nl9TUEVFRFNURVBfSUNIIHx8IFg4Nl9TUEVFRFNURVBfU01JIHx8IFg4Nl9QNF9DTE9DS01PRAorCitjb25maWcgWDg2X1NQRUVEU1RFUF9SRUxBWEVEX0NBUF9DSEVDSworCWJvb2wgIlJlbGF4ZWQgc3BlZWRzdGVwIGNhcGFiaWxpdHkgY2hlY2tzIgorCWRlcGVuZHMgb24gKFg4Nl9TUEVFRFNURVBfU01JIHx8IFg4Nl9TUEVFRFNURVBfSUNIKQorCWhlbHAKKwkgIERvbid0IHBlcmZvcm0gYWxsIGNoZWNrcyBmb3IgYSBzcGVlZHN0ZXAgY2FwYWJsZSBzeXN0ZW0gd2hpY2ggd291bGQgCisJICBub3JtYWxseSBiZSBkb25lLiBTb21lIGFuY2llbnQgb3Igc3RyYW5nZSBzeXN0ZW1zLCB0aG91Z2ggc3BlZWRzdGVwIAorCSAgY2FwYWJsZSwgZG9uJ3QgYWx3YXlzIGluZGljYXRlIHRoYXQgdGhleSBhcmUgc3BlZWRzdGVwIGNhcGFibGUuIFRoaXMgCisJICBvcHRpb24gbGV0cyB0aGUgcHJvYmluZyBjb2RlIGJ5cGFzcyBzb21lIG9mIHRob3NlIGNoZWNrcyBpZiB0aGUKKwkgIHBhcmFtZXRlciAicmVsYXhlZF9jaGVjaz0xIiBpcyBwYXNzZWQgdG8gdGhlIG1vZHVsZS4KKworZW5kaWYJIyBDUFVfRlJFUQorCitlbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL01ha2VmaWxlIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTIyZTk3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9NYWtlZmlsZQpAQCAtMCwwICsxLDE0IEBACitvYmotJChDT05GSUdfWDg2X1BPV0VSTk9XX0s2KQkJKz0gcG93ZXJub3ctazYubworb2JqLSQoQ09ORklHX1g4Nl9QT1dFUk5PV19LNykJCSs9IHBvd2Vybm93LWs3Lm8KK29iai0kKENPTkZJR19YODZfUE9XRVJOT1dfSzgpCQkrPSBwb3dlcm5vdy1rOC5vCitvYmotJChDT05GSUdfWDg2X0xPTkdIQVVMKQkJKz0gbG9uZ2hhdWwubworb2JqLSQoQ09ORklHX0VMQU5fQ1BVRlJFUSkJCSs9IGVsYW5mcmVxLm8KK29iai0kKENPTkZJR19YODZfTE9OR1JVTikJCSs9IGxvbmdydW4ubyAgCitvYmotJChDT05GSUdfWDg2X0dYX1NVU1BNT0QpCQkrPSBneC1zdXNwbW9kLm8KK29iai0kKENPTkZJR19YODZfU1BFRURTVEVQX0lDSCkJCSs9IHNwZWVkc3RlcC1pY2gubworb2JqLSQoQ09ORklHX1g4Nl9TUEVFRFNURVBfQ0VOVFJJTk8pCSs9IHNwZWVkc3RlcC1jZW50cmluby5vCitvYmotJChDT05GSUdfWDg2X1NQRUVEU1RFUF9MSUIpCQkrPSBzcGVlZHN0ZXAtbGliLm8KK29iai0kKENPTkZJR19YODZfU1BFRURTVEVQX1NNSSkJCSs9IHNwZWVkc3RlcC1zbWkubworb2JqLSQoQ09ORklHX1g4Nl9BQ1BJX0NQVUZSRVEpCQkrPSBhY3BpLWNwdWZyZXEubworb2JqLSQoQ09ORklHX1g4Nl9QNF9DTE9DS01PRCkJCSs9IHA0LWNsb2NrbW9kLm8KK29iai0kKENPTkZJR19YODZfQ1BVRlJFUV9ORk9SQ0UyKQkrPSBjcHVmcmVxLW5mb3JjZTIubwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9hY3BpLWNwdWZyZXEuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvYWNwaS1jcHVmcmVxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYzZTE3YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvYWNwaS1jcHVmcmVxLmMKQEAgLTAsMCArMSw1MzcgQEAKKy8qCisgKiBhY3BpLWNwdWZyZXEuYyAtIEFDUEkgUHJvY2Vzc29yIFAtU3RhdGVzIERyaXZlciAoJFJldmlzaW9uOiAxLjMgJCkKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIEFuZHkgR3JvdmVyIDxhbmRyZXcuZ3JvdmVyQGludGVsLmNvbT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgUGF1bCBEaWVmZW5iYXVnaCA8cGF1bC5zLmRpZWZlbmJhdWdoQGludGVsLmNvbT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgLSAyMDA0IERvbWluaWsgQnJvZG93c2tpIDxsaW51eEBicm9kby5kZT4KKyAqCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EuCisgKgorICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGFjcGkvcHJvY2Vzc29yLmg+CisKKyNpbmNsdWRlICJzcGVlZHN0ZXAtZXN0LWNvbW1vbi5oIgorCisjZGVmaW5lIGRwcmludGsobXNnLi4uKSBjcHVmcmVxX2RlYnVnX3ByaW50ayhDUFVGUkVRX0RFQlVHX0RSSVZFUiwgImFjcGktY3B1ZnJlcSIsIG1zZykKKworTU9EVUxFX0FVVEhPUigiUGF1bCBEaWVmZW5iYXVnaCwgRG9taW5payBCcm9kb3dza2kiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQUNQSSBQcm9jZXNzb3IgUC1TdGF0ZXMgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKworc3RydWN0IGNwdWZyZXFfYWNwaV9pbyB7CisJc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlCWFjcGlfZGF0YTsKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUJCSpmcmVxX3RhYmxlOworCXVuc2lnbmVkIGludAkJCQlyZXN1bWU7Cit9OworCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfYWNwaV9pbwkqYWNwaV9pb19kYXRhW05SX0NQVVNdOworCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZHJpdmVyIGFjcGlfY3B1ZnJlcV9kcml2ZXI7CisKK3N0YXRpYyBpbnQKK2FjcGlfcHJvY2Vzc29yX3dyaXRlX3BvcnQoCisJdTE2CXBvcnQsCisJdTgJYml0X3dpZHRoLAorCXUzMgl2YWx1ZSkKK3sKKwlpZiAoYml0X3dpZHRoIDw9IDgpIHsKKwkJb3V0Yih2YWx1ZSwgcG9ydCk7CisJfSBlbHNlIGlmIChiaXRfd2lkdGggPD0gMTYpIHsKKwkJb3V0dyh2YWx1ZSwgcG9ydCk7CisJfSBlbHNlIGlmIChiaXRfd2lkdGggPD0gMzIpIHsKKwkJb3V0bCh2YWx1ZSwgcG9ydCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CithY3BpX3Byb2Nlc3Nvcl9yZWFkX3BvcnQoCisJdTE2CXBvcnQsCisJdTgJYml0X3dpZHRoLAorCXUzMgkqcmV0KQoreworCSpyZXQgPSAwOworCWlmIChiaXRfd2lkdGggPD0gOCkgeworCQkqcmV0ID0gaW5iKHBvcnQpOworCX0gZWxzZSBpZiAoYml0X3dpZHRoIDw9IDE2KSB7CisJCSpyZXQgPSBpbncocG9ydCk7CisJfSBlbHNlIGlmIChiaXRfd2lkdGggPD0gMzIpIHsKKwkJKnJldCA9IGlubChwb3J0KTsKKwl9IGVsc2UgeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2FjcGlfcHJvY2Vzc29yX3NldF9wZXJmb3JtYW5jZSAoCisJc3RydWN0IGNwdWZyZXFfYWNwaV9pbwkqZGF0YSwKKwl1bnNpZ25lZCBpbnQJCWNwdSwKKwlpbnQJCQlzdGF0ZSkKK3sKKwl1MTYJCQlwb3J0ID0gMDsKKwl1OAkJCWJpdF93aWR0aCA9IDA7CisJaW50CQkJcmV0ID0gMDsKKwl1MzIJCQl2YWx1ZSA9IDA7CisJaW50CQkJaSA9IDA7CisJc3RydWN0IGNwdWZyZXFfZnJlcXMgICAgY3B1ZnJlcV9mcmVxczsKKwljcHVtYXNrX3QJCXNhdmVkX21hc2s7CisJaW50CQkJcmV0dmFsOworCisJZHByaW50aygiYWNwaV9wcm9jZXNzb3Jfc2V0X3BlcmZvcm1hbmNlXG4iKTsKKworCS8qCisJICogVEJEOiBVc2Ugc29tZXRoaW5nIG90aGVyIHRoYW4gc2V0X2NwdXNfYWxsb3dlZC4KKwkgKiBBcyBzZXRfY3B1c19hbGxvd2VkIGlzIGEgYml0IHJhY3ksIAorCSAqIHdpdGggYW55IG90aGVyIHNldF9jcHVzX2FsbG93ZWQgZm9yIHRoaXMgcHJvY2Vzcy4KKwkgKi8KKwlzYXZlZF9tYXNrID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOworCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgY3B1bWFza19vZl9jcHUoY3B1KSk7CisJaWYgKHNtcF9wcm9jZXNzb3JfaWQoKSAhPSBjcHUpIHsKKwkJcmV0dXJuICgtRUFHQUlOKTsKKwl9CisJCisJaWYgKHN0YXRlID09IGRhdGEtPmFjcGlfZGF0YS5zdGF0ZSkgeworCQlpZiAodW5saWtlbHkoZGF0YS0+cmVzdW1lKSkgeworCQkJZHByaW50aygiQ2FsbGVkIGFmdGVyIHJlc3VtZSwgcmVzZXR0aW5nIHRvIFAlZFxuIiwgc3RhdGUpOworCQkJZGF0YS0+cmVzdW1lID0gMDsKKwkJfSBlbHNlIHsKKwkJCWRwcmludGsoIkFscmVhZHkgYXQgdGFyZ2V0IHN0YXRlIChQJWQpXG4iLCBzdGF0ZSk7CisJCQlyZXR2YWwgPSAwOworCQkJZ290byBtaWdyYXRlX2VuZDsKKwkJfQorCX0KKworCWRwcmludGsoIlRyYW5zaXRpb25pbmcgZnJvbSBQJWQgdG8gUCVkXG4iLAorCQlkYXRhLT5hY3BpX2RhdGEuc3RhdGUsIHN0YXRlKTsKKworCS8qIGNwdWZyZXEgZnJlcXVlbmN5IHN0cnVjdCAqLworCWNwdWZyZXFfZnJlcXMuY3B1ID0gY3B1OworCWNwdWZyZXFfZnJlcXMub2xkID0gZGF0YS0+ZnJlcV90YWJsZVtkYXRhLT5hY3BpX2RhdGEuc3RhdGVdLmZyZXF1ZW5jeTsKKwljcHVmcmVxX2ZyZXFzLm5ldyA9IGRhdGEtPmZyZXFfdGFibGVbc3RhdGVdLmZyZXF1ZW5jeTsKKworCS8qIG5vdGlmeSBjcHVmcmVxICovCisJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmY3B1ZnJlcV9mcmVxcywgQ1BVRlJFUV9QUkVDSEFOR0UpOworCisJLyoKKwkgKiBGaXJzdCB3ZSB3cml0ZSB0aGUgdGFyZ2V0IHN0YXRlJ3MgJ2NvbnRyb2wnIHZhbHVlIHRvIHRoZQorCSAqIGNvbnRyb2xfcmVnaXN0ZXIuCisJICovCisKKwlwb3J0ID0gZGF0YS0+YWNwaV9kYXRhLmNvbnRyb2xfcmVnaXN0ZXIuYWRkcmVzczsKKwliaXRfd2lkdGggPSBkYXRhLT5hY3BpX2RhdGEuY29udHJvbF9yZWdpc3Rlci5iaXRfd2lkdGg7CisJdmFsdWUgPSAodTMyKSBkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW3N0YXRlXS5jb250cm9sOworCisJZHByaW50aygiV3JpdGluZyAweCUwOHggdG8gcG9ydCAweCUwNHhcbiIsIHZhbHVlLCBwb3J0KTsKKworCXJldCA9IGFjcGlfcHJvY2Vzc29yX3dyaXRlX3BvcnQocG9ydCwgYml0X3dpZHRoLCB2YWx1ZSk7CisJaWYgKHJldCkgeworCQlkcHJpbnRrKCJJbnZhbGlkIHBvcnQgd2lkdGggMHglMDR4XG4iLCBiaXRfd2lkdGgpOworCQlyZXR2YWwgPSByZXQ7CisJCWdvdG8gbWlncmF0ZV9lbmQ7CisJfQorCisJLyoKKwkgKiBUaGVuIHdlIHJlYWQgdGhlICdzdGF0dXNfcmVnaXN0ZXInIGFuZCBjb21wYXJlIHRoZSB2YWx1ZSB3aXRoIHRoZQorCSAqIHRhcmdldCBzdGF0ZSdzICdzdGF0dXMnIHRvIG1ha2Ugc3VyZSB0aGUgdHJhbnNpdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKwkgKiBOb3RlIHRoYXQgd2UnbGwgcG9sbCBmb3IgdXAgdG8gMW1zICgxMDAgY3ljbGVzIG9mIDEwdXMpIGJlZm9yZQorCSAqIGdpdmluZyB1cC4KKwkgKi8KKworCXBvcnQgPSBkYXRhLT5hY3BpX2RhdGEuc3RhdHVzX3JlZ2lzdGVyLmFkZHJlc3M7CisJYml0X3dpZHRoID0gZGF0YS0+YWNwaV9kYXRhLnN0YXR1c19yZWdpc3Rlci5iaXRfd2lkdGg7CisKKwlkcHJpbnRrKCJMb29raW5nIGZvciAweCUwOHggZnJvbSBwb3J0IDB4JTA0eFxuIiwKKwkJKHUzMikgZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tzdGF0ZV0uc3RhdHVzLCBwb3J0KTsKKworCWZvciAoaT0wOyBpPDEwMDsgaSsrKSB7CisJCXJldCA9IGFjcGlfcHJvY2Vzc29yX3JlYWRfcG9ydChwb3J0LCBiaXRfd2lkdGgsICZ2YWx1ZSk7CisJCWlmIChyZXQpIHsJCisJCQlkcHJpbnRrKCJJbnZhbGlkIHBvcnQgd2lkdGggMHglMDR4XG4iLCBiaXRfd2lkdGgpOworCQkJcmV0dmFsID0gcmV0OworCQkJZ290byBtaWdyYXRlX2VuZDsKKwkJfQorCQlpZiAodmFsdWUgPT0gKHUzMikgZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tzdGF0ZV0uc3RhdHVzKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMCk7CisJfQorCisJLyogbm90aWZ5IGNwdWZyZXEgKi8KKwljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZjcHVmcmVxX2ZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOworCisJaWYgKHZhbHVlICE9ICh1MzIpIGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbc3RhdGVdLnN0YXR1cykgeworCQl1bnNpZ25lZCBpbnQgdG1wID0gY3B1ZnJlcV9mcmVxcy5uZXc7CisJCWNwdWZyZXFfZnJlcXMubmV3ID0gY3B1ZnJlcV9mcmVxcy5vbGQ7CisJCWNwdWZyZXFfZnJlcXMub2xkID0gdG1wOworCQljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZjcHVmcmVxX2ZyZXFzLCBDUFVGUkVRX1BSRUNIQU5HRSk7CisJCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmNwdWZyZXFfZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImFjcGktY3B1ZnJlcTogVHJhbnNpdGlvbiBmYWlsZWRcbiIpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIG1pZ3JhdGVfZW5kOworCX0KKworCWRwcmludGsoIlRyYW5zaXRpb24gc3VjY2Vzc2Z1bCBhZnRlciAlZCBtaWNyb3NlY29uZHNcbiIsIGkgKiAxMCk7CisKKwlkYXRhLT5hY3BpX2RhdGEuc3RhdGUgPSBzdGF0ZTsKKworCXJldHZhbCA9IDA7CittaWdyYXRlX2VuZDoKKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIHNhdmVkX21hc2spOworCXJldHVybiAocmV0dmFsKTsKK30KKworCitzdGF0aWMgaW50CithY3BpX2NwdWZyZXFfdGFyZ2V0ICgKKwlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgICAqcG9saWN5LAorCXVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwKKwl1bnNpZ25lZCBpbnQgcmVsYXRpb24pCit7CisJc3RydWN0IGNwdWZyZXFfYWNwaV9pbyAqZGF0YSA9IGFjcGlfaW9fZGF0YVtwb2xpY3ktPmNwdV07CisJdW5zaWduZWQgaW50IG5leHRfc3RhdGUgPSAwOworCXVuc2lnbmVkIGludCByZXN1bHQgPSAwOworCisJZHByaW50aygiYWNwaV9jcHVmcmVxX3NldHBvbGljeVxuIik7CisKKwlyZXN1bHQgPSBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQocG9saWN5LAorCQkJZGF0YS0+ZnJlcV90YWJsZSwKKwkJCXRhcmdldF9mcmVxLAorCQkJcmVsYXRpb24sCisJCQkmbmV4dF9zdGF0ZSk7CisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIChyZXN1bHQpOworCisJcmVzdWx0ID0gYWNwaV9wcm9jZXNzb3Jfc2V0X3BlcmZvcm1hbmNlIChkYXRhLCBwb2xpY3ktPmNwdSwgbmV4dF9zdGF0ZSk7CisKKwlyZXR1cm4gKHJlc3VsdCk7Cit9CisKKworc3RhdGljIGludAorYWNwaV9jcHVmcmVxX3ZlcmlmeSAoCisJc3RydWN0IGNwdWZyZXFfcG9saWN5ICAgKnBvbGljeSkKK3sKKwl1bnNpZ25lZCBpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgY3B1ZnJlcV9hY3BpX2lvICpkYXRhID0gYWNwaV9pb19kYXRhW3BvbGljeS0+Y3B1XTsKKworCWRwcmludGsoImFjcGlfY3B1ZnJlcV92ZXJpZnlcbiIpOworCisJcmVzdWx0ID0gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdmVyaWZ5KHBvbGljeSwgCisJCQlkYXRhLT5mcmVxX3RhYmxlKTsKKworCXJldHVybiAocmVzdWx0KTsKK30KKworCitzdGF0aWMgdW5zaWduZWQgbG9uZworYWNwaV9jcHVmcmVxX2d1ZXNzX2ZyZXEgKAorCXN0cnVjdCBjcHVmcmVxX2FjcGlfaW8JKmRhdGEsCisJdW5zaWduZWQgaW50CQljcHUpCit7CisJaWYgKGNwdV9raHopIHsKKwkJLyogc2VhcmNoIHRoZSBjbG9zZXN0IG1hdGNoIHRvIGNwdV9raHogKi8KKwkJdW5zaWduZWQgaW50IGk7CisJCXVuc2lnbmVkIGxvbmcgZnJlcTsKKwkJdW5zaWduZWQgbG9uZyBmcmVxbiA9IGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbMF0uY29yZV9mcmVxdWVuY3kgKiAxMDAwOworCisJCWZvciAoaT0wOyBpIDwgKGRhdGEtPmFjcGlfZGF0YS5zdGF0ZV9jb3VudCAtIDEpOyBpKyspIHsKKwkJCWZyZXEgPSBmcmVxbjsKKwkJCWZyZXFuID0gZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpKzFdLmNvcmVfZnJlcXVlbmN5ICogMTAwMDsKKwkJCWlmICgoMiAqIGNwdV9raHopID4gKGZyZXFuICsgZnJlcSkpIHsKKwkJCQlkYXRhLT5hY3BpX2RhdGEuc3RhdGUgPSBpOworCQkJCXJldHVybiAoZnJlcSk7CisJCQl9CisJCX0KKwkJZGF0YS0+YWNwaV9kYXRhLnN0YXRlID0gZGF0YS0+YWNwaV9kYXRhLnN0YXRlX2NvdW50IC0gMTsKKwkJcmV0dXJuIChmcmVxbik7CisJfSBlbHNlCisJCS8qIGFzc3VtZSBDUFUgaXMgYXQgUDAuLi4gKi8KKwkJZGF0YS0+YWNwaV9kYXRhLnN0YXRlID0gMDsKKwkJcmV0dXJuIGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbMF0uY29yZV9mcmVxdWVuY3kgKiAxMDAwOworCQorfQorCisKKy8qIAorICogYWNwaV9wcm9jZXNzb3JfY3B1X2luaXRfcGRjX2VzdCAtIGxldCBCSU9TIGtub3cgYWJvdXQgdGhlIFNNUCBjYXBhYmlsaXRpZXMKKyAqIG9mIHRoaXMgZHJpdmVyCisgKiBAcGVyZjogcHJvY2Vzc29yLXNwZWNpZmljIGFjcGlfaW9fZGF0YSBzdHJ1Y3QKKyAqIEBjcHU6IENQVSBiZWluZyBpbml0aWFsaXplZAorICoKKyAqIFRvIGF2b2lkIGlzc3VlcyB3aXRoIGxlZ2FjeSBPU2VzLCBzb21lIEJJT1NlcyByZXF1aXJlIHRvIGJlIGluZm9ybWVkIG9mCisgKiB0aGUgU01QIGNhcGFiaWxpdGllcyBvZiBPUyBQLXN0YXRlIGRyaXZlci4gSGVyZSB3ZSBzZXQgdGhlIGJpdHMgaW4gX1BEQyAKKyAqIGFjY29yZGluZ2x5LCBmb3IgRW5oYW5jZWQgU3BlZWRzdGVwLiBBY3R1YWwgY2FsbCB0byBfUERDIGlzIGRvbmUgaW4KKyAqIGRyaXZlci9hY3BpL3Byb2Nlc3Nvci5jCisgKi8KK3N0YXRpYyB2b2lkIAorYWNwaV9wcm9jZXNzb3JfY3B1X2luaXRfcGRjX2VzdCgKKwkJc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlICpwZXJmLCAKKwkJdW5zaWduZWQgaW50IGNwdSwKKwkJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgKm9ial9saXN0CisJCSkKK3sKKwl1bmlvbiBhY3BpX29iamVjdCAqb2JqOworCXUzMiAqYnVmOworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9IGNwdV9kYXRhICsgY3B1OworCWRwcmludGsoImFjcGlfcHJvY2Vzc29yX2NwdV9pbml0X3BkY19lc3RcbiIpOworCisJaWYgKCFjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX0VTVCkpCisJCXJldHVybjsKKworCS8qIEluaXRpYWxpemUgcGRjLiBJdCB3aWxsIGJlIHVzZWQgbGF0ZXIuICovCisJaWYgKCFvYmpfbGlzdCkKKwkJcmV0dXJuOworCQkKKwlpZiAoIShvYmpfbGlzdC0+Y291bnQgJiYgb2JqX2xpc3QtPnBvaW50ZXIpKQorCQlyZXR1cm47CisKKwlvYmogPSBvYmpfbGlzdC0+cG9pbnRlcjsKKwlpZiAoKG9iai0+YnVmZmVyLmxlbmd0aCA9PSAxMikgJiYgb2JqLT5idWZmZXIucG9pbnRlcikgeworCQlidWYgPSAodTMyICopb2JqLT5idWZmZXIucG9pbnRlcjsKKyAgICAgICAJCWJ1ZlswXSA9IEFDUElfUERDX1JFVklTSU9OX0lEOworICAgICAgIAkJYnVmWzFdID0gMTsKKyAgICAgICAJCWJ1ZlsyXSA9IEFDUElfUERDX0VTVF9DQVBBQklMSVRZX1NNUDsKKwkJcGVyZi0+cGRjID0gb2JqX2xpc3Q7CisJfQorCXJldHVybjsKK30KKyAKKworLyogQ1BVIHNwZWNpZmljIFBEQyBpbml0aWFsaXphdGlvbiAqLworc3RhdGljIHZvaWQgCithY3BpX3Byb2Nlc3Nvcl9jcHVfaW5pdF9wZGMoCisJCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZSAqcGVyZiwgCisJCXVuc2lnbmVkIGludCBjcHUsCisJCXN0cnVjdCBhY3BpX29iamVjdF9saXN0ICpvYmpfbGlzdAorCQkpCit7CisJc3RydWN0IGNwdWluZm9feDg2ICpjID0gY3B1X2RhdGEgKyBjcHU7CisJZHByaW50aygiYWNwaV9wcm9jZXNzb3JfY3B1X2luaXRfcGRjXG4iKTsKKwlwZXJmLT5wZGMgPSBOVUxMOworCWlmIChjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX0VTVCkpCisJCWFjcGlfcHJvY2Vzc29yX2NwdV9pbml0X3BkY19lc3QocGVyZiwgY3B1LCBvYmpfbGlzdCk7CisJcmV0dXJuOworfQorCisKK3N0YXRpYyBpbnQKK2FjcGlfY3B1ZnJlcV9jcHVfaW5pdCAoCisJc3RydWN0IGNwdWZyZXFfcG9saWN5ICAgKnBvbGljeSkKK3sKKwl1bnNpZ25lZCBpbnQJCWk7CisJdW5zaWduZWQgaW50CQljcHUgPSBwb2xpY3ktPmNwdTsKKwlzdHJ1Y3QgY3B1ZnJlcV9hY3BpX2lvCSpkYXRhOworCXVuc2lnbmVkIGludAkJcmVzdWx0ID0gMDsKKworCXVuaW9uIGFjcGlfb2JqZWN0CQlhcmcwID0ge0FDUElfVFlQRV9CVUZGRVJ9OworCXUzMgkJCQlhcmcwX2J1ZlszXTsKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCAJYXJnX2xpc3QgPSB7MSwgJmFyZzB9OworCisJZHByaW50aygiYWNwaV9jcHVmcmVxX2NwdV9pbml0XG4iKTsKKwkvKiBzZXR1cCBhcmdfbGlzdCBmb3IgX1BEQyBzZXR0aW5ncyAqLworICAgICAgICBhcmcwLmJ1ZmZlci5sZW5ndGggPSAxMjsKKyAgICAgICAgYXJnMC5idWZmZXIucG9pbnRlciA9ICh1OCAqKSBhcmcwX2J1ZjsKKworCWRhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY3B1ZnJlcV9hY3BpX2lvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKQorCQlyZXR1cm4gKC1FTk9NRU0pOworCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IGNwdWZyZXFfYWNwaV9pbykpOworCisJYWNwaV9pb19kYXRhW2NwdV0gPSBkYXRhOworCisJYWNwaV9wcm9jZXNzb3JfY3B1X2luaXRfcGRjKCZkYXRhLT5hY3BpX2RhdGEsIGNwdSwgJmFyZ19saXN0KTsKKwlyZXN1bHQgPSBhY3BpX3Byb2Nlc3Nvcl9yZWdpc3Rlcl9wZXJmb3JtYW5jZSgmZGF0YS0+YWNwaV9kYXRhLCBjcHUpOworCWRhdGEtPmFjcGlfZGF0YS5wZGMgPSBOVUxMOworCisJaWYgKHJlc3VsdCkKKwkJZ290byBlcnJfZnJlZTsKKworCWlmIChpc19jb25zdF9sb29wc19jcHUoY3B1KSkgeworCQlhY3BpX2NwdWZyZXFfZHJpdmVyLmZsYWdzIHw9IENQVUZSRVFfQ09OU1RfTE9PUFM7CisJfQorCisJLyogY2FwYWJpbGl0eSBjaGVjayAqLworCWlmIChkYXRhLT5hY3BpX2RhdGEuc3RhdGVfY291bnQgPD0gMSkgeworCQlkcHJpbnRrKCJObyBQLVN0YXRlc1xuIik7CisJCXJlc3VsdCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX3VucmVnOworCX0KKwlpZiAoKGRhdGEtPmFjcGlfZGF0YS5jb250cm9sX3JlZ2lzdGVyLnNwYWNlX2lkICE9IEFDUElfQURSX1NQQUNFX1NZU1RFTV9JTykgfHwKKwkgICAgKGRhdGEtPmFjcGlfZGF0YS5zdGF0dXNfcmVnaXN0ZXIuc3BhY2VfaWQgIT0gQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX0lPKSkgeworCQlkcHJpbnRrKCJVbnN1cHBvcnRlZCBhZGRyZXNzIHNwYWNlIFslZCwgJWRdXG4iLAorCQkJKHUzMikgKGRhdGEtPmFjcGlfZGF0YS5jb250cm9sX3JlZ2lzdGVyLnNwYWNlX2lkKSwKKwkJCSh1MzIpIChkYXRhLT5hY3BpX2RhdGEuc3RhdHVzX3JlZ2lzdGVyLnNwYWNlX2lkKSk7CisJCXJlc3VsdCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX3VucmVnOworCX0KKworCS8qIGFsbG9jIGZyZXFfdGFibGUgKi8KKwlkYXRhLT5mcmVxX3RhYmxlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlKSAqIChkYXRhLT5hY3BpX2RhdGEuc3RhdGVfY291bnQgKyAxKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhLT5mcmVxX3RhYmxlKSB7CisJCXJlc3VsdCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3VucmVnOworCX0KKworCS8qIGRldGVjdCB0cmFuc2l0aW9uIGxhdGVuY3kgKi8KKwlwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID0gMDsKKwlmb3IgKGk9MDsgaTxkYXRhLT5hY3BpX2RhdGEuc3RhdGVfY291bnQ7IGkrKykgeworCQlpZiAoKGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbaV0udHJhbnNpdGlvbl9sYXRlbmN5ICogMTAwMCkgPiBwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5KQorCQkJcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9IGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbaV0udHJhbnNpdGlvbl9sYXRlbmN5ICogMTAwMDsKKwl9CisJcG9saWN5LT5nb3Zlcm5vciA9IENQVUZSRVFfREVGQVVMVF9HT1ZFUk5PUjsKKworCS8qIFRoZSBjdXJyZW50IHNwZWVkIGlzIHVua25vd24gYW5kIG5vdCBkZXRlY3RhYmxlIGJ5IEFDUEkuLi4gICovCisJcG9saWN5LT5jdXIgPSBhY3BpX2NwdWZyZXFfZ3Vlc3NfZnJlcShkYXRhLCBwb2xpY3ktPmNwdSk7CisKKwkvKiB0YWJsZSBpbml0ICovCisJZm9yIChpPTA7IGk8PWRhdGEtPmFjcGlfZGF0YS5zdGF0ZV9jb3VudDsgaSsrKQorCXsKKwkJZGF0YS0+ZnJlcV90YWJsZVtpXS5pbmRleCA9IGk7CisJCWlmIChpPGRhdGEtPmFjcGlfZGF0YS5zdGF0ZV9jb3VudCkKKwkJCWRhdGEtPmZyZXFfdGFibGVbaV0uZnJlcXVlbmN5ID0gZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpXS5jb3JlX2ZyZXF1ZW5jeSAqIDEwMDA7CisJCWVsc2UKKwkJCWRhdGEtPmZyZXFfdGFibGVbaV0uZnJlcXVlbmN5ID0gQ1BVRlJFUV9UQUJMRV9FTkQ7CisJfQorCisJcmVzdWx0ID0gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfY3B1aW5mbyhwb2xpY3ksIGRhdGEtPmZyZXFfdGFibGUpOworCWlmIChyZXN1bHQpIHsKKwkJZ290byBlcnJfZnJlcWZyZWU7CisJfQorCisJLyogbm90aWZ5IEJJT1MgdGhhdCB3ZSBleGlzdCAqLworCWFjcGlfcHJvY2Vzc29yX25vdGlmeV9zbW0oVEhJU19NT0RVTEUpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiYWNwaS1jcHVmcmVxOiBDUFUldSAtIEFDUEkgcGVyZm9ybWFuY2UgbWFuYWdlbWVudCBhY3RpdmF0ZWQuXG4iLAorCSAgICAgICBjcHUpOworCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5hY3BpX2RhdGEuc3RhdGVfY291bnQ7IGkrKykKKwkJZHByaW50aygiICAgICAlY1AlZDogJWQgTUh6LCAlZCBtVywgJWQgdVNcbiIsCisJCQkoaSA9PSBkYXRhLT5hY3BpX2RhdGEuc3RhdGU/JyonOicgJyksIGksCisJCQkodTMyKSBkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW2ldLmNvcmVfZnJlcXVlbmN5LAorCQkJKHUzMikgZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpXS5wb3dlciwKKwkJCSh1MzIpIGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbaV0udHJhbnNpdGlvbl9sYXRlbmN5KTsKKworCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2dldF9hdHRyKGRhdGEtPmZyZXFfdGFibGUsIHBvbGljeS0+Y3B1KTsKKwlyZXR1cm4gKHJlc3VsdCk7CisKKyBlcnJfZnJlcWZyZWU6CisJa2ZyZWUoZGF0YS0+ZnJlcV90YWJsZSk7CisgZXJyX3VucmVnOgorCWFjcGlfcHJvY2Vzc29yX3VucmVnaXN0ZXJfcGVyZm9ybWFuY2UoJmRhdGEtPmFjcGlfZGF0YSwgY3B1KTsKKyBlcnJfZnJlZToKKwlrZnJlZShkYXRhKTsKKwlhY3BpX2lvX2RhdGFbY3B1XSA9IE5VTEw7CisKKwlyZXR1cm4gKHJlc3VsdCk7Cit9CisKKworc3RhdGljIGludAorYWNwaV9jcHVmcmVxX2NwdV9leGl0ICgKKwlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgICAqcG9saWN5KQoreworCXN0cnVjdCBjcHVmcmVxX2FjcGlfaW8gKmRhdGEgPSBhY3BpX2lvX2RhdGFbcG9saWN5LT5jcHVdOworCisKKwlkcHJpbnRrKCJhY3BpX2NwdWZyZXFfY3B1X2V4aXRcbiIpOworCisJaWYgKGRhdGEpIHsKKwkJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfcHV0X2F0dHIocG9saWN5LT5jcHUpOworCQlhY3BpX2lvX2RhdGFbcG9saWN5LT5jcHVdID0gTlVMTDsKKwkJYWNwaV9wcm9jZXNzb3JfdW5yZWdpc3Rlcl9wZXJmb3JtYW5jZSgmZGF0YS0+YWNwaV9kYXRhLCBwb2xpY3ktPmNwdSk7CisJCWtmcmVlKGRhdGEpOworCX0KKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK2FjcGlfY3B1ZnJlcV9yZXN1bWUgKAorCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAgICpwb2xpY3kpCit7CisJc3RydWN0IGNwdWZyZXFfYWNwaV9pbyAqZGF0YSA9IGFjcGlfaW9fZGF0YVtwb2xpY3ktPmNwdV07CisKKworCWRwcmludGsoImFjcGlfY3B1ZnJlcV9yZXN1bWVcbiIpOworCisJZGF0YS0+cmVzdW1lID0gMTsKKworCXJldHVybiAoMCk7Cit9CisKKworc3RhdGljIHN0cnVjdCBmcmVxX2F0dHIqIGFjcGlfY3B1ZnJlcV9hdHRyW10gPSB7CisJJmNwdWZyZXFfZnJlcV9hdHRyX3NjYWxpbmdfYXZhaWxhYmxlX2ZyZXFzLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZHJpdmVyIGFjcGlfY3B1ZnJlcV9kcml2ZXIgPSB7CisJLnZlcmlmeSAJPSBhY3BpX2NwdWZyZXFfdmVyaWZ5LAorCS50YXJnZXQgCT0gYWNwaV9jcHVmcmVxX3RhcmdldCwKKwkuaW5pdAkJPSBhY3BpX2NwdWZyZXFfY3B1X2luaXQsCisJLmV4aXQJCT0gYWNwaV9jcHVmcmVxX2NwdV9leGl0LAorCS5yZXN1bWUJCT0gYWNwaV9jcHVmcmVxX3Jlc3VtZSwKKwkubmFtZQkJPSAiYWNwaS1jcHVmcmVxIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmF0dHIgICAgICAgICAgID0gYWNwaV9jcHVmcmVxX2F0dHIsCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0CithY3BpX2NwdWZyZXFfaW5pdCAodm9pZCkKK3sKKwlpbnQgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAwOworCisJZHByaW50aygiYWNwaV9jcHVmcmVxX2luaXRcbiIpOworCisgCXJlc3VsdCA9IGNwdWZyZXFfcmVnaXN0ZXJfZHJpdmVyKCZhY3BpX2NwdWZyZXFfZHJpdmVyKTsKKwkKKwlyZXR1cm4gKHJlc3VsdCk7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0CithY3BpX2NwdWZyZXFfZXhpdCAodm9pZCkKK3sKKwlkcHJpbnRrKCJhY3BpX2NwdWZyZXFfZXhpdFxuIik7CisKKwljcHVmcmVxX3VucmVnaXN0ZXJfZHJpdmVyKCZhY3BpX2NwdWZyZXFfZHJpdmVyKTsKKworCXJldHVybjsKK30KKworCitsYXRlX2luaXRjYWxsKGFjcGlfY3B1ZnJlcV9pbml0KTsKK21vZHVsZV9leGl0KGFjcGlfY3B1ZnJlcV9leGl0KTsKKworTU9EVUxFX0FMSUFTKCJhY3BpIik7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2NwdWZyZXEtbmZvcmNlMi5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9jcHVmcmVxLW5mb3JjZTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGE0MDUzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9jcHVmcmVxLW5mb3JjZTIuYwpAQCAtMCwwICsxLDQ1NyBAQAorLyoKKyAqIChDKSAyMDA0ICBTZWJhc3RpYW4gV2l0dCA8c2Uud2l0dEBnbXgubmV0PgorICoKKyAqICBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgTGljZW5zZSB2ZXJzaW9uIDIuCisgKiAgQmFzZWQgdXBvbiByZXZlcnNlIGVuZ2luZWVyZWQgaW5mb3JtYXRpb24KKyAqCisgKiAgQklHIEZBVCBESVNDTEFJTUVSOiBXb3JrIGluIHByb2dyZXNzIGNvZGUuIFBvc3NpYmx5ICpkYW5nZXJvdXMqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjZGVmaW5lIE5GT1JDRTJfWFRBTCAyNQorI2RlZmluZSBORk9SQ0UyX0JPT1RGU0IgMHg0OAorI2RlZmluZSBORk9SQ0UyX1BMTEVOQUJMRSAweGE4CisjZGVmaW5lIE5GT1JDRTJfUExMUkVHIDB4YTQKKyNkZWZpbmUgTkZPUkNFMl9QTExBRFIgMHhhMAorI2RlZmluZSBORk9SQ0UyX1BMTChtdWwsIGRpdikgKDB4MTAwMDAwIHwgKG11bCA8PCA4KSB8IGRpdikKKworI2RlZmluZSBORk9SQ0UyX01JTl9GU0IgNTAKKyNkZWZpbmUgTkZPUkNFMl9TQUZFX0RJU1RBTkNFIDUwCisKKy8qIERlbGF5IGluIG1zIGJldHdlZW4gRlNCIGNoYW5nZXMgKi8KKy8vI2RlZmluZSBORk9SQ0UyX0RFTEFZIDEwCisKKy8qIG5mb3JjZTJfY2hpcHNldDoKKyAqIEZTQiBpcyBjaGFuZ2VkIHVzaW5nIHRoZSBjaGlwc2V0CisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldiAqbmZvcmNlMl9jaGlwc2V0X2RldjsKKworLyogZmlkOgorICogbXVsdGlwbGllciAqIDEwCisgKi8KK3N0YXRpYyBpbnQgZmlkID0gMDsKKworLyogbWluX2ZzYiwgbWF4X2ZzYjoKKyAqIG1pbmltdW0gYW5kIG1heGltdW0gRlNCICg9IEZTQiBhdCBib290IHRpbWUpIAorICovCitzdGF0aWMgaW50IG1pbl9mc2IgPSAwOworc3RhdGljIGludCBtYXhfZnNiID0gMDsKKworTU9EVUxFX0FVVEhPUigiU2ViYXN0aWFuIFdpdHQgPHNlLndpdHRAZ214Lm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigibkZvcmNlMiBGU0IgY2hhbmdpbmcgY3B1ZnJlcSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtKGZpZCwgaW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbShtaW5fZnNiLCBpbnQsIDA0NDQpOworCitNT0RVTEVfUEFSTV9ERVNDKGZpZCwgIkNQVSBtdWx0aXBsaWVyIHRvIHVzZSAoMTEuNSA9IDExNSkiKTsKK01PRFVMRV9QQVJNX0RFU0MobWluX2ZzYiwKKyAgICAgICAgICAgICAgICAgIk1pbmltdW0gRlNCIHRvIHVzZSwgaWYgbm90IGRlZmluZWQ6IGN1cnJlbnQgRlNCIC0gNTAiKTsKKworI2RlZmluZSBkcHJpbnRrKG1zZy4uLikgY3B1ZnJlcV9kZWJ1Z19wcmludGsoQ1BVRlJFUV9ERUJVR19EUklWRVIsICJjcHVmcmVxLW5mb3JjZTIiLCBtc2cpCisKKy8qCisgKiBuZm9yY2UyX2NhbGNfZnNiIC0gY2FsY3VsYXRlIEZTQgorICogQHBsbDogUExMIHZhbHVlCisgKiAKKyAqICAgQ2FsY3VsYXRlcyBGU0IgZnJvbSBQTEwgdmFsdWUKKyAqLworc3RhdGljIGludCBuZm9yY2UyX2NhbGNfZnNiKGludCBwbGwpCit7CisJdW5zaWduZWQgY2hhciBtdWwsIGRpdjsKKworCW11bCA9IChwbGwgPj4gOCkgJiAweGZmOworCWRpdiA9IHBsbCAmIDB4ZmY7CisKKwlpZiAoZGl2ID4gMCkKKwkJcmV0dXJuIE5GT1JDRTJfWFRBTCAqIG11bCAvIGRpdjsKKworCXJldHVybiAwOworfQorCisvKgorICogbmZvcmNlMl9jYWxjX3BsbCAtIGNhbGN1bGF0ZSBQTEwgdmFsdWUKKyAqIEBmc2I6IEZTQgorICogCisgKiAgIENhbGN1bGF0ZSBQTEwgdmFsdWUgZm9yIGdpdmVuIEZTQgorICovCitzdGF0aWMgaW50IG5mb3JjZTJfY2FsY19wbGwodW5zaWduZWQgaW50IGZzYikKK3sKKwl1bnNpZ25lZCBjaGFyIHhtdWwsIHhkaXY7CisJdW5zaWduZWQgY2hhciBtdWwgPSAwLCBkaXYgPSAwOworCWludCB0cmllZCA9IDA7CisKKwkvKiBUcnkgdG8gY2FsY3VsYXRlIG11bHRpcGxpZXIgYW5kIGRpdmlkZXIgdXAgdG8gNCB0aW1lcyAqLworCXdoaWxlICgoKG11bCA9PSAwKSB8fCAoZGl2ID09IDApKSAmJiAodHJpZWQgPD0gMykpIHsKKwkJZm9yICh4ZGl2ID0gMTsgeGRpdiA8PSAweDgwOyB4ZGl2KyspCisJCQlmb3IgKHhtdWwgPSAxOyB4bXVsIDw9IDB4ZmU7IHhtdWwrKykKKwkJCQlpZiAobmZvcmNlMl9jYWxjX2ZzYihORk9SQ0UyX1BMTCh4bXVsLCB4ZGl2KSkgPT0KKwkJCQkgICAgZnNiICsgdHJpZWQpIHsKKwkJCQkJbXVsID0geG11bDsKKwkJCQkJZGl2ID0geGRpdjsKKwkJCQl9CisJCXRyaWVkKys7CisJfQorCisJaWYgKChtdWwgPT0gMCkgfHwgKGRpdiA9PSAwKSkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIE5GT1JDRTJfUExMKG11bCwgZGl2KTsKK30KKworLyoKKyAqIG5mb3JjZTJfd3JpdGVfcGxsIC0gd3JpdGUgUExMIHZhbHVlIHRvIGNoaXBzZXQKKyAqIEBwbGw6IFBMTCB2YWx1ZQorICogCisgKiAgIFdyaXRlcyBuZXcgRlNCIFBMTCB2YWx1ZSB0byBjaGlwc2V0CisgKi8KK3N0YXRpYyB2b2lkIG5mb3JjZTJfd3JpdGVfcGxsKGludCBwbGwpCit7CisJaW50IHRlbXA7CisKKwkvKiBTZXQgdGhlIHBsbCBhZGRyLiB0byAweDAwICovCisJdGVtcCA9IDB4MDA7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChuZm9yY2UyX2NoaXBzZXRfZGV2LCBORk9SQ0UyX1BMTEFEUiwgdGVtcCk7CisKKwkvKiBOb3cgd3JpdGUgdGhlIHZhbHVlIGluIGFsbCA2NCByZWdpc3RlcnMgKi8KKwlmb3IgKHRlbXAgPSAwOyB0ZW1wIDw9IDB4M2Y7IHRlbXArKykgeworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKG5mb3JjZTJfY2hpcHNldF9kZXYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkZPUkNFMl9QTExSRUcsIHBsbCk7CisJfQorCisJcmV0dXJuOworfQorCisvKgorICogbmZvcmNlMl9mc2JfcmVhZCAtIFJlYWQgRlNCCisgKgorICogICBSZWFkIEZTQiBmcm9tIGNoaXBzZXQKKyAqICAgSWYgYm9vdGZzYiAhPSAwLCByZXR1cm4gRlNCIGF0IGJvb3QtdGltZQorICovCitzdGF0aWMgdW5zaWduZWQgaW50IG5mb3JjZTJfZnNiX3JlYWQoaW50IGJvb3Rmc2IpCit7CisJc3RydWN0IHBjaV9kZXYgKm5mb3JjZTJfc3ViNTsKKwl1MzIgZnNiLCB0ZW1wID0gMDsKKworCQorCS8qIEdldCBjaGlwc2V0IGJvb3QgRlNCIGZyb20gc3ViZGV2aWNlIDUgKEZTQiBhdCBib290LXRpbWUpICovCisJbmZvcmNlMl9zdWI1ID0gcGNpX2dldF9zdWJzeXMoUENJX1ZFTkRPUl9JRF9OVklESUEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFFRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJX0FOWV9JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJX0FOWV9JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisJCisJaWYgKCFuZm9yY2UyX3N1YjUpCisJCXJldHVybiAwOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKG5mb3JjZTJfc3ViNSwgTkZPUkNFMl9CT09URlNCLCAmZnNiKTsKKwlmc2IgLz0gMTAwMDAwMDsKKwkKKwkvKiBDaGVjayBpZiBQTEwgcmVnaXN0ZXIgaXMgYWxyZWFkeSBzZXQgKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShuZm9yY2UyX2NoaXBzZXRfZGV2LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkZPUkNFMl9QTExFTkFCTEUsICh1OCAqKSZ0ZW1wKTsKKwkKKwlpZihib290ZnNiIHx8ICF0ZW1wKQorCQlyZXR1cm4gZnNiOworCQkKKwkvKiBVc2UgUExMIHJlZ2lzdGVyIEZTQiB2YWx1ZSAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChuZm9yY2UyX2NoaXBzZXRfZGV2LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5GT1JDRTJfUExMUkVHLCAmdGVtcCk7CisJZnNiID0gbmZvcmNlMl9jYWxjX2ZzYih0ZW1wKTsKKworCXJldHVybiBmc2I7Cit9CisKKy8qCisgKiBuZm9yY2UyX3NldF9mc2IgLSBzZXQgbmV3IEZTQgorICogQGZzYjogTmV3IEZTQgorICogCisgKiAgIFNldHMgbmV3IEZTQgorICovCitzdGF0aWMgaW50IG5mb3JjZTJfc2V0X2ZzYih1bnNpZ25lZCBpbnQgZnNiKQoreworCXUzMiBwbGwsIHRlbXAgPSAwOworCXVuc2lnbmVkIGludCB0ZnNiOworCWludCBkaWZmOworCisJaWYgKChmc2IgPiBtYXhfZnNiKSB8fCAoZnNiIDwgTkZPUkNFMl9NSU5fRlNCKSkgeworCQlwcmludGsoS0VSTl9FUlIgImNwdWZyZXE6IEZTQiAlZCBpcyBvdXQgb2YgcmFuZ2UhXG4iLCBmc2IpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJCisJdGZzYiA9IG5mb3JjZTJfZnNiX3JlYWQoMCk7CisJaWYgKCF0ZnNiKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY3B1ZnJlcTogRXJyb3Igd2hpbGUgcmVhZGluZyB0aGUgRlNCXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogRmlyc3Qgd3JpdGU/IFRoZW4gc2V0IGFjdHVhbCB2YWx1ZSAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKG5mb3JjZTJfY2hpcHNldF9kZXYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORk9SQ0UyX1BMTEVOQUJMRSwgKHU4ICopJnRlbXApOworCWlmICghdGVtcCkgeworCQlwbGwgPSBuZm9yY2UyX2NhbGNfcGxsKHRmc2IpOworCisJCWlmIChwbGwgPCAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJbmZvcmNlMl93cml0ZV9wbGwocGxsKTsKKwl9CisKKwkvKiBFbmFibGUgd3JpdGUgYWNjZXNzICovCisJdGVtcCA9IDB4MDE7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKG5mb3JjZTJfY2hpcHNldF9kZXYsIE5GT1JDRTJfUExMRU5BQkxFLCAodTgpdGVtcCk7CisKKwlkaWZmID0gdGZzYiAtIGZzYjsKKworCWlmICghZGlmZikKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAoKHRmc2IgIT0gZnNiKSAmJiAodGZzYiA8PSBtYXhfZnNiKSAmJiAodGZzYiA+PSBtaW5fZnNiKSkgeworCQlpZiAoZGlmZiA8IDApCisJCQl0ZnNiKys7CisJCWVsc2UKKwkJCXRmc2ItLTsKKworCQkvKiBDYWxjdWxhdGUgdGhlIFBMTCByZWcuIHZhbHVlICovCisJCWlmICgocGxsID0gbmZvcmNlMl9jYWxjX3BsbCh0ZnNiKSkgPT0gLTEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCisJCW5mb3JjZTJfd3JpdGVfcGxsKHBsbCk7CisjaWZkZWYgTkZPUkNFMl9ERUxBWQorCQltZGVsYXkoTkZPUkNFMl9ERUxBWSk7CisjZW5kaWYKKwl9CisKKwl0ZW1wID0gMHg0MDsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUobmZvcmNlMl9jaGlwc2V0X2RldiwgTkZPUkNFMl9QTExBRFIsICh1OCl0ZW1wKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIG5mb3JjZTJfZ2V0IC0gZ2V0IHRoZSBDUFUgZnJlcXVlbmN5CisgKiBAY3B1OiBDUFUgbnVtYmVyCisgKiAKKyAqIFJldHVybnMgdGhlIENQVSBmcmVxdWVuY3kKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBuZm9yY2UyX2dldCh1bnNpZ25lZCBpbnQgY3B1KQoreworCWlmIChjcHUpCisJCXJldHVybiAwOworCXJldHVybiBuZm9yY2UyX2ZzYl9yZWFkKDApICogZmlkICogMTAwOworfQorCisvKioKKyAqIG5mb3JjZTJfdGFyZ2V0IC0gc2V0IGEgbmV3IENQVUZyZXEgcG9saWN5CisgKiBAcG9saWN5OiBuZXcgcG9saWN5CisgKiBAdGFyZ2V0X2ZyZXE6IHRoZSB0YXJnZXQgZnJlcXVlbmN5CisgKiBAcmVsYXRpb246IGhvdyB0aGF0IGZyZXF1ZW5jeSByZWxhdGVzIHRvIGFjaGlldmVkIGZyZXF1ZW5jeSAoQ1BVRlJFUV9SRUxBVElPTl9MIG9yIENQVUZSRVFfUkVMQVRJT05fSCkKKyAqCisgKiBTZXRzIGEgbmV3IENQVUZyZXEgcG9saWN5LgorICovCitzdGF0aWMgaW50IG5mb3JjZTJfdGFyZ2V0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAorCQkJICB1bnNpZ25lZCBpbnQgdGFyZ2V0X2ZyZXEsIHVuc2lnbmVkIGludCByZWxhdGlvbikKK3sKKy8vICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgZmxhZ3M7CisJc3RydWN0IGNwdWZyZXFfZnJlcXMgZnJlcXM7CisJdW5zaWduZWQgaW50IHRhcmdldF9mc2I7CisKKwlpZiAoKHRhcmdldF9mcmVxID4gcG9saWN5LT5tYXgpIHx8ICh0YXJnZXRfZnJlcSA8IHBvbGljeS0+bWluKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0YXJnZXRfZnNiID0gdGFyZ2V0X2ZyZXEgLyAoZmlkICogMTAwKTsKKworCWZyZXFzLm9sZCA9IG5mb3JjZTJfZ2V0KHBvbGljeS0+Y3B1KTsKKwlmcmVxcy5uZXcgPSB0YXJnZXRfZnNiICogZmlkICogMTAwOworCWZyZXFzLmNwdSA9IDA7CQkvKiBPbmx5IG9uZSBDUFUgb24gbkZvcmNlMiBwbGF0dGZvcm1zICovCisKKwlpZiAoZnJlcXMub2xkID09IGZyZXFzLm5ldykKKwkJcmV0dXJuIDA7CisKKwlkcHJpbnRrKEtFUk5fSU5GTyAiY3B1ZnJlcTogT2xkIENQVSBmcmVxdWVuY3kgJWQga0h6LCBuZXcgJWQga0h6XG4iLAorCSAgICAgICBmcmVxcy5vbGQsIGZyZXFzLm5ldyk7CisKKwljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QUkVDSEFOR0UpOworCisJLyogRGlzYWJsZSBJUlFzICovCisJLy9sb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlpZiAobmZvcmNlMl9zZXRfZnNiKHRhcmdldF9mc2IpIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJjcHVmcmVxOiBDaGFuZ2luZyBGU0IgdG8gJWQgZmFpbGVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfZnNiKTsKKwllbHNlCisJCWRwcmludGsoS0VSTl9JTkZPICJjcHVmcmVxOiBDaGFuZ2VkIEZTQiBzdWNjZXNzZnVsbHkgdG8gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9mc2IpOworCisJLyogRW5hYmxlIElSUXMgKi8KKwkvL2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbmZvcmNlMl92ZXJpZnkgLSB2ZXJpZmllcyBhIG5ldyBDUFVGcmVxIHBvbGljeQorICogQHBvbGljeTogbmV3IHBvbGljeQorICovCitzdGF0aWMgaW50IG5mb3JjZTJfdmVyaWZ5KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXVuc2lnbmVkIGludCBmc2JfcG9sX21heDsKKworCWZzYl9wb2xfbWF4ID0gcG9saWN5LT5tYXggLyAoZmlkICogMTAwKTsKKworCWlmIChwb2xpY3ktPm1pbiA8IChmc2JfcG9sX21heCAqIGZpZCAqIDEwMCkpCisJCXBvbGljeS0+bWF4ID0gKGZzYl9wb2xfbWF4ICsgMSkgKiBmaWQgKiAxMDA7CisKKwljcHVmcmVxX3ZlcmlmeV93aXRoaW5fbGltaXRzKHBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3ktPmNwdWluZm8ubWluX2ZyZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5LT5jcHVpbmZvLm1heF9mcmVxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZm9yY2UyX2NwdV9pbml0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXVuc2lnbmVkIGludCBmc2I7CisJdW5zaWduZWQgaW50IHJmaWQ7CisKKwkvKiBjYXBhYmlsaXR5IGNoZWNrICovCisJaWYgKHBvbGljeS0+Y3B1ICE9IDApCisJCXJldHVybiAtRU5PREVWOworCisJLyogR2V0IGN1cnJlbnQgRlNCICovCisJZnNiID0gbmZvcmNlMl9mc2JfcmVhZCgwKTsKKworCWlmICghZnNiKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIEZJWDogR2V0IEZJRCBmcm9tIENQVSAqLworCWlmICghZmlkKSB7CisJCWlmICghY3B1X2toeikgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJjcHVmcmVxOiBjcHVfa2h6IG5vdCBzZXQsIGNhbid0IGNhbGN1bGF0ZSBtdWx0aXBsaWVyIVxuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCisJCWZpZCA9IGNwdV9raHogLyAoZnNiICogMTAwKTsKKwkJcmZpZCA9IGZpZCAlIDU7CisKKwkJaWYgKHJmaWQpIHsKKwkJCWlmIChyZmlkID4gMikKKwkJCQlmaWQgKz0gNSAtIHJmaWQ7CisJCQllbHNlCisJCQkJZmlkIC09IHJmaWQ7CisJCX0KKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJjcHVmcmVxOiBGU0IgY3VycmVudGx5IGF0ICVpIE1IeiwgRklEICVkLiVkXG4iLCBmc2IsCisJICAgICAgIGZpZCAvIDEwLCBmaWQgJSAxMCk7CisJCisJLyogU2V0IG1heGltdW0gRlNCIHRvIEZTQiBhdCBib290IHRpbWUgKi8KKwltYXhfZnNiID0gbmZvcmNlMl9mc2JfcmVhZCgxKTsKKwkKKwlpZighbWF4X2ZzYikKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoIW1pbl9mc2IpCisJCW1pbl9mc2IgPSBtYXhfZnNiIC0gTkZPUkNFMl9TQUZFX0RJU1RBTkNFOworCisJaWYgKG1pbl9mc2IgPCBORk9SQ0UyX01JTl9GU0IpCisJCW1pbl9mc2IgPSBORk9SQ0UyX01JTl9GU0I7CisKKwkvKiBjcHVpbmZvIGFuZCBkZWZhdWx0IHBvbGljeSB2YWx1ZXMgKi8KKwlwb2xpY3ktPmNwdWluZm8ubWluX2ZyZXEgPSBtaW5fZnNiICogZmlkICogMTAwOworCXBvbGljeS0+Y3B1aW5mby5tYXhfZnJlcSA9IG1heF9mc2IgKiBmaWQgKiAxMDA7CisJcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9IENQVUZSRVFfRVRFUk5BTDsKKwlwb2xpY3ktPmN1ciA9IG5mb3JjZTJfZ2V0KHBvbGljeS0+Y3B1KTsKKwlwb2xpY3ktPm1pbiA9IHBvbGljeS0+Y3B1aW5mby5taW5fZnJlcTsKKwlwb2xpY3ktPm1heCA9IHBvbGljeS0+Y3B1aW5mby5tYXhfZnJlcTsKKwlwb2xpY3ktPmdvdmVybm9yID0gQ1BVRlJFUV9ERUZBVUxUX0dPVkVSTk9SOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmZvcmNlMl9jcHVfZXhpdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBuZm9yY2UyX2RyaXZlciA9IHsKKwkubmFtZSA9ICJuZm9yY2UyIiwKKwkudmVyaWZ5ID0gbmZvcmNlMl92ZXJpZnksCisJLnRhcmdldCA9IG5mb3JjZTJfdGFyZ2V0LAorCS5nZXQgPSBuZm9yY2UyX2dldCwKKwkuaW5pdCA9IG5mb3JjZTJfY3B1X2luaXQsCisJLmV4aXQgPSBuZm9yY2UyX2NwdV9leGl0LAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorfTsKKworLyoqCisgKiBuZm9yY2UyX2RldGVjdF9jaGlwc2V0IC0gZGV0ZWN0IHRoZSBTb3V0aGJyaWRnZSB3aGljaCBjb250YWlucyBGU0IgUExMIGxvZ2ljCisgKgorICogRGV0ZWN0cyBuRm9yY2UyIEEyIGFuZCBDMSBzdGVwcGluZworICogCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmZvcmNlMl9kZXRlY3RfY2hpcHNldCh2b2lkKQoreworCXU4IHJldmlzaW9uOworCisJbmZvcmNlMl9jaGlwc2V0X2RldiA9IHBjaV9nZXRfc3Vic3lzKFBDSV9WRU5ET1JfSURfTlZJRElBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9BTllfSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfQU5ZX0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKwlpZiAobmZvcmNlMl9jaGlwc2V0X2RldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKG5mb3JjZTJfY2hpcHNldF9kZXYsIFBDSV9SRVZJU0lPTl9JRCwgJnJldmlzaW9uKTsKKworCXByaW50ayhLRVJOX0lORk8gImNwdWZyZXE6IERldGVjdGVkIG5Gb3JjZTIgY2hpcHNldCByZXZpc2lvbiAlWFxuIiwKKwkgICAgICAgcmV2aXNpb24pOworCXByaW50ayhLRVJOX0lORk8KKwkgICAgICAgImNwdWZyZXE6IEZTQiBjaGFuZ2luZyBpcyBtYXliZSB1bnN0YWJsZSBhbmQgY2FuIGxlYWQgdG8gY3Jhc2hlcyBhbmQgZGF0YSBsb3NzLlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBuZm9yY2UyX2luaXQgLSBpbml0aWFsaXplcyB0aGUgbkZvcmNlMiBDUFVGcmVxIGRyaXZlcgorICoKKyAqIEluaXRpYWxpemVzIHRoZSBuRm9yY2UyIEZTQiBzdXBwb3J0LiBSZXR1cm5zIC1FTk9ERVYgb24gdW5zdXBwb3J0ZWQKKyAqIGRldmljZXMsIC1FSU5WQUwgb24gcHJvYmxlbXMgZHVyaW5nIGluaXRpYXRpemF0aW9uLCBhbmQgemVybyBvbgorICogc3VjY2Vzcy4KKyAqLworc3RhdGljIGludCBfX2luaXQgbmZvcmNlMl9pbml0KHZvaWQpCit7CisJLyogVE9ETzogZG8gd2UgbmVlZCB0byBkZXRlY3QgdGhlIHByb2Nlc3Nvcj8gKi8KKworCS8qIGRldGVjdCBjaGlwc2V0ICovCisJaWYgKG5mb3JjZTJfZGV0ZWN0X2NoaXBzZXQoKSkgeworCQlwcmludGsoS0VSTl9FUlIgImNwdWZyZXE6IE5vIG5Gb3JjZTIgY2hpcHNldC5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJm5mb3JjZTJfZHJpdmVyKTsKK30KKworLyoqCisgKiBuZm9yY2UyX2V4aXQgLSB1bnJlZ2lzdGVycyBjcHVmcmVxIG1vZHVsZQorICoKKyAqICAgVW5yZWdpc3RlcnMgbkZvcmNlMiBGU0IgY2hhbmdlIHN1cHBvcnQuCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBuZm9yY2UyX2V4aXQodm9pZCkKK3sKKwljcHVmcmVxX3VucmVnaXN0ZXJfZHJpdmVyKCZuZm9yY2UyX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG5mb3JjZTJfaW5pdCk7Cittb2R1bGVfZXhpdChuZm9yY2UyX2V4aXQpOworCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2VsYW5mcmVxLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2VsYW5mcmVxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y3Y2FhNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvZWxhbmZyZXEuYwpAQCAtMCwwICsxLDMxMiBAQAorLyoKKyAqIAllbGFuZnJlcTogCWNwdWZyZXEgZHJpdmVyIGZvciB0aGUgQU1EIEVMQU4gZmFtaWx5CisgKgorICoJKGMpIENvcHlyaWdodCAyMDAyIFJvYmVydCBTY2h3ZWJlbCA8ci5zY2h3ZWJlbEBwZW5ndXRyb25peC5kZT4KKyAqCisgKglQYXJ0cyBvZiB0aGlzIGNvZGUgYXJlIChjKSBTdmVuIEdlZ2d1cyA8c3ZlbkBnZWdndXMubmV0PiAKKyAqCisgKiAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIAorICoKKyAqCTIwMDItMDItMTM6IC0gaW5pdGlhbCByZXZpc2lvbiBmb3IgMi40LjE4LXByZTkgYnkgUm9iZXJ0IFNjaHdlYmVsCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisKKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSA8YXNtL3RpbWV4Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNkZWZpbmUgUkVHX0NTQ0lSIDB4MjIgCQkvKiBDaGlwIFNldHVwIGFuZCBDb250cm9sIEluZGV4IFJlZ2lzdGVyICAgICovCisjZGVmaW5lIFJFR19DU0NEUiAweDIzCQkvKiBDaGlwIFNldHVwIGFuZCBDb250cm9sIERhdGEgIFJlZ2lzdGVyICAgICovCisKKy8qIE1vZHVsZSBwYXJhbWV0ZXIgKi8KK3N0YXRpYyBpbnQgbWF4X2ZyZXE7CisKK3N0cnVjdCBzX2VsYW5fbXVsdGlwbGllciB7CisJaW50IGNsb2NrOwkJLyogZnJlcXVlbmN5IGluIGtIeiAgICAgICAgICAgICAgICAgICAgICAgICAqLworCWludCB2YWw0MGg7CQkvKiBQTVUgRm9yY2UgTW9kZSByZWdpc3RlciAgICAgICAgICAgICAgICAgICovCisJaW50IHZhbDgwaDsJCS8qIENQVSBDbG9jayBTcGVlZCBSZWdpc3RlciAgICAgICAgICAgICAgICAgKi8KK307CisKKy8qCisgKiBJdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGUgZnJlcXVlbmNpZXMgCisgKiBhcmUgbGlzdGVkIGluIGFzY2VuZGluZyBvcmRlciBoZXJlIQorICovCitzdHJ1Y3Qgc19lbGFuX211bHRpcGxpZXIgZWxhbl9tdWx0aXBsaWVyW10gPSB7CisJezEwMDAsCTB4MDIsCTB4MTh9LAorCXsyMDAwLAkweDAyLAkweDEwfSwKKwl7NDAwMCwJMHgwMiwJMHgwOH0sCisJezgwMDAsCTB4MDAsCTB4MDB9LAorCXsxNjAwMCwJMHgwMCwJMHgwMn0sCisJezMzMDAwLAkweDAwLAkweDA0fSwKKwl7NjYwMDAsCTB4MDEsCTB4MDR9LAorCXs5OTAwMCwJMHgwMSwJMHgwNX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgZWxhbmZyZXFfdGFibGVbXSA9IHsKKwl7MCwJMTAwMH0sCisJezEsCTIwMDB9LAorCXsyLAk0MDAwfSwKKwl7MywJODAwMH0sCisJezQsCTE2MDAwfSwKKwl7NSwJMzMwMDB9LAorCXs2LAk2NjAwMH0sCisJezcsCTk5MDAwfSwKKwl7MCwJQ1BVRlJFUV9UQUJMRV9FTkR9LAorfTsKKworCisvKioKKyAqCWVsYW5mcmVxX2dldF9jcHVfZnJlcXVlbmN5OiBkZXRlcm1pbmUgY3VycmVudCBjcHUgc3BlZWQKKyAqCisgKglGaW5kcyBvdXQgYXQgd2hpY2ggZnJlcXVlbmN5IHRoZSBDUFUgb2YgdGhlIEVsYW4gU09DIHJ1bnMKKyAqCWF0IHRoZSBtb21lbnQuIEZyZXF1ZW5jaWVzIGZyb20gMSB0byAzMyBNSHogYXJlIGdlbmVyYXRlZCAKKyAqCXRoZSBub3JtYWwgd2F5LCA2NiBhbmQgOTkgTUh6IGFyZSBjYWxsZWQgIkh5cGVyc3BlZWQgTW9kZSIKKyAqCWFuZCBoYXZlIHRoZSByZXN0IG9mIHRoZSBjaGlwIHJ1bm5pbmcgd2l0aCAzMyBNSHouIAorICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZWxhbmZyZXFfZ2V0X2NwdV9mcmVxdWVuY3kodW5zaWduZWQgaW50IGNwdSkKK3sKKyAgICAgICAgdTggY2xvY2tzcGVlZF9yZWc7ICAgIC8qIENsb2NrIFNwZWVkIFJlZ2lzdGVyICovCisJCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKyAgICAgICAgb3V0Yl9wKDB4ODAsUkVHX0NTQ0lSKTsKKyAgICAgICAgY2xvY2tzcGVlZF9yZWcgPSBpbmJfcChSRUdfQ1NDRFIpOworCWxvY2FsX2lycV9lbmFibGUoKTsKKworICAgICAgICBpZiAoKGNsb2Nrc3BlZWRfcmVnICYgMHhFMCkgPT0gMHhFMCkgeyByZXR1cm4gMDsgfQorCisgICAgICAgIC8qIEFyZSB3ZSBpbiBDUFUgY2xvY2sgbXVsdGlwbGllZCBtb2RlICg2Ni85OSBNSHopPyAqLworICAgICAgICBpZiAoKGNsb2Nrc3BlZWRfcmVnICYgMHhFMCkgPT0gMHhDMCkgeworICAgICAgICAgICAgICAgIGlmICgoY2xvY2tzcGVlZF9yZWcgJiAweDAxKSA9PSAwKSB7CisJCQlyZXR1cm4gNjYwMDA7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gOTkwMDA7ICAgICAgICAgICAgIAorCQl9CisgICAgICAgIH0KKworCS8qIDMzIE1IeiBpcyBub3QgMzIgTUh6Li4uICovCisJaWYgKChjbG9ja3NwZWVkX3JlZyAmIDB4RTApPT0weEEwKQorCQlyZXR1cm4gMzMwMDA7CisKKyAgICAgICAgcmV0dXJuICgoMTw8KChjbG9ja3NwZWVkX3JlZyAmIDB4RTApID4+IDUpKSAqIDEwMDApOworfQorCisKKy8qKgorICogICAgICBlbGFuZnJlcV9zZXRfY3B1X2ZyZXF1ZW5jeTogQ2hhbmdlIHRoZSBDUFUgY29yZSBmcmVxdWVuY3kKKyAqIAlAY3B1OiBjcHUgbnVtYmVyCisgKglAZnJlcTogZnJlcXVlbmN5IGluIGtIegorICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhIGZyZXF1ZW5jeSB2YWx1ZSBhbmQgY2hhbmdlcyB0aGUgQ1BVIGZyZXF1ZW5jeSAKKyAqCWFjY29yZGluZyB0byB0aGlzLiBOb3RlIHRoYXQgdGhlIGZyZXF1ZW5jeSBoYXMgdG8gYmUgY2hlY2tlZCBieQorICoJZWxhbmZyZXFfdmFsaWRhdGVzcGVlZCgpIGZvciBjb3JyZWN0bmVzcyEKKyAqCQorICoJVGhlcmUgaXMgbm8gcmV0dXJuIHZhbHVlLiAKKyAqLworCitzdGF0aWMgdm9pZCBlbGFuZnJlcV9zZXRfY3B1X3N0YXRlICh1bnNpZ25lZCBpbnQgc3RhdGUpIHsKKworCXN0cnVjdCBjcHVmcmVxX2ZyZXFzICAgIGZyZXFzOworCisJZnJlcXMub2xkID0gZWxhbmZyZXFfZ2V0X2NwdV9mcmVxdWVuY3koMCk7CisJZnJlcXMubmV3ID0gZWxhbl9tdWx0aXBsaWVyW3N0YXRlXS5jbG9jazsKKwlmcmVxcy5jcHUgPSAwOyAvKiBlbGFuZnJlcS5jIGlzIFVQIG9ubHkgZHJpdmVyICovCisJCisJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUFJFQ0hBTkdFKTsKKworCXByaW50ayhLRVJOX0lORk8gImVsYW5mcmVxOiBhdHRlbXB0aW5nIHRvIHNldCBmcmVxdWVuY3kgdG8gJWkga0h6XG4iLGVsYW5fbXVsdGlwbGllcltzdGF0ZV0uY2xvY2spOworCisKKwkvKiAKKwkgKiBBY2Nlc3MgdG8gdGhlIEVsYW4ncyBpbnRlcm5hbCByZWdpc3RlcnMgaXMgaW5kZXhlZCB2aWEgICAgCisJICogMHgyMjogQ2hpcCBTZXR1cCAmIENvbnRyb2wgUmVnaXN0ZXIgSW5kZXggUmVnaXN0ZXIgKENTQ0kpIAorCSAqIDB4MjM6IENoaXAgU2V0dXAgJiBDb250cm9sIFJlZ2lzdGVyIERhdGEgIFJlZ2lzdGVyIChDU0NEKSAKKwkgKgorCSAqLworCisJLyogCisJICogMHg0MCBpcyB0aGUgUG93ZXIgTWFuYWdlbWVudCBVbml0J3MgRm9yY2UgTW9kZSBSZWdpc3Rlci4gCisJICogQml0IDYgZW5hYmxlcyBIeXBlcnNwZWVkIE1vZGUgKDY2LzEwMCBNSHogY29yZSBmcmVxdWVuY3kpCisJICovCisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCW91dGJfcCgweDQwLFJFR19DU0NJUik7IAkvKiBEaXNhYmxlIGh5cGVyc3BlZWQgbW9kZSAgICAgICAgICAqLworCW91dGJfcCgweDAwLFJFR19DU0NEUik7CisJbG9jYWxfaXJxX2VuYWJsZSgpOwkJLyogd2FpdCB0aWxsIGludGVybmFsIHBpcGVsaW5lcyBhbmQgKi8KKwl1ZGVsYXkoMTAwMCk7CQkJLyogYnVmZmVycyBoYXZlIGNsZWFuZWQgdXAgICAgICAgICAgKi8KKworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisKKwkvKiBub3csIHNldCB0aGUgQ1BVIGNsb2NrIHNwZWVkIHJlZ2lzdGVyICgweDgwKSAqLworCW91dGJfcCgweDgwLFJFR19DU0NJUik7CisJb3V0Yl9wKGVsYW5fbXVsdGlwbGllcltzdGF0ZV0udmFsODBoLFJFR19DU0NEUik7CisKKwkvKiBub3csIHRoZSBoeXBlcnNwZWVkIGJpdCBpbiBQTVUgRm9yY2UgTW9kZSBSZWdpc3RlciAoMHg0MCkgKi8KKwlvdXRiX3AoMHg0MCxSRUdfQ1NDSVIpOworCW91dGJfcChlbGFuX211bHRpcGxpZXJbc3RhdGVdLnZhbDQwaCxSRUdfQ1NDRFIpOworCXVkZWxheSgxMDAwMCk7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7Cit9OworCisKKy8qKgorICoJZWxhbmZyZXFfdmFsaWRhdGVzcGVlZDogdGVzdCBpZiBmcmVxdWVuY3kgcmFuZ2UgaXMgdmFsaWQKKyAqICAgICAgQHBvbGljeTogdGhlIHBvbGljeSB0byB2YWxpZGF0ZQorICoKKyAqCVRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIGEgZ2l2ZW4gZnJlcXVlbmN5IHJhbmdlIGluIGtIeiBpcyB2YWxpZCAKKyAqICAgICAgZm9yIHRoZSBoYXJkd2FyZSBzdXBwb3J0ZWQgYnkgdGhlIGRyaXZlci4gCisgKi8KKworc3RhdGljIGludCBlbGFuZnJlcV92ZXJpZnkgKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXJldHVybiBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV92ZXJpZnkocG9saWN5LCAmZWxhbmZyZXFfdGFibGVbMF0pOworfQorCitzdGF0aWMgaW50IGVsYW5mcmVxX3RhcmdldCAoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksIAorCQkJICAgIHVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwgCisJCQkgICAgdW5zaWduZWQgaW50IHJlbGF0aW9uKQoreworCXVuc2lnbmVkIGludCAgICBuZXdzdGF0ZSA9IDA7CisKKwlpZiAoY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdGFyZ2V0KHBvbGljeSwgJmVsYW5mcmVxX3RhYmxlWzBdLCB0YXJnZXRfZnJlcSwgcmVsYXRpb24sICZuZXdzdGF0ZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJZWxhbmZyZXFfc2V0X2NwdV9zdGF0ZShuZXdzdGF0ZSk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICoJTW9kdWxlIGluaXQgYW5kIGV4aXQgY29kZQorICovCisKK3N0YXRpYyBpbnQgZWxhbmZyZXFfY3B1X2luaXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJc3RydWN0IGNwdWluZm9feDg2ICpjID0gY3B1X2RhdGE7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJlc3VsdDsKKworCS8qIGNhcGFiaWxpdHkgY2hlY2sgKi8KKwlpZiAoKGMtPng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9BTUQpIHx8CisJICAgIChjLT54ODYgIT0gNCkgfHwgKGMtPng4Nl9tb2RlbCE9MTApKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIG1heCBmcmVxICovCisJaWYgKCFtYXhfZnJlcSkKKwkJbWF4X2ZyZXEgPSBlbGFuZnJlcV9nZXRfY3B1X2ZyZXF1ZW5jeSgwKTsKKworCS8qIHRhYmxlIGluaXQgKi8KKyAJZm9yIChpPTA7IChlbGFuZnJlcV90YWJsZVtpXS5mcmVxdWVuY3kgIT0gQ1BVRlJFUV9UQUJMRV9FTkQpOyBpKyspIHsKKwkJaWYgKGVsYW5mcmVxX3RhYmxlW2ldLmZyZXF1ZW5jeSA+IG1heF9mcmVxKQorCQkJZWxhbmZyZXFfdGFibGVbaV0uZnJlcXVlbmN5ID0gQ1BVRlJFUV9FTlRSWV9JTlZBTElEOworCX0KKworCS8qIGNwdWluZm8gYW5kIGRlZmF1bHQgcG9saWN5IHZhbHVlcyAqLworCXBvbGljeS0+Z292ZXJub3IgPSBDUFVGUkVRX0RFRkFVTFRfR09WRVJOT1I7CisJcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9IENQVUZSRVFfRVRFUk5BTDsKKwlwb2xpY3ktPmN1ciA9IGVsYW5mcmVxX2dldF9jcHVfZnJlcXVlbmN5KDApOworCisJcmVzdWx0ID0gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfY3B1aW5mbyhwb2xpY3ksIGVsYW5mcmVxX3RhYmxlKTsKKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gKHJlc3VsdCk7CisKKyAgICAgICAgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfZ2V0X2F0dHIoZWxhbmZyZXFfdGFibGUsIHBvbGljeS0+Y3B1KTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZWxhbmZyZXFfY3B1X2V4aXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfcHV0X2F0dHIocG9saWN5LT5jcHUpOworCXJldHVybiAwOworfQorCisKKyNpZm5kZWYgTU9EVUxFCisvKioKKyAqIGVsYW5mcmVxX3NldHVwIC0gZWxhbmZyZXEgY29tbWFuZCBsaW5lIHBhcmFtZXRlciBwYXJzaW5nCisgKgorICogZWxhbmZyZXEgY29tbWFuZCBsaW5lIHBhcmFtZXRlci4gIFVzZToKKyAqICBlbGFuZnJlcT02NjAwMAorICogdG8gc2V0IHRoZSBtYXhpbXVtIENQVSBmcmVxdWVuY3kgdG8gNjYgTUh6LiBOb3RlIHRoYXQgaW4KKyAqIGNhc2UgeW91IGRvIG5vdCBnaXZlIHRoaXMgYm9vdCBwYXJhbWV0ZXIsIHRoZSBtYXhpbXVtCisgKiBmcmVxdWVuY3kgd2lsbCBmYWxsIGJhY2sgdG8gX2N1cnJlbnRfIENQVSBmcmVxdWVuY3kgd2hpY2gKKyAqIG1pZ2h0IGJlIGxvd2VyLiBJZiB5b3UgYnVpbGQgdGhpcyBhcyBhIG1vZHVsZSwgdXNlIHRoZQorICogbWF4X2ZyZXEgbW9kdWxlIHBhcmFtZXRlciBpbnN0ZWFkLgorICovCitzdGF0aWMgaW50IF9faW5pdCBlbGFuZnJlcV9zZXR1cChjaGFyICpzdHIpCit7CisJbWF4X2ZyZXEgPSBzaW1wbGVfc3RydG91bChzdHIsICZzdHIsIDApOworCXByaW50ayhLRVJOX1dBUk5JTkcgIllvdSdyZSB1c2luZyB0aGUgZGVwcmVjYXRlZCBlbGFuZnJlcSBjb21tYW5kIGxpbmUgb3B0aW9uLiBVc2UgZWxhbmZyZXEubWF4X2ZyZXEgaW5zdGVhZCwgcGxlYXNlIVxuIik7CisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJlbGFuZnJlcT0iLCBlbGFuZnJlcV9zZXR1cCk7CisjZW5kaWYKKworCitzdGF0aWMgc3RydWN0IGZyZXFfYXR0ciogZWxhbmZyZXFfYXR0cltdID0geworCSZjcHVmcmVxX2ZyZXFfYXR0cl9zY2FsaW5nX2F2YWlsYWJsZV9mcmVxcywKKwlOVUxMLAorfTsKKworCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZHJpdmVyIGVsYW5mcmVxX2RyaXZlciA9IHsKKwkuZ2V0CSAJPSBlbGFuZnJlcV9nZXRfY3B1X2ZyZXF1ZW5jeSwKKwkudmVyaWZ5IAk9IGVsYW5mcmVxX3ZlcmlmeSwKKwkudGFyZ2V0IAk9IGVsYW5mcmVxX3RhcmdldCwKKwkuaW5pdAkJPSBlbGFuZnJlcV9jcHVfaW5pdCwKKwkuZXhpdAkJPSBlbGFuZnJlcV9jcHVfZXhpdCwKKwkubmFtZQkJPSAiZWxhbmZyZXEiLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuYXR0cgkJPSBlbGFuZnJlcV9hdHRyLAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBlbGFuZnJlcV9pbml0KHZvaWQpIAorewkKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSBjcHVfZGF0YTsKKworCS8qIFRlc3QgaWYgd2UgaGF2ZSB0aGUgcmlnaHQgaGFyZHdhcmUgKi8KKwlpZiAoKGMtPng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9BTUQpIHx8CisJCShjLT54ODYgIT0gNCkgfHwgKGMtPng4Nl9tb2RlbCE9MTApKQorCXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZWxhbmZyZXE6IGVycm9yOiBubyBFbGFuIHByb2Nlc3NvciBmb3VuZCFcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOworCX0KKwkKKwlyZXR1cm4gY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJmVsYW5mcmVxX2RyaXZlcik7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IGVsYW5mcmVxX2V4aXQodm9pZCkgCit7CisJY3B1ZnJlcV91bnJlZ2lzdGVyX2RyaXZlcigmZWxhbmZyZXFfZHJpdmVyKTsKK30KKworCittb2R1bGVfcGFyYW0gKG1heF9mcmVxLCBpbnQsIDA0NDQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJSb2JlcnQgU2Nod2ViZWwgPHIuc2Nod2ViZWxAcGVuZ3V0cm9uaXguZGU+LCBTdmVuIEdlZ2d1cyA8c3ZlbkBnZWdndXMubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJjcHVmcmVxIGRyaXZlciBmb3IgQU1EJ3MgRWxhbiBDUFVzIik7CisKK21vZHVsZV9pbml0KGVsYW5mcmVxX2luaXQpOworbW9kdWxlX2V4aXQoZWxhbmZyZXFfZXhpdCk7CisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvZ3gtc3VzcG1vZC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9neC1zdXNwbW9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE0OWFkYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvZ3gtc3VzcG1vZC5jCkBAIC0wLDAgKzEsNTAyIEBACisvKgorICoJQ3lyaXggTWVkaWFHWCBhbmQgTmF0U2VtaSBHZW9kZSBTdXNwZW5kIE1vZHVsYXRpb24KKyAqCShDKSAyMDAyIFp3YW5lIE13YWlrYW1ibyA8endhbmVAY29tbWZpcmVzZXJ2aWNlcy5jb20+CisgKgkoQykgMjAwMiBIaXJvc2hpIE1pdXJhICAgPG1pdXJhQGRhLWNoYS5vcmc+CisgKglBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gCisgKgorICogICAgICBUaGUgYXV0aG9yKHMpIG9mIHRoaXMgc29mdHdhcmUgc2hhbGwgbm90IGJlIGhlbGQgbGlhYmxlIGZvciBkYW1hZ2VzCisgKiAgICAgIG9mIGFueSBuYXR1cmUgcmVzdWx0aW5nIGR1ZSB0byB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuIFRoaXMKKyAqICAgICAgc29mdHdhcmUgaXMgcHJvdmlkZWQgQVMtSVMgd2l0aCBubyB3YXJyYW50aWVzLgorICoJCisgKiBUaGVvcml0aWNhbCBub3RlOgorICoKKyAqCShzZWUgR2VvZGUodG0pIENTNTUzMCBtYW51YWwgKHJldi40LjEpIHBhZ2UuNTYpCisgKgorICoJQ1BVIGZyZXF1ZW5jeSBjb250cm9sIG9uIE5hdFNlbWkgR2VvZGUgR1gxL0dYTFYgcHJvY2Vzc29yIGFuZCBDUzU1eDAKKyAqCWFyZSBiYXNlZCBvbiBTdXNwZW5kIE1vZHVyYXRpb24uCisgKgorICoJU3VzcGVuZCBNb2R1bGF0aW9uIHdvcmtzIGJ5IGFzc2VydGluZyBhbmQgZGUtYXNzZXJ0aW5nIHRoZSBTVVNQIyBwaW4KKyAqCXRvIENQVShHWDEvR1hMVikgZm9yIGNvbmZpZ3VyYWJsZSBkdXJhdGlvbnMuIFdoZW4gYXNzZXJ0aW5nIFNVU1AjCisgKgl0aGUgQ1BVIGVudGVycyBhbiBpZGxlIHN0YXRlLiBHWDEgc3RvcHMgaXRzIGNvcmUgY2xvY2sgd2hlbiBTVVNQIyBpcyAKKyAqCWFzc2VydGVkIHRoZW4gcG93ZXIgY29uc3VtcHRpb24gaXMgcmVkdWNlZC4KKyAqCisgKglTdXNwZW5kIE1vZHVsYXRpb24ncyBPRkYvT04gZHVyYXRpb24gYXJlIGNvbmZpZ3VyYWJsZSAKKyAqCXdpdGggJ1N1c3BlbmQgTW9kdWxhdGlvbiBPRkYgQ291bnQgUmVnaXN0ZXInCisgKglhbmQgJ1N1c3BlbmQgTW9kdWxhdGlvbiBPTiBDb3VudCBSZWdpc3RlcicuCisgKglUaGVzZSByZWdpc3RlcnMgYXJlIDhiaXQgY291bnRlcnMgdGhhdCByZXByZXNlbnQgdGhlIG51bWJlciBvZiAKKyAqCTMydXMgaW50ZXJ2YWxzIHdoaWNoIHRoZSBTVVNQIyBwaW4gaXMgYXNzZXJ0ZWQoT04pL2RlLWFzc2VydGVkKE9GRikKKyAqCXRvIHRoZSBwcm9jZXNzb3IuCisgKgorICoJVGhlc2UgY291bnRlcnMgZGVmaW5lIGEgcmF0aW8gd2hpY2ggaXMgdGhlIGVmZmVjdGl2ZSBmcmVxdWVuY3kgCisgKiAJb2Ygb3BlcmF0aW9uIG9mIHRoZSBzeXN0ZW0uCisgKgorICoJCQkgICAgICAgT0ZGIENvdW50CisgKglGX2VmZiA9IEZneCAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCSAgICAgICAgICAgICAgICBPRkYgQ291bnQgKyBPTiBDb3VudAorICoKKyAqCTAgPD0gT24gQ291bnQsIE9mZiBDb3VudCA8PSAyNTUKKyAqCisgKglGcm9tIHRoZXNlIGxpbWl0cywgd2UgY2FuIGdldCByZWdpc3RlciB2YWx1ZXMgCisgKgorICoJb2ZmX2R1cmF0aW9uICsgb25fZHVyYXRpb24gPD0gTUFYX0RVUkFUSU9OCisgKglvbl9kdXJhdGlvbiA9IG9mZl9kdXJhdGlvbiAqIChzdG9ja19mcmVxIC0gZnJlcSkgLyBmcmVxCisgKgorICogICAgICBvZmZfZHVyYXRpb24gID0gIChmcmVxICogRFVSQVRJT04pIC8gc3RvY2tfZnJlcSAKKyAqICAgICAgb25fZHVyYXRpb24gPSBEVVJBVElPTiAtIG9mZl9kdXJhdGlvbiAKKyAqCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBDaGFuZ2VMb2c6CisgKiAgCURlYy4gMTIsIDIwMDMJSGlyb3NoaSBNaXVyYSA8bWl1cmFAZGEtY2hhLm9yZz4KKyAqICAJCS0gZml4IG9uL29mZiByZWdpc3RlciBtaXN0YWtlCisgKiAgCQktIGZpeCBjcHVfa2h6IGNhbGMgd2hlbiBpdCBzdG9wcyBjcHUgbW9kdWxhdGlvbi4KKyAqCisgKglEZWMuIDExLCAyMDAyIAlIaXJvc2hpIE1pdXJhIDxtaXVyYUBkYS1jaGEub3JnPgorICoJCS0gcmV3cml0ZSBmb3IgQ3lyaXggTWVkaWFHWCBDeDU1MTAvNTUyMCBhbmQgCisgKgkJICBOYXRTZW1pIEdlb2RlIENzNTUzMChBKS4KKyAqCisgKglKdWwuID8/LCAyMDAyICBad2FuZSBNd2Fpa2FtYm8gPHp3YW5lQGNvbW1maXJlc2VydmljZXMuY29tPgorICoJCS0gY3M1NTMwX21vZCBwYXRjaCBmb3IgMi40LjE5LXJjMS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFRvZG8KKyAqCVRlc3Qgb24gbWFjaGluZXMgd2l0aCA1NTEwLCA1NTMwLCA1NTMwQQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJU3VzcGVuZCBNb2R1bGF0aW9uIC0gRGVmaW5pdGlvbnMJCSoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4gCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+IAorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorCisvKiBQQ0kgY29uZmlnIHJlZ2lzdGVycywgYWxsIGF0IEYwICovCisjZGVmaW5lIFBDSV9QTUVSMSAgICAgICAgICAgICAgMHg4MCAgICAvKiBwb3dlciBtYW5hZ2VtZW50IGVuYWJsZSByZWdpc3RlciAxICovCisjZGVmaW5lIFBDSV9QTUVSMiAgICAgICAgICAgICAgMHg4MSAgICAvKiBwb3dlciBtYW5hZ2VtZW50IGVuYWJsZSByZWdpc3RlciAyICovCisjZGVmaW5lIFBDSV9QTUVSMyAgICAgICAgICAgICAgMHg4MiAgICAvKiBwb3dlciBtYW5hZ2VtZW50IGVuYWJsZSByZWdpc3RlciAzICovCisjZGVmaW5lIFBDSV9JUlFUQyAgICAgICAgICAgICAgMHg4YyAgICAvKiBpcnEgc3BlZWR1cCB0aW1lciBjb3VudGVyIHJlZ2lzdGVyOnR5cGljYWwgMiB0byA0bXMgKi8KKyNkZWZpbmUgUENJX1ZJRFRDICAgICAgICAgICAgICAweDhkICAgIC8qIHZpZGVvIHNwZWVkdXAgdGltZXIgY291bnRlciByZWdpc3RlcjogdHlwaWNhbCA1MCB0byAxMDBtcyAqLworI2RlZmluZSBQQ0lfTU9ET0ZGICAgICAgICAgICAgIDB4OTQgICAgLyogc3VzcGVuZCBtb2R1bGF0aW9uIE9GRiBjb3VudGVyIHJlZ2lzdGVyLCAxID0gMzJ1cyAqLworI2RlZmluZSBQQ0lfTU9ET04gICAgICAgICAgICAgIDB4OTUgICAgLyogc3VzcGVuZCBtb2R1bGF0aW9uIE9OIGNvdW50ZXIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUENJX1NVU0NGRyAgICAgICAgICAgICAweDk2ICAgIC8qIHN1c3BlbmQgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLworCisvKiBQTUVSMSBiaXRzICovCisjZGVmaW5lIEdQTSAgICAgICAgICAgICAgICAgICAgKDE8PDApICAvKiBnbG9iYWwgcG93ZXIgbWFuYWdlbWVudCAqLworI2RlZmluZSBHSVQgICAgICAgICAgICAgICAgICAgICgxPDwxKSAgLyogZ2xvYmFsbHkgZW5hYmxlIFBNIGRldmljZSBpZGxlIHRpbWVycyAqLworI2RlZmluZSBHVFIgICAgICAgICAgICAgICAgICAgICgxPDwyKSAgLyogZ2xvYmFsbHkgZW5hYmxlIElPIHRyYXBzICovCisjZGVmaW5lIElSUV9TUERVUCAgICAgICAgICAgICAgKDE8PDMpICAvKiBkaXNhYmxlIGNsb2NrIHRocm90dGxlIGR1cmluZyBpbnRlcnJ1cHQgaGFuZGxpbmcgKi8KKyNkZWZpbmUgVklEX1NQRFVQICAgICAgICAgICAgICAoMTw8NCkgIC8qIGRpc2FibGUgY2xvY2sgdGhyb3R0bGUgZHVyaW5nIHZnYSB2aWRlbyBoYW5kbGluZyAqLworCisvKiBTVVNDRkcgYml0cyAqLworI2RlZmluZSBTVVNNT0QgICAgICAgICAgICAgICAgICgxPDwwKSAgLyogZW5hYmxlL2Rpc2FibGUgc3VzcGVuZCBtb2R1bGF0aW9uICovCisvKiB0aGUgYmVsb3dzIHN1cHBvcnQgb25seSB3aXRoIGNzNTUzMCAoYWZ0ZXIgcmV2LjEuMikvY3M1NTMwQSAqLyAKKyNkZWZpbmUgU01JU1BEVVAgICAgICAgICAgICAgICAoMTw8MSkgIC8qIHNlbGVjdCBob3cgU01JIHJlLWVuYWJsZSBzdXNwZW5kIG1vZHVsYXRpb246ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJUlFUQyB0aW1lciBvciByZWFkIFNNSSBzcGVlZHVwIGRpc2FibGUgcmVnLihGMUJBUlswOC0wOWhdKSAqLworI2RlZmluZSBTVVNDRkcgICAgICAgICAgICAgICAgICgxPDwyKSAgLyogZW5hYmxlIHBvd2VyaW5nIGRvd24gYSBHWExWIHByb2Nlc3Nvci4gIlNwZWNpYWwgM1ZvbHQgU3VzcGVuZCIgbW9kZSAqLworLyogdGhlIGJlbG93cyBzdXBwb3J0IG9ubHkgd2l0aCBjczU1MzBBICovIAorI2RlZmluZSBQV1JTVkVfSVNBICAgICAgICAgICAgICgxPDwzKSAgLyogc3RvcCBJU0EgY2xvY2sgICovCisjZGVmaW5lIFBXUlNWRSAgICAgICAgICAgICAgICAgKDE8PDQpICAvKiBhY3RpdmUgaWRsZSAqLworCitzdHJ1Y3QgZ3hmcmVxX3BhcmFtcyB7CisJdTggb25fZHVyYXRpb247CisJdTggb2ZmX2R1cmF0aW9uOworCXU4IHBjaV9zdXNjZmc7CisJdTggcGNpX3BtZXIxOworCXU4IHBjaV9wbWVyMjsKKwl1OCBwY2lfcmV2OworCXN0cnVjdCBwY2lfZGV2ICpjczU1eDA7Cit9OworCitzdGF0aWMgc3RydWN0IGd4ZnJlcV9wYXJhbXMgKmd4X3BhcmFtczsKK3N0YXRpYyBpbnQgc3RvY2tfZnJlcTsKKworLyogUENJIGJ1cyBjbG9jayAtIGRlZmF1bHRzIHRvIDMwLjAwMCBpZiBjcHVfa2h6IGlzIG5vdCBhdmFpbGFibGUgKi8KK3N0YXRpYyBpbnQgcGNpX2J1c2NsayA9IDA7Cittb2R1bGVfcGFyYW0gKHBjaV9idXNjbGssIGludCwgMDQ0NCk7CisKKy8qIG1heGltdW0gZHVyYXRpb24gZm9yIHdoaWNoIHRoZSBjcHUgbWF5IGJlIHN1c3BlbmRlZAorICogKDMydXMgKiBNQVhfRFVSQVRJT04pLiBJZiBubyBwYXJhbWV0ZXIgaXMgZ2l2ZW4sIHRoaXMgZGVmYXVsdHMKKyAqIHRvIDI1NS4gCisgKiBOb3RlIHRoYXQgdGhpcyBsZWFkcyB0byBhIG1heGltdW0gb2YgOCBtcyghKSB3aGVyZSB0aGUgQ1BVIGNsb2NrCisgKiBpcyBzdXNwZW5kZWQgLS0gcHJvY2Vzc2luZyBwb3dlciBpcyBqdXN0IDAuMzklIG9mIHdoYXQgaXQgdXNlZCB0byBiZSwKKyAqIHRob3VnaC4gNzgxLjI1IGtIeighKSBmb3IgYSAyMDAgTUh6IHByb2Nlc3NvciAtLSB3b3cuICovCitzdGF0aWMgaW50IG1heF9kdXJhdGlvbiA9IDI1NTsKK21vZHVsZV9wYXJhbSAobWF4X2R1cmF0aW9uLCBpbnQsIDA0NDQpOworCisvKiBGb3IgdGhlIGRlZmF1bHQgcG9saWN5LCB3ZSB3YW50IGF0IGxlYXN0IHNvbWUgcHJvY2Vzc2luZyBwb3dlcgorICogLSBsZXQncyBzYXkgNSUuIChtaW4gPSBtYXhmcmVxIC8gUE9MSUNZX01JTl9ESVYpCisgKi8KKyNkZWZpbmUgUE9MSUNZX01JTl9ESVYgMjAKKworCisjZGVmaW5lIGRwcmludGsobXNnLi4uKSBjcHVmcmVxX2RlYnVnX3ByaW50ayhDUFVGUkVRX0RFQlVHX0RSSVZFUiwgImd4LXN1c3Btb2QiLCBtc2cpCisKKy8qKgorICogICAgICB3ZSBjYW4gZGV0ZWN0IGEgY29yZSBtdWx0aXBpbGVyIGZyb20gZGlyMF9sc2IgCisgKiAgICAgIGZyb20gR1gxIGRhdGFzaGVldCBwLjU2LCAKKyAqCSAgIE1VTFRbMzowXToKKyAqCSAgIDAwMDAgPSBTWVNDTEsgbXVsdGlwbGllZCBieSA0ICh0ZXN0IG9ubHkpCisgKgkgICAwMDAxID0gU1lTQ0xLIG11bHRpcGxpZWQgYnkgMTAKKyAqCSAgIDAwMTAgPSBTWVNDTEsgbXVsdGlwbGllZCBieSA0CisgKgkgICAwMDExID0gU1lTQ0xLIG11bHRpcGxpZWQgYnkgNgorICoJICAgMDEwMCA9IFNZU0NMSyBtdWx0aXBsaWVkIGJ5IDkKKyAqCSAgIDAxMDEgPSBTWVNDTEsgbXVsdGlwbGllZCBieSA1CisgKgkgICAwMTEwID0gU1lTQ0xLIG11bHRpcGxpZWQgYnkgNworICoJICAgMDExMSA9IFNZU0NMSyBtdWx0aXBsaWVkIGJ5IDgKKyAqICAgICAgICAgICAgICBvZiAzMy4zTUh6CisgKiovCitzdGF0aWMgaW50IGd4X2ZyZXFfbXVsdFsxNl0gPSB7CisJCTQsIDEwLCA0LCA2LCA5LCA1LCA3LCA4LAorCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAJTG93IExldmVsIGNoaXBzZXQgaW50ZXJmYWNlCQkJCSoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGd4X2NoaXBzZXRfdGJsW10gX19pbml0ZGF0YSA9IHsKKyAgICAgICAgeyBQQ0lfVkVORE9SX0lEX0NZUklYLCBQQ0lfREVWSUNFX0lEX0NZUklYXzU1MzBfTEVHQUNZLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lEIH0sCisgICAgICAgIHsgUENJX1ZFTkRPUl9JRF9DWVJJWCwgUENJX0RFVklDRV9JRF9DWVJJWF81NTIwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lEIH0sCisgICAgICAgIHsgUENJX1ZFTkRPUl9JRF9DWVJJWCwgUENJX0RFVklDRV9JRF9DWVJJWF81NTEwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lEIH0sCisgICAgICAgIHsgMCwgfSwKK307CisKKy8qKgorICogICAgIGd4X2RldGVjdF9jaGlwc2V0OgorICoKKyAqKi8KK3N0YXRpYyBfX2luaXQgc3RydWN0IHBjaV9kZXYgKmd4X2RldGVjdF9jaGlwc2V0KHZvaWQpCit7CisJc3RydWN0IHBjaV9kZXYgKmd4X3BjaSA9IE5VTEw7CisKKwkvKiBjaGVjayBpZiBDUFUgaXMgYSBNZWRpYUdYIG9yIGEgR2VvZGUuICovCisgICAgICAgIGlmICgoY3VycmVudF9jcHVfZGF0YS54ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1JfTlNDKSAmJiAKKwkgICAgKGN1cnJlbnRfY3B1X2RhdGEueDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0NZUklYKSkgeworCQlkcHJpbnRrKCJlcnJvcjogbm8gTWVkaWFHWC9HZW9kZSBwcm9jZXNzb3IgZm91bmQhXG4iKTsKKwkJcmV0dXJuIE5VTEw7CQkKKwl9CisKKwkvKiBkZXRlY3Qgd2hpY2ggY29tcGFuaW9uIGNoaXAgaXMgdXNlZCAqLworCXdoaWxlICgoZ3hfcGNpID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgZ3hfcGNpKSkgIT0gTlVMTCkgeworCQlpZiAoKHBjaV9tYXRjaF9kZXZpY2UgKGd4X2NoaXBzZXRfdGJsLCBneF9wY2kpKSAhPSBOVUxMKSB7CisJCQlyZXR1cm4gZ3hfcGNpOworCQl9CisJfQorCisJZHByaW50aygiZXJyb3I6IG5vIHN1cHBvcnRlZCBjaGlwc2V0IGZvdW5kIVxuIik7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogICAgICBneF9nZXRfY3B1c3BlZWQ6CisgKgorICogRmluZHMgb3V0IGF0IHdoaWNoIGVmZmljaWVudCBmcmVxdWVuY3kgdGhlIEN5cml4IE1lZGlhR1gvTmF0U2VtaSBHZW9kZSBDUFUgcnVucy4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBneF9nZXRfY3B1c3BlZWQodW5zaWduZWQgaW50IGNwdSkKK3sKKwlpZiAoKGd4X3BhcmFtcy0+cGNpX3N1c2NmZyAmIFNVU01PRCkgPT0gMCkgCisJCXJldHVybiBzdG9ja19mcmVxOworCisJcmV0dXJuIChzdG9ja19mcmVxICogZ3hfcGFyYW1zLT5vZmZfZHVyYXRpb24pIAorCQkvIChneF9wYXJhbXMtPm9uX2R1cmF0aW9uICsgZ3hfcGFyYW1zLT5vZmZfZHVyYXRpb24pOworfQorCisvKioKKyAqICAgICAgZ3hfdmFsaWRhdGVfc3BlZWQ6CisgKiAgICAgIGRldGVybWluZSBjdXJyZW50IGNwdSBzcGVlZAorICogICAgICAgCisqKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBneF92YWxpZGF0ZV9zcGVlZCh1bnNpZ25lZCBpbnQga2h6LCB1OCAqb25fZHVyYXRpb24sIHU4ICpvZmZfZHVyYXRpb24pCit7CisJdW5zaWduZWQgaW50IGk7CisJdTggdG1wX29uLCB0bXBfb2ZmOworCWludCBvbGRfdG1wX2ZyZXEgPSBzdG9ja19mcmVxOworCWludCB0bXBfZnJlcTsKKworCSpvZmZfZHVyYXRpb249MTsKKwkqb25fZHVyYXRpb249MDsKKworCWZvciAoaT1tYXhfZHVyYXRpb247IGk+MDsgaS0tKSB7CisJCXRtcF9vZmYgPSAoKGtoeiAqIGkpIC8gc3RvY2tfZnJlcSkgJiAweGZmOyAKKwkJdG1wX29uID0gaSAtIHRtcF9vZmY7CisJCXRtcF9mcmVxID0gKHN0b2NrX2ZyZXEgKiB0bXBfb2ZmKSAvIGk7CisJCS8qIGlmIHRoaXMgcmVsYXRpb24gaXMgY2xvc2VyIHRvIGtoeiwgdXNlIHRoaXMuIElmIGl0J3MgZXF1YWwsCisJCSAqIHByZWZlciBpdCwgdG9vIC0gbG93ZXIgbGF0ZW5jeSAqLworCQlpZiAoYWJzKHRtcF9mcmVxIC0ga2h6KSA8PSBhYnMob2xkX3RtcF9mcmVxIC0ga2h6KSkgeworCQkJKm9uX2R1cmF0aW9uID0gdG1wX29uOworCQkJKm9mZl9kdXJhdGlvbiA9IHRtcF9vZmY7CisJCQlvbGRfdG1wX2ZyZXEgPSB0bXBfZnJlcTsKKwkJfQorCX0KKworCXJldHVybiBvbGRfdG1wX2ZyZXE7Cit9CisKKworLyoqCisgKiAJZ3hfc2V0X2NwdXNwZWVkOgorICoJCXNldCBjcHUgc3BlZWQgaW4ga2h6LgorICoqLworCitzdGF0aWMgdm9pZCBneF9zZXRfY3B1c3BlZWQodW5zaWduZWQgaW50IGtoeikKK3sKKyAgICAgICAgdTggc3VzY2ZnLCBwbWVyMTsKKwl1bnNpZ25lZCBpbnQgbmV3X2toejsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBjcHVmcmVxX2ZyZXFzIGZyZXFzOworCisKKwlmcmVxcy5jcHUgPSAwOworCWZyZXFzLm9sZCA9IGd4X2dldF9jcHVzcGVlZCgwKTsKKworCW5ld19raHogPSBneF92YWxpZGF0ZV9zcGVlZChraHosICZneF9wYXJhbXMtPm9uX2R1cmF0aW9uLCAmZ3hfcGFyYW1zLT5vZmZfZHVyYXRpb24pOworCisJZnJlcXMubmV3ID0gbmV3X2toejsKKworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BSRUNIQU5HRSk7CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJaWYgKG5ld19raHogIT0gc3RvY2tfZnJlcSkgeyAgLyogaWYgbmV3IGtoeiA9PSAxMDAlIG9mIENQVSBzcGVlZCwgaXQgaXMgc3BlY2lhbCBjYXNlICovCisJCXN3aXRjaCAoZ3hfcGFyYW1zLT5jczU1eDAtPmRldmljZSkgeworCQljYXNlIFBDSV9ERVZJQ0VfSURfQ1lSSVhfNTUzMF9MRUdBQ1k6CisJCQlwbWVyMSA9IGd4X3BhcmFtcy0+cGNpX3BtZXIxIHwgSVJRX1NQRFVQIHwgVklEX1NQRFVQOworCQkJLyogRklYTUU6IG5lZWQgdG8gdGVzdCBvdGhlciB2YWx1ZXMgLS0gWndhbmUsTWl1cmEgKi8KKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShneF9wYXJhbXMtPmNzNTV4MCwgUENJX0lSUVRDLCA0KTsgLyogdHlwaWNhbCAyIHRvIDRtcyAqLworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGd4X3BhcmFtcy0+Y3M1NXgwLCBQQ0lfVklEVEMsIDEwMCk7LyogdHlwaWNhbCA1MCB0byAxMDBtcyAqLworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGd4X3BhcmFtcy0+Y3M1NXgwLCBQQ0lfUE1FUjEsIHBtZXIxKTsKKworCQkJaWYgKGd4X3BhcmFtcy0+cGNpX3JldiA8IDB4MTApIHsgICAvKiBDUzU1MzAocmV2IDEuMiwgMS4zKSAqLworCQkJCXN1c2NmZyA9IGd4X3BhcmFtcy0+cGNpX3N1c2NmZyB8IFNVU01PRDsKKwkJCX0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ1M1NTMwQSxCLi4gKi8KKwkJCQlzdXNjZmcgPSBneF9wYXJhbXMtPnBjaV9zdXNjZmcgfCBTVVNNT0QgfCBQV1JTVkU7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0NZUklYXzU1MjA6CisJCWNhc2UgUENJX0RFVklDRV9JRF9DWVJJWF81NTEwOgorCQkJc3VzY2ZnID0gZ3hfcGFyYW1zLT5wY2lfc3VzY2ZnIHwgU1VTTU9EOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCQlkcHJpbnRrKCJmYXRhbDogdHJ5IHRvIHNldCB1bmtub3duIGNoaXBzZXQuXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSB7CisJCXN1c2NmZyA9IGd4X3BhcmFtcy0+cGNpX3N1c2NmZyAmIH4oU1VTTU9EKTsKKwkJZ3hfcGFyYW1zLT5vZmZfZHVyYXRpb24gPSAwOworCQlneF9wYXJhbXMtPm9uX2R1cmF0aW9uID0gMDsKKwkJZHByaW50aygic3VzcGVuZCBtb2R1bGF0aW9uIGRpc2FibGVkOiBjcHUgcnVucyAxMDAgcGVyY2VudCBzcGVlZC5cbiIpOworCX0KKworCXBjaV93cml0ZV9jb25maWdfYnl0ZShneF9wYXJhbXMtPmNzNTV4MCwgUENJX01PRE9GRiwgZ3hfcGFyYW1zLT5vZmZfZHVyYXRpb24pOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShneF9wYXJhbXMtPmNzNTV4MCwgUENJX01PRE9OLCBneF9wYXJhbXMtPm9uX2R1cmF0aW9uKTsKKworICAgICAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUoZ3hfcGFyYW1zLT5jczU1eDAsIFBDSV9TVVNDRkcsIHN1c2NmZyk7CisgICAgICAgIHBjaV9yZWFkX2NvbmZpZ19ieXRlKGd4X3BhcmFtcy0+Y3M1NXgwLCBQQ0lfU1VTQ0ZHLCAmc3VzY2ZnKTsKKworICAgICAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlneF9wYXJhbXMtPnBjaV9zdXNjZmcgPSBzdXNjZmc7CisKKwljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QT1NUQ0hBTkdFKTsKKworICAgICAgICBkcHJpbnRrKCJzdXNwZW5kIG1vZHVsYXRpb24gdy8gZHVyYXRpb24gb2YgT046JWQgdXMsIE9GRjolZCB1c1xuIiwKKyAgICAgICAgICAgICAgICBneF9wYXJhbXMtPm9uX2R1cmF0aW9uICogMzIsIGd4X3BhcmFtcy0+b2ZmX2R1cmF0aW9uICogMzIpOworCWRwcmludGsoInN1c3BlbmQgbW9kdWxhdGlvbiB3LyBjbG9jayBzcGVlZDogJWQga0h6LlxuIiwgZnJlcXMubmV3KTsgCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICBIaWdoIGxldmVsIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKgljcHVmcmVxX2d4X3ZlcmlmeTogdGVzdCBpZiBmcmVxdWVuY3kgcmFuZ2UgaXMgdmFsaWQgCisgKgorICoJVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgYSBnaXZlbiBmcmVxdWVuY3kgcmFuZ2UgaW4ga0h6IGlzIHZhbGlkIAorICogICAgICBmb3IgdGhlIGhhcmR3YXJlIHN1cHBvcnRlZCBieSB0aGUgZHJpdmVyLiAKKyAqLworCitzdGF0aWMgaW50IGNwdWZyZXFfZ3hfdmVyaWZ5KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXVuc2lnbmVkIGludCB0bXBfZnJlcSA9IDA7CisJdTggdG1wMSwgdG1wMjsKKworICAgICAgICBpZiAoIXN0b2NrX2ZyZXEgfHwgIXBvbGljeSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworCXBvbGljeS0+Y3B1ID0gMDsKKwljcHVmcmVxX3ZlcmlmeV93aXRoaW5fbGltaXRzKHBvbGljeSwgKHN0b2NrX2ZyZXEgLyBtYXhfZHVyYXRpb24pLCBzdG9ja19mcmVxKTsKKworCS8qIGl0IG5lZWRzIHRvIGJlIGFzc3VyZWQgdGhhdCBhdCBsZWFzdCBvbmUgc3VwcG9ydGVkIGZyZXF1ZW5jeSBpcworCSAqIHdpdGhpbiBwb2xpY3ktPm1pbiBhbmQgcG9saWN5LT5tYXguIElmIGl0IGlzIG5vdCwgcG9saWN5LT5tYXgKKwkgKiBuZWVkcyB0byBiZSBpbmNyZWFzZWQgdW50aWwgb25lIGZyZXVxZW5jeSBpcyBzdXBwb3J0ZWQuCisJICogcG9saWN5LT5taW4gbWF5IG5vdCBiZSBkZWNyZWFzZWQsIHRob3VnaC4gVGhpcyB3YXkgd2UgZ3VhcmFudGVlIGEgCisJICogc3BlY2lmaWMgcHJvY2Vzc2luZyBjYXBhY2l0eS4KKwkgKi8KKwl0bXBfZnJlcSA9IGd4X3ZhbGlkYXRlX3NwZWVkKHBvbGljeS0+bWluLCAmdG1wMSwgJnRtcDIpOworCWlmICh0bXBfZnJlcSA8IHBvbGljeS0+bWluKSAKKwkJdG1wX2ZyZXEgKz0gc3RvY2tfZnJlcSAvIG1heF9kdXJhdGlvbjsKKwlwb2xpY3ktPm1pbiA9IHRtcF9mcmVxOworCWlmIChwb2xpY3ktPm1pbiA+IHBvbGljeS0+bWF4KSAKKwkJcG9saWN5LT5tYXggPSB0bXBfZnJlcTsKKwl0bXBfZnJlcSA9IGd4X3ZhbGlkYXRlX3NwZWVkKHBvbGljeS0+bWF4LCAmdG1wMSwgJnRtcDIpOworCWlmICh0bXBfZnJlcSA+IHBvbGljeS0+bWF4KQorCQl0bXBfZnJlcSAtPSBzdG9ja19mcmVxIC8gbWF4X2R1cmF0aW9uOworCXBvbGljeS0+bWF4ID0gdG1wX2ZyZXE7CisJaWYgKHBvbGljeS0+bWF4IDwgcG9saWN5LT5taW4pCisJCXBvbGljeS0+bWF4ID0gcG9saWN5LT5taW47CisJY3B1ZnJlcV92ZXJpZnlfd2l0aGluX2xpbWl0cyhwb2xpY3ksIChzdG9ja19mcmVxIC8gbWF4X2R1cmF0aW9uKSwgc3RvY2tfZnJlcSk7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgICAgIGNwdWZyZXFfZ3hfdGFyZ2V0OiAgCisgKgorICovCitzdGF0aWMgaW50IGNwdWZyZXFfZ3hfdGFyZ2V0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAorCQkJICAgICB1bnNpZ25lZCBpbnQgdGFyZ2V0X2ZyZXEsCisJCQkgICAgIHVuc2lnbmVkIGludCByZWxhdGlvbikKK3sKKwl1OCB0bXAxLCB0bXAyOworCXVuc2lnbmVkIGludCB0bXBfZnJlcTsKKworICAgICAgICBpZiAoIXN0b2NrX2ZyZXEgfHwgIXBvbGljeSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworCXBvbGljeS0+Y3B1ID0gMDsKKworCXRtcF9mcmVxID0gZ3hfdmFsaWRhdGVfc3BlZWQodGFyZ2V0X2ZyZXEsICZ0bXAxLCAmdG1wMik7CisJd2hpbGUgKHRtcF9mcmVxIDwgcG9saWN5LT5taW4pIHsKKwkJdG1wX2ZyZXEgKz0gc3RvY2tfZnJlcSAvIG1heF9kdXJhdGlvbjsKKwkJdG1wX2ZyZXEgPSBneF92YWxpZGF0ZV9zcGVlZCh0bXBfZnJlcSwgJnRtcDEsICZ0bXAyKTsKKwl9CisJd2hpbGUgKHRtcF9mcmVxID4gcG9saWN5LT5tYXgpIHsKKwkJdG1wX2ZyZXEgLT0gc3RvY2tfZnJlcSAvIG1heF9kdXJhdGlvbjsKKwkJdG1wX2ZyZXEgPSBneF92YWxpZGF0ZV9zcGVlZCh0bXBfZnJlcSwgJnRtcDEsICZ0bXAyKTsKKwl9CisKKwlneF9zZXRfY3B1c3BlZWQodG1wX2ZyZXEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3B1ZnJlcV9neF9jcHVfaW5pdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwl1bnNpZ25lZCBpbnQgbWF4ZnJlcSwgY3VyZnJlcTsKKworCWlmICghcG9saWN5IHx8IHBvbGljeS0+Y3B1ICE9IDApCisJCXJldHVybiAtRU5PREVWOworCisJLyogZGV0ZXJtaW5lIG1heGltdW0gZnJlcXVlbmN5ICovCisJaWYgKHBjaV9idXNjbGspIHsKKwkJbWF4ZnJlcSA9IHBjaV9idXNjbGsgKiBneF9mcmVxX211bHRbZ2V0Q3g4NihDWDg2X0RJUjEpICYgMHgwZl07CisJfSBlbHNlIGlmIChjcHVfa2h6KSB7CisJCW1heGZyZXEgPSBjcHVfa2h6OworCX0gZWxzZSB7CisJCW1heGZyZXEgPSAzMDAwMCAqIGd4X2ZyZXFfbXVsdFtnZXRDeDg2KENYODZfRElSMSkgJiAweDBmXTsKKwl9CisJc3RvY2tfZnJlcSA9IG1heGZyZXE7CisJY3VyZnJlcSA9IGd4X2dldF9jcHVzcGVlZCgwKTsKKworCWRwcmludGsoImNwdSBtYXggZnJlcXVlbmN5IGlzICVkLlxuIiwgbWF4ZnJlcSk7CisJZHByaW50aygiY3B1IGN1cnJlbnQgZnJlcXVlbmN5IGlzICVka0h6LlxuIixjdXJmcmVxKTsKKworCS8qIHNldHVwIGJhc2ljIHN0cnVjdCBmb3IgY3B1ZnJlcSBBUEkgKi8KKwlwb2xpY3ktPmNwdSA9IDA7CisKKwlpZiAobWF4X2R1cmF0aW9uIDwgUE9MSUNZX01JTl9ESVYpCisJCXBvbGljeS0+bWluID0gbWF4ZnJlcSAvIG1heF9kdXJhdGlvbjsKKwllbHNlCisJCXBvbGljeS0+bWluID0gbWF4ZnJlcSAvIFBPTElDWV9NSU5fRElWOworCXBvbGljeS0+bWF4ID0gbWF4ZnJlcTsKKwlwb2xpY3ktPmN1ciA9IGN1cmZyZXE7CisJcG9saWN5LT5nb3Zlcm5vciA9IENQVUZSRVFfREVGQVVMVF9HT1ZFUk5PUjsKKwlwb2xpY3ktPmNwdWluZm8ubWluX2ZyZXEgPSBtYXhmcmVxIC8gbWF4X2R1cmF0aW9uOworCXBvbGljeS0+Y3B1aW5mby5tYXhfZnJlcSA9IG1heGZyZXE7CisJcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9IENQVUZSRVFfRVRFUk5BTDsKKworCXJldHVybiAwOworfQorCisvKiAKKyAqIGNwdWZyZXFfZ3hfaW5pdDoKKyAqICAgTWVkaWFHWC9HZW9kZSBHWCBpbml0aWFsaXplIGNwdWZyZXEgZHJpdmVyCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIgZ3hfc3VzcG1vZF9kcml2ZXIgPSB7CisJLmdldAkJPSBneF9nZXRfY3B1c3BlZWQsCisJLnZlcmlmeQkJPSBjcHVmcmVxX2d4X3ZlcmlmeSwKKwkudGFyZ2V0CQk9IGNwdWZyZXFfZ3hfdGFyZ2V0LAorCS5pbml0CQk9IGNwdWZyZXFfZ3hfY3B1X2luaXQsCisJLm5hbWUJCT0gImd4LXN1c3Btb2QiLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGNwdWZyZXFfZ3hfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisJc3RydWN0IGd4ZnJlcV9wYXJhbXMgKnBhcmFtczsKKwlzdHJ1Y3QgcGNpX2RldiAqZ3hfcGNpOworCXUzMiBjbGFzc19yZXY7CisKKwkvKiBUZXN0IGlmIHdlIGhhdmUgdGhlIHJpZ2h0IGhhcmR3YXJlICovCisJaWYgKChneF9wY2kgPSBneF9kZXRlY3RfY2hpcHNldCgpKSA9PSBOVUxMKSAKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBjaGVjayB3aGV0aGVyIG1vZHVsZSBwYXJhbWV0ZXJzIGFyZSBzYW5lICovCisJaWYgKG1heF9kdXJhdGlvbiA+IDB4ZmYpCisJCW1heF9kdXJhdGlvbiA9IDB4ZmY7CisKKwlkcHJpbnRrKCJnZW9kZSBzdXNwZW5kIG1vZHVsYXRpb24gYXZhaWxhYmxlLlxuIik7CisKKwlwYXJhbXMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZ3hmcmVxX3BhcmFtcyksIEdGUF9LRVJORUwpOworCWlmIChwYXJhbXMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KHBhcmFtcywgMCwgc2l6ZW9mKHN0cnVjdCBneGZyZXFfcGFyYW1zKSk7CisKKwlwYXJhbXMtPmNzNTV4MCA9IGd4X3BjaTsKKwlneF9wYXJhbXMgPSBwYXJhbXM7CisKKwkvKiBrZWVwIGNzNTV4MCBjb25maWd1cmF0aW9ucyAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBhcmFtcy0+Y3M1NXgwLCBQQ0lfU1VTQ0ZHLCAmKHBhcmFtcy0+cGNpX3N1c2NmZykpOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBhcmFtcy0+Y3M1NXgwLCBQQ0lfUE1FUjEsICYocGFyYW1zLT5wY2lfcG1lcjEpKTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwYXJhbXMtPmNzNTV4MCwgUENJX1BNRVIyLCAmKHBhcmFtcy0+cGNpX3BtZXIyKSk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGFyYW1zLT5jczU1eDAsIFBDSV9NT0RPTiwgJihwYXJhbXMtPm9uX2R1cmF0aW9uKSk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGFyYW1zLT5jczU1eDAsIFBDSV9NT0RPRkYsICYocGFyYW1zLT5vZmZfZHVyYXRpb24pKTsKKyAgICAgICAgcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBhcmFtcy0+Y3M1NXgwLCBQQ0lfQ0xBU1NfUkVWSVNJT04sICZjbGFzc19yZXYpOworCXBhcmFtcy0+cGNpX3JldiA9IGNsYXNzX3JldiAmJiAweGZmOworCisJaWYgKChyZXQgPSBjcHVmcmVxX3JlZ2lzdGVyX2RyaXZlcigmZ3hfc3VzcG1vZF9kcml2ZXIpKSkgeyAKKwkJa2ZyZWUocGFyYW1zKTsKKwkJcmV0dXJuIHJldDsgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgZXJyb3IhICovCisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjcHVmcmVxX2d4X2V4aXQodm9pZCkKK3sKKwljcHVmcmVxX3VucmVnaXN0ZXJfZHJpdmVyKCZneF9zdXNwbW9kX2RyaXZlcik7CisJcGNpX2Rldl9wdXQoZ3hfcGFyYW1zLT5jczU1eDApOworCWtmcmVlKGd4X3BhcmFtcyk7Cit9CisKK01PRFVMRV9BVVRIT1IgKCJIaXJvc2hpIE1pdXJhIDxtaXVyYUBkYS1jaGEub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OICgiQ3B1ZnJlcSBkcml2ZXIgZm9yIEN5cml4IE1lZGlhR1ggYW5kIE5hdFNlbWkgR2VvZGUiKTsKK01PRFVMRV9MSUNFTlNFICgiR1BMIik7CisKK21vZHVsZV9pbml0KGNwdWZyZXFfZ3hfaW5pdCk7Cittb2R1bGVfZXhpdChjcHVmcmVxX2d4X2V4aXQpOworCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2xvbmdoYXVsLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2xvbmdoYXVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIwZjlmNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuYwpAQCAtMCwwICsxLDY1OCBAQAorLyoKKyAqICAoQykgMjAwMS0yMDA0ICBEYXZlIEpvbmVzLiA8ZGF2ZWpAY29kZW1vbmtleS5vcmcudWs+CisgKiAgKEMpIDIwMDIgIFBhZHJhaWcgQnJhZHkuIDxwYWRyYWlnQGFudGVmYWN0by5jb20+CisgKgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBMaWNlbnNlIHZlcnNpb24gMi4KKyAqICBCYXNlZCB1cG9uIGRhdGFzaGVldHMgJiBzYW1wbGUgQ1BVcyBraW5kbHkgcHJvdmlkZWQgYnkgVklBLgorICoKKyAqICBWSUEgaGF2ZSBjdXJyZW50bHkgMyBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgTG9uZ2hhdWwuCisgKiAgVmVyc2lvbiAxIChMb25naGF1bCkgdXNlcyB0aGUgQkNSMiBNU1IgYXQgMHgxMTQ3LgorICogICBJdCBpcyBwcmVzZW50IG9ubHkgaW4gU2FtdWVsIDEgKEM1QSksIFNhbXVlbCAyIChDNUIpIHN0ZXBwaW5nIDAuCisgKiAgVmVyc2lvbiAyIG9mIGxvbmdoYXVsIGlzIHRoZSBzYW1lIGFzIHYxLCBidXQgYWRkcyB2b2x0YWdlIHNjYWxpbmcuCisgKiAgIFByZXNlbnQgaW4gU2FtdWVsIDIgKHN0ZXBwaW5ncyAxLTcgb25seSkgKEM1QiksIGFuZCBFenJhIChDNUMpCisgKiAgIHZvbHRhZ2Ugc2NhbGluZyBzdXBwb3J0IGhhcyBjdXJyZW50bHkgYmVlbiBkaXNhYmxlZCBpbiB0aGlzIGRyaXZlcgorICogICB1bnRpbCB3ZSBoYXZlIGNvZGUgdGhhdCBnZXRzIGl0IHJpZ2h0LgorICogIFZlcnNpb24gMyBvZiBsb25naGF1bCBnb3QgcmVuYW1lZCB0byBQb3dlcnNhdmVyIGFuZCByZWRlc2lnbmVkCisgKiAgIHRvIHVzZSB0aGUgUE9XRVJTQVZFUiBNU1IgYXQgMHgxMTBhLgorICogICBJdCBpcyBwcmVzZW50IGluIEV6cmEtVCAoQzVNKSwgTmVoZW1pYWggKEM1WCkgYW5kIGFib3ZlLgorICogICBJdCdzIHByZXR0eSBtdWNoIHRoZSBzYW1lIGZlYXR1cmUgd2lzZSB0byBsb25naGF1bCB2MiwgdGhvdWdoCisgKiAgIHRoZXJlIGlzIHByb3Zpc2lvbiBmb3Igc2NhbGluZyBGU0IgdG9vLCBidXQgdGhpcyBkb2Vzbid0IHdvcmsKKyAqICAgdG9vIHdlbGwgaW4gcHJhY3RpY2Ugc28gd2UgZG9uJ3QgZXZlbiB0cnkgdG8gdXNlIHRoaXMuCisgKgorICogIEJJRyBGQVQgRElTQ0xBSU1FUjogV29yayBpbiBwcm9ncmVzcyBjb2RlLiBQb3NzaWJseSAqZGFuZ2Vyb3VzKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCisjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgPGFzbS90aW1leC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAibG9uZ2hhdWwuaCIKKworI2RlZmluZSBQRlggImxvbmdoYXVsOiAiCisKKyNkZWZpbmUgVFlQRV9MT05HSEFVTF9WMQkxCisjZGVmaW5lIFRZUEVfTE9OR0hBVUxfVjIJMgorI2RlZmluZSBUWVBFX1BPV0VSU0FWRVIJCTMKKworI2RlZmluZQlDUFVfU0FNVUVMCTEKKyNkZWZpbmUJQ1BVX1NBTVVFTDIJMgorI2RlZmluZQlDUFVfRVpSQQkzCisjZGVmaW5lCUNQVV9FWlJBX1QJNAorI2RlZmluZQlDUFVfTkVIRU1JQUgJNQorCitzdGF0aWMgaW50IGNwdV9tb2RlbDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbnVtc2NhbGVzPTE2LCBudW12c2NhbGVzOworc3RhdGljIHVuc2lnbmVkIGludCBmc2I7CitzdGF0aWMgaW50IG1pbnZpZCwgbWF4dmlkOworc3RhdGljIHVuc2lnbmVkIGludCBtaW5tdWx0LCBtYXhtdWx0Oworc3RhdGljIGludCBjYW5fc2NhbGVfdm9sdGFnZTsKK3N0YXRpYyBpbnQgdnJtcmV2OworCisvKiBNb2R1bGUgcGFyYW1ldGVycyAqLworc3RhdGljIGludCBkb250X3NjYWxlX3ZvbHRhZ2U7CisKKworI2RlZmluZSBkcHJpbnRrKG1zZy4uLikgY3B1ZnJlcV9kZWJ1Z19wcmludGsoQ1BVRlJFUV9ERUJVR19EUklWRVIsICJsb25naGF1bCIsIG1zZykKKworCisjZGVmaW5lIF9faGx0KCkgICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJobHQiOiA6IDoibWVtb3J5IikKKworLyogQ2xvY2sgcmF0aW9zIG11bHRpcGxpZWQgYnkgMTAgKi8KK3N0YXRpYyBpbnQgY2xvY2tfcmF0aW9bMzJdOworc3RhdGljIGludCBlYmxjcl90YWJsZVszMl07CitzdGF0aWMgaW50IHZvbHRhZ2VfdGFibGVbMzJdOworc3RhdGljIHVuc2lnbmVkIGludCBoaWdoZXN0X3NwZWVkLCBsb3dlc3Rfc3BlZWQ7IC8qIGtIeiAqLworc3RhdGljIGludCBsb25naGF1bF92ZXJzaW9uOworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqbG9uZ2hhdWxfdGFibGU7CisKKyNpZmRlZiBDT05GSUdfQ1BVX0ZSRVFfREVCVUcKK3N0YXRpYyBjaGFyIHNwZWVkYnVmZmVyWzhdOworCitzdGF0aWMgY2hhciAqcHJpbnRfc3BlZWQoaW50IHNwZWVkKQoreworCWlmIChzcGVlZCA+IDEwMDApIHsKKwkJaWYgKHNwZWVkJTEwMDAgPT0gMCkKKwkJCXNwcmludGYgKHNwZWVkYnVmZmVyLCAiJWRHSHoiLCBzcGVlZC8xMDAwKTsKKwkJZWxzZQorCQkJc3ByaW50ZiAoc3BlZWRidWZmZXIsICIlZC4lZEdIeiIsIHNwZWVkLzEwMDAsIChzcGVlZCUxMDAwKS8xMDApOworCX0gZWxzZQorCQlzcHJpbnRmIChzcGVlZGJ1ZmZlciwgIiVkTUh6Iiwgc3BlZWQpOworCisJcmV0dXJuIHNwZWVkYnVmZmVyOworfQorI2VuZGlmCisKKworc3RhdGljIHVuc2lnbmVkIGludCBjYWxjX3NwZWVkKGludCBtdWx0KQoreworCWludCBraHo7CisJa2h6ID0gKG11bHQvMTApKmZzYjsKKwlpZiAobXVsdCUxMCkKKwkJa2h6ICs9IGZzYi8yOworCWtoeiAqPSAxMDAwOworCXJldHVybiBraHo7Cit9CisKKworc3RhdGljIGludCBsb25naGF1bF9nZXRfY3B1X211bHQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGludmFsdWU9MCxsbywgaGk7CisKKwlyZG1zciAoTVNSX0lBMzJfRUJMX0NSX1BPV0VST04sIGxvLCBoaSk7CisJaW52YWx1ZSA9IChsbyAmICgxPDwyMnwxPDwyM3wxPDwyNHwxPDwyNSkpID4+MjI7CisJaWYgKGxvbmdoYXVsX3ZlcnNpb249PVRZUEVfTE9OR0hBVUxfVjIgfHwgbG9uZ2hhdWxfdmVyc2lvbj09VFlQRV9QT1dFUlNBVkVSKSB7CisJCWlmIChsbyAmICgxPDwyNykpCisJCQlpbnZhbHVlKz0xNjsKKwl9CisJcmV0dXJuIGVibGNyX3RhYmxlW2ludmFsdWVdOworfQorCisKK3N0YXRpYyB2b2lkIGRvX3Bvd2Vyc2F2ZXIodW5pb24gbXNyX2xvbmdoYXVsICpsb25naGF1bCwKKwkJCXVuc2lnbmVkIGludCBjbG9ja19yYXRpb19pbmRleCkKK3sKKwlpbnQgdmVyc2lvbjsKKworCXN3aXRjaCAoY3B1X21vZGVsKSB7CisJY2FzZSBDUFVfRVpSQV9UOgorCQl2ZXJzaW9uID0gMzsKKwkJYnJlYWs7CisJY2FzZSBDUFVfTkVIRU1JQUg6CisJCXZlcnNpb24gPSAweGY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CisKKwlyZG1zcmwoTVNSX1ZJQV9MT05HSEFVTCwgbG9uZ2hhdWwtPnZhbCk7CisJbG9uZ2hhdWwtPmJpdHMuU29mdEJ1c1JhdGlvID0gY2xvY2tfcmF0aW9faW5kZXggJiAweGY7CisJbG9uZ2hhdWwtPmJpdHMuU29mdEJ1c1JhdGlvNCA9IChjbG9ja19yYXRpb19pbmRleCAmIDB4MTApID4+IDQ7CisJbG9uZ2hhdWwtPmJpdHMuRW5hYmxlU29mdEJ1c1JhdGlvID0gMTsKKwlsb25naGF1bC0+Yml0cy5SZXZpc2lvbktleSA9IDA7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwl3cm1zcmwoTVNSX1ZJQV9MT05HSEFVTCwgbG9uZ2hhdWwtPnZhbCk7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworCV9faGx0KCk7CisKKwlyZG1zcmwoTVNSX1ZJQV9MT05HSEFVTCwgbG9uZ2hhdWwtPnZhbCk7CisJbG9uZ2hhdWwtPmJpdHMuRW5hYmxlU29mdEJ1c1JhdGlvID0gMDsKKwlsb25naGF1bC0+Yml0cy5SZXZpc2lvbktleSA9IHZlcnNpb247CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwl3cm1zcmwoTVNSX1ZJQV9MT05HSEFVTCwgbG9uZ2hhdWwtPnZhbCk7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworfQorCisvKioKKyAqIGxvbmdoYXVsX3NldF9jcHVfZnJlcXVlbmN5KCkKKyAqIEBjbG9ja19yYXRpb19pbmRleCA6IGJpdHBhdHRlcm4gb2YgdGhlIG5ldyBtdWx0aXBsaWVyLgorICoKKyAqIFNldHMgYSBuZXcgY2xvY2sgcmF0aW8uCisgKi8KKworc3RhdGljIHZvaWQgbG9uZ2hhdWxfc2V0c3RhdGUodW5zaWduZWQgaW50IGNsb2NrX3JhdGlvX2luZGV4KQoreworCWludCBzcGVlZCwgbXVsdDsKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyBmcmVxczsKKwl1bmlvbiBtc3JfbG9uZ2hhdWwgbG9uZ2hhdWw7CisJdW5pb24gbXNyX2JjcjIgYmNyMjsKKwlzdGF0aWMgdW5zaWduZWQgaW50IG9sZF9yYXRpbz0tMTsKKworCWlmIChvbGRfcmF0aW8gPT0gY2xvY2tfcmF0aW9faW5kZXgpCisJCXJldHVybjsKKwlvbGRfcmF0aW8gPSBjbG9ja19yYXRpb19pbmRleDsKKworCW11bHQgPSBjbG9ja19yYXRpb1tjbG9ja19yYXRpb19pbmRleF07CisJaWYgKG11bHQgPT0gLTEpCisJCXJldHVybjsKKworCXNwZWVkID0gY2FsY19zcGVlZChtdWx0KTsKKwlpZiAoKHNwZWVkID4gaGlnaGVzdF9zcGVlZCkgfHwgKHNwZWVkIDwgbG93ZXN0X3NwZWVkKSkKKwkJcmV0dXJuOworCisJZnJlcXMub2xkID0gY2FsY19zcGVlZChsb25naGF1bF9nZXRfY3B1X211bHQoKSk7CisJZnJlcXMubmV3ID0gc3BlZWQ7CisJZnJlcXMuY3B1ID0gMDsgLyogbG9uZ2hhdWwuYyBpcyBVUCBvbmx5IGRyaXZlciAqLworCisJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUFJFQ0hBTkdFKTsKKworCWRwcmludGsgKCJTZXR0aW5nIHRvIEZTQjolZE1IeiBNdWx0OiVkLiVkeCAoJXMpXG4iLAorCQkJZnNiLCBtdWx0LzEwLCBtdWx0JTEwLCBwcmludF9zcGVlZChzcGVlZC8xMDAwKSk7CisKKwlzd2l0Y2ggKGxvbmdoYXVsX3ZlcnNpb24pIHsKKworCS8qCisJICogTG9uZ2hhdWwgdjEuIChTYW11ZWxbQzVBXSBhbmQgU2FtdWVsMiBzdGVwcGluZyAwW0M1Ql0pCisJICogU29mdHdhcmUgY29udHJvbGxlZCBtdWx0aXBsaWVycyBvbmx5LgorCSAqCisJICogKk5CKiBVbnRpbCB3ZSBnZXQgdm9sdGFnZSBzY2FsaW5nIHdvcmtpbmcgdjEgJiB2MiBhcmUgdGhlIHNhbWUgY29kZS4KKwkgKiBMb25naGF1bCB2MiBhcHBlYXJzIGluIFNhbXVlbDIgU3RlcHBpbmdzIDEtPjcgW0M1Yl0gYW5kIEV6cmEgW0M1Q10KKwkgKi8KKwljYXNlIFRZUEVfTE9OR0hBVUxfVjE6CisJY2FzZSBUWVBFX0xPTkdIQVVMX1YyOgorCQlyZG1zcmwgKE1TUl9WSUFfQkNSMiwgYmNyMi52YWwpOworCQkvKiBFbmFibGUgc29mdHdhcmUgY2xvY2sgbXVsdGlwbGllciAqLworCQliY3IyLmJpdHMuRVNPRlRCRiA9IDE7CisJCWJjcjIuYml0cy5DTE9DS01VTCA9IGNsb2NrX3JhdGlvX2luZGV4OworCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQl3cm1zcmwgKE1TUl9WSUFfQkNSMiwgYmNyMi52YWwpOworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwkJX19obHQoKTsKKworCQkvKiBEaXNhYmxlIHNvZnR3YXJlIGNsb2NrIG11bHRpcGxpZXIgKi8KKwkJcmRtc3JsIChNU1JfVklBX0JDUjIsIGJjcjIudmFsKTsKKwkJYmNyMi5iaXRzLkVTT0ZUQkYgPSAwOworCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQl3cm1zcmwgKE1TUl9WSUFfQkNSMiwgYmNyMi52YWwpOworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJCWJyZWFrOworCisJLyoKKwkgKiBMb25naGF1bCB2MyAoYWthIFBvd2Vyc2F2ZXIpLiAoRXpyYS1UIFtDNU1dICYgTmVoZW1pYWggW0M1Tl0pCisJICogV2UgY2FuIHNjYWxlIHZvbHRhZ2Ugd2l0aCB0aGlzIHRvbywgYnV0IHRoYXQncyBjdXJyZW50bHkKKwkgKiBkaXNhYmxlZCB1bnRpbCB3ZSBjb21lIHVwIHdpdGggYSBkZWNlbnQgJ21hdGNoIGZyZXEgdG8gdm9sdGFnZScKKwkgKiBhbGdvcml0aG0uCisJICogV2hlbiB3ZSBhZGQgdm9sdGFnZSBzY2FsaW5nLCB3ZSB3aWxsIGFsc28gbmVlZCB0byBkbyB0aGUKKwkgKiB2b2x0YWdlL2ZyZXEgc2V0dGluZyBpbiBvcmRlciBkZXBlbmRpbmcgb24gdGhlIGRpcmVjdGlvbgorCSAqIG9mIHNjYWxpbmcgKGxpa2Ugd2UgZG8gaW4gcG93ZXJub3ctazcuYykKKwkgKiBOZWhlbWlhaCBjYW4gZG8gRlNCIHNjYWxpbmcgdG9vLCBidXQgdGhpcyBoYXMgbmV2ZXIgYmVlbiBwcm92ZW4KKwkgKiB0byB3b3JrIGluIHByYWN0aWNlLgorCSAqLworCWNhc2UgVFlQRV9QT1dFUlNBVkVSOgorCQlkb19wb3dlcnNhdmVyKCZsb25naGF1bCwgY2xvY2tfcmF0aW9faW5kZXgpOworCQlicmVhazsKKwl9CisKKwljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QT1NUQ0hBTkdFKTsKK30KKworLyoKKyAqIENlbnRhdXIgZGVjaWRlZCB0byBtYWtlIGxpZmUgYSBsaXR0bGUgbW9yZSB0cmlja3kuCisgKiBPbmx5IGxvbmdoYXVsIHYxIGlzIGFsbG93ZWQgdG8gcmVhZCBFQkxDUiBCU0VMWzA6MV0uCisgKiBTYW11ZWwyIGFuZCBhYm92ZSBoYXZlIHRvIHRyeSBhbmQgZ3Vlc3Mgd2hhdCB0aGUgRlNCIGlzLgorICogV2UgZG8gdGhpcyBieSBhc3N1bWluZyB3ZSBib290ZWQgYXQgbWF4aW11bSBtdWx0aXBsaWVyLCBhbmQgaW50ZXJwb2xhdGUKKyAqIGJldHdlZW4gdGhhdCB2YWx1ZSBtdWx0aXBsaWVkIGJ5IHBvc3NpYmxlIEZTQnMgYW5kIGNwdV9taHogd2hpY2gKKyAqIHdhcyBjYWxjdWxhdGVkIGF0IGJvb3QgdGltZS4gUmVhbGx5IHVnbHksIGJ1dCBubyBvdGhlciB3YXkgdG8gZG8gdGhpcy4KKyAqLworCisjZGVmaW5lIFJPVU5ESU5HCTB4ZgorCitzdGF0aWMgaW50IF9ndWVzcyhpbnQgZ3Vlc3MpCit7CisJaW50IHRhcmdldDsKKworCXRhcmdldCA9ICgobWF4bXVsdC8xMCkqZ3Vlc3MpOworCWlmIChtYXhtdWx0JTEwICE9IDApCisJCXRhcmdldCArPSAoZ3Vlc3MvMik7CisJdGFyZ2V0ICs9IFJPVU5ESU5HLzI7CisJdGFyZ2V0ICY9IH5ST1VORElORzsKKwlyZXR1cm4gdGFyZ2V0OworfQorCisKK3N0YXRpYyBpbnQgZ3Vlc3NfZnNiKHZvaWQpCit7CisJaW50IHNwZWVkID0gKGNwdV9raHovMTAwMCk7CisJaW50IGk7CisJaW50IHNwZWVkc1szXSA9IHsgNjYsIDEwMCwgMTMzIH07CisKKwlzcGVlZCArPSBST1VORElORy8yOworCXNwZWVkICY9IH5ST1VORElORzsKKworCWZvciAoaT0wOyBpPDM7IGkrKykgeworCQlpZiAoX2d1ZXNzKHNwZWVkc1tpXSkgPT0gc3BlZWQpCisJCQlyZXR1cm4gc3BlZWRzW2ldOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IF9faW5pdCBsb25naGF1bF9nZXRfcmFuZ2VzKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBpbnZhbHVlOworCXVuc2lnbmVkIGludCBtdWx0aXBsaWVyc1szMl09IHsKKwkJNTAsMzAsNDAsMTAwLDU1LDM1LDQ1LDk1LDkwLDcwLDgwLDYwLDEyMCw3NSw4NSw2NSwKKwkJLTEsMTEwLDEyMCwtMSwxMzUsMTE1LDEyNSwxMDUsMTMwLDE1MCwxNjAsMTQwLC0xLDE1NSwtMSwxNDUgfTsKKwl1bnNpZ25lZCBpbnQgaiwgayA9IDA7CisJdW5pb24gbXNyX2xvbmdoYXVsIGxvbmdoYXVsOworCXVuc2lnbmVkIGxvbmcgbG8sIGhpOworCXVuc2lnbmVkIGludCBlYmxjcl9mc2JfdGFibGVfdjFbXSA9IHsgNjYsIDEzMywgMTAwLCAtMSB9OworCXVuc2lnbmVkIGludCBlYmxjcl9mc2JfdGFibGVfdjJbXSA9IHsgMTMzLCAxMDAsIC0xLCA2NiB9OworCisJc3dpdGNoIChsb25naGF1bF92ZXJzaW9uKSB7CisJY2FzZSBUWVBFX0xPTkdIQVVMX1YxOgorCWNhc2UgVFlQRV9MT05HSEFVTF9WMjoKKwkJLyogVWdoLCBMb25naGF1bCB2MSBkaWRuJ3QgaGF2ZSB0aGUgbWluL21heCBNU1JzLgorCQkgICBBc3N1bWUgbWluPTMuMHggJiBtYXggPSB3aGF0ZXZlciB3ZSBib290ZWQgYXQuICovCisJCW1pbm11bHQgPSAzMDsKKwkJbWF4bXVsdCA9IGxvbmdoYXVsX2dldF9jcHVfbXVsdCgpOworCQlyZG1zciAoTVNSX0lBMzJfRUJMX0NSX1BPV0VST04sIGxvLCBoaSk7CisJCWludmFsdWUgPSAobG8gJiAoMTw8MTh8MTw8MTkpKSA+PjE4OworCQlpZiAoY3B1X21vZGVsPT1DUFVfU0FNVUVMIHx8IGNwdV9tb2RlbD09Q1BVX1NBTVVFTDIpCisJCQlmc2IgPSBlYmxjcl9mc2JfdGFibGVfdjFbaW52YWx1ZV07CisJCWVsc2UKKwkJCWZzYiA9IGd1ZXNzX2ZzYigpOworCQlicmVhazsKKworCWNhc2UgVFlQRV9QT1dFUlNBVkVSOgorCQkvKiBFenJhLVQgKi8KKwkJaWYgKGNwdV9tb2RlbD09Q1BVX0VaUkFfVCkgeworCQkJcmRtc3JsIChNU1JfVklBX0xPTkdIQVVMLCBsb25naGF1bC52YWwpOworCQkJaW52YWx1ZSA9IGxvbmdoYXVsLmJpdHMuTWF4TUh6QlI7CisJCQlpZiAobG9uZ2hhdWwuYml0cy5NYXhNSHpCUjQpCisJCQkJaW52YWx1ZSArPSAxNjsKKwkJCW1heG11bHQ9bXVsdGlwbGllcnNbaW52YWx1ZV07CisKKwkJCWludmFsdWUgPSBsb25naGF1bC5iaXRzLk1pbk1IekJSOworCQkJaWYgKGxvbmdoYXVsLmJpdHMuTWluTUh6QlI0ID09IDEpCisJCQkJbWlubXVsdCA9IDMwOworCQkJZWxzZQorCQkJCW1pbm11bHQgPSBtdWx0aXBsaWVyc1tpbnZhbHVlXTsKKwkJCWZzYiA9IGVibGNyX2ZzYl90YWJsZV92Mltsb25naGF1bC5iaXRzLk1heE1IekZTQl07CisJCQlicmVhazsKKwkJfQorCisJCS8qIE5laGVtaWFoICovCisJCWlmIChjcHVfbW9kZWw9PUNQVV9ORUhFTUlBSCkgeworCQkJcmRtc3JsIChNU1JfVklBX0xPTkdIQVVMLCBsb25naGF1bC52YWwpOworCisJCQkvKgorCQkJICogVE9ETzogVGhpcyBjb2RlIHdvcmtzLCBidXQgcmFpc2VzIGEgbG90IG9mIHF1ZXN0aW9ucy4KKwkJCSAqIC0gU29tZSBOZWhlbWlhaCdzIHNlZW0gdG8gaGF2ZSBicm9rZW4gTWluL01heE1IekJSJ3MuCisJCQkgKiAgIFdlIGdldCBhcm91bmQgdGhpcyBieSB1c2luZyBhIGhhcmRjb2RlZCBtdWx0aXBsaWVyIG9mIDQuMHgKKwkJCSAqICAgZm9yIHRoZSBtaW5pbWltdW0gc3BlZWQsIGFuZCB0aGUgc3BlZWQgd2UgYm9vdGVkIHVwIGF0IGZvciB0aGUgbWF4LgorCQkJICogICBUaGlzIGlzIGRvbmUgaW4gbG9uZ2hhdWxfZ2V0X2NwdV9tdWx0KCkgYnkgcmVhZGluZyB0aGUgRUJMQ1IgcmVnaXN0ZXIuCisJCQkgKiAtIEFjY29yZGluZyB0byBzb21lIFZJQSBkb2N1bWVudGF0aW9uIEVCTENSIGlzIG9ubHkKKwkJCSAqICAgaW4gcHJlLU5laGVtaWFoIEMzcy4gSG93IHRoaXMgc3RpbGwgd29ya3MgaXMgYSBteXN0ZXJ5LgorCQkJICogICBXZSdyZSBwb3NzaWJseSB1c2luZyBzb21ldGhpbmcgdW5kb2N1bWVudGVkIGFuZCB1bnN1cHBvcnRlZCwKKwkJCSAqICAgQnV0IGl0IHdvcmtzLCBzbyB3ZSBkb24ndCBncnVtYmxlLgorCQkJICovCisJCQltaW5tdWx0PTQwOworCQkJbWF4bXVsdD1sb25naGF1bF9nZXRfY3B1X211bHQoKTsKKworCQkJLyogU3RhcnRpbmcgd2l0aCB0aGUgMS4yR0h6IHBhcnRzLCB0aGVyZXMgYSAyMDBNSHogYnVzLiAqLworCQkJaWYgKChjcHVfa2h6LzEwMDApID4gMTIwMCkKKwkJCQlmc2IgPSAyMDA7CisJCQllbHNlCisJCQkJZnNiID0gZWJsY3JfZnNiX3RhYmxlX3YyW2xvbmdoYXVsLmJpdHMuTWF4TUh6RlNCXTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJZHByaW50ayAoIk1pbk11bHQ6JWQuJWR4IE1heE11bHQ6JWQuJWR4XG4iLAorCQkgbWlubXVsdC8xMCwgbWlubXVsdCUxMCwgbWF4bXVsdC8xMCwgbWF4bXVsdCUxMCk7CisKKwlpZiAoZnNiID09IC0xKSB7CisJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiSW52YWxpZCAocmVzZXJ2ZWQpIEZTQiFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwloaWdoZXN0X3NwZWVkID0gY2FsY19zcGVlZChtYXhtdWx0KTsKKwlsb3dlc3Rfc3BlZWQgPSBjYWxjX3NwZWVkKG1pbm11bHQpOworCWRwcmludGsgKCJGU0I6JWRNSHogIExvd2VzdCBzcGVlZDogJXMgICBIaWdoZXN0IHNwZWVkOiVzXG4iLCBmc2IsCisJCSBwcmludF9zcGVlZChsb3dlc3Rfc3BlZWQvMTAwMCksIAorCQkgcHJpbnRfc3BlZWQoaGlnaGVzdF9zcGVlZC8xMDAwKSk7CisKKwlpZiAobG93ZXN0X3NwZWVkID09IGhpZ2hlc3Rfc3BlZWQpIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJoaWdoZXN0c3BlZWQgPT0gbG93ZXN0LCBhYm9ydGluZy5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGxvd2VzdF9zcGVlZCA+IGhpZ2hlc3Rfc3BlZWQpIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJub25zZW5zZSEgbG93ZXN0ICglZCA+ICVkKSAhXG4iLAorCQkJbG93ZXN0X3NwZWVkLCBoaWdoZXN0X3NwZWVkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbG9uZ2hhdWxfdGFibGUgPSBrbWFsbG9jKChudW1zY2FsZXMgKyAxKSAqIHNpemVvZihzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUpLCBHRlBfS0VSTkVMKTsKKwlpZighbG9uZ2hhdWxfdGFibGUpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChqPTA7IGogPCBudW1zY2FsZXM7IGorKykgeworCQl1bnNpZ25lZCBpbnQgcmF0aW87CisJCXJhdGlvID0gY2xvY2tfcmF0aW9bal07CisJCWlmIChyYXRpbyA9PSAtMSkKKwkJCWNvbnRpbnVlOworCQlpZiAocmF0aW8gPiBtYXhtdWx0IHx8IHJhdGlvIDwgbWlubXVsdCkKKwkJCWNvbnRpbnVlOworCQlsb25naGF1bF90YWJsZVtrXS5mcmVxdWVuY3kgPSBjYWxjX3NwZWVkKHJhdGlvKTsKKwkJbG9uZ2hhdWxfdGFibGVba10uaW5kZXgJPSBqOworCQlrKys7CisJfQorCisJbG9uZ2hhdWxfdGFibGVba10uZnJlcXVlbmN5ID0gQ1BVRlJFUV9UQUJMRV9FTkQ7CisJaWYgKCFrKSB7CisJCWtmcmVlIChsb25naGF1bF90YWJsZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIF9faW5pdCBsb25naGF1bF9zZXR1cF92b2x0YWdlc2NhbGluZyh2b2lkKQoreworCXVuaW9uIG1zcl9sb25naGF1bCBsb25naGF1bDsKKworCXJkbXNybCAoTVNSX1ZJQV9MT05HSEFVTCwgbG9uZ2hhdWwudmFsKTsKKworCWlmICghKGxvbmdoYXVsLmJpdHMuUmV2aXNpb25JRCAmIDEpKQorCQlyZXR1cm47CisKKwltaW52aWQgPSBsb25naGF1bC5iaXRzLk1pbmltdW1WSUQ7CisJbWF4dmlkID0gbG9uZ2hhdWwuYml0cy5NYXhpbXVtVklEOworCXZybXJldiA9IGxvbmdoYXVsLmJpdHMuVlJNUmV2OworCisJaWYgKG1pbnZpZCA9PSAwIHx8IG1heHZpZCA9PSAwKSB7CisJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiQm9ndXMgdmFsdWVzIE1pbjolZC4lMDNkIE1heDolZC4lMDNkLiAiCisJCQkJCSJWb2x0YWdlIHNjYWxpbmcgZGlzYWJsZWQuXG4iLAorCQkJCQltaW52aWQvMTAwMCwgbWludmlkJTEwMDAsIG1heHZpZC8xMDAwLCBtYXh2aWQlMTAwMCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAobWludmlkID09IG1heHZpZCkgeworCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIkNsYWltcyB0byBzdXBwb3J0IHZvbHRhZ2Ugc2NhbGluZyBidXQgbWluICYgbWF4IGFyZSAiCisJCQkJImJvdGggJWQuJTAzZC4gVm9sdGFnZSBzY2FsaW5nIGRpc2FibGVkXG4iLAorCQkJCW1heHZpZC8xMDAwLCBtYXh2aWQlMTAwMCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAodnJtcmV2PT0wKSB7CisJCWRwcmludGsgKCJWUk0gOC41IFxuIik7CisJCW1lbWNweSAodm9sdGFnZV90YWJsZSwgdnJtODVzY2FsZXMsIHNpemVvZih2b2x0YWdlX3RhYmxlKSk7CisJCW51bXZzY2FsZXMgPSAodm9sdGFnZV90YWJsZVttYXh2aWRdLXZvbHRhZ2VfdGFibGVbbWludmlkXSkvMjU7CisJfSBlbHNlIHsKKwkJZHByaW50ayAoIk1vYmlsZSBWUk0gXG4iKTsKKwkJbWVtY3B5ICh2b2x0YWdlX3RhYmxlLCBtb2JpbGV2cm1zY2FsZXMsIHNpemVvZih2b2x0YWdlX3RhYmxlKSk7CisJCW51bXZzY2FsZXMgPSAodm9sdGFnZV90YWJsZVttYXh2aWRdLXZvbHRhZ2VfdGFibGVbbWludmlkXSkvNTsKKwl9CisKKwkvKiBDdXJyZW50IHZvbHRhZ2UgaXNuJ3QgcmVhZGFibGUgYXQgZmlyc3QsIHNvIHdlIG5lZWQgdG8KKwkgICBzZXQgaXQgdG8gYSBrbm93biB2YWx1ZS4gVGhlIHNwZWMgc2F5cyB0byB1c2UgbWF4dmlkICovCisJbG9uZ2hhdWwuYml0cy5SZXZpc2lvbktleSA9IGxvbmdoYXVsLmJpdHMuUmV2aXNpb25JRDsJLyogRklYTUU6IFRoaXMgaXMgYmFkLiAqLworCWxvbmdoYXVsLmJpdHMuRW5hYmxlU29mdFZJRCA9IDE7CisJbG9uZ2hhdWwuYml0cy5Tb2Z0VklEID0gbWF4dmlkOworCXdybXNybCAoTVNSX1ZJQV9MT05HSEFVTCwgbG9uZ2hhdWwudmFsKTsKKworCW1pbnZpZCA9IHZvbHRhZ2VfdGFibGVbbWludmlkXTsKKwltYXh2aWQgPSB2b2x0YWdlX3RhYmxlW21heHZpZF07CisKKwlkcHJpbnRrICgiTWluIFZJRD0lZC4lMDNkIE1heCBWSUQ9JWQuJTAzZCwgJWQgcG9zc2libGUgdm9sdGFnZSBzY2FsZXNcbiIsCisJCW1heHZpZC8xMDAwLCBtYXh2aWQlMTAwMCwgbWludmlkLzEwMDAsIG1pbnZpZCUxMDAwLCBudW12c2NhbGVzKTsKKworCWNhbl9zY2FsZV92b2x0YWdlID0gMTsKK30KKworCitzdGF0aWMgaW50IGxvbmdoYXVsX3ZlcmlmeShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwlyZXR1cm4gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdmVyaWZ5KHBvbGljeSwgbG9uZ2hhdWxfdGFibGUpOworfQorCisKK3N0YXRpYyBpbnQgbG9uZ2hhdWxfdGFyZ2V0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAorCQkJICAgIHVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwgdW5zaWduZWQgaW50IHJlbGF0aW9uKQoreworCXVuc2lnbmVkIGludCB0YWJsZV9pbmRleCA9IDA7CisJdW5zaWduZWQgaW50IG5ld19jbG9ja19yYXRpbyA9IDA7CisKKwlpZiAoY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdGFyZ2V0KHBvbGljeSwgbG9uZ2hhdWxfdGFibGUsIHRhcmdldF9mcmVxLCByZWxhdGlvbiwgJnRhYmxlX2luZGV4KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwluZXdfY2xvY2tfcmF0aW8gPSBsb25naGF1bF90YWJsZVt0YWJsZV9pbmRleF0uaW5kZXggJiAweEZGOworCisJbG9uZ2hhdWxfc2V0c3RhdGUobmV3X2Nsb2NrX3JhdGlvKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbG9uZ2hhdWxfZ2V0KHVuc2lnbmVkIGludCBjcHUpCit7CisJaWYgKGNwdSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGNhbGNfc3BlZWQobG9uZ2hhdWxfZ2V0X2NwdV9tdWx0KCkpOworfQorCisKK3N0YXRpYyBpbnQgX19pbml0IGxvbmdoYXVsX2NwdV9pbml0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9IGNwdV9kYXRhOworCWNoYXIgKmNwdW5hbWU9TlVMTDsKKwlpbnQgcmV0OworCisJc3dpdGNoIChjLT54ODZfbW9kZWwpIHsKKwljYXNlIDY6CisJCWNwdV9tb2RlbCA9IENQVV9TQU1VRUw7CisJCWNwdW5hbWUgPSAiQzMgJ1NhbXVlbCcgW0M1QV0iOworCQlsb25naGF1bF92ZXJzaW9uID0gVFlQRV9MT05HSEFVTF9WMTsKKwkJbWVtY3B5IChjbG9ja19yYXRpbywgc2FtdWVsMV9jbG9ja19yYXRpbywgc2l6ZW9mKHNhbXVlbDFfY2xvY2tfcmF0aW8pKTsKKwkJbWVtY3B5IChlYmxjcl90YWJsZSwgc2FtdWVsMV9lYmxjciwgc2l6ZW9mKHNhbXVlbDFfZWJsY3IpKTsKKwkJYnJlYWs7CisKKwljYXNlIDc6CisJCWxvbmdoYXVsX3ZlcnNpb24gPSBUWVBFX0xPTkdIQVVMX1YxOworCQlzd2l0Y2ggKGMtPng4Nl9tYXNrKSB7CisJCWNhc2UgMDoKKwkJCWNwdV9tb2RlbCA9IENQVV9TQU1VRUwyOworCQkJY3B1bmFtZSA9ICJDMyAnU2FtdWVsIDInIFtDNUJdIjsKKwkJCS8qIE5vdGUsIHRoaXMgaXMgbm90IGEgdHlwbywgZWFybHkgU2FtdWVsMidzIGhhZCBTYW11ZWwxIHJhdGlvcy4gKi8KKwkJCW1lbWNweSAoY2xvY2tfcmF0aW8sIHNhbXVlbDFfY2xvY2tfcmF0aW8sIHNpemVvZihzYW11ZWwxX2Nsb2NrX3JhdGlvKSk7CisJCQltZW1jcHkgKGVibGNyX3RhYmxlLCBzYW11ZWwyX2VibGNyLCBzaXplb2Yoc2FtdWVsMl9lYmxjcikpOworCQkJYnJlYWs7CisJCWNhc2UgMSAuLi4gMTU6CisJCQlpZiAoYy0+eDg2X21hc2sgPCA4KSB7CisJCQkJY3B1X21vZGVsID0gQ1BVX1NBTVVFTDI7CisJCQkJY3B1bmFtZSA9ICJDMyAnU2FtdWVsIDInIFtDNUJdIjsKKwkJCX0gZWxzZSB7CisJCQkJY3B1X21vZGVsID0gQ1BVX0VaUkE7CisJCQkJY3B1bmFtZSA9ICJDMyAnRXpyYScgW0M1Q10iOworCQkJfQorCQkJbWVtY3B5IChjbG9ja19yYXRpbywgZXpyYV9jbG9ja19yYXRpbywgc2l6ZW9mKGV6cmFfY2xvY2tfcmF0aW8pKTsKKwkJCW1lbWNweSAoZWJsY3JfdGFibGUsIGV6cmFfZWJsY3IsIHNpemVvZihlenJhX2VibGNyKSk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgODoKKwkJY3B1X21vZGVsID0gQ1BVX0VaUkFfVDsKKwkJY3B1bmFtZSA9ICJDMyAnRXpyYS1UJyBbQzVNXSI7CisJCWxvbmdoYXVsX3ZlcnNpb24gPSBUWVBFX1BPV0VSU0FWRVI7CisJCW51bXNjYWxlcz0zMjsKKwkJbWVtY3B5IChjbG9ja19yYXRpbywgZXpyYXRfY2xvY2tfcmF0aW8sIHNpemVvZihlenJhdF9jbG9ja19yYXRpbykpOworCQltZW1jcHkgKGVibGNyX3RhYmxlLCBlenJhdF9lYmxjciwgc2l6ZW9mKGV6cmF0X2VibGNyKSk7CisJCWJyZWFrOworCisJY2FzZSA5OgorCQljcHVfbW9kZWwgPSBDUFVfTkVIRU1JQUg7CisJCWxvbmdoYXVsX3ZlcnNpb24gPSBUWVBFX1BPV0VSU0FWRVI7CisJCW51bXNjYWxlcz0zMjsKKwkJc3dpdGNoIChjLT54ODZfbWFzaykgeworCQljYXNlIDAgLi4uIDE6CisJCQljcHVuYW1lID0gIkMzICdOZWhlbWlhaCBBJyBbQzVOXSI7CisJCQltZW1jcHkgKGNsb2NrX3JhdGlvLCBuZWhlbWlhaF9hX2Nsb2NrX3JhdGlvLCBzaXplb2YobmVoZW1pYWhfYV9jbG9ja19yYXRpbykpOworCQkJbWVtY3B5IChlYmxjcl90YWJsZSwgbmVoZW1pYWhfYV9lYmxjciwgc2l6ZW9mKG5laGVtaWFoX2FfZWJsY3IpKTsKKwkJCWJyZWFrOworCQljYXNlIDIgLi4uIDQ6CisJCQljcHVuYW1lID0gIkMzICdOZWhlbWlhaCBCJyBbQzVOXSI7CisJCQltZW1jcHkgKGNsb2NrX3JhdGlvLCBuZWhlbWlhaF9iX2Nsb2NrX3JhdGlvLCBzaXplb2YobmVoZW1pYWhfYl9jbG9ja19yYXRpbykpOworCQkJbWVtY3B5IChlYmxjcl90YWJsZSwgbmVoZW1pYWhfYl9lYmxjciwgc2l6ZW9mKG5laGVtaWFoX2JfZWJsY3IpKTsKKwkJCWJyZWFrOworCQljYXNlIDUgLi4uIDE1OgorCQkJY3B1bmFtZSA9ICJDMyAnTmVoZW1pYWggQycgW0M1Tl0iOworCQkJbWVtY3B5IChjbG9ja19yYXRpbywgbmVoZW1pYWhfY19jbG9ja19yYXRpbywgc2l6ZW9mKG5laGVtaWFoX2NfY2xvY2tfcmF0aW8pKTsKKwkJCW1lbWNweSAoZWJsY3JfdGFibGUsIG5laGVtaWFoX2NfZWJsY3IsIHNpemVvZihuZWhlbWlhaF9jX2VibGNyKSk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWNwdW5hbWUgPSAiVW5rbm93biI7CisJCWJyZWFrOworCX0KKworCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiVklBICVzIENQVSBkZXRlY3RlZC4gICIsIGNwdW5hbWUpOworCXN3aXRjaCAobG9uZ2hhdWxfdmVyc2lvbikgeworCWNhc2UgVFlQRV9MT05HSEFVTF9WMToKKwljYXNlIFRZUEVfTE9OR0hBVUxfVjI6CisJCXByaW50ayAoIkxvbmdoYXVsIHYlZCBzdXBwb3J0ZWQuXG4iLCBsb25naGF1bF92ZXJzaW9uKTsKKwkJYnJlYWs7CisJY2FzZSBUWVBFX1BPV0VSU0FWRVI6CisJCXByaW50ayAoIlBvd2Vyc2F2ZXIgc3VwcG9ydGVkLlxuIik7CisJCWJyZWFrOworCX07CisKKwlyZXQgPSBsb25naGF1bF9nZXRfcmFuZ2VzKCk7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKChsb25naGF1bF92ZXJzaW9uPT1UWVBFX0xPTkdIQVVMX1YyIHx8IGxvbmdoYXVsX3ZlcnNpb249PVRZUEVfUE9XRVJTQVZFUikgJiYKKwkJIChkb250X3NjYWxlX3ZvbHRhZ2U9PTApKQorCQlsb25naGF1bF9zZXR1cF92b2x0YWdlc2NhbGluZygpOworCisJcG9saWN5LT5nb3Zlcm5vciA9IENQVUZSRVFfREVGQVVMVF9HT1ZFUk5PUjsKKwlwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID0gQ1BVRlJFUV9FVEVSTkFMOworCXBvbGljeS0+Y3VyID0gY2FsY19zcGVlZChsb25naGF1bF9nZXRfY3B1X211bHQoKSk7CisKKwlyZXQgPSBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9jcHVpbmZvKHBvbGljeSwgbG9uZ2hhdWxfdGFibGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9nZXRfYXR0cihsb25naGF1bF90YWJsZSwgcG9saWN5LT5jcHUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGxvbmdoYXVsX2NwdV9leGl0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3B1dF9hdHRyKHBvbGljeS0+Y3B1KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmcmVxX2F0dHIqIGxvbmdoYXVsX2F0dHJbXSA9IHsKKwkmY3B1ZnJlcV9mcmVxX2F0dHJfc2NhbGluZ19hdmFpbGFibGVfZnJlcXMsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIgbG9uZ2hhdWxfZHJpdmVyID0geworCS52ZXJpZnkJPSBsb25naGF1bF92ZXJpZnksCisJLnRhcmdldAk9IGxvbmdoYXVsX3RhcmdldCwKKwkuZ2V0CT0gbG9uZ2hhdWxfZ2V0LAorCS5pbml0CT0gbG9uZ2hhdWxfY3B1X2luaXQsCisJLmV4aXQJPSBfX2RldmV4aXRfcChsb25naGF1bF9jcHVfZXhpdCksCisJLm5hbWUJPSAibG9uZ2hhdWwiLAorCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCS5hdHRyCT0gbG9uZ2hhdWxfYXR0ciwKK307CisKKworc3RhdGljIGludCBfX2luaXQgbG9uZ2hhdWxfaW5pdCh2b2lkKQoreworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9IGNwdV9kYXRhOworCisJaWYgKGMtPng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9DRU5UQVVSIHx8IGMtPng4NiAhPSA2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXN3aXRjaCAoYy0+eDg2X21vZGVsKSB7CisJY2FzZSA2IC4uLiA5OgorCQlyZXR1cm4gY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJmxvbmdoYXVsX2RyaXZlcik7CisJZGVmYXVsdDoKKwkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJVbmtub3duIFZJQSBDUFUuIENvbnRhY3QgZGF2ZWpAY29kZW1vbmtleS5vcmcudWtcbiIpOworCX0KKworCXJldHVybiAtRU5PREVWOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBsb25naGF1bF9leGl0KHZvaWQpCit7CisJaW50IGk9MDsKKworCWZvciAoaT0wOyBpIDwgbnVtc2NhbGVzOyBpKyspIHsKKwkJaWYgKGNsb2NrX3JhdGlvW2ldID09IG1heG11bHQpIHsKKwkJCWxvbmdoYXVsX3NldHN0YXRlKGkpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwljcHVmcmVxX3VucmVnaXN0ZXJfZHJpdmVyKCZsb25naGF1bF9kcml2ZXIpOworCWtmcmVlKGxvbmdoYXVsX3RhYmxlKTsKK30KKworbW9kdWxlX3BhcmFtIChkb250X3NjYWxlX3ZvbHRhZ2UsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRvbnRfc2NhbGVfdm9sdGFnZSwgIkRvbid0IHNjYWxlIHZvbHRhZ2Ugb2YgcHJvY2Vzc29yIik7CisKK01PRFVMRV9BVVRIT1IgKCJEYXZlIEpvbmVzIDxkYXZlakBjb2RlbW9ua2V5Lm9yZy51az4iKTsKK01PRFVMRV9ERVNDUklQVElPTiAoIkxvbmdoYXVsIGRyaXZlciBmb3IgVklBIEN5cml4IHByb2Nlc3NvcnMuIik7CitNT0RVTEVfTElDRU5TRSAoIkdQTCIpOworCittb2R1bGVfaW5pdChsb25naGF1bF9pbml0KTsKK21vZHVsZV9leGl0KGxvbmdoYXVsX2V4aXQpOworCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2xvbmdoYXVsLmggYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2xvbmdoYXVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE0OTVjMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuaApAQCAtMCwwICsxLDQ2NiBAQAorLyoKKyAqICBsb25naGF1bC5oCisgKiAgKEMpIDIwMDMgRGF2ZSBKb25lcy4KKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyLgorICoKKyAqICBWSUEtc3BlY2lmaWMgaW5mb3JtYXRpb24KKyAqLworCit1bmlvbiBtc3JfYmNyMiB7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgUmVzZXZlZDoxOSwJLy8gMTg6MAorCQlFU09GVEJGOjEsCQkvLyAxOQorCQlSZXNlcnZlZDI6MywJCS8vIDIyOjIwCisJCUNMT0NLTVVMOjQsCQkvLyAyNjoyMworCQlSZXNlcnZlZDM6NTsJCS8vIDMxOjI3CisJfSBiaXRzOworCXVuc2lnbmVkIGxvbmcgdmFsOworfTsKKwordW5pb24gbXNyX2xvbmdoYXVsIHsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBSZXZpc2lvbklEOjQsCS8vIDM6MAorCQlSZXZpc2lvbktleTo0LAkJLy8gNzo0CisJCUVuYWJsZVNvZnRCdXNSYXRpbzoxLAkvLyA4CisJCUVuYWJsZVNvZnRWSUQ6MSwJLy8gOQorCQlFbmFibGVTb2Z0QlNFTDoxLAkvLyAxMAorCQlSZXNlcnZlZDozLAkJLy8gMTE6MTMKKwkJU29mdEJ1c1JhdGlvNDoxLAkvLyAxNAorCQlWUk1SZXY6MSwJCS8vIDE1CisJCVNvZnRCdXNSYXRpbzo0LAkJLy8gMTk6MTYKKwkJU29mdFZJRDo1LAkJLy8gMjQ6MjAKKwkJUmVzZXJ2ZWQyOjMsCQkvLyAyNzoyNQorCQlTb2Z0QlNFTDoyLAkJLy8gMjk6MjgKKwkJUmVzZXJ2ZWQzOjIsCQkvLyAzMTozMAorCQlNYXhNSHpCUjo0LAkJLy8gMzU6MzIKKwkJTWF4aW11bVZJRDo1LAkJLy8gNDA6MzYKKwkJTWF4TUh6RlNCOjIsCQkvLyA0Mjo0MQorCQlNYXhNSHpCUjQ6MSwJCS8vIDQzCisJCVJlc2VydmVkNDo0LAkJLy8gNDc6NDQKKwkJTWluTUh6QlI6NCwJCS8vIDUxOjQ4CisJCU1pbmltdW1WSUQ6NSwJCS8vIDU2OjUyCisJCU1pbk1IekZTQjoyLAkJLy8gNTg6NTcKKwkJTWluTUh6QlI0OjEsCQkvLyA1OQorCQlSZXNlcnZlZDU6NDsJCS8vIDYzOjYwCisJfSBiaXRzOworCXVuc2lnbmVkIGxvbmcgbG9uZyB2YWw7Cit9OworCisvKgorICogQ2xvY2sgcmF0aW8gdGFibGVzLiBEaXYvTW9kIGJ5IDEwIHRvIGdldCByYXRpby4KKyAqIFRoZSBlYmxjciBvbmVzIHNwZWNpZnkgdGhlIHJhdGlvIHJlYWQgZnJvbSB0aGUgQ1BVLgorICogVGhlIGNsb2NrX3JhdGlvIG9uZXMgc3BlY2lmeSB3aGF0IHRvIHdyaXRlIHRvIHRoZSBDUFUuCisgKi8KKworLyoKKyAqIFZJQSBDMyBTYW11ZWwgMSAgJiBTYW11ZWwgMiAoc3RlcHBpbmcgMCkKKyAqLworc3RhdGljIGludCBfX2luaXRkYXRhIHNhbXVlbDFfY2xvY2tfcmF0aW9bMTZdID0geworCS0xLCAvKiAwMDAwIC0+IFJFU0VSVkVEICovCisJMzAsIC8qIDAwMDEgLT4gIDMuMHggKi8KKwk0MCwgLyogMDAxMCAtPiAgNC4weCAqLworCS0xLCAvKiAwMDExIC0+IFJFU0VSVkVEICovCisJLTEsIC8qIDAxMDAgLT4gUkVTRVJWRUQgKi8KKwkzNSwgLyogMDEwMSAtPiAgMy41eCAqLworCTQ1LCAvKiAwMTEwIC0+ICA0LjV4ICovCisJNTUsIC8qIDAxMTEgLT4gIDUuNXggKi8KKwk2MCwgLyogMTAwMCAtPiAgNi4weCAqLworCTcwLCAvKiAxMDAxIC0+ICA3LjB4ICovCisJODAsIC8qIDEwMTAgLT4gIDguMHggKi8KKwk1MCwgLyogMTAxMSAtPiAgNS4weCAqLworCTY1LCAvKiAxMTAwIC0+ICA2LjV4ICovCisJNzUsIC8qIDExMDEgLT4gIDcuNXggKi8KKwktMSwgLyogMTExMCAtPiBSRVNFUlZFRCAqLworCS0xLCAvKiAxMTExIC0+IFJFU0VSVkVEICovCit9OworCitzdGF0aWMgaW50IF9faW5pdGRhdGEgc2FtdWVsMV9lYmxjclsxNl0gPSB7CisJNTAsIC8qIDAwMDAgLT4gUkVTRVJWRUQgKi8KKwkzMCwgLyogMDAwMSAtPiAgMy4weCAqLworCTQwLCAvKiAwMDEwIC0+ICA0LjB4ICovCisJLTEsIC8qIDAwMTEgLT4gUkVTRVJWRUQgKi8KKwk1NSwgLyogMDEwMCAtPiAgNS41eCAqLworCTM1LCAvKiAwMTAxIC0+ICAzLjV4ICovCisJNDUsIC8qIDAxMTAgLT4gIDQuNXggKi8KKwktMSwgLyogMDExMSAtPiBSRVNFUlZFRCAqLworCS0xLCAvKiAxMDAwIC0+IFJFU0VSVkVEICovCisJNzAsIC8qIDEwMDEgLT4gIDcuMHggKi8KKwk4MCwgLyogMTAxMCAtPiAgOC4weCAqLworCTYwLCAvKiAxMDExIC0+ICA2LjB4ICovCisJLTEsIC8qIDExMDAgLT4gUkVTRVJWRUQgKi8KKwk3NSwgLyogMTEwMSAtPiAgNy41eCAqLworCS0xLCAvKiAxMTEwIC0+IFJFU0VSVkVEICovCisJNjUsIC8qIDExMTEgLT4gIDYuNXggKi8KK307CisKKy8qCisgKiBWSUEgQzMgU2FtdWVsMiBTdGVwcGluZyAxLT4xNQorICovCitzdGF0aWMgaW50IF9faW5pdGRhdGEgc2FtdWVsMl9lYmxjclsxNl0gPSB7CisJNTAsICAvKiAwMDAwIC0+ICA1LjB4ICovCisJMzAsICAvKiAwMDAxIC0+ICAzLjB4ICovCisJNDAsICAvKiAwMDEwIC0+ICA0LjB4ICovCisJMTAwLCAvKiAwMDExIC0+IDEwLjB4ICovCisJNTUsICAvKiAwMTAwIC0+ICA1LjV4ICovCisJMzUsICAvKiAwMTAxIC0+ICAzLjV4ICovCisJNDUsICAvKiAwMTEwIC0+ICA0LjV4ICovCisJMTEwLCAvKiAwMTExIC0+IDExLjB4ICovCisJOTAsICAvKiAxMDAwIC0+ICA5LjB4ICovCisJNzAsICAvKiAxMDAxIC0+ICA3LjB4ICovCisJODAsICAvKiAxMDEwIC0+ICA4LjB4ICovCisJNjAsICAvKiAxMDExIC0+ICA2LjB4ICovCisJMTIwLCAvKiAxMTAwIC0+IDEyLjB4ICovCisJNzUsICAvKiAxMTAxIC0+ICA3LjV4ICovCisJMTMwLCAvKiAxMTEwIC0+IDEzLjB4ICovCisJNjUsICAvKiAxMTExIC0+ICA2LjV4ICovCit9OworCisvKgorICogVklBIEMzIEV6cmEKKyAqLworc3RhdGljIGludCBfX2luaXRkYXRhIGV6cmFfY2xvY2tfcmF0aW9bMTZdID0geworCTEwMCwgLyogMDAwMCAtPiAxMC4weCAqLworCTMwLCAgLyogMDAwMSAtPiAgMy4weCAqLworCTQwLCAgLyogMDAxMCAtPiAgNC4weCAqLworCTkwLCAgLyogMDAxMSAtPiAgOS4weCAqLworCTk1LCAgLyogMDEwMCAtPiAgOS41eCAqLworCTM1LCAgLyogMDEwMSAtPiAgMy41eCAqLworCTQ1LCAgLyogMDExMCAtPiAgNC41eCAqLworCTU1LCAgLyogMDExMSAtPiAgNS41eCAqLworCTYwLCAgLyogMTAwMCAtPiAgNi4weCAqLworCTcwLCAgLyogMTAwMSAtPiAgNy4weCAqLworCTgwLCAgLyogMTAxMCAtPiAgOC4weCAqLworCTUwLCAgLyogMTAxMSAtPiAgNS4weCAqLworCTY1LCAgLyogMTEwMCAtPiAgNi41eCAqLworCTc1LCAgLyogMTEwMSAtPiAgNy41eCAqLworCTg1LCAgLyogMTExMCAtPiAgOC41eCAqLworCTEyMCwgLyogMTExMSAtPiAxMi4weCAqLworfTsKKworc3RhdGljIGludCBfX2luaXRkYXRhIGV6cmFfZWJsY3JbMTZdID0geworCTUwLCAgLyogMDAwMCAtPiAgNS4weCAqLworCTMwLCAgLyogMDAwMSAtPiAgMy4weCAqLworCTQwLCAgLyogMDAxMCAtPiAgNC4weCAqLworCTEwMCwgLyogMDAxMSAtPiAxMC4weCAqLworCTU1LCAgLyogMDEwMCAtPiAgNS41eCAqLworCTM1LCAgLyogMDEwMSAtPiAgMy41eCAqLworCTQ1LCAgLyogMDExMCAtPiAgNC41eCAqLworCTk1LCAgLyogMDExMSAtPiAgOS41eCAqLworCTkwLCAgLyogMTAwMCAtPiAgOS4weCAqLworCTcwLCAgLyogMTAwMSAtPiAgNy4weCAqLworCTgwLCAgLyogMTAxMCAtPiAgOC4weCAqLworCTYwLCAgLyogMTAxMSAtPiAgNi4weCAqLworCTEyMCwgLyogMTEwMCAtPiAxMi4weCAqLworCTc1LCAgLyogMTEwMSAtPiAgNy41eCAqLworCTg1LCAgLyogMTExMCAtPiAgOC41eCAqLworCTY1LCAgLyogMTExMSAtPiAgNi41eCAqLworfTsKKworLyoKKyAqIFZJQSBDMyAoRXpyYS1UKSBbQzVNXS4KKyAqLworc3RhdGljIGludCBfX2luaXRkYXRhIGV6cmF0X2Nsb2NrX3JhdGlvWzMyXSA9IHsKKwkxMDAsIC8qIDAwMDAgLT4gMTAuMHggKi8KKwkzMCwgIC8qIDAwMDEgLT4gIDMuMHggKi8KKwk0MCwgIC8qIDAwMTAgLT4gIDQuMHggKi8KKwk5MCwgIC8qIDAwMTEgLT4gIDkuMHggKi8KKwk5NSwgIC8qIDAxMDAgLT4gIDkuNXggKi8KKwkzNSwgIC8qIDAxMDEgLT4gIDMuNXggKi8KKwk0NSwgIC8qIDAxMTAgLT4gIDQuNXggKi8KKwk1NSwgIC8qIDAxMTEgLT4gIDUuNXggKi8KKwk2MCwgIC8qIDEwMDAgLT4gIDYuMHggKi8KKwk3MCwgIC8qIDEwMDEgLT4gIDcuMHggKi8KKwk4MCwgIC8qIDEwMTAgLT4gIDguMHggKi8KKwk1MCwgIC8qIDEwMTEgLT4gIDUuMHggKi8KKwk2NSwgIC8qIDExMDAgLT4gIDYuNXggKi8KKwk3NSwgIC8qIDExMDEgLT4gIDcuNXggKi8KKwk4NSwgIC8qIDExMTAgLT4gIDguNXggKi8KKwkxMjAsIC8qIDExMTEgLT4gIDEyLjB4ICovCisKKwktMSwgIC8qIDAwMDAgLT4gUkVTRVJWRUQgKDEwLjB4KSAqLworCTExMCwgLyogMDAwMSAtPiAxMS4weCAqLworCTEyMCwgLyogMDAxMCAtPiAxMi4weCAqLworCS0xLCAgLyogMDAxMSAtPiBSRVNFUlZFRCAoOS4weCkqLworCTEwNSwgLyogMDEwMCAtPiAxMC41eCAqLworCTExNSwgLyogMDEwMSAtPiAxMS41eCAqLworCTEyNSwgLyogMDExMCAtPiAxMi41eCAqLworCTEzNSwgLyogMDExMSAtPiAxMy41eCAqLworCTE0MCwgLyogMTAwMCAtPiAxNC4weCAqLworCTE1MCwgLyogMTAwMSAtPiAxNS4weCAqLworCTE2MCwgLyogMTAxMCAtPiAxNi4weCAqLworCTEzMCwgLyogMTAxMSAtPiAxMy4weCAqLworCTE0NSwgLyogMTEwMCAtPiAxNC41eCAqLworCTE1NSwgLyogMTEwMSAtPiAxNS41eCAqLworCS0xLCAgLyogMTExMCAtPiBSRVNFUlZFRCAoMTMuMHgpICovCisJLTEsICAvKiAxMTExIC0+IFJFU0VSVkVEICgxMi4weCkgKi8KK307CisKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBlenJhdF9lYmxjclszMl0gPSB7CisJNTAsICAvKiAwMDAwIC0+ICA1LjB4ICovCisJMzAsICAvKiAwMDAxIC0+ICAzLjB4ICovCisJNDAsICAvKiAwMDEwIC0+ICA0LjB4ICovCisJMTAwLCAvKiAwMDExIC0+IDEwLjB4ICovCisJNTUsICAvKiAwMTAwIC0+ICA1LjV4ICovCisJMzUsICAvKiAwMTAxIC0+ICAzLjV4ICovCisJNDUsICAvKiAwMTEwIC0+ICA0LjV4ICovCisJOTUsICAvKiAwMTExIC0+ICA5LjV4ICovCisJOTAsICAvKiAxMDAwIC0+ICA5LjB4ICovCisJNzAsICAvKiAxMDAxIC0+ICA3LjB4ICovCisJODAsICAvKiAxMDEwIC0+ICA4LjB4ICovCisJNjAsICAvKiAxMDExIC0+ICA2LjB4ICovCisJMTIwLCAvKiAxMTAwIC0+IDEyLjB4ICovCisJNzUsICAvKiAxMTAxIC0+ICA3LjV4ICovCisJODUsICAvKiAxMTEwIC0+ICA4LjV4ICovCisJNjUsICAvKiAxMTExIC0+ICA2LjV4ICovCisKKwktMSwgIC8qIDAwMDAgLT4gUkVTRVJWRUQgKDkuMHgpICovCisJMTEwLCAvKiAwMDAxIC0+IDExLjB4ICovCisJMTIwLCAvKiAwMDEwIC0+IDEyLjB4ICovCisJLTEsICAvKiAwMDExIC0+IFJFU0VSVkVEICgxMC4weCkqLworCTEzNSwgLyogMDEwMCAtPiAxMy41eCAqLworCTExNSwgLyogMDEwMSAtPiAxMS41eCAqLworCTEyNSwgLyogMDExMCAtPiAxMi41eCAqLworCTEwNSwgLyogMDExMSAtPiAxMC41eCAqLworCTEzMCwgLyogMTAwMCAtPiAxMy4weCAqLworCTE1MCwgLyogMTAwMSAtPiAxNS4weCAqLworCTE2MCwgLyogMTAxMCAtPiAxNi4weCAqLworCTE0MCwgLyogMTAxMSAtPiAxNC4weCAqLworCS0xLCAgLyogMTEwMCAtPiBSRVNFUlZFRCAoMTIuMHgpICovCisJMTU1LCAvKiAxMTAxIC0+IDE1LjV4ICovCisJLTEsICAvKiAxMTEwIC0+IFJFU0VSVkVEICgxMy4weCkgKi8KKwkxNDUsIC8qIDExMTEgLT4gMTQuNXggKi8KK307CisKKy8qCisgKiBWSUEgQzMgTmVoZW1pYWggKi8KKyAKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBuZWhlbWlhaF9hX2Nsb2NrX3JhdGlvWzMyXSA9IHsKKwkxMDAsIC8qIDAwMDAgLT4gMTAuMHggKi8KKwkxNjAsIC8qIDAwMDEgLT4gMTYuMHggKi8KKwktMSwgIC8qIDAwMTAgLT4gIFJFU0VSVkVEICovCisJOTAsICAvKiAwMDExIC0+ICA5LjB4ICovCisJOTUsICAvKiAwMTAwIC0+ICA5LjV4ICovCisJLTEsICAvKiAwMTAxIC0+ICBSRVNFUlZFRCAqLworCS0xLCAgLyogMDExMCAtPiAgUkVTRVJWRUQgKi8KKwk1NSwgIC8qIDAxMTEgLT4gIDUuNXggKi8KKwk2MCwgIC8qIDEwMDAgLT4gIDYuMHggKi8KKwk3MCwgIC8qIDEwMDEgLT4gIDcuMHggKi8KKwk4MCwgIC8qIDEwMTAgLT4gIDguMHggKi8KKwk1MCwgIC8qIDEwMTEgLT4gIDUuMHggKi8KKwk2NSwgIC8qIDExMDAgLT4gIDYuNXggKi8KKwk3NSwgIC8qIDExMDEgLT4gIDcuNXggKi8KKwk4NSwgIC8qIDExMTAgLT4gIDguNXggKi8KKwkxMjAsIC8qIDExMTEgLT4gMTIuMHggKi8KKwkxMDAsIC8qIDAwMDAgLT4gMTAuMHggKi8KKwktMSwgIC8qIDAwMDEgLT4gUkVTRVJWRUQgKi8KKwkxMjAsIC8qIDAwMTAgLT4gMTIuMHggKi8KKwk5MCwgIC8qIDAwMTEgLT4gIDkuMHggKi8KKwkxMDUsIC8qIDAxMDAgLT4gMTAuNXggKi8KKwkxMTUsIC8qIDAxMDEgLT4gMTEuNXggKi8KKwkxMjUsIC8qIDAxMTAgLT4gMTIuNXggKi8KKwkxMzUsIC8qIDAxMTEgLT4gMTMuNXggKi8KKwkxNDAsIC8qIDEwMDAgLT4gMTQuMHggKi8KKwkxNTAsIC8qIDEwMDEgLT4gMTUuMHggKi8KKwkxNjAsIC8qIDEwMTAgLT4gMTYuMHggKi8KKwkxMzAsIC8qIDEwMTEgLT4gMTMuMHggKi8KKwkxNDUsIC8qIDExMDAgLT4gMTQuNXggKi8KKwkxNTUsIC8qIDExMDEgLT4gMTUuNXggKi8KKwktMSwgIC8qIDExMTAgLT4gUkVTRVJWRUQgKDEzLjB4KSAqLworCTEyMCwgLyogMTExMSAtPiAxMi4weCAqLworfTsKKworc3RhdGljIGludCBfX2luaXRkYXRhICBuZWhlbWlhaF9iX2Nsb2NrX3JhdGlvWzMyXSA9IHsKKwkxMDAsIC8qIDAwMDAgLT4gMTAuMHggKi8KKwkxNjAsIC8qIDAwMDEgLT4gMTYuMHggKi8KKwktMSwgIC8qIDAwMTAgLT4gIFJFU0VSVkVEICovCisJOTAsICAvKiAwMDExIC0+ICA5LjB4ICovCisJOTUsICAvKiAwMTAwIC0+ICA5LjV4ICovCisJLTEsICAvKiAwMTAxIC0+ICBSRVNFUlZFRCAqLworCS0xLCAgLyogMDExMCAtPiAgUkVTRVJWRUQgKi8KKwk1NSwgIC8qIDAxMTEgLT4gIDUuNXggKi8KKwk2MCwgIC8qIDEwMDAgLT4gIDYuMHggKi8KKwk3MCwgIC8qIDEwMDEgLT4gIDcuMHggKi8KKwk4MCwgIC8qIDEwMTAgLT4gIDguMHggKi8KKwk1MCwgIC8qIDEwMTEgLT4gIDUuMHggKi8KKwk2NSwgIC8qIDExMDAgLT4gIDYuNXggKi8KKwk3NSwgIC8qIDExMDEgLT4gIDcuNXggKi8KKwk4NSwgIC8qIDExMTAgLT4gIDguNXggKi8KKwkxMjAsIC8qIDExMTEgLT4gMTIuMHggKi8KKwkxMDAsIC8qIDAwMDAgLT4gMTAuMHggKi8KKwkxMTAsIC8qIDAwMDEgLT4gMTEuMHggKi8KKwkxMjAsIC8qIDAwMTAgLT4gMTIuMHggKi8KKwk5MCwgIC8qIDAwMTEgLT4gIDkuMHggKi8KKwkxMDUsIC8qIDAxMDAgLT4gMTAuNXggKi8KKwkxMTUsIC8qIDAxMDEgLT4gMTEuNXggKi8KKwkxMjUsIC8qIDAxMTAgLT4gMTIuNXggKi8KKwkxMzUsIC8qIDAxMTEgLT4gMTMuNXggKi8KKwkxNDAsIC8qIDEwMDAgLT4gMTQuMHggKi8KKwkxNTAsIC8qIDEwMDEgLT4gMTUuMHggKi8KKwkxNjAsIC8qIDEwMTAgLT4gMTYuMHggKi8KKwkxMzAsIC8qIDEwMTEgLT4gMTMuMHggKi8KKwkxNDUsIC8qIDExMDAgLT4gMTQuNXggKi8KKwkxNTUsIC8qIDExMDEgLT4gMTUuNXggKi8KKwktMSwgIC8qIDExMTAgLT4gUkVTRVJWRUQgKDEzLjB4KSAqLworCTEyMCwgLyogMTExMSAtPiAxMi4weCAqLworfTsKKworc3RhdGljIGludCBfX2luaXRkYXRhICBuZWhlbWlhaF9jX2Nsb2NrX3JhdGlvWzMyXSA9IHsKKwkxMDAsIC8qIDAwMDAgLT4gMTAuMHggKi8KKwkxNjAsIC8qIDAwMDEgLT4gMTYuMHggKi8KKwk0MCwgIC8qIDAwMTAgLT4gIFJFU0VSVkVEICovCisJOTAsICAvKiAwMDExIC0+ICA5LjB4ICovCisJOTUsICAvKiAwMTAwIC0+ICA5LjV4ICovCisJLTEsICAvKiAwMTAxIC0+ICBSRVNFUlZFRCAqLworCTQ1LCAgLyogMDExMCAtPiAgUkVTRVJWRUQgKi8KKwk1NSwgIC8qIDAxMTEgLT4gIDUuNXggKi8KKwk2MCwgIC8qIDEwMDAgLT4gIDYuMHggKi8KKwk3MCwgIC8qIDEwMDEgLT4gIDcuMHggKi8KKwk4MCwgIC8qIDEwMTAgLT4gIDguMHggKi8KKwk1MCwgIC8qIDEwMTEgLT4gIDUuMHggKi8KKwk2NSwgIC8qIDExMDAgLT4gIDYuNXggKi8KKwk3NSwgIC8qIDExMDEgLT4gIDcuNXggKi8KKwk4NSwgIC8qIDExMTAgLT4gIDguNXggKi8KKwkxMjAsIC8qIDExMTEgLT4gMTIuMHggKi8KKwkxMDAsIC8qIDAwMDAgLT4gMTAuMHggKi8KKwkxMTAsIC8qIDAwMDEgLT4gMTEuMHggKi8KKwkxMjAsIC8qIDAwMTAgLT4gMTIuMHggKi8KKwk5MCwgIC8qIDAwMTEgLT4gIDkuMHggKi8KKwkxMDUsIC8qIDAxMDAgLT4gMTAuNXggKi8KKwkxMTUsIC8qIDAxMDEgLT4gMTEuNXggKi8KKwkxMjUsIC8qIDAxMTAgLT4gMTIuNXggKi8KKwkxMzUsIC8qIDAxMTEgLT4gMTMuNXggKi8KKwkxNDAsIC8qIDEwMDAgLT4gMTQuMHggKi8KKwkxNTAsIC8qIDEwMDEgLT4gMTUuMHggKi8KKwkxNjAsIC8qIDEwMTAgLT4gMTYuMHggKi8KKwkxMzAsIC8qIDEwMTEgLT4gMTMuMHggKi8KKwkxNDUsIC8qIDExMDAgLT4gMTQuNXggKi8KKwkxNTUsIC8qIDExMDEgLT4gMTUuNXggKi8KKwktMSwgIC8qIDExMTAgLT4gUkVTRVJWRUQgKDEzLjB4KSAqLworCTEyMCwgLyogMTExMSAtPiAxMi4weCAqLworfTsKKworc3RhdGljIGludCBfX2luaXRkYXRhIG5laGVtaWFoX2FfZWJsY3JbMzJdID0geworCTUwLCAgLyogMDAwMCAtPiAgNS4weCAqLworCTE2MCwgLyogMDAwMSAtPiAxNi4weCAqLworCS0xLCAgLyogMDAxMCAtPiAgUkVTRVJWRUQgKi8KKwkxMDAsIC8qIDAwMTEgLT4gMTAuMHggKi8KKwk1NSwgIC8qIDAxMDAgLT4gIDUuNXggKi8KKwktMSwgIC8qIDAxMDEgLT4gIFJFU0VSVkVEICovCisJLTEsICAvKiAwMTEwIC0+ICBSRVNFUlZFRCAqLworCTk1LCAgLyogMDExMSAtPiAgOS41eCAqLworCTkwLCAgLyogMTAwMCAtPiAgOS4weCAqLworCTcwLCAgLyogMTAwMSAtPiAgNy4weCAqLworCTgwLCAgLyogMTAxMCAtPiAgOC4weCAqLworCTYwLCAgLyogMTAxMSAtPiAgNi4weCAqLworCTEyMCwgLyogMTEwMCAtPiAxMi4weCAqLworCTc1LCAgLyogMTEwMSAtPiAgNy41eCAqLworCTg1LCAgLyogMTExMCAtPiAgOC41eCAqLworCTY1LCAgLyogMTExMSAtPiAgNi41eCAqLworCTkwLCAgLyogMDAwMCAtPiAgOS4weCAqLworCS0xLCAgLyogMDAwMSAtPiBSRVNFUlZFRCAqLworCTEyMCwgLyogMDAxMCAtPiAxMi4weCAqLworCTEwMCwgLyogMDAxMSAtPiAxMC4weCAqLworCTEzNSwgLyogMDEwMCAtPiAxMy41eCAqLworCTExNSwgLyogMDEwMSAtPiAxMS41eCAqLworCTEyNSwgLyogMDExMCAtPiAxMi41eCAqLworCTEwNSwgLyogMDExMSAtPiAxMC41eCAqLworCTEzMCwgLyogMTAwMCAtPiAxMy4weCAqLworCTE1MCwgLyogMTAwMSAtPiAxNS4weCAqLworCTE2MCwgLyogMTAxMCAtPiAxNi4weCAqLworCTE0MCwgLyogMTAxMSAtPiAxNC4weCAqLworCTEyMCwgLyogMTEwMCAtPiAxMi4weCAqLworCTE1NSwgLyogMTEwMSAtPiAxNS41eCAqLworCS0xLCAgLyogMTExMCAtPiBSRVNFUlZFRCAoMTMuMHgpICovCisJMTQ1IC8qIDExMTEgLT4gMTQuNXggKi8KKyAgIC8qIGVuZCBvZiB0YWJsZSAgKi8KK307CitzdGF0aWMgaW50IF9faW5pdGRhdGEgbmVoZW1pYWhfYl9lYmxjclszMl0gPSB7CisJNTAsICAvKiAwMDAwIC0+ICA1LjB4ICovCisJMTYwLCAvKiAwMDAxIC0+IDE2LjB4ICovCisJLTEsICAvKiAwMDEwIC0+ICBSRVNFUlZFRCAqLworCTEwMCwgLyogMDAxMSAtPiAxMC4weCAqLworCTU1LCAgLyogMDEwMCAtPiAgNS41eCAqLworCS0xLCAgLyogMDEwMSAtPiAgUkVTRVJWRUQgKi8KKwktMSwgIC8qIDAxMTAgLT4gIFJFU0VSVkVEICovCisJOTUsICAvKiAwMTExIC0+ICA5LjV4ICovCisJOTAsICAvKiAxMDAwIC0+ICA5LjB4ICovCisJNzAsICAvKiAxMDAxIC0+ICA3LjB4ICovCisJODAsICAvKiAxMDEwIC0+ICA4LjB4ICovCisJNjAsICAvKiAxMDExIC0+ICA2LjB4ICovCisJMTIwLCAvKiAxMTAwIC0+IDEyLjB4ICovCisJNzUsICAvKiAxMTAxIC0+ICA3LjV4ICovCisJODUsICAvKiAxMTEwIC0+ICA4LjV4ICovCisJNjUsICAvKiAxMTExIC0+ICA2LjV4ICovCisJOTAsICAvKiAwMDAwIC0+ICA5LjB4ICovCisJMTEwLCAvKiAwMDAxIC0+IDExLjB4ICovCisJMTIwLCAvKiAwMDEwIC0+IDEyLjB4ICovCisJMTAwLCAvKiAwMDExIC0+IDEwLjB4ICovCisJMTM1LCAvKiAwMTAwIC0+IDEzLjV4ICovCisJMTE1LCAvKiAwMTAxIC0+IDExLjV4ICovCisJMTI1LCAvKiAwMTEwIC0+IDEyLjV4ICovCisJMTA1LCAvKiAwMTExIC0+IDEwLjV4ICovCisJMTMwLCAvKiAxMDAwIC0+IDEzLjB4ICovCisJMTUwLCAvKiAxMDAxIC0+IDE1LjB4ICovCisJMTYwLCAvKiAxMDEwIC0+IDE2LjB4ICovCisJMTQwLCAvKiAxMDExIC0+IDE0LjB4ICovCisJMTIwLCAvKiAxMTAwIC0+IDEyLjB4ICovCisJMTU1LCAvKiAxMTAxIC0+IDE1LjV4ICovCisJLTEsICAvKiAxMTEwIC0+IFJFU0VSVkVEICgxMy4weCkgKi8KKwkxNDUgLyogMTExMSAtPiAxNC41eCAqLworCSAgIC8qIGVuZCBvZiB0YWJsZSAgKi8KK307CitzdGF0aWMgaW50IF9faW5pdGRhdGEgbmVoZW1pYWhfY19lYmxjclszMl0gPSB7CisJNTAsICAvKiAwMDAwIC0+ICA1LjB4ICovCisJMTYwLCAvKiAwMDAxIC0+IDE2LjB4ICovCisJNDAsICAvKiAwMDEwIC0+ICBSRVNFUlZFRCAqLworCTEwMCwgLyogMDAxMSAtPiAxMC4weCAqLworCTU1LCAgLyogMDEwMCAtPiAgNS41eCAqLworCS0xLCAgLyogMDEwMSAtPiAgUkVTRVJWRUQgKi8KKwk0NSwgIC8qIDAxMTAgLT4gIFJFU0VSVkVEICovCisJOTUsICAvKiAwMTExIC0+ICA5LjV4ICovCisJOTAsICAvKiAxMDAwIC0+ICA5LjB4ICovCisJNzAsICAvKiAxMDAxIC0+ICA3LjB4ICovCisJODAsICAvKiAxMDEwIC0+ICA4LjB4ICovCisJNjAsICAvKiAxMDExIC0+ICA2LjB4ICovCisJMTIwLCAvKiAxMTAwIC0+IDEyLjB4ICovCisJNzUsICAvKiAxMTAxIC0+ICA3LjV4ICovCisJODUsICAvKiAxMTEwIC0+ICA4LjV4ICovCisJNjUsICAvKiAxMTExIC0+ICA2LjV4ICovCisJOTAsICAvKiAwMDAwIC0+ICA5LjB4ICovCisJMTEwLCAvKiAwMDAxIC0+IDExLjB4ICovCisJMTIwLCAvKiAwMDEwIC0+IDEyLjB4ICovCisJMTAwLCAvKiAwMDExIC0+IDEwLjB4ICovCisJMTM1LCAvKiAwMTAwIC0+IDEzLjV4ICovCisJMTE1LCAvKiAwMTAxIC0+IDExLjV4ICovCisJMTI1LCAvKiAwMTEwIC0+IDEyLjV4ICovCisJMTA1LCAvKiAwMTExIC0+IDEwLjV4ICovCisJMTMwLCAvKiAxMDAwIC0+IDEzLjB4ICovCisJMTUwLCAvKiAxMDAxIC0+IDE1LjB4ICovCisJMTYwLCAvKiAxMDEwIC0+IDE2LjB4ICovCisJMTQwLCAvKiAxMDExIC0+IDE0LjB4ICovCisJMTIwLCAvKiAxMTAwIC0+IDEyLjB4ICovCisJMTU1LCAvKiAxMTAxIC0+IDE1LjV4ICovCisJLTEsICAvKiAxMTEwIC0+IFJFU0VSVkVEICgxMy4weCkgKi8KKwkxNDUgLyogMTExMSAtPiAxNC41eCAqLworCSAgLyogZW5kIG9mIHRhYmxlICAqLworfTsKKworLyogCisgKiBWb2x0YWdlIHNjYWxlcy4gRGl2L01vZCBieSAxMDAwIHRvIGdldCBhY3R1YWwgdm9sdGFnZS4KKyAqIFdoaWNoIHNjYWxlIHRvIHVzZSBkZXBlbmRzIG9uIHRoZSBWUk0gdHlwZSBpbiB1c2UuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0ZGF0YSB2cm04NXNjYWxlc1szMl0gPSB7CisJMTI1MCwgMTIwMCwgMTE1MCwgMTEwMCwgMTA1MCwgMTgwMCwgMTc1MCwgMTcwMCwKKwkxNjUwLCAxNjAwLCAxNTUwLCAxNTAwLCAxNDUwLCAxNDAwLCAxMzUwLCAxMzAwLAorCTEyNzUsIDEyMjUsIDExNzUsIDExMjUsIDEwNzUsIDE4MjUsIDE3NzUsIDE3MjUsCisJMTY3NSwgMTYyNSwgMTU3NSwgMTUyNSwgMTQ3NSwgMTQyNSwgMTM3NSwgMTMyNSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBtb2JpbGV2cm1zY2FsZXNbMzJdID0geworCTIwMDAsIDE5NTAsIDE5MDAsIDE4NTAsIDE4MDAsIDE3NTAsIDE3MDAsIDE2NTAsCisJMTYwMCwgMTU1MCwgMTUwMCwgMTQ1MCwgMTUwMCwgMTM1MCwgMTMwMCwgLTEsCisJMTI3NSwgMTI1MCwgMTIyNSwgMTIwMCwgMTE3NSwgMTE1MCwgMTEyNSwgMTEwMCwKKwkxMDc1LCAxMDUwLCAxMDI1LCAxMDAwLCA5NzUsIDk1MCwgOTI1LCAtMSwKK307CisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ3J1bi5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25ncnVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM4NjhkZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ3J1bi5jCkBAIC0wLDAgKzEsMzI2IEBACisvKgorICogKEMpIDIwMDIgLSAyMDAzICBEb21pbmlrIEJyb2Rvd3NraSA8bGludXhAYnJvZG8uZGU+CisgKgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBMaWNlbnNlIHZlcnNpb24gMi4KKyAqCisgKiAgQklHIEZBVCBESVNDTEFJTUVSOiBXb3JrIGluIHByb2dyZXNzIGNvZGUuIFBvc3NpYmx5ICpkYW5nZXJvdXMqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgorCisjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vdGltZXguaD4KKworI2RlZmluZSBkcHJpbnRrKG1zZy4uLikgY3B1ZnJlcV9kZWJ1Z19wcmludGsoQ1BVRlJFUV9ERUJVR19EUklWRVIsICJsb25ncnVuIiwgbXNnKQorCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZHJpdmVyCWxvbmdydW5fZHJpdmVyOworCisvKioKKyAqIGxvbmdydW5fe2xvdyxoaWdofV9mcmVxIGlzIG5lZWRlZCBmb3IgdGhlIGNvbnZlcnNpb24gb2YgY3B1ZnJlcSBrSHoKKyAqIHZhbHVlcyBpbnRvIHBlciBjZW50IHZhbHVlcy4gSW4gVE1UQSBtaWNyb2NvZGUsIHRoZSBmb2xsb3dpbmcgaXMgdmFsaWQ6CisgKiBwZXJmb3JtYW5jZV9wY3RnID0gKGN1cnJlbnRfZnJlcSAtIGxvd19mcmVxKS8oaGlnaF9mcmVxIC0gbG93X2ZyZXEpCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbG9uZ3J1bl9sb3dfZnJlcSwgbG9uZ3J1bl9oaWdoX2ZyZXE7CisKKworLyoqCisgKiBsb25ncnVuX2dldF9wb2xpY3kgLSBnZXQgdGhlIGN1cnJlbnQgTG9uZ1J1biBwb2xpY3kKKyAqIEBwb2xpY3k6IHN0cnVjdCBjcHVmcmVxX3BvbGljeSB3aGVyZSBjdXJyZW50IHBvbGljeSBpcyB3cml0dGVuIGludG8KKyAqCisgKiBSZWFkcyB0aGUgY3VycmVudCBMb25nUnVuIHBvbGljeSBieSBhY2Nlc3MgdG8gTVNSX1RNVEFfTE9OR1JVTl9GTEFHUworICogYW5kIE1TUl9UTVRBX0xPTkdSVU5fQ1RSTAorICovCitzdGF0aWMgdm9pZCBfX2luaXQgbG9uZ3J1bl9nZXRfcG9saWN5KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXUzMiBtc3JfbG8sIG1zcl9oaTsKKworCXJkbXNyKE1TUl9UTVRBX0xPTkdSVU5fRkxBR1MsIG1zcl9sbywgbXNyX2hpKTsKKwlkcHJpbnRrKCJsb25ncnVuIGZsYWdzIGFyZSAleCAtICV4XG4iLCBtc3JfbG8sIG1zcl9oaSk7CisJaWYgKG1zcl9sbyAmIDB4MDEpCisJCXBvbGljeS0+cG9saWN5ID0gQ1BVRlJFUV9QT0xJQ1lfUEVSRk9STUFOQ0U7CisJZWxzZQorCQlwb2xpY3ktPnBvbGljeSA9IENQVUZSRVFfUE9MSUNZX1BPV0VSU0FWRTsKKworCXJkbXNyKE1TUl9UTVRBX0xPTkdSVU5fQ1RSTCwgbXNyX2xvLCBtc3JfaGkpOworCWRwcmludGsoImxvbmdydW4gY3RybCBpcyAleCAtICV4XG4iLCBtc3JfbG8sIG1zcl9oaSk7CisJbXNyX2xvICY9IDB4MDAwMDAwN0Y7CisJbXNyX2hpICY9IDB4MDAwMDAwN0Y7CisKKwlpZiAoIGxvbmdydW5faGlnaF9mcmVxIDw9IGxvbmdydW5fbG93X2ZyZXEgKSB7CisJCS8qIEFzc3VtZSBkZWdlbmVyYXRlIExvbmdydW4gdGFibGUgKi8KKwkJcG9saWN5LT5taW4gPSBwb2xpY3ktPm1heCA9IGxvbmdydW5faGlnaF9mcmVxOworCX0gZWxzZSB7CisJCXBvbGljeS0+bWluID0gbG9uZ3J1bl9sb3dfZnJlcSArIG1zcl9sbyAqCisJCQkoKGxvbmdydW5faGlnaF9mcmVxIC0gbG9uZ3J1bl9sb3dfZnJlcSkgLyAxMDApOworCQlwb2xpY3ktPm1heCA9IGxvbmdydW5fbG93X2ZyZXEgKyBtc3JfaGkgKgorCQkJKChsb25ncnVuX2hpZ2hfZnJlcSAtIGxvbmdydW5fbG93X2ZyZXEpIC8gMTAwKTsKKwl9CisJcG9saWN5LT5jcHUgPSAwOworfQorCisKKy8qKgorICogbG9uZ3J1bl9zZXRfcG9saWN5IC0gc2V0cyBhIG5ldyBDUFVGcmVxIHBvbGljeQorICogQHBvbGljeTogbmV3IHBvbGljeQorICoKKyAqIFNldHMgYSBuZXcgQ1BVRnJlcSBwb2xpY3kgb24gTG9uZ1J1bi1jYXBhYmxlIHByb2Nlc3NvcnMuIFRoaXMgZnVuY3Rpb24KKyAqIGhhcyB0byBiZSBjYWxsZWQgd2l0aCBjcHVmcmVxX2RyaXZlciBsb2NrZWQuCisgKi8KK3N0YXRpYyBpbnQgbG9uZ3J1bl9zZXRfcG9saWN5KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXUzMiBtc3JfbG8sIG1zcl9oaTsKKwl1MzIgcGN0Z19sbywgcGN0Z19oaTsKKworCWlmICghcG9saWN5KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICggbG9uZ3J1bl9oaWdoX2ZyZXEgPD0gbG9uZ3J1bl9sb3dfZnJlcSApIHsKKwkJLyogQXNzdW1lIGRlZ2VuZXJhdGUgTG9uZ3J1biB0YWJsZSAqLworCQlwY3RnX2xvID0gcGN0Z19oaSA9IDEwMDsKKwl9IGVsc2UgeworCQlwY3RnX2xvID0gKHBvbGljeS0+bWluIC0gbG9uZ3J1bl9sb3dfZnJlcSkgLworCQkJKChsb25ncnVuX2hpZ2hfZnJlcSAtIGxvbmdydW5fbG93X2ZyZXEpIC8gMTAwKTsKKwkJcGN0Z19oaSA9IChwb2xpY3ktPm1heCAtIGxvbmdydW5fbG93X2ZyZXEpIC8KKwkJCSgobG9uZ3J1bl9oaWdoX2ZyZXEgLSBsb25ncnVuX2xvd19mcmVxKSAvIDEwMCk7CisJfQorCisJaWYgKHBjdGdfaGkgPiAxMDApCisJCXBjdGdfaGkgPSAxMDA7CisJaWYgKHBjdGdfbG8gPiBwY3RnX2hpKQorCQlwY3RnX2xvID0gcGN0Z19oaTsKKworCS8qIHBlcmZvcm1hbmNlIG9yIGVjb25vbXkgbW9kZSAqLworCXJkbXNyKE1TUl9UTVRBX0xPTkdSVU5fRkxBR1MsIG1zcl9sbywgbXNyX2hpKTsKKwltc3JfbG8gJj0gMHhGRkZGRkZGRTsKKwlzd2l0Y2ggKHBvbGljeS0+cG9saWN5KSB7CisJY2FzZSBDUFVGUkVRX1BPTElDWV9QRVJGT1JNQU5DRToKKwkJbXNyX2xvIHw9IDB4MDAwMDAwMDE7CisJCWJyZWFrOworCWNhc2UgQ1BVRlJFUV9QT0xJQ1lfUE9XRVJTQVZFOgorCQlicmVhazsKKwl9CisJd3Jtc3IoTVNSX1RNVEFfTE9OR1JVTl9GTEFHUywgbXNyX2xvLCBtc3JfaGkpOworCisJLyogbG93ZXIgYW5kIHVwcGVyIGJvdW5kYXJ5ICovCisJcmRtc3IoTVNSX1RNVEFfTE9OR1JVTl9DVFJMLCBtc3JfbG8sIG1zcl9oaSk7CisJbXNyX2xvICY9IDB4RkZGRkZGODA7CisJbXNyX2hpICY9IDB4RkZGRkZGODA7CisJbXNyX2xvIHw9IHBjdGdfbG87CisJbXNyX2hpIHw9IHBjdGdfaGk7CisJd3Jtc3IoTVNSX1RNVEFfTE9OR1JVTl9DVFJMLCBtc3JfbG8sIG1zcl9oaSk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIGxvbmdydW5fdmVyaWZ5X3BvbGl5IC0gdmVyaWZpZXMgYSBuZXcgQ1BVRnJlcSBwb2xpY3kKKyAqIEBwb2xpY3k6IHRoZSBwb2xpY3kgdG8gdmVyaWZ5CisgKgorICogVmFsaWRhdGVzIGEgbmV3IENQVUZyZXEgcG9saWN5LiBUaGlzIGZ1bmN0aW9uIGhhcyB0byBiZSBjYWxsZWQgd2l0aAorICogY3B1ZnJlcV9kcml2ZXIgbG9ja2VkLgorICovCitzdGF0aWMgaW50IGxvbmdydW5fdmVyaWZ5X3BvbGljeShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwlpZiAoIXBvbGljeSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwb2xpY3ktPmNwdSA9IDA7CisJY3B1ZnJlcV92ZXJpZnlfd2l0aGluX2xpbWl0cyhwb2xpY3ksCisJCXBvbGljeS0+Y3B1aW5mby5taW5fZnJlcSwKKwkJcG9saWN5LT5jcHVpbmZvLm1heF9mcmVxKTsKKworCWlmICgocG9saWN5LT5wb2xpY3kgIT0gQ1BVRlJFUV9QT0xJQ1lfUE9XRVJTQVZFKSAmJgorCSAgICAocG9saWN5LT5wb2xpY3kgIT0gQ1BVRlJFUV9QT0xJQ1lfUEVSRk9STUFOQ0UpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGxvbmdydW5fZ2V0KHVuc2lnbmVkIGludCBjcHUpCit7CisJdTMyIGVheCwgZWJ4LCBlY3gsIGVkeDsKKworCWlmIChjcHUpCisJCXJldHVybiAwOworCisJY3B1aWQoMHg4MDg2MDAwNywgJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7CisJZHByaW50aygiY3B1aWQgZWF4IGlzICV1XG4iLCBlYXgpOworCisJcmV0dXJuIChlYXggKiAxMDAwKTsKK30KKworLyoqCisgKiBsb25ncnVuX2RldGVybWluZV9mcmVxcyAtIGRldGVybWluZXMgdGhlIGxvd2VzdCBhbmQgaGlnaGVzdCBwb3NzaWJsZSBjb3JlIGZyZXF1ZW5jeQorICogQGxvd19mcmVxOiBhbiBpbnQgdG8gcHV0IHRoZSBsb3dlc3QgZnJlcXVlbmN5IGludG8KKyAqIEBoaWdoX2ZyZXE6IGFuIGludCB0byBwdXQgdGhlIGhpZ2hlc3QgZnJlcXVlbmN5IGludG8KKyAqCisgKiBEZXRlcm1pbmVzIHRoZSBsb3dlc3QgYW5kIGhpZ2hlc3QgcG9zc2libGUgY29yZSBmcmVxdWVuY2llcyBvbiB0aGlzIENQVS4KKyAqIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGNhbGN1bGF0ZSB0aGUgcGVyZm9ybWFuY2UgcGVyY2VudGFnZSBhY2NvcmRpbmcgdG8KKyAqIFRNVEEgcnVsZXM6CisgKiBwZXJmb3JtYW5jZV9wY3RnID0gKHRhcmdldF9mcmVxIC0gbG93X2ZyZXEpLyhoaWdoX2ZyZXEgLSBsb3dfZnJlcSkKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgbG9uZ3J1bl9kZXRlcm1pbmVfZnJlcXModW5zaWduZWQgaW50ICpsb3dfZnJlcSwKKwkJCQkJCSAgIHVuc2lnbmVkIGludCAqaGlnaF9mcmVxKQoreworCXUzMiBtc3JfbG8sIG1zcl9oaTsKKwl1MzIgc2F2ZV9sbywgc2F2ZV9oaTsKKwl1MzIgZWF4LCBlYngsIGVjeCwgZWR4OworCXUzMiB0cnlfaGk7CisJc3RydWN0IGNwdWluZm9feDg2ICpjID0gY3B1X2RhdGE7CisKKwlpZiAoIWxvd19mcmVxIHx8ICFoaWdoX2ZyZXEpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfTFJUSSkpIHsKKwkJLyogaWYgdGhlIExvbmdSdW4gVGFibGUgSW50ZXJmYWNlIGlzIHByZXNlbnQsIHRoZQorCQkgKiBkZXRlY3Rpb24gaXMgYSBiaXQgZWFzaWVyOgorCQkgKiBGb3IgbWluaW11bSBmcmVxdWVuY3ksIHJlYWQgb3V0IHRoZSBtYXhpbXVtCisJCSAqIGxldmVsIChtc3JfaGkpLCB3cml0ZSB0aGF0IGludG8gImN1cnJlbnRseQorCQkgKiBzZWxlY3RlZCBsZXZlbCIsIGFuZCByZWFkIG91dCB0aGUgZnJlcXVlbmN5LgorCQkgKiBGb3IgbWF4aW11bSBmcmVxdWVuY3ksIHJlYWQgb3V0IGxldmVsIHplcm8uCisJCSAqLworCQkvKiBtaW5pbXVtICovCisJCXJkbXNyKE1TUl9UTVRBX0xSVElfUkVBRE9VVCwgbXNyX2xvLCBtc3JfaGkpOworCQl3cm1zcihNU1JfVE1UQV9MUlRJX1JFQURPVVQsIG1zcl9oaSwgbXNyX2hpKTsKKwkJcmRtc3IoTVNSX1RNVEFfTFJUSV9WT0xUX01IWiwgbXNyX2xvLCBtc3JfaGkpOworCQkqbG93X2ZyZXEgPSBtc3JfbG8gKiAxMDAwOyAvKiB0byBrSHogKi8KKworCQkvKiBtYXhpbXVtICovCisJCXdybXNyKE1TUl9UTVRBX0xSVElfUkVBRE9VVCwgMCwgbXNyX2hpKTsKKwkJcmRtc3IoTVNSX1RNVEFfTFJUSV9WT0xUX01IWiwgbXNyX2xvLCBtc3JfaGkpOworCQkqaGlnaF9mcmVxID0gbXNyX2xvICogMTAwMDsgLyogdG8ga0h6ICovCisKKwkJZHByaW50aygibG9uZ3J1biB0YWJsZSBpbnRlcmZhY2UgdG9sZCAldSAtICV1IGtIelxuIiwgKmxvd19mcmVxLCAqaGlnaF9mcmVxKTsKKworCQlpZiAoKmxvd19mcmVxID4gKmhpZ2hfZnJlcSkKKwkJCSpsb3dfZnJlcSA9ICpoaWdoX2ZyZXE7CisJCXJldHVybiAwOworCX0KKworCS8qIHNldCB0aGUgdXBwZXIgYm9yZGVyIHRvIHRoZSB2YWx1ZSBkZXRlcm1pbmVkIGR1cmluZyBUU0MgaW5pdCAqLworCSpoaWdoX2ZyZXEgPSAoY3B1X2toeiAvIDEwMDApOworCSpoaWdoX2ZyZXEgPSAqaGlnaF9mcmVxICogMTAwMDsKKwlkcHJpbnRrKCJoaWdoIGZyZXF1ZW5jeSBpcyAldSBrSHpcbiIsICpoaWdoX2ZyZXEpOworCisJLyogZ2V0IGN1cnJlbnQgYm9yZGVycyAqLworCXJkbXNyKE1TUl9UTVRBX0xPTkdSVU5fQ1RSTCwgbXNyX2xvLCBtc3JfaGkpOworCXNhdmVfbG8gPSBtc3JfbG8gJiAweDAwMDAwMDdGOworCXNhdmVfaGkgPSBtc3JfaGkgJiAweDAwMDAwMDdGOworCisJLyogaWYgY3VycmVudCBwZXJmX3BjdGcgaXMgbGFyZ2VyIHRoYW4gOTAlLCB3ZSBuZWVkIHRvIGRlY3JlYXNlIHRoZQorCSAqIHVwcGVyIGxpbWl0IHRvIG1ha2UgdGhlIGNhbGN1bGF0aW9uIG1vcmUgYWNjdXJhdGUuCisJICovCisJY3B1aWQoMHg4MDg2MDAwNywgJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7CisJLyogdHJ5IGRlY3JlYXNpbmcgaW4gMTAlIHN0ZXBzLCBzb21lIHByb2Nlc3NvcnMgcmVhY3Qgb25seQorCSAqIG9uIHNvbWUgYmFycmllciB2YWx1ZXMgKi8KKwlmb3IgKHRyeV9oaSA9IDgwOyB0cnlfaGkgPiAwICYmIGVjeCA+IDkwOyB0cnlfaGkgLT0xMCkgeworCQkvKiBzZXQgdG8gMCB0byB0cnlfaGkgcGVyZl9wY3RnICovCisJCW1zcl9sbyAmPSAweEZGRkZGRjgwOworCQltc3JfaGkgJj0gMHhGRkZGRkY4MDsKKwkJbXNyX2xvIHw9IDA7CisJCW1zcl9oaSB8PSB0cnlfaGk7CisJCXdybXNyKE1TUl9UTVRBX0xPTkdSVU5fQ1RSTCwgbXNyX2xvLCBtc3JfaGkpOworCisJCS8qIHJlYWQgb3V0IGN1cnJlbnQgY29yZSBNSHogYW5kIGN1cnJlbnQgcGVyZl9wY3RnICovCisJCWNwdWlkKDB4ODA4NjAwMDcsICZlYXgsICZlYngsICZlY3gsICZlZHgpOworCisJCS8qIHJlc3RvcmUgdmFsdWVzICovCisJCXdybXNyKE1TUl9UTVRBX0xPTkdSVU5fQ1RSTCwgc2F2ZV9sbywgc2F2ZV9oaSk7CisJfQorCWRwcmludGsoInBlcmNlbnRhZ2UgaXMgJXUgJSUsIGZyZXEgaXMgJXUgTUh6XG4iLCBlY3gsIGVheCk7CisKKwkvKiBwZXJmb3JtYW5jZV9wY3RnID0gKGN1cnJlbnRfZnJlcSAtIGxvd19mcmVxKS8oaGlnaF9mcmVxIC0gbG93X2ZyZXEpCisJICogZXFhbHMKKwkgKiBsb3dfZnJlcSAqICggMSAtIHBlcmZfcGN0ZykgPSAoY3VyX2ZyZXEgLSBoaWdoX2ZyZXEgKiBwZXJmX3BjdGcpCisJICoKKwkgKiBoaWdoX2ZyZXEgKiBwZXJmX3BjdGcgaXMgc3RvcmVkIHRlbXBvYXJpbHkgaW50byAiZWJ4Ii4KKwkgKi8KKwllYnggPSAoKChjcHVfa2h6IC8gMTAwMCkgKiBlY3gpIC8gMTAwKTsgLyogdG8gTUh6ICovCisKKwlpZiAoKGVjeCA+IDk1KSB8fCAoZWN4ID09IDApIHx8IChlYXggPCBlYngpKQorCQlyZXR1cm4gLUVJTzsKKworCWVkeCA9IChlYXggLSBlYngpIC8gKDEwMCAtIGVjeCk7CisJKmxvd19mcmVxID0gZWR4ICogMTAwMDsgLyogYmFjayB0byBrSHogKi8KKworCWRwcmludGsoImxvdyBmcmVxdWVuY3kgaXMgJXUga0h6XG4iLCAqbG93X2ZyZXEpOworCisJaWYgKCpsb3dfZnJlcSA+ICpoaWdoX2ZyZXEpCisJCSpsb3dfZnJlcSA9ICpoaWdoX2ZyZXE7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IF9faW5pdCBsb25ncnVuX2NwdV9pbml0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCWludCByZXN1bHQgPSAwOworCisJLyogY2FwYWJpbGl0eSBjaGVjayAqLworCWlmIChwb2xpY3ktPmNwdSAhPSAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIGRldGVjdCBsb3cgYW5kIGhpZ2ggZnJlcXVlbmN5ICovCisJcmVzdWx0ID0gbG9uZ3J1bl9kZXRlcm1pbmVfZnJlcXMoJmxvbmdydW5fbG93X2ZyZXEsICZsb25ncnVuX2hpZ2hfZnJlcSk7CisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCS8qIGNwdWluZm8gYW5kIGRlZmF1bHQgcG9saWN5IHZhbHVlcyAqLworCXBvbGljeS0+Y3B1aW5mby5taW5fZnJlcSA9IGxvbmdydW5fbG93X2ZyZXE7CisJcG9saWN5LT5jcHVpbmZvLm1heF9mcmVxID0gbG9uZ3J1bl9oaWdoX2ZyZXE7CisJcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9IENQVUZSRVFfRVRFUk5BTDsKKwlsb25ncnVuX2dldF9wb2xpY3kocG9saWN5KTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIgbG9uZ3J1bl9kcml2ZXIgPSB7CisJLmZsYWdzCQk9IENQVUZSRVFfQ09OU1RfTE9PUFMsCisJLnZlcmlmeQkJPSBsb25ncnVuX3ZlcmlmeV9wb2xpY3ksCisJLnNldHBvbGljeQk9IGxvbmdydW5fc2V0X3BvbGljeSwKKwkuZ2V0CQk9IGxvbmdydW5fZ2V0LAorCS5pbml0CQk9IGxvbmdydW5fY3B1X2luaXQsCisJLm5hbWUJCT0gImxvbmdydW4iLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKKworLyoqCisgKiBsb25ncnVuX2luaXQgLSBpbml0aWFsaXplcyB0aGUgVHJhbnNtZXRhIENydXNvZSBMb25nUnVuIENQVUZyZXEgZHJpdmVyCisgKgorICogSW5pdGlhbGl6ZXMgdGhlIExvbmdSdW4gc3VwcG9ydC4KKyAqLworc3RhdGljIGludCBfX2luaXQgbG9uZ3J1bl9pbml0KHZvaWQpCit7CisJc3RydWN0IGNwdWluZm9feDg2ICpjID0gY3B1X2RhdGE7CisKKwlpZiAoYy0+eDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX1RSQU5TTUVUQSB8fAorCSAgICAhY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9MT05HUlVOKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJmxvbmdydW5fZHJpdmVyKTsKK30KKworCisvKioKKyAqIGxvbmdydW5fZXhpdCAtIHVucmVnaXN0ZXJzIExvbmdSdW4gc3VwcG9ydAorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgbG9uZ3J1bl9leGl0KHZvaWQpCit7CisJY3B1ZnJlcV91bnJlZ2lzdGVyX2RyaXZlcigmbG9uZ3J1bl9kcml2ZXIpOworfQorCisKK01PRFVMRV9BVVRIT1IgKCJEb21pbmlrIEJyb2Rvd3NraSA8bGludXhAYnJvZG8uZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04gKCJMb25nUnVuIGRyaXZlciBmb3IgVHJhbnNtZXRhIENydXNvZSBhbmQgRWZmaWNlb24gcHJvY2Vzc29ycy4iKTsKK01PRFVMRV9MSUNFTlNFICgiR1BMIik7CisKK21vZHVsZV9pbml0KGxvbmdydW5faW5pdCk7Cittb2R1bGVfZXhpdChsb25ncnVuX2V4aXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wNC1jbG9ja21vZC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wNC1jbG9ja21vZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNjIyZDUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3A0LWNsb2NrbW9kLmMKQEAgLTAsMCArMSwzMzcgQEAKKy8qCisgKglQZW50aXVtIDQvWGVvbiBDUFUgb24gZGVtYW5kIGNsb2NrIG1vZHVsYXRpb24vc3BlZWQgc2NhbGluZworICoJKEMpIDIwMDIgLSAyMDAzIERvbWluaWsgQnJvZG93c2tpIDxsaW51eEBicm9kby5kZT4KKyAqCShDKSAyMDAyIFp3YW5lIE13YWlrYW1ibyA8endhbmVAY29tbWZpcmVzZXJ2aWNlcy5jb20+CisgKgkoQykgMjAwMiBBcmphbiB2YW4gZGUgVmVuIDxhcmphbnZAcmVkaGF0LmNvbT4KKyAqCShDKSAyMDAyIFRvcmEgVC4gRW5nc3RhZAorICoJQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGUgYXV0aG9yKHMpIG9mIHRoaXMgc29mdHdhcmUgc2hhbGwgbm90IGJlIGhlbGQgbGlhYmxlIGZvciBkYW1hZ2VzCisgKiAgICAgIG9mIGFueSBuYXR1cmUgcmVzdWx0aW5nIGR1ZSB0byB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuIFRoaXMKKyAqICAgICAgc29mdHdhcmUgaXMgcHJvdmlkZWQgQVMtSVMgd2l0aCBubyB3YXJyYW50aWVzLgorICoJCisgKglEYXRlCQlFcnJhdGEJCQlEZXNjcmlwdGlvbgorICoJMjAwMjA1MjUJTjQ0LCBPMTcJMTIuNSUgb3IgMjUlIERDIGNhdXNlcyBsb2NrdXAKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPiAKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+IAorI2luY2x1ZGUgPGFzbS9tc3IuaD4KKyNpbmNsdWRlIDxhc20vdGltZXguaD4KKworI2luY2x1ZGUgInNwZWVkc3RlcC1saWIuaCIKKworI2RlZmluZSBQRlgJInA0LWNsb2NrbW9kOiAiCisjZGVmaW5lIGRwcmludGsobXNnLi4uKSBjcHVmcmVxX2RlYnVnX3ByaW50ayhDUFVGUkVRX0RFQlVHX0RSSVZFUiwgInA0LWNsb2NrbW9kIiwgbXNnKQorCisvKgorICogRHV0eSBDeWNsZSAoM2JpdHMpLCBub3RlIERDX0RJU0FCTEUgaXMgbm90IHNwZWNpZmllZCBpbgorICogaW50ZWwgZG9jcyBpIGp1c3QgdXNlIGl0IHRvIG1lYW4gZGlzYWJsZQorICovCitlbnVtIHsKKwlEQ19SRVNWLCBEQ19ERkxULCBEQ18yNVBULCBEQ18zOFBULCBEQ181MFBULAorCURDXzY0UFQsIERDXzc1UFQsIERDXzg4UFQsIERDX0RJU0FCTEUKK307CisKKyNkZWZpbmUgRENfRU5UUklFUwk4CisKKworc3RhdGljIGludCBoYXNfTjQ0X08xN19lcnJhdGFbTlJfQ1BVU107CitzdGF0aWMgdW5zaWduZWQgaW50IHN0b2NrX2ZyZXE7CitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZHJpdmVyIHA0Y2xvY2ttb2RfZHJpdmVyOworc3RhdGljIHVuc2lnbmVkIGludCBjcHVmcmVxX3A0X2dldCh1bnNpZ25lZCBpbnQgY3B1KTsKKworc3RhdGljIGludCBjcHVmcmVxX3A0X3NldGRjKHVuc2lnbmVkIGludCBjcHUsIHVuc2lnbmVkIGludCBuZXdzdGF0ZSkKK3sKKwl1MzIgbCwgaDsKKworCWlmICghY3B1X29ubGluZShjcHUpIHx8IChuZXdzdGF0ZSA+IERDX0RJU0FCTEUpIHx8IChuZXdzdGF0ZSA9PSBEQ19SRVNWKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZG1zcihNU1JfSUEzMl9USEVSTV9TVEFUVVMsIGwsIGgpOworCisJaWYgKGwgJiAweDAxKQorCQlkcHJpbnRrKCJDUFUjJWQgY3VycmVudGx5IHRoZXJtYWwgdGhyb3R0bGVkXG4iLCBjcHUpOworCisJaWYgKGhhc19ONDRfTzE3X2VycmF0YVtjcHVdICYmIChuZXdzdGF0ZSA9PSBEQ18yNVBUIHx8IG5ld3N0YXRlID09IERDX0RGTFQpKQorCQluZXdzdGF0ZSA9IERDXzM4UFQ7CisKKwlyZG1zcihNU1JfSUEzMl9USEVSTV9DT05UUk9MLCBsLCBoKTsKKwlpZiAobmV3c3RhdGUgPT0gRENfRElTQUJMRSkgeworCQlkcHJpbnRrKCJDUFUjJWQgZGlzYWJsaW5nIG1vZHVsYXRpb25cbiIsIGNwdSk7CisJCXdybXNyKE1TUl9JQTMyX1RIRVJNX0NPTlRST0wsIGwgJiB+KDE8PDQpLCBoKTsKKwl9IGVsc2UgeworCQlkcHJpbnRrKCJDUFUjJWQgc2V0dGluZyBkdXR5IGN5Y2xlIHRvICVkJSVcbiIsCisJCQljcHUsICgoMTI1ICogbmV3c3RhdGUpIC8gMTApKTsKKwkJLyogYml0cyA2MyAtIDUJOiByZXNlcnZlZCAKKwkJICogYml0ICA0CTogZW5hYmxlL2Rpc2FibGUKKwkJICogYml0cyAzLTEJOiBkdXR5IGN5Y2xlCisJCSAqIGJpdCAgMAk6IHJlc2VydmVkCisJCSAqLworCQlsID0gKGwgJiB+MTQpOworCQlsID0gbCB8ICgxPDw0KSB8ICgobmV3c3RhdGUgJiAweDcpPDwxKTsKKwkJd3Jtc3IoTVNSX0lBMzJfVEhFUk1fQ09OVFJPTCwgbCwgaCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSBwNGNsb2NrbW9kX3RhYmxlW10gPSB7CisJe0RDX1JFU1YsIENQVUZSRVFfRU5UUllfSU5WQUxJRH0sCisJe0RDX0RGTFQsIDB9LAorCXtEQ18yNVBULCAwfSwKKwl7RENfMzhQVCwgMH0sCisJe0RDXzUwUFQsIDB9LAorCXtEQ182NFBULCAwfSwKKwl7RENfNzVQVCwgMH0sCisJe0RDXzg4UFQsIDB9LAorCXtEQ19ESVNBQkxFLCAwfSwKKwl7RENfUkVTViwgQ1BVRlJFUV9UQUJMRV9FTkR9LAorfTsKKworCitzdGF0aWMgaW50IGNwdWZyZXFfcDRfdGFyZ2V0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAorCQkJICAgICB1bnNpZ25lZCBpbnQgdGFyZ2V0X2ZyZXEsCisJCQkgICAgIHVuc2lnbmVkIGludCByZWxhdGlvbikKK3sKKwl1bnNpZ25lZCBpbnQgICAgbmV3c3RhdGUgPSBEQ19SRVNWOworCXN0cnVjdCBjcHVmcmVxX2ZyZXFzIGZyZXFzOworCWNwdW1hc2tfdCBjcHVzX2FsbG93ZWQ7CisJaW50IGk7CisKKwlpZiAoY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdGFyZ2V0KHBvbGljeSwgJnA0Y2xvY2ttb2RfdGFibGVbMF0sIHRhcmdldF9mcmVxLCByZWxhdGlvbiwgJm5ld3N0YXRlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmcmVxcy5vbGQgPSBjcHVmcmVxX3A0X2dldChwb2xpY3ktPmNwdSk7CisJZnJlcXMubmV3ID0gc3RvY2tfZnJlcSAqIHA0Y2xvY2ttb2RfdGFibGVbbmV3c3RhdGVdLmluZGV4IC8gODsKKworCWlmIChmcmVxcy5uZXcgPT0gZnJlcXMub2xkKQorCQlyZXR1cm4gMDsKKworCS8qIG5vdGlmaWVycyAqLworCWZvcl9lYWNoX2NwdV9tYXNrKGksIHBvbGljeS0+Y3B1cykgeworCQlmcmVxcy5jcHUgPSBpOworCQljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QUkVDSEFOR0UpOworCX0KKworCS8qIHJ1biBvbiBlYWNoIGxvZ2ljYWwgQ1BVLCBzZWUgc2VjdGlvbiAxMy4xNS4zIG9mIElBMzIgSW50ZWwgQXJjaGl0ZWN0dXJlIFNvZnR3YXJlCisJICogRGV2ZWxvcGVyJ3MgTWFudWFsLCBWb2x1bWUgMyAKKwkgKi8KKwljcHVzX2FsbG93ZWQgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CisKKwlmb3JfZWFjaF9jcHVfbWFzayhpLCBwb2xpY3ktPmNwdXMpIHsKKwkJY3B1bWFza190IHRoaXNfY3B1ID0gY3B1bWFza19vZl9jcHUoaSk7CisKKwkJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCB0aGlzX2NwdSk7CisJCUJVR19PTihzbXBfcHJvY2Vzc29yX2lkKCkgIT0gaSk7CisKKwkJY3B1ZnJlcV9wNF9zZXRkYyhpLCBwNGNsb2NrbW9kX3RhYmxlW25ld3N0YXRlXS5pbmRleCk7CisJfQorCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgY3B1c19hbGxvd2VkKTsKKworCS8qIG5vdGlmaWVycyAqLworCWZvcl9lYWNoX2NwdV9tYXNrKGksIHBvbGljeS0+Y3B1cykgeworCQlmcmVxcy5jcHUgPSBpOworCQljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QT1NUQ0hBTkdFKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGNwdWZyZXFfcDRfdmVyaWZ5KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXJldHVybiBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV92ZXJpZnkocG9saWN5LCAmcDRjbG9ja21vZF90YWJsZVswXSk7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGludCBjcHVmcmVxX3A0X2dldF9mcmVxdWVuY3koc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworCWlmICgoYy0+eDg2ID09IDB4MDYpICYmIChjLT54ODZfbW9kZWwgPT0gMHgwOSkpIHsKKwkJLyogUGVudGl1bSBNIChCYW5pYXMpICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJXYXJuaW5nOiBQZW50aXVtIE0gZGV0ZWN0ZWQuICIKKwkJICAgICAgICJUaGUgc3BlZWRzdGVwX2NlbnRyaW5vIG1vZHVsZSBvZmZlcnMgdm9sdGFnZSBzY2FsaW5nIgorCQkgICAgICAgIiBpbiBhZGRpdGlvbiBvZiBmcmVxdWVuY3kgc2NhbGluZy4gWW91IHNob3VsZCB1c2UgIgorCQkgICAgICAgInRoYXQgaW5zdGVhZCBvZiBwNC1jbG9ja21vZCwgaWYgcG9zc2libGUuXG4iKTsKKwkJcmV0dXJuIHNwZWVkc3RlcF9nZXRfcHJvY2Vzc29yX2ZyZXF1ZW5jeShTUEVFRFNURVBfUFJPQ0VTU09SX1BNKTsKKwl9CisKKwlpZiAoKGMtPng4NiA9PSAweDA2KSAmJiAoYy0+eDg2X21vZGVsID09IDB4MEQpKSB7CisJCS8qIFBlbnRpdW0gTSAoRG90aGFuKSAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiV2FybmluZzogUGVudGl1bSBNIGRldGVjdGVkLiAiCisJCSAgICAgICAiVGhlIHNwZWVkc3RlcF9jZW50cmlubyBtb2R1bGUgb2ZmZXJzIHZvbHRhZ2Ugc2NhbGluZyIKKwkJICAgICAgICIgaW4gYWRkaXRpb24gb2YgZnJlcXVlbmN5IHNjYWxpbmcuIFlvdSBzaG91bGQgdXNlICIKKwkJICAgICAgICJ0aGF0IGluc3RlYWQgb2YgcDQtY2xvY2ttb2QsIGlmIHBvc3NpYmxlLlxuIik7CisJCS8qIG9uIFAtNHMsIHRoZSBUU0MgcnVucyB3aXRoIGNvbnN0YW50IGZyZXF1ZW5jeSBpbmRlcGVuZGVudCB3aGV0aGVyCisJCSAqIHRocm90dGxpbmcgaXMgYWN0aXZlIG9yIG5vdC4gKi8KKwkJcDRjbG9ja21vZF9kcml2ZXIuZmxhZ3MgfD0gQ1BVRlJFUV9DT05TVF9MT09QUzsKKwkJcmV0dXJuIHNwZWVkc3RlcF9nZXRfcHJvY2Vzc29yX2ZyZXF1ZW5jeShTUEVFRFNURVBfUFJPQ0VTU09SX1BNKTsKKwl9CisKKwlpZiAoYy0+eDg2ICE9IDB4RikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiVW5rbm93biBwNC1jbG9ja21vZC1jYXBhYmxlIENQVS4gUGxlYXNlIHNlbmQgYW4gZS1tYWlsIHRvIDxsaW51eEBicm9kby5kZT5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBvbiBQLTRzLCB0aGUgVFNDIHJ1bnMgd2l0aCBjb25zdGFudCBmcmVxdWVuY3kgaW5kZXBlbmRlbnQgd2hldGhlcgorCSAqIHRocm90dGxpbmcgaXMgYWN0aXZlIG9yIG5vdC4gKi8KKwlwNGNsb2NrbW9kX2RyaXZlci5mbGFncyB8PSBDUFVGUkVRX0NPTlNUX0xPT1BTOworCisJaWYgKHNwZWVkc3RlcF9kZXRlY3RfcHJvY2Vzc29yKCkgPT0gU1BFRURTVEVQX1BST0NFU1NPUl9QNE0pIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIldhcm5pbmc6IFBlbnRpdW0gNC1NIGRldGVjdGVkLiAiCisJCSAgICAgICAiVGhlIHNwZWVkc3RlcC1pY2ggb3IgYWNwaSBjcHVmcmVxIG1vZHVsZXMgb2ZmZXIgIgorCQkgICAgICAgInZvbHRhZ2Ugc2NhbGluZyBpbiBhZGRpdGlvbiBvZiBmcmVxdWVuY3kgc2NhbGluZy4gIgorCQkgICAgICAgIllvdSBzaG91bGQgdXNlIGVpdGhlciBvbmUgaW5zdGVhZCBvZiBwNC1jbG9ja21vZCwgIgorCQkgICAgICAgImlmIHBvc3NpYmxlLlxuIik7CisJCXJldHVybiBzcGVlZHN0ZXBfZ2V0X3Byb2Nlc3Nvcl9mcmVxdWVuY3koU1BFRURTVEVQX1BST0NFU1NPUl9QNE0pOworCX0KKworCXJldHVybiBzcGVlZHN0ZXBfZ2V0X3Byb2Nlc3Nvcl9mcmVxdWVuY3koU1BFRURTVEVQX1BST0NFU1NPUl9QNEQpOworfQorCisgCisKK3N0YXRpYyBpbnQgY3B1ZnJlcV9wNF9jcHVfaW5pdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSAmY3B1X2RhdGFbcG9saWN5LT5jcHVdOworCWludCBjcHVpZCA9IDA7CisJdW5zaWduZWQgaW50IGk7CisKKyNpZmRlZiBDT05GSUdfU01QCisJcG9saWN5LT5jcHVzID0gY3B1X3NpYmxpbmdfbWFwW3BvbGljeS0+Y3B1XTsKKyNlbmRpZgorCisJLyogRXJyYXRhIHdvcmthcm91bmQgKi8KKwljcHVpZCA9IChjLT54ODYgPDwgOCkgfCAoYy0+eDg2X21vZGVsIDw8IDQpIHwgYy0+eDg2X21hc2s7CisJc3dpdGNoIChjcHVpZCkgeworCWNhc2UgMHgwZjA3OgorCWNhc2UgMHgwZjBhOgorCWNhc2UgMHgwZjExOgorCWNhc2UgMHgwZjEyOgorCQloYXNfTjQ0X08xN19lcnJhdGFbcG9saWN5LT5jcHVdID0gMTsKKwkJZHByaW50aygiaGFzIGVycmF0YSAtLSBkaXNhYmxpbmcgbG93IGZyZXF1ZW5jaWVzXG4iKTsKKwl9CisJCisJLyogZ2V0IG1heCBmcmVxdWVuY3kgKi8KKwlzdG9ja19mcmVxID0gY3B1ZnJlcV9wNF9nZXRfZnJlcXVlbmN5KGMpOworCWlmICghc3RvY2tfZnJlcSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiB0YWJsZSBpbml0ICovCisJZm9yIChpPTE7IChwNGNsb2NrbW9kX3RhYmxlW2ldLmZyZXF1ZW5jeSAhPSBDUFVGUkVRX1RBQkxFX0VORCk7IGkrKykgeworCQlpZiAoKGk8MikgJiYgKGhhc19ONDRfTzE3X2VycmF0YVtwb2xpY3ktPmNwdV0pKQorCQkJcDRjbG9ja21vZF90YWJsZVtpXS5mcmVxdWVuY3kgPSBDUFVGUkVRX0VOVFJZX0lOVkFMSUQ7CisJCWVsc2UKKwkJCXA0Y2xvY2ttb2RfdGFibGVbaV0uZnJlcXVlbmN5ID0gKHN0b2NrX2ZyZXEgKiBpKS84OworCX0KKwljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9nZXRfYXR0cihwNGNsb2NrbW9kX3RhYmxlLCBwb2xpY3ktPmNwdSk7CisJCisJLyogY3B1aW5mbyBhbmQgZGVmYXVsdCBwb2xpY3kgdmFsdWVzICovCisJcG9saWN5LT5nb3Zlcm5vciA9IENQVUZSRVFfREVGQVVMVF9HT1ZFUk5PUjsKKwlwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID0gMTAwMDAwMDsgLyogYXNzdW1lZCAqLworCXBvbGljeS0+Y3VyID0gc3RvY2tfZnJlcTsKKworCXJldHVybiBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9jcHVpbmZvKHBvbGljeSwgJnA0Y2xvY2ttb2RfdGFibGVbMF0pOworfQorCisKK3N0YXRpYyBpbnQgY3B1ZnJlcV9wNF9jcHVfZXhpdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9wdXRfYXR0cihwb2xpY3ktPmNwdSk7ICAgIAorCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGNwdWZyZXFfcDRfZ2V0KHVuc2lnbmVkIGludCBjcHUpCit7CisJY3B1bWFza190IGNwdXNfYWxsb3dlZDsKKwl1MzIgbCwgaDsKKworCWNwdXNfYWxsb3dlZCA9IGN1cnJlbnQtPmNwdXNfYWxsb3dlZDsKKworCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgY3B1bWFza19vZl9jcHUoY3B1KSk7CisJQlVHX09OKHNtcF9wcm9jZXNzb3JfaWQoKSAhPSBjcHUpOworCisJcmRtc3IoTVNSX0lBMzJfVEhFUk1fQ09OVFJPTCwgbCwgaCk7CisKKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIGNwdXNfYWxsb3dlZCk7CisKKwlpZiAobCAmIDB4MTApIHsKKwkJbCA9IGwgPj4gMTsKKwkJbCAmPSAweDc7CisJfSBlbHNlCisJCWwgPSBEQ19ESVNBQkxFOworCisJaWYgKGwgIT0gRENfRElTQUJMRSkKKwkJcmV0dXJuIChzdG9ja19mcmVxICogbCAvIDgpOworCisJcmV0dXJuIHN0b2NrX2ZyZXE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZnJlcV9hdHRyKiBwNGNsb2NrbW9kX2F0dHJbXSA9IHsKKwkmY3B1ZnJlcV9mcmVxX2F0dHJfc2NhbGluZ19hdmFpbGFibGVfZnJlcXMsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIgcDRjbG9ja21vZF9kcml2ZXIgPSB7CisJLnZlcmlmeSAJPSBjcHVmcmVxX3A0X3ZlcmlmeSwKKwkudGFyZ2V0CQk9IGNwdWZyZXFfcDRfdGFyZ2V0LAorCS5pbml0CQk9IGNwdWZyZXFfcDRfY3B1X2luaXQsCisJLmV4aXQJCT0gY3B1ZnJlcV9wNF9jcHVfZXhpdCwKKwkuZ2V0CQk9IGNwdWZyZXFfcDRfZ2V0LAorCS5uYW1lCQk9ICJwNC1jbG9ja21vZCIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5hdHRyCQk9IHA0Y2xvY2ttb2RfYXR0ciwKK307CisKKworc3RhdGljIGludCBfX2luaXQgY3B1ZnJlcV9wNF9pbml0KHZvaWQpCit7CQorCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9IGNwdV9kYXRhOworCWludCByZXQ7CisKKwkvKgorCSAqIFRIRVJNX0NPTlRST0wgaXMgYXJjaGl0ZWN0dXJhbCBmb3IgSUEzMiBub3csIHNvIAorCSAqIHdlIGNhbiByZWx5IG9uIHRoZSBjYXBhYmlsaXR5IGNoZWNrcworCSAqLworCWlmIChjLT54ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1JfSU5URUwpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCF0ZXN0X2JpdChYODZfRkVBVFVSRV9BQ1BJLCBjLT54ODZfY2FwYWJpbGl0eSkgfHwKKwkJIXRlc3RfYml0KFg4Nl9GRUFUVVJFX0FDQywgYy0+eDg2X2NhcGFiaWxpdHkpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldCA9IGNwdWZyZXFfcmVnaXN0ZXJfZHJpdmVyKCZwNGNsb2NrbW9kX2RyaXZlcik7CisJaWYgKCFyZXQpCisJCXByaW50ayhLRVJOX0lORk8gUEZYICJQNC9YZW9uKFRNKSBDUFUgT24tRGVtYW5kIENsb2NrIE1vZHVsYXRpb24gYXZhaWxhYmxlXG4iKTsKKworCXJldHVybiAocmV0KTsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgY3B1ZnJlcV9wNF9leGl0KHZvaWQpCit7CisJY3B1ZnJlcV91bnJlZ2lzdGVyX2RyaXZlcigmcDRjbG9ja21vZF9kcml2ZXIpOworfQorCisKK01PRFVMRV9BVVRIT1IgKCJad2FuZSBNd2Fpa2FtYm8gPHp3YW5lQGNvbW1maXJlc2VydmljZXMuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OICgiY3B1ZnJlcSBkcml2ZXIgZm9yIFBlbnRpdW0oVE0pIDQvWGVvbihUTSkiKTsKK01PRFVMRV9MSUNFTlNFICgiR1BMIik7CisKK2xhdGVfaW5pdGNhbGwoY3B1ZnJlcV9wNF9pbml0KTsKK21vZHVsZV9leGl0KGNwdWZyZXFfcDRfZXhpdCk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs2LmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIyZjhjZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazYuYwpAQCAtMCwwICsxLDI1NiBAQAorLyoKKyAqICBUaGlzIGZpbGUgd2FzIGJhc2VkIHVwb24gY29kZSBpbiBQb3dlcnR3ZWFrIExpbnV4IChodHRwOi8vcG93ZXJ0d2Vhay5zZi5uZXQpCisgKiAgKEMpIDIwMDAtMjAwMyAgRGF2ZSBKb25lcywgQXJqYW4gdmFuIGRlIFZlbiwgSmFubmUgUORua+Rs5CwgRG9taW5payBCcm9kb3dza2kuCisgKgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBMaWNlbnNlIHZlcnNpb24gMi4KKyAqCisgKiAgQklHIEZBVCBESVNDTEFJTUVSOiBXb3JrIGluIHByb2dyZXNzIGNvZGUuIFBvc3NpYmx5ICpkYW5nZXJvdXMqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPiAKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgPGFzbS9tc3IuaD4KKyNpbmNsdWRlIDxhc20vdGltZXguaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworCisjZGVmaW5lIFBPV0VSTk9XX0lPUE9SVCAweGZmZjAgICAgICAgICAvKiBpdCBkb2Vzbid0IG1hdHRlciB3aGVyZSwgYXMgbG9uZworCQkJCQkgIGFzIGl0IGlzIHVudXNlZCAqLworCitzdGF0aWMgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgICAgICAgYnVzZnJlcTsgICAvKiBGU0IsIGluIDEwIGtIeiAqLworc3RhdGljIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICAgICAgIG1heF9tdWx0aXBsaWVyOworCisKKy8qIENsb2NrIHJhdGlvIG11bHRpcGxpZWQgYnkgMTAgLSBzZWUgdGFibGUgMjcgaW4gQU1EIzIzNDQ2ICovCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlIGNsb2NrX3JhdGlvW10gPSB7CisJezQ1LCAgLyogMDAwIC0+IDQuNXggKi8gMH0sCisJezUwLCAgLyogMDAxIC0+IDUuMHggKi8gMH0sCisJezQwLCAgLyogMDEwIC0+IDQuMHggKi8gMH0sCisJezU1LCAgLyogMDExIC0+IDUuNXggKi8gMH0sCisJezIwLCAgLyogMTAwIC0+IDIuMHggKi8gMH0sCisJezMwLCAgLyogMTAxIC0+IDMuMHggKi8gMH0sCisJezYwLCAgLyogMTEwIC0+IDYuMHggKi8gMH0sCisJezM1LCAgLyogMTExIC0+IDMuNXggKi8gMH0sCisJezAsIENQVUZSRVFfVEFCTEVfRU5EfQorfTsKKworCisvKioKKyAqIHBvd2Vybm93X2s2X2dldF9jcHVfbXVsdGlwbGllciAtIHJldHVybnMgdGhlIGN1cnJlbnQgRlNCIG11bHRpcGxpZXIKKyAqCisgKiAgIFJldHVybnMgdGhlIGN1cnJlbnQgc2V0dGluZyBvZiB0aGUgZnJlcXVlbmN5IG11bHRpcGxpZXIuIENvcmUgY2xvY2sKKyAqIHNwZWVkIGlzIGZyZXF1ZW5jeSBvZiB0aGUgRnJvbnQtU2lkZSBCdXMgbXVsdGlwbGllZCB3aXRoIHRoaXMgdmFsdWUuCisgKi8KK3N0YXRpYyBpbnQgcG93ZXJub3dfazZfZ2V0X2NwdV9tdWx0aXBsaWVyKHZvaWQpCit7CisJdTY0ICAgICAgICAgICAgIGludmFsdWUgPSAwOworCXUzMiAgICAgICAgICAgICBtc3J2YWw7CisJCisJbXNydmFsID0gUE9XRVJOT1dfSU9QT1JUICsgMHgxOworCXdybXNyKE1TUl9LNl9FUE1SLCBtc3J2YWwsIDApOyAvKiBlbmFibGUgdGhlIFBvd2VyTm93IHBvcnQgKi8KKwlpbnZhbHVlPWlubChQT1dFUk5PV19JT1BPUlQgKyAweDgpOworCW1zcnZhbCA9IFBPV0VSTk9XX0lPUE9SVCArIDB4MDsKKwl3cm1zcihNU1JfSzZfRVBNUiwgbXNydmFsLCAwKTsgLyogZGlzYWJsZSBpdCBhZ2FpbiAqLworCisJcmV0dXJuIGNsb2NrX3JhdGlvWyhpbnZhbHVlID4+IDUpJjddLmluZGV4OworfQorCisKKy8qKgorICogcG93ZXJub3dfazZfc2V0X3N0YXRlIC0gc2V0IHRoZSBQb3dlck5vdyEgbXVsdGlwbGllcgorICogQGJlc3RfaTogY2xvY2tfcmF0aW9bYmVzdF9pXSBpcyB0aGUgdGFyZ2V0IG11bHRpcGxpZXIKKyAqCisgKiAgIFRyaWVzIHRvIGNoYW5nZSB0aGUgUG93ZXJOb3chIG11bHRpcGxpZXIKKyAqLworc3RhdGljIHZvaWQgcG93ZXJub3dfazZfc2V0X3N0YXRlICh1bnNpZ25lZCBpbnQgYmVzdF9pKQoreworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIG91dHZhbHVlPTAsIGludmFsdWU9MDsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICBtc3J2YWw7CisJc3RydWN0IGNwdWZyZXFfZnJlcXMgICAgZnJlcXM7CisKKwlpZiAoY2xvY2tfcmF0aW9bYmVzdF9pXS5pbmRleCA+IG1heF9tdWx0aXBsaWVyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY3B1ZnJlcTogaW52YWxpZCB0YXJnZXQgZnJlcXVlbmN5XG4iKTsKKwkJcmV0dXJuOworCX0KKworCWZyZXFzLm9sZCA9IGJ1c2ZyZXEgKiBwb3dlcm5vd19rNl9nZXRfY3B1X211bHRpcGxpZXIoKTsKKwlmcmVxcy5uZXcgPSBidXNmcmVxICogY2xvY2tfcmF0aW9bYmVzdF9pXS5pbmRleDsKKwlmcmVxcy5jcHUgPSAwOyAvKiBwb3dlcm5vdy1rNi5jIGlzIFVQIG9ubHkgZHJpdmVyICovCisJCisJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUFJFQ0hBTkdFKTsKKworCS8qIHdlIG5vdyBuZWVkIHRvIHRyYW5zZm9ybSBiZXN0X2kgdG8gdGhlIEJWQyBmb3JtYXQsIHNlZSBBTUQjMjM0NDYgKi8KKworCW91dHZhbHVlID0gKDE8PDEyKSB8ICgxPDwxMCkgfCAoMTw8OSkgfCAoYmVzdF9pPDw1KTsKKworCW1zcnZhbCA9IFBPV0VSTk9XX0lPUE9SVCArIDB4MTsKKwl3cm1zcihNU1JfSzZfRVBNUiwgbXNydmFsLCAwKTsgLyogZW5hYmxlIHRoZSBQb3dlck5vdyBwb3J0ICovCisJaW52YWx1ZT1pbmwoUE9XRVJOT1dfSU9QT1JUICsgMHg4KTsKKwlpbnZhbHVlID0gaW52YWx1ZSAmIDB4ZjsKKwlvdXR2YWx1ZSA9IG91dHZhbHVlIHwgaW52YWx1ZTsKKwlvdXRsKG91dHZhbHVlICwoUE9XRVJOT1dfSU9QT1JUICsgMHg4KSk7CisJbXNydmFsID0gUE9XRVJOT1dfSU9QT1JUICsgMHgwOworCXdybXNyKE1TUl9LNl9FUE1SLCBtc3J2YWwsIDApOyAvKiBkaXNhYmxlIGl0IGFnYWluICovCisKKwljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QT1NUQ0hBTkdFKTsKKworCXJldHVybjsKK30KKworCisvKioKKyAqIHBvd2Vybm93X2s2X3ZlcmlmeSAtIHZlcmlmaWVzIGEgbmV3IENQVWZyZXEgcG9saWN5CisgKiBAcG9saWN5OiBuZXcgcG9saWN5CisgKgorICogUG9saWN5IG11c3QgYmUgd2l0aGluIGxvd2VzdCBhbmQgaGlnaGVzdCBwb3NzaWJsZSBDUFUgRnJlcXVlbmN5LAorICogYW5kIGF0IGxlYXN0IG9uZSBwb3NzaWJsZSBzdGF0ZSBtdXN0IGJlIHdpdGhpbiBtaW4gYW5kIG1heC4KKyAqLworc3RhdGljIGludCBwb3dlcm5vd19rNl92ZXJpZnkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3ZlcmlmeShwb2xpY3ksICZjbG9ja19yYXRpb1swXSk7Cit9CisKKworLyoqCisgKiBwb3dlcm5vd19rNl9zZXRwb2xpY3kgLSBzZXRzIGEgbmV3IENQVUZyZXEgcG9saWN5CisgKiBAcG9saWN5OiBuZXcgcG9saWN5CisgKiBAdGFyZ2V0X2ZyZXE6IHRoZSB0YXJnZXQgZnJlcXVlbmN5CisgKiBAcmVsYXRpb246IGhvdyB0aGF0IGZyZXF1ZW5jeSByZWxhdGVzIHRvIGFjaGlldmVkIGZyZXF1ZW5jeSAoQ1BVRlJFUV9SRUxBVElPTl9MIG9yIENQVUZSRVFfUkVMQVRJT05fSCkKKyAqCisgKiBzZXRzIGEgbmV3IENQVUZyZXEgcG9saWN5CisgKi8KK3N0YXRpYyBpbnQgcG93ZXJub3dfazZfdGFyZ2V0IChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2V0X2ZyZXEsCisJCQkgICAgICAgdW5zaWduZWQgaW50IHJlbGF0aW9uKQoreworCXVuc2lnbmVkIGludCAgICBuZXdzdGF0ZSA9IDA7CisKKwlpZiAoY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdGFyZ2V0KHBvbGljeSwgJmNsb2NrX3JhdGlvWzBdLCB0YXJnZXRfZnJlcSwgcmVsYXRpb24sICZuZXdzdGF0ZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJcG93ZXJub3dfazZfc2V0X3N0YXRlKG5ld3N0YXRlKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcG93ZXJub3dfazZfY3B1X2luaXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJlc3VsdDsKKworCWlmIChwb2xpY3ktPmNwdSAhPSAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIGdldCBmcmVxdWVuY2llcyAqLworCW1heF9tdWx0aXBsaWVyID0gcG93ZXJub3dfazZfZ2V0X2NwdV9tdWx0aXBsaWVyKCk7CisJYnVzZnJlcSA9IGNwdV9raHogLyBtYXhfbXVsdGlwbGllcjsKKworCS8qIHRhYmxlIGluaXQgKi8KKyAJZm9yIChpPTA7IChjbG9ja19yYXRpb1tpXS5mcmVxdWVuY3kgIT0gQ1BVRlJFUV9UQUJMRV9FTkQpOyBpKyspIHsKKwkJaWYgKGNsb2NrX3JhdGlvW2ldLmluZGV4ID4gbWF4X211bHRpcGxpZXIpCisJCQljbG9ja19yYXRpb1tpXS5mcmVxdWVuY3kgPSBDUFVGUkVRX0VOVFJZX0lOVkFMSUQ7CisJCWVsc2UKKwkJCWNsb2NrX3JhdGlvW2ldLmZyZXF1ZW5jeSA9IGJ1c2ZyZXEgKiBjbG9ja19yYXRpb1tpXS5pbmRleDsKKwl9CisKKwkvKiBjcHVpbmZvIGFuZCBkZWZhdWx0IHBvbGljeSB2YWx1ZXMgKi8KKwlwb2xpY3ktPmdvdmVybm9yID0gQ1BVRlJFUV9ERUZBVUxUX0dPVkVSTk9SOworCXBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kgPSBDUFVGUkVRX0VURVJOQUw7CisJcG9saWN5LT5jdXIgPSBidXNmcmVxICogbWF4X211bHRpcGxpZXI7CisKKwlyZXN1bHQgPSBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9jcHVpbmZvKHBvbGljeSwgY2xvY2tfcmF0aW8pOworCWlmIChyZXN1bHQpCisJCXJldHVybiAocmVzdWx0KTsKKworCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2dldF9hdHRyKGNsb2NrX3JhdGlvLCBwb2xpY3ktPmNwdSk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHBvd2Vybm93X2s2X2NwdV9leGl0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXVuc2lnbmVkIGludCBpOworCWZvciAoaT0wOyBpPDg7IGkrKykgeworCQlpZiAoaT09bWF4X211bHRpcGxpZXIpCisJCQlwb3dlcm5vd19rNl9zZXRfc3RhdGUoaSk7CisJfQorCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3B1dF9hdHRyKHBvbGljeS0+Y3B1KTsKKyAJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcG93ZXJub3dfazZfZ2V0KHVuc2lnbmVkIGludCBjcHUpCit7CisJcmV0dXJuIGJ1c2ZyZXEgKiBwb3dlcm5vd19rNl9nZXRfY3B1X211bHRpcGxpZXIoKTsKK30KKworc3RhdGljIHN0cnVjdCBmcmVxX2F0dHIqIHBvd2Vybm93X2s2X2F0dHJbXSA9IHsKKwkmY3B1ZnJlcV9mcmVxX2F0dHJfc2NhbGluZ19hdmFpbGFibGVfZnJlcXMsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIgcG93ZXJub3dfazZfZHJpdmVyID0geworCS52ZXJpZnkgCT0gcG93ZXJub3dfazZfdmVyaWZ5LAorCS50YXJnZXQgCT0gcG93ZXJub3dfazZfdGFyZ2V0LAorCS5pbml0CQk9IHBvd2Vybm93X2s2X2NwdV9pbml0LAorCS5leGl0CQk9IHBvd2Vybm93X2s2X2NwdV9leGl0LAorCS5nZXQJCT0gcG93ZXJub3dfazZfZ2V0LAorCS5uYW1lCQk9ICJwb3dlcm5vdy1rNiIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5hdHRyCQk9IHBvd2Vybm93X2s2X2F0dHIsCit9OworCisKKy8qKgorICogcG93ZXJub3dfazZfaW5pdCAtIGluaXRpYWxpemVzIHRoZSBrNiBQb3dlck5vdyEgQ1BVRnJlcSBkcml2ZXIKKyAqCisgKiAgIEluaXRpYWxpemVzIHRoZSBLNiBQb3dlck5vdyEgc3VwcG9ydC4gUmV0dXJucyAtRU5PREVWIG9uIHVuc3VwcG9ydGVkCisgKiBkZXZpY2VzLCAtRUlOVkFMIG9yIC1FTk9NRU0gb24gcHJvYmxlbXMgZHVyaW5nIGluaXRpYXRpemF0aW9uLCBhbmQgemVybworICogb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGludCBfX2luaXQgcG93ZXJub3dfazZfaW5pdCh2b2lkKQorewkKKwlzdHJ1Y3QgY3B1aW5mb194ODYgICAgICAqYyA9IGNwdV9kYXRhOworCisJaWYgKChjLT54ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1JfQU1EKSB8fCAoYy0+eDg2ICE9IDUpIHx8CisJCSgoYy0+eDg2X21vZGVsICE9IDEyKSAmJiAoYy0+eDg2X21vZGVsICE9IDEzKSkpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihQT1dFUk5PV19JT1BPUlQsIDE2LCAiUG93ZXJOb3chIikpIHsKKwkJcHJpbnRrKCJjcHVmcmVxOiBQb3dlck5vdyBJT1BPUlQgcmVnaW9uIGFscmVhZHkgdXNlZC5cbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAoY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJnBvd2Vybm93X2s2X2RyaXZlcikpIHsKKwkJcmVsZWFzZV9yZWdpb24gKFBPV0VSTk9XX0lPUE9SVCwgMTYpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIHBvd2Vybm93X2s2X2V4aXQgLSB1bnJlZ2lzdGVycyBBTUQgSzYtMisvMysgUG93ZXJOb3chIHN1cHBvcnQKKyAqCisgKiAgIFVucmVnaXN0ZXJzIEFNRCBLNi0yKyAvIEs2LTMrIFBvd2VyTm93ISBzdXBwb3J0LgorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgcG93ZXJub3dfazZfZXhpdCh2b2lkKQoreworCWNwdWZyZXFfdW5yZWdpc3Rlcl9kcml2ZXIoJnBvd2Vybm93X2s2X2RyaXZlcik7CisJcmVsZWFzZV9yZWdpb24gKFBPV0VSTk9XX0lPUE9SVCwgMTYpOworfQorCisKK01PRFVMRV9BVVRIT1IgKCJBcmphbiB2YW4gZGUgVmVuIDxhcmphbnZAcmVkaGF0LmNvbT4sIERhdmUgSm9uZXMgPGRhdmVqQGNvZGVtb25rZXkub3JnLnVrPiwgRG9taW5payBCcm9kb3dza2kgPGxpbnV4QGJyb2RvLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OICgiUG93ZXJOb3chIGRyaXZlciBmb3IgQU1EIEs2LTIrIC8gSzYtMysgcHJvY2Vzc29ycy4iKTsKK01PRFVMRV9MSUNFTlNFICgiR1BMIik7CisKK21vZHVsZV9pbml0KHBvd2Vybm93X2s2X2luaXQpOworbW9kdWxlX2V4aXQocG93ZXJub3dfazZfZXhpdCk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs3LmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEzZjY1MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazcuYwpAQCAtMCwwICsxLDY5MCBAQAorLyoKKyAqICBBTUQgSzcgUG93ZXJub3cgZHJpdmVyLgorICogIChDKSAyMDAzIERhdmUgSm9uZXMgPGRhdmVqQGNvZGVtb25rZXkub3JnLnVrPiBvbiBiZWhhbGYgb2YgU3VTRSBMYWJzLgorICogIChDKSAyMDAzLTIwMDQgRGF2ZSBKb25lcyA8ZGF2ZWpAcmVkaGF0LmNvbT4KKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyLgorICogIEJhc2VkIHVwb24gZGF0YXNoZWV0cyAmIHNhbXBsZSBDUFVzIGtpbmRseSBwcm92aWRlZCBieSBBTUQuCisgKgorICogRXJyYXRhIDU6IFByb2Nlc3NvciBtYXkgZmFpbCB0byBleGVjdXRlIGEgRklEL1ZJRCBjaGFuZ2UgaW4gcHJlc2VuY2Ugb2YgaW50ZXJydXB0LgorICogLSBXZSBjbGkvc3RpIG9uIHN0ZXBwaW5nIEEwIENQVXMgYXJvdW5kIHRoZSBGSUQvVklEIHRyYW5zaXRpb24uCisgKiBFcnJhdGEgMTU6IFByb2Nlc3NvcnMgd2l0aCBoYWxmIGZyZXF1ZW5jeSBtdWx0aXBsaWVycyBtYXkgaGFuZyB1cG9uIHdha2V1cCBmcm9tIGRpc2Nvbm5lY3QuCisgKiAtIFdlIGRpc2FibGUgaGFsZiBtdWx0aXBsaWVycyBpZiBBQ1BJIGlzIHVzZWQgb24gQTAgc3RlcHBpbmcgQ1BVcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KKworI2luY2x1ZGUgPGFzbS9tc3IuaD4KKyNpbmNsdWRlIDxhc20vdGltZXguaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpZmRlZiBDT05GSUdfWDg2X1BPV0VSTk9XX0s3X0FDUEkKKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8YWNwaS9wcm9jZXNzb3IuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAicG93ZXJub3ctazcuaCIKKworI2RlZmluZSBQRlggInBvd2Vybm93OiAiCisKKworc3RydWN0IHBzYl9zIHsKKwl1OCBzaWduYXR1cmVbMTBdOworCXU4IHRhYmxldmVyc2lvbjsKKwl1OCBmbGFnczsKKwl1MTYgc2V0dGxpbmd0aW1lOworCXU4IHJlc2VydmVkMTsKKwl1OCBudW1wc3Q7Cit9OworCitzdHJ1Y3QgcHN0X3MgeworCXUzMiBjcHVpZDsKKwl1OCBmc2JzcGVlZDsKKwl1OCBtYXhmaWQ7CisJdTggc3RhcnR2aWQ7CisJdTggbnVtcHN0YXRlczsKK307CisKKyNpZmRlZiBDT05GSUdfWDg2X1BPV0VSTk9XX0s3X0FDUEkKK3VuaW9uIHBvd2Vybm93X2FjcGlfY29udHJvbF90IHsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBsb25nIGZpZDo1LAorCQl2aWQ6NSwKKwkJc2d0YzoyMCwKKwkJcmVzMToyOworCX0gYml0czsKKwl1bnNpZ25lZCBsb25nIHZhbDsKK307CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19DUFVfRlJFUV9ERUJVRworLyogZGl2aWRlIGJ5IDEwMDAgdG8gZ2V0IFZDb3JlIHZvbHRhZ2UgaW4gVi4gKi8KK3N0YXRpYyBpbnQgbW9iaWxlX3ZpZF90YWJsZVszMl0gPSB7CisgICAgMjAwMCwgMTk1MCwgMTkwMCwgMTg1MCwgMTgwMCwgMTc1MCwgMTcwMCwgMTY1MCwKKyAgICAxNjAwLCAxNTUwLCAxNTAwLCAxNDUwLCAxNDAwLCAxMzUwLCAxMzAwLCAwLAorICAgIDEyNzUsIDEyNTAsIDEyMjUsIDEyMDAsIDExNzUsIDExNTAsIDExMjUsIDExMDAsCisgICAgMTA3NSwgMTA1MCwgMTAyNSwgMTAwMCwgOTc1LCA5NTAsIDkyNSwgMCwKK307CisjZW5kaWYKKworLyogZGl2aWRlIGJ5IDEwIHRvIGdldCBGSUQuICovCitzdGF0aWMgaW50IGZpZF9jb2Rlc1szMl0gPSB7CisgICAgMTEwLCAxMTUsIDEyMCwgMTI1LCA1MCwgNTUsIDYwLCA2NSwKKyAgICA3MCwgNzUsIDgwLCA4NSwgOTAsIDk1LCAxMDAsIDEwNSwKKyAgICAzMCwgMTkwLCA0MCwgMjAwLCAxMzAsIDEzNSwgMTQwLCAyMTAsCisgICAgMTUwLCAyMjUsIDE2MCwgMTY1LCAxNzAsIDE4MCwgLTEsIC0xLAorfTsKKworLyogVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCBpbiBvcmRlciB0byBmb3JjZSBBQ1BJIGluc3RlYWQgb2YgbGVnYWN5IG1ldGhvZCBmb3IKKyAqIGNvbmZpZ3VyYXRpb24gcHVycG9zZS4KKyAqLworCitzdGF0aWMgaW50IGFjcGlfZm9yY2U7CisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKnBvd2Vybm93X3RhYmxlOworCitzdGF0aWMgdW5zaWduZWQgaW50IGNhbl9zY2FsZV9idXM7CitzdGF0aWMgdW5zaWduZWQgaW50IGNhbl9zY2FsZV92aWQ7CitzdGF0aWMgdW5zaWduZWQgaW50IG1pbmltdW1fc3BlZWQ9LTE7CitzdGF0aWMgdW5zaWduZWQgaW50IG1heGltdW1fc3BlZWQ7CitzdGF0aWMgdW5zaWduZWQgaW50IG51bWJlcl9zY2FsZXM7CitzdGF0aWMgdW5zaWduZWQgaW50IGZzYjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbGF0ZW5jeTsKK3N0YXRpYyBjaGFyIGhhdmVfYTA7CisKKyNkZWZpbmUgZHByaW50ayhtc2cuLi4pIGNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfRFJJVkVSLCAicG93ZXJub3ctazciLCBtc2cpCisKK3N0YXRpYyBpbnQgY2hlY2tfZnNiKHVuc2lnbmVkIGludCBmc2JzcGVlZCkKK3sKKwlpbnQgZGVsdGE7CisJdW5zaWduZWQgaW50IGYgPSBmc2IgLyAxMDAwOworCisJZGVsdGEgPSAoZnNic3BlZWQgPiBmKSA/IGZzYnNwZWVkIC0gZiA6IGYgLSBmc2JzcGVlZDsKKwlyZXR1cm4gKGRlbHRhIDwgNSk7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfcG93ZXJub3codm9pZCkKK3sKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSBjcHVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgbWF4ZWksIGVheCwgZWJ4LCBlY3gsIGVkeDsKKworCWlmICgoYy0+eDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0FNRCkgfHwgKGMtPng4NiAhPTYpKSB7CisjaWZkZWYgTU9EVUxFCisJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiVGhpcyBtb2R1bGUgb25seSB3b3JrcyB3aXRoIEFNRCBLNyBDUFVzXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBHZXQgbWF4aW11bSBjYXBhYmlsaXRpZXMgKi8KKwltYXhlaSA9IGNwdWlkX2VheCAoMHg4MDAwMDAwMCk7CisJaWYgKG1heGVpIDwgMHg4MDAwMDAwNykgewkvKiBBbnkgcG93ZXJub3cgaW5mbyA/ICovCisjaWZkZWYgTU9EVUxFCisJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiTm8gcG93ZXJub3cgY2FwYWJpbGl0aWVzIGRldGVjdGVkXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoKGMtPng4Nl9tb2RlbCA9PSA2KSAmJiAoYy0+eDg2X21hc2sgPT0gMCkpIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJLNyA2NjBbQTBdIGNvcmUgZGV0ZWN0ZWQsIGVuYWJsaW5nIGVycmF0YSB3b3JrYXJvdW5kc1xuIik7CisJCWhhdmVfYTAgPSAxOworCX0KKworCWNwdWlkKDB4ODAwMDAwMDcsICZlYXgsICZlYngsICZlY3gsICZlZHgpOworCisJLyogQ2hlY2sgd2UgY2FuIGFjdHVhbGx5IGRvIHNvbWV0aGluZyBiZWZvcmUgd2Ugc2F5IGFueXRoaW5nLiovCisJaWYgKCEoZWR4ICYgKDEgPDwgMSB8IDEgPDwgMikpKQorCQlyZXR1cm4gMDsKKworCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiUG93ZXJOT1chIFRlY2hub2xvZ3kgcHJlc2VudC4gQ2FuIHNjYWxlOiAiKTsKKworCWlmIChlZHggJiAxIDw8IDEpIHsKKwkJcHJpbnRrICgiZnJlcXVlbmN5Iik7CisJCWNhbl9zY2FsZV9idXM9MTsKKwl9CisKKwlpZiAoKGVkeCAmICgxIDw8IDEgfCAxIDw8IDIpKSA9PSAweDYpCisJCXByaW50ayAoIiBhbmQgIik7CisKKwlpZiAoZWR4ICYgMSA8PCAyKSB7CisJCXByaW50ayAoInZvbHRhZ2UiKTsKKwkJY2FuX3NjYWxlX3ZpZD0xOworCX0KKworCXByaW50ayAoIi5cbiIpOworCXJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgZ2V0X3JhbmdlcyAodW5zaWduZWQgY2hhciAqcHN0KQoreworCXVuc2lnbmVkIGludCBqOworCXVuc2lnbmVkIGludCBzcGVlZDsKKwl1OCBmaWQsIHZpZDsKKworCXBvd2Vybm93X3RhYmxlID0ga21hbGxvYygoc2l6ZW9mKHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSkgKiAobnVtYmVyX3NjYWxlcyArIDEpKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwb3dlcm5vd190YWJsZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KHBvd2Vybm93X3RhYmxlLCAwLCAoc2l6ZW9mKHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSkgKiAobnVtYmVyX3NjYWxlcyArIDEpKSk7CisKKwlmb3IgKGo9MCA7IGogPCBudW1iZXJfc2NhbGVzOyBqKyspIHsKKwkJZmlkID0gKnBzdCsrOworCisJCXBvd2Vybm93X3RhYmxlW2pdLmZyZXF1ZW5jeSA9IChmc2IgKiBmaWRfY29kZXNbZmlkXSkgLyAxMDsKKwkJcG93ZXJub3dfdGFibGVbal0uaW5kZXggPSBmaWQ7IC8qIGxvd2VyIDggYml0cyAqLworCisJCXNwZWVkID0gcG93ZXJub3dfdGFibGVbal0uZnJlcXVlbmN5OworCisJCWlmICgoZmlkX2NvZGVzW2ZpZF0gJSAxMCk9PTUpIHsKKyNpZmRlZiBDT05GSUdfWDg2X1BPV0VSTk9XX0s3X0FDUEkKKwkJCWlmIChoYXZlX2EwID09IDEpCisJCQkJcG93ZXJub3dfdGFibGVbal0uZnJlcXVlbmN5ID0gQ1BVRlJFUV9FTlRSWV9JTlZBTElEOworI2VuZGlmCisJCX0KKworCQlpZiAoc3BlZWQgPCBtaW5pbXVtX3NwZWVkKQorCQkJbWluaW11bV9zcGVlZCA9IHNwZWVkOworCQlpZiAoc3BlZWQgPiBtYXhpbXVtX3NwZWVkKQorCQkJbWF4aW11bV9zcGVlZCA9IHNwZWVkOworCisJCXZpZCA9ICpwc3QrKzsKKwkJcG93ZXJub3dfdGFibGVbal0uaW5kZXggfD0gKHZpZCA8PCA4KTsgLyogdXBwZXIgOCBiaXRzICovCisKKwkJZHByaW50ayAoIiAgIEZJRDogMHgleCAoJWQuJWR4IFslZE1Iel0pICAiCisJCQkgIlZJRDogMHgleCAoJWQuJTAzZFYpXG4iLCBmaWQsIGZpZF9jb2Rlc1tmaWRdIC8gMTAsIAorCQkJIGZpZF9jb2Rlc1tmaWRdICUgMTAsIHNwZWVkLzEwMDAsIHZpZCwJCisJCQkgbW9iaWxlX3ZpZF90YWJsZVt2aWRdLzEwMDAsCisJCQkgbW9iaWxlX3ZpZF90YWJsZVt2aWRdJTEwMDApOworCX0KKwlwb3dlcm5vd190YWJsZVtudW1iZXJfc2NhbGVzXS5mcmVxdWVuY3kgPSBDUFVGUkVRX1RBQkxFX0VORDsKKwlwb3dlcm5vd190YWJsZVtudW1iZXJfc2NhbGVzXS5pbmRleCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBjaGFuZ2VfRklEKGludCBmaWQpCit7CisJdW5pb24gbXNyX2ZpZHZpZGN0bCBmaWR2aWRjdGw7CisKKwlyZG1zcmwgKE1TUl9LN19GSURfVklEX0NUTCwgZmlkdmlkY3RsLnZhbCk7CisJaWYgKGZpZHZpZGN0bC5iaXRzLkZJRCAhPSBmaWQpIHsKKwkJZmlkdmlkY3RsLmJpdHMuU0dUQyA9IGxhdGVuY3k7CisJCWZpZHZpZGN0bC5iaXRzLkZJRCA9IGZpZDsKKwkJZmlkdmlkY3RsLmJpdHMuVklEQyA9IDA7CisJCWZpZHZpZGN0bC5iaXRzLkZJREMgPSAxOworCQl3cm1zcmwgKE1TUl9LN19GSURfVklEX0NUTCwgZmlkdmlkY3RsLnZhbCk7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIGNoYW5nZV9WSUQoaW50IHZpZCkKK3sKKwl1bmlvbiBtc3JfZmlkdmlkY3RsIGZpZHZpZGN0bDsKKworCXJkbXNybCAoTVNSX0s3X0ZJRF9WSURfQ1RMLCBmaWR2aWRjdGwudmFsKTsKKwlpZiAoZmlkdmlkY3RsLmJpdHMuVklEICE9IHZpZCkgeworCQlmaWR2aWRjdGwuYml0cy5TR1RDID0gbGF0ZW5jeTsKKwkJZmlkdmlkY3RsLmJpdHMuVklEID0gdmlkOworCQlmaWR2aWRjdGwuYml0cy5GSURDID0gMDsKKwkJZmlkdmlkY3RsLmJpdHMuVklEQyA9IDE7CisJCXdybXNybCAoTVNSX0s3X0ZJRF9WSURfQ1RMLCBmaWR2aWRjdGwudmFsKTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgY2hhbmdlX3NwZWVkICh1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJdTggZmlkLCB2aWQ7CisJc3RydWN0IGNwdWZyZXFfZnJlcXMgZnJlcXM7CisJdW5pb24gbXNyX2ZpZHZpZHN0YXR1cyBmaWR2aWRzdGF0dXM7CisJaW50IGNmaWQ7CisKKwkvKiBmaWQgYXJlIHRoZSBsb3dlciA4IGJpdHMgb2YgdGhlIGluZGV4IHdlIHN0b3JlZCBpbnRvCisJICogdGhlIGNwdWZyZXEgZnJlcXVlbmN5IHRhYmxlIGluIHBvd2Vybm93X2RlY29kZV9iaW9zLAorCSAqIHZpZCBhcmUgdGhlIHVwcGVyIDggYml0cy4KKwkgKi8KKworCWZpZCA9IHBvd2Vybm93X3RhYmxlW2luZGV4XS5pbmRleCAmIDB4RkY7CisJdmlkID0gKHBvd2Vybm93X3RhYmxlW2luZGV4XS5pbmRleCAmIDB4RkYwMCkgPj4gODsKKworCWZyZXFzLmNwdSA9IDA7CisKKwlyZG1zcmwgKE1TUl9LN19GSURfVklEX1NUQVRVUywgZmlkdmlkc3RhdHVzLnZhbCk7CisJY2ZpZCA9IGZpZHZpZHN0YXR1cy5iaXRzLkNGSUQ7CisJZnJlcXMub2xkID0gZnNiICogZmlkX2NvZGVzW2NmaWRdIC8gMTA7CisKKwlmcmVxcy5uZXcgPSBwb3dlcm5vd190YWJsZVtpbmRleF0uZnJlcXVlbmN5OworCisJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUFJFQ0hBTkdFKTsKKworCS8qIE5vdyBkbyB0aGUgbWFnaWMgcG9raW5nIGludG8gdGhlIE1TUnMuICAqLworCisJaWYgKGhhdmVfYTAgPT0gMSkJLyogQTAgZXJyYXRhIDUgKi8KKwkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKworCWlmIChmcmVxcy5vbGQgPiBmcmVxcy5uZXcpIHsKKwkJLyogR29pbmcgZG93biwgc28gY2hhbmdlIEZJRCBmaXJzdCAqLworCQljaGFuZ2VfRklEKGZpZCk7CisJCWNoYW5nZV9WSUQodmlkKTsKKwl9IGVsc2UgeworCQkvKiBHb2luZyB1cCwgc28gY2hhbmdlIFZJRCBmaXJzdCAqLworCQljaGFuZ2VfVklEKHZpZCk7CisJCWNoYW5nZV9GSUQoZmlkKTsKKwl9CisKKworCWlmIChoYXZlX2EwID09IDEpCisJCWxvY2FsX2lycV9lbmFibGUoKTsKKworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOworfQorCisKKyNpZmRlZiBDT05GSUdfWDg2X1BPV0VSTk9XX0s3X0FDUEkKKworc3RhdGljIHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZSAqYWNwaV9wcm9jZXNzb3JfcGVyZjsKKworc3RhdGljIGludCBwb3dlcm5vd19hY3BpX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKwlpbnQgcmV0dmFsID0gMDsKKwl1bmlvbiBwb3dlcm5vd19hY3BpX2NvbnRyb2xfdCBwYzsKKworCWlmIChhY3BpX3Byb2Nlc3Nvcl9wZXJmICE9IE5VTEwgJiYgcG93ZXJub3dfdGFibGUgIT0gTlVMTCkgeworCQlyZXR2YWwgPSAtRUlOVkFMOworCQlnb3RvIGVycjA7CisJfQorCisJYWNwaV9wcm9jZXNzb3JfcGVyZiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZSksCisJCQkJICAgICAgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWFjcGlfcHJvY2Vzc29yX3BlcmYpIHsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBlcnIwOworCX0KKworCW1lbXNldChhY3BpX3Byb2Nlc3Nvcl9wZXJmLCAwLCBzaXplb2Yoc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlKSk7CisKKwlpZiAoYWNwaV9wcm9jZXNzb3JfcmVnaXN0ZXJfcGVyZm9ybWFuY2UoYWNwaV9wcm9jZXNzb3JfcGVyZiwgMCkpIHsKKwkJcmV0dmFsID0gLUVJTzsKKwkJZ290byBlcnIxOworCX0KKworCWlmIChhY3BpX3Byb2Nlc3Nvcl9wZXJmLT5jb250cm9sX3JlZ2lzdGVyLnNwYWNlX2lkICE9IEFDUElfQURSX1NQQUNFX0ZJWEVEX0hBUkRXQVJFKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyMjsKKwl9CisKKwlpZiAoYWNwaV9wcm9jZXNzb3JfcGVyZi0+c3RhdHVzX3JlZ2lzdGVyLnNwYWNlX2lkICE9IEFDUElfQURSX1NQQUNFX0ZJWEVEX0hBUkRXQVJFKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyMjsKKwl9CisKKwludW1iZXJfc2NhbGVzID0gYWNwaV9wcm9jZXNzb3JfcGVyZi0+c3RhdGVfY291bnQ7CisKKwlpZiAobnVtYmVyX3NjYWxlcyA8IDIpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBlcnIyOworCX0KKworCXBvd2Vybm93X3RhYmxlID0ga21hbGxvYygobnVtYmVyX3NjYWxlcyArIDEpICogKHNpemVvZihzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUpKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwb3dlcm5vd190YWJsZSkgeworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIGVycjI7CisJfQorCisJbWVtc2V0KHBvd2Vybm93X3RhYmxlLCAwLCAoKG51bWJlcl9zY2FsZXMgKyAxKSAqIHNpemVvZihzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUpKSk7CisKKwlwYy52YWwgPSAodW5zaWduZWQgbG9uZykgYWNwaV9wcm9jZXNzb3JfcGVyZi0+c3RhdGVzWzBdLmNvbnRyb2w7CisJZm9yIChpID0gMDsgaSA8IG51bWJlcl9zY2FsZXM7IGkrKykgeworCQl1OCBmaWQsIHZpZDsKKwkJdW5zaWduZWQgaW50IHNwZWVkOworCisJCXBjLnZhbCA9ICh1bnNpZ25lZCBsb25nKSBhY3BpX3Byb2Nlc3Nvcl9wZXJmLT5zdGF0ZXNbaV0uY29udHJvbDsKKwkJZHByaW50ayAoImFjcGk6ICBQJWQ6ICVkIE1IeiAlZCBtVyAlZCB1UyBjb250cm9sICUwOHggU0dUQyAlZFxuIiwKKwkJCSBpLAorCQkJICh1MzIpIGFjcGlfcHJvY2Vzc29yX3BlcmYtPnN0YXRlc1tpXS5jb3JlX2ZyZXF1ZW5jeSwKKwkJCSAodTMyKSBhY3BpX3Byb2Nlc3Nvcl9wZXJmLT5zdGF0ZXNbaV0ucG93ZXIsCisJCQkgKHUzMikgYWNwaV9wcm9jZXNzb3JfcGVyZi0+c3RhdGVzW2ldLnRyYW5zaXRpb25fbGF0ZW5jeSwKKwkJCSAodTMyKSBhY3BpX3Byb2Nlc3Nvcl9wZXJmLT5zdGF0ZXNbaV0uY29udHJvbCwKKwkJCSBwYy5iaXRzLnNndGMpOworCisJCXZpZCA9IHBjLmJpdHMudmlkOworCQlmaWQgPSBwYy5iaXRzLmZpZDsKKworCQlwb3dlcm5vd190YWJsZVtpXS5mcmVxdWVuY3kgPSBmc2IgKiBmaWRfY29kZXNbZmlkXSAvIDEwOworCQlwb3dlcm5vd190YWJsZVtpXS5pbmRleCA9IGZpZDsgLyogbG93ZXIgOCBiaXRzICovCisJCXBvd2Vybm93X3RhYmxlW2ldLmluZGV4IHw9ICh2aWQgPDwgOCk7IC8qIHVwcGVyIDggYml0cyAqLworCisJCXNwZWVkID0gcG93ZXJub3dfdGFibGVbaV0uZnJlcXVlbmN5OworCisJCWlmICgoZmlkX2NvZGVzW2ZpZF0gJSAxMCk9PTUpIHsKKwkJCWlmIChoYXZlX2EwID09IDEpCisJCQkJcG93ZXJub3dfdGFibGVbaV0uZnJlcXVlbmN5ID0gQ1BVRlJFUV9FTlRSWV9JTlZBTElEOworCQl9CisKKwkJZHByaW50ayAoIiAgIEZJRDogMHgleCAoJWQuJWR4IFslZE1Iel0pICAiCisJCQkgIlZJRDogMHgleCAoJWQuJTAzZFYpXG4iLCBmaWQsIGZpZF9jb2Rlc1tmaWRdIC8gMTAsIAorCQkJIGZpZF9jb2Rlc1tmaWRdICUgMTAsIHNwZWVkLzEwMDAsIHZpZCwJCisJCQkgbW9iaWxlX3ZpZF90YWJsZVt2aWRdLzEwMDAsCisJCQkgbW9iaWxlX3ZpZF90YWJsZVt2aWRdJTEwMDApOworCisJCWlmIChsYXRlbmN5IDwgcGMuYml0cy5zZ3RjKQorCQkJbGF0ZW5jeSA9IHBjLmJpdHMuc2d0YzsKKworCQlpZiAoc3BlZWQgPCBtaW5pbXVtX3NwZWVkKQorCQkJbWluaW11bV9zcGVlZCA9IHNwZWVkOworCQlpZiAoc3BlZWQgPiBtYXhpbXVtX3NwZWVkKQorCQkJbWF4aW11bV9zcGVlZCA9IHNwZWVkOworCX0KKworCXBvd2Vybm93X3RhYmxlW2ldLmZyZXF1ZW5jeSA9IENQVUZSRVFfVEFCTEVfRU5EOworCXBvd2Vybm93X3RhYmxlW2ldLmluZGV4ID0gMDsKKworCS8qIG5vdGlmeSBCSU9TIHRoYXQgd2UgZXhpc3QgKi8KKwlhY3BpX3Byb2Nlc3Nvcl9ub3RpZnlfc21tKFRISVNfTU9EVUxFKTsKKworCXJldHVybiAwOworCitlcnIyOgorCWFjcGlfcHJvY2Vzc29yX3VucmVnaXN0ZXJfcGVyZm9ybWFuY2UoYWNwaV9wcm9jZXNzb3JfcGVyZiwgMCk7CitlcnIxOgorCWtmcmVlKGFjcGlfcHJvY2Vzc29yX3BlcmYpOworZXJyMDoKKwlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiQUNQSSBwZXJmbGliIGNhbiBub3QgYmUgdXNlZCBpbiB0aGlzIHBsYXRmb3JtXG4iKTsKKwlhY3BpX3Byb2Nlc3Nvcl9wZXJmID0gTlVMTDsKKwlyZXR1cm4gcmV0dmFsOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgcG93ZXJub3dfYWNwaV9pbml0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIm5vIHN1cHBvcnQgZm9yIEFDUEkgcHJvY2Vzc29yIGZvdW5kLiIKKwkgICAgICAgIiAgUGxlYXNlIHJlY29tcGlsZSB5b3VyIGtlcm5lbCB3aXRoIEFDUEkgcHJvY2Vzc29yXG4iKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHBvd2Vybm93X2RlY29kZV9iaW9zIChpbnQgbWF4ZmlkLCBpbnQgc3RhcnR2aWQpCit7CisJc3RydWN0IHBzYl9zICpwc2I7CisJc3RydWN0IHBzdF9zICpwc3Q7CisJdW5zaWduZWQgaW50IGksIGo7CisJdW5zaWduZWQgY2hhciAqcDsKKwl1bnNpZ25lZCBpbnQgZXR1cGxlOworCXVuc2lnbmVkIGludCByZXQ7CisKKwlldHVwbGUgPSBjcHVpZF9lYXgoMHg4MDAwMDAwMSk7CisKKwlmb3IgKGk9MHhDMDAwMDsgaSA8IDB4ZmZmZjAgOyBpKz0xNikgeworCisJCXAgPSBwaHlzX3RvX3ZpcnQoaSk7CisKKwkJaWYgKG1lbWNtcChwLCAiQU1ESzdQTk9XISIsICAxMCkgPT0gMCl7CisJCQlkcHJpbnRrICgiRm91bmQgUFNCIGhlYWRlciBhdCAlcFxuIiwgcCk7CisJCQlwc2IgPSAoc3RydWN0IHBzYl9zICopIHA7CisJCQlkcHJpbnRrICgiVGFibGUgdmVyc2lvbjogMHgleFxuIiwgcHNiLT50YWJsZXZlcnNpb24pOworCQkJaWYgKHBzYi0+dGFibGV2ZXJzaW9uICE9IDB4MTIpIHsKKwkJCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIlNvcnJ5LCBvbmx5IHYxLjIgdGFibGVzIHN1cHBvcnRlZCByaWdodCBub3dcbiIpOworCQkJCXJldHVybiAtRU5PREVWOworCQkJfQorCisJCQlkcHJpbnRrICgiRmxhZ3M6IDB4JXhcbiIsIHBzYi0+ZmxhZ3MpOworCQkJaWYgKChwc2ItPmZsYWdzICYgMSk9PTApIHsKKwkJCQlkcHJpbnRrICgiTW9iaWxlIHZvbHRhZ2UgcmVndWxhdG9yXG4iKTsKKwkJCX0gZWxzZSB7CisJCQkJZHByaW50ayAoIkRlc2t0b3Agdm9sdGFnZSByZWd1bGF0b3JcbiIpOworCQkJfQorCisJCQlsYXRlbmN5ID0gcHNiLT5zZXR0bGluZ3RpbWU7CisJCQlpZiAobGF0ZW5jeSA8IDEwMCkgeworCQkJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiQklPUyBzZXQgc2V0dGxpbmcgdGltZSB0byAlZCBtaWNyb3NlY29uZHMuIgorCQkJCQkJIlNob3VsZCBiZSBhdCBsZWFzdCAxMDAuIENvcnJlY3RpbmcuXG4iLCBsYXRlbmN5KTsKKwkJCQlsYXRlbmN5ID0gMTAwOworCQkJfQorCQkJZHByaW50ayAoIlNldHRsaW5nIFRpbWU6ICVkIG1pY3Jvc2Vjb25kcy5cbiIsIHBzYi0+c2V0dGxpbmd0aW1lKTsKKwkJCWRwcmludGsgKCJIYXMgJWQgUFNUIHRhYmxlcy4gKE9ubHkgZHVtcGluZyBvbmVzIHJlbGV2YW50IHRvIHRoaXMgQ1BVKS5cbiIsIHBzYi0+bnVtcHN0KTsKKworCQkJcCArPSBzaXplb2YgKHN0cnVjdCBwc2Jfcyk7CisKKwkJCXBzdCA9IChzdHJ1Y3QgcHN0X3MgKikgcDsKKworCQkJZm9yIChpID0gMCA7IGkgPHBzYi0+bnVtcHN0OyBpKyspIHsKKwkJCQlwc3QgPSAoc3RydWN0IHBzdF9zICopIHA7CisJCQkJbnVtYmVyX3NjYWxlcyA9IHBzdC0+bnVtcHN0YXRlczsKKworCQkJCWlmICgoZXR1cGxlID09IHBzdC0+Y3B1aWQpICYmIGNoZWNrX2ZzYihwc3QtPmZzYnNwZWVkKSAmJgorCQkJCSAgICAobWF4ZmlkPT1wc3QtPm1heGZpZCkgJiYgKHN0YXJ0dmlkPT1wc3QtPnN0YXJ0dmlkKSkKKwkJCQl7CisJCQkJCWRwcmludGsgKCJQU1Q6JWQgKEAlcClcbiIsIGksIHBzdCk7CisJCQkJCWRwcmludGsgKCIgY3B1aWQ6IDB4JXggIGZzYjogJWQgIG1heEZJRDogMHgleCAgc3RhcnR2aWQ6IDB4JXhcbiIsIAorCQkJCQkJIHBzdC0+Y3B1aWQsIHBzdC0+ZnNic3BlZWQsIHBzdC0+bWF4ZmlkLCBwc3QtPnN0YXJ0dmlkKTsKKworCQkJCQlyZXQgPSBnZXRfcmFuZ2VzICgoY2hhciAqKSBwc3QgKyBzaXplb2YgKHN0cnVjdCBwc3RfcykpOworCQkJCQlyZXR1cm4gcmV0OworCisJCQkJfSBlbHNlIHsKKwkJCQkJcCA9IChjaGFyICopIHBzdCArIHNpemVvZiAoc3RydWN0IHBzdF9zKTsKKwkJCQkJZm9yIChqPTAgOyBqIDwgbnVtYmVyX3NjYWxlczsgaisrKQorCQkJCQkJcCs9MjsKKwkJCQl9CisJCQl9CisJCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIk5vIFBTVCB0YWJsZXMgbWF0Y2ggdGhpcyBjcHVpZCAoMHgleClcbiIsIGV0dXBsZSk7CisJCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIlRoaXMgaXMgaW5kaWNhdGl2ZSBvZiBhIGJyb2tlbiBCSU9TLlxuIik7CisKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXArKzsKKwl9CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworCitzdGF0aWMgaW50IHBvd2Vybm93X3RhcmdldCAoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCisJCQkgICAgdW5zaWduZWQgaW50IHRhcmdldF9mcmVxLAorCQkJICAgIHVuc2lnbmVkIGludCByZWxhdGlvbikKK3sKKwl1bnNpZ25lZCBpbnQgbmV3c3RhdGU7CisKKwlpZiAoY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdGFyZ2V0KHBvbGljeSwgcG93ZXJub3dfdGFibGUsIHRhcmdldF9mcmVxLCByZWxhdGlvbiwgJm5ld3N0YXRlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljaGFuZ2Vfc3BlZWQobmV3c3RhdGUpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBwb3dlcm5vd192ZXJpZnkgKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXJldHVybiBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV92ZXJpZnkocG9saWN5LCBwb3dlcm5vd190YWJsZSk7Cit9CisKKy8qCisgKiBXZSB1c2UgdGhlIGZhY3QgdGhhdCB0aGUgYnVzIGZyZXF1ZW5jeSBpcyBzb21laG93CisgKiBhIG11bHRpcGxlIG9mIDEwMDAwMC8zIGtoeiwgdGhlbiB3ZSBjb21wdXRlIHNndGMgYWNjb3JkaW5nCisgKiB0byB0aGlzIG11bHRpcGxlLgorICogVGhhdCB3YXksIHdlIG1hdGNoIG1vcmUgaG93IEFNRCB0aGlua3MgYWxsIG9mIHRoYXQgd29yay4KKyAqIFdlIHdpbGwgdGhlbiBnZXQgdGhlIHNhbWUga2luZCBvZiBiZWhhdmlvdXIgYWxyZWFkeSB0ZXN0ZWQgdW5kZXIKKyAqIHRoZSAid2VsbC1rbm93biIgb3RoZXIgT1MuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGZpeHVwX3NndGModm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgc2d0YzsKKwl1bnNpZ25lZCBpbnQgbTsKKworCW0gPSBmc2IgLyAzMzMzOworCWlmICgobSAlIDEwKSA+PSA1KQorCQltICs9IDU7CisKKwltIC89IDEwOworCisJc2d0YyA9IDEwMCAqIG0gKiBsYXRlbmN5OworCXNndGMgPSBzZ3RjIC8gMzsKKwlpZiAoc2d0YyA+IDB4ZmZmZmYpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIlNHVEMgdG9vIGxhcmdlICVkXG4iLCBzZ3RjKTsKKwkJc2d0YyA9IDB4ZmZmZmY7CisJfQorCXJldHVybiBzZ3RjOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHBvd2Vybm93X2dldCh1bnNpZ25lZCBpbnQgY3B1KQoreworCXVuaW9uIG1zcl9maWR2aWRzdGF0dXMgZmlkdmlkc3RhdHVzOworCXVuc2lnbmVkIGludCBjZmlkOworCisJaWYgKGNwdSkKKwkJcmV0dXJuIDA7CisJcmRtc3JsIChNU1JfSzdfRklEX1ZJRF9TVEFUVVMsIGZpZHZpZHN0YXR1cy52YWwpOworCWNmaWQgPSBmaWR2aWRzdGF0dXMuYml0cy5DRklEOworCisJcmV0dXJuIChmc2IgKiBmaWRfY29kZXNbY2ZpZF0gLyAxMCk7Cit9CisKKworc3RhdGljIGludCBfX2luaXQgYWNlcl9jcHVmcmVxX3BzdChzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZCkKK3sKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlcyBsYXB0b3Agd2l0aCBicm9rZW4gUFNUIHRhYmxlcyBpbiBCSU9TIGRldGVjdGVkLlxuIiwgZC0+aWRlbnQpOworCXByaW50ayhLRVJOX1dBUk5JTkcgIllvdSBuZWVkIHRvIGRvd25ncmFkZSB0byAzQTIxICgwOS8wOS8yMDAyKSwgb3IgdHJ5IGEgbmV3ZXIgQklPUyB0aGFuIDNBNzEgKDAxLzIwLzIwMDMpXG4iKTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICJjcHVmcmVxIHNjYWxpbmcgaGFzIGJlZW4gZGlzYWJsZWQgYXMgYSByZXN1bHQgb2YgdGhpcy5cbiIpOworCXJldHVybiAwOworfQorCisvKgorICogU29tZSBBdGhsb24gbGFwdG9wcyBoYXZlIHJlYWxseSBmdWNrZWQgUFNUIHRhYmxlcy4KKyAqIEEgQklPUyB1cGRhdGUgaXMgYWxsIHRoYXQgY2FuIHNhdmUgdGhlbS4KKyAqIE1lbnRpb24gdGhpcywgYW5kIGRpc2FibGUgY3B1ZnJlcS4KKyAqLworc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIF9faW5pdGRhdGEgcG93ZXJub3dfZG1pX3RhYmxlW10gPSB7CisJeworCQkuY2FsbGJhY2sgPSBhY2VyX2NwdWZyZXFfcHN0LAorCQkuaWRlbnQgPSAiQWNlciBBc3BpcmUiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkluc3lkZSBTb2Z0d2FyZSIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX1ZFUlNJT04sICIzQTcxIiksCisJCX0sCisJfSwKKwl7IH0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBvd2Vybm93X2NwdV9pbml0IChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwl1bmlvbiBtc3JfZmlkdmlkc3RhdHVzIGZpZHZpZHN0YXR1czsKKwlpbnQgcmVzdWx0OworCisJaWYgKHBvbGljeS0+Y3B1ICE9IDApCisJCXJldHVybiAtRU5PREVWOworCisJcmRtc3JsIChNU1JfSzdfRklEX1ZJRF9TVEFUVVMsIGZpZHZpZHN0YXR1cy52YWwpOworCisJLyogQSBLNyB3aXRoIHBvd2Vybm93IHRlY2hub2xvZ3kgaXMgc2V0IHRvIG1heCBmcmVxdWVuY3kgYnkgQklPUyAqLworCWZzYiA9ICgxMCAqIGNwdV9raHopIC8gZmlkX2NvZGVzW2ZpZHZpZHN0YXR1cy5iaXRzLk1GSURdOworCWlmICghZnNiKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJjYW4gbm90IGRldGVybWluZSBidXMgZnJlcXVlbmN5XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWRwcmludGsoIkZTQjogJTNkLiUwM2QgTUh6XG4iLCBmc2IvMTAwMCwgZnNiJTEwMDApOworCisJaWYgKGRtaV9jaGVja19zeXN0ZW0ocG93ZXJub3dfZG1pX3RhYmxlKSB8fCBhY3BpX2ZvcmNlKSB7CisJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiUFNCL1BTVCBrbm93biB0byBiZSBicm9rZW4uICBUcnlpbmcgQUNQSSBpbnN0ZWFkXG4iKTsKKwkJcmVzdWx0ID0gcG93ZXJub3dfYWNwaV9pbml0KCk7CisJfSBlbHNlIHsKKwkJcmVzdWx0ID0gcG93ZXJub3dfZGVjb2RlX2Jpb3MoZmlkdmlkc3RhdHVzLmJpdHMuTUZJRCwgZmlkdmlkc3RhdHVzLmJpdHMuU1ZJRCk7CisJCWlmIChyZXN1bHQpIHsKKwkJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiVHJ5aW5nIEFDUEkgcGVyZmxpYlxuIik7CisJCQltYXhpbXVtX3NwZWVkID0gMDsKKwkJCW1pbmltdW1fc3BlZWQgPSAtMTsKKwkJCWxhdGVuY3kgPSAwOworCQkJcmVzdWx0ID0gcG93ZXJub3dfYWNwaV9pbml0KCk7CisJCQlpZiAocmVzdWx0KSB7CisJCQkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJBQ1BJIGFuZCBsZWdhY3kgbWV0aG9kcyBmYWlsZWRcbiIpOworCQkJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiU2VlIGh0dHA6Ly93d3cuY29kZW1vbmtleS5vcmcudWsvcHJvamVjdHMvY3B1ZnJlcS9wb3dlcm5vdy1rNy5zaHRtbFxuIik7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBTR1RDIHVzZSB0aGUgYnVzIGNsb2NrIGFzIHRpbWVyICovCisJCQlsYXRlbmN5ID0gZml4dXBfc2d0YygpOworCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlNHVEM6ICVkXG4iLCBsYXRlbmN5KTsKKwkJfQorCX0KKworCWlmIChyZXN1bHQpCisJCXJldHVybiByZXN1bHQ7CisKKwlwcmludGsgKEtFUk5fSU5GTyBQRlggIk1pbmltdW0gc3BlZWQgJWQgTUh6LiBNYXhpbXVtIHNwZWVkICVkIE1Iei5cbiIsCisJCQkJbWluaW11bV9zcGVlZC8xMDAwLCBtYXhpbXVtX3NwZWVkLzEwMDApOworCisJcG9saWN5LT5nb3Zlcm5vciA9IENQVUZSRVFfREVGQVVMVF9HT1ZFUk5PUjsKKworCXBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kgPSBjcHVmcmVxX3NjYWxlKDIwMDAwMDBVTCwgZnNiLCBsYXRlbmN5KTsKKworCXBvbGljeS0+Y3VyID0gcG93ZXJub3dfZ2V0KDApOworCisJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfZ2V0X2F0dHIocG93ZXJub3dfdGFibGUsIHBvbGljeS0+Y3B1KTsKKworCXJldHVybiBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9jcHVpbmZvKHBvbGljeSwgcG93ZXJub3dfdGFibGUpOworfQorCitzdGF0aWMgaW50IHBvd2Vybm93X2NwdV9leGl0IChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkgeworCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3B1dF9hdHRyKHBvbGljeS0+Y3B1KTsKKworI2lmZGVmIENPTkZJR19YODZfUE9XRVJOT1dfSzdfQUNQSQorCWlmIChhY3BpX3Byb2Nlc3Nvcl9wZXJmKSB7CisJCWFjcGlfcHJvY2Vzc29yX3VucmVnaXN0ZXJfcGVyZm9ybWFuY2UoYWNwaV9wcm9jZXNzb3JfcGVyZiwgMCk7CisJCWtmcmVlKGFjcGlfcHJvY2Vzc29yX3BlcmYpOworCX0KKyNlbmRpZgorCisJaWYgKHBvd2Vybm93X3RhYmxlKQorCQlrZnJlZShwb3dlcm5vd190YWJsZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmcmVxX2F0dHIqIHBvd2Vybm93X3RhYmxlX2F0dHJbXSA9IHsKKwkmY3B1ZnJlcV9mcmVxX2F0dHJfc2NhbGluZ19hdmFpbGFibGVfZnJlcXMsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIgcG93ZXJub3dfZHJpdmVyID0geworCS52ZXJpZnkJPSBwb3dlcm5vd192ZXJpZnksCisJLnRhcmdldAk9IHBvd2Vybm93X3RhcmdldCwKKwkuZ2V0CT0gcG93ZXJub3dfZ2V0LAorCS5pbml0CT0gcG93ZXJub3dfY3B1X2luaXQsCisJLmV4aXQJPSBwb3dlcm5vd19jcHVfZXhpdCwKKwkubmFtZQk9ICJwb3dlcm5vdy1rNyIsCisJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLmF0dHIJPSBwb3dlcm5vd190YWJsZV9hdHRyLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcG93ZXJub3dfaW5pdCAodm9pZCkKK3sKKwlpZiAoY2hlY2tfcG93ZXJub3coKT09MCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJcmV0dXJuIGNwdWZyZXFfcmVnaXN0ZXJfZHJpdmVyKCZwb3dlcm5vd19kcml2ZXIpOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwb3dlcm5vd19leGl0ICh2b2lkKQoreworCWNwdWZyZXFfdW5yZWdpc3Rlcl9kcml2ZXIoJnBvd2Vybm93X2RyaXZlcik7Cit9CisKK21vZHVsZV9wYXJhbShhY3BpX2ZvcmNlLCAgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoYWNwaV9mb3JjZSwgIkZvcmNlIEFDUEkgdG8gYmUgdXNlZC4iKTsKKworTU9EVUxFX0FVVEhPUiAoIkRhdmUgSm9uZXMgPGRhdmVqQGNvZGVtb25rZXkub3JnLnVrPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OICgiUG93ZXJub3cgZHJpdmVyIGZvciBBTUQgSzcgcHJvY2Vzc29ycy4iKTsKK01PRFVMRV9MSUNFTlNFICgiR1BMIik7CisKK2xhdGVfaW5pdGNhbGwocG93ZXJub3dfaW5pdCk7Cittb2R1bGVfZXhpdChwb3dlcm5vd19leGl0KTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rNy5oIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rNy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YTYzYjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs3LmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqICAkSWQ6IHBvd2Vybm93LWs3LmgsdiAxLjIgMjAwMy8wMi8xMCAxODoyNjowMSBkYXZlaiBFeHAgJAorICogIChDKSAyMDAzIERhdmUgSm9uZXMuCisgKgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBMaWNlbnNlIHZlcnNpb24gMi4KKyAqCisgKiAgQU1ELXNwZWNpZmljIGluZm9ybWF0aW9uCisgKgorICovCisKK3VuaW9uIG1zcl9maWR2aWRjdGwgeworCXN0cnVjdCB7CisJCXVuc2lnbmVkIEZJRDo1LAkJCS8vIDQ6MAorCQlyZXNlcnZlZDE6MywJLy8gNzo1CisJCVZJRDo1LAkJCS8vIDEyOjgKKwkJcmVzZXJ2ZWQyOjMsCS8vIDE1OjEzCisJCUZJREM6MSwJCQkvLyAxNgorCQlWSURDOjEsCQkJLy8gMTcKKwkJcmVzZXJ2ZWQzOjIsCS8vIDE5OjE4CisJCUZJRENIR1JBVElPOjEsCS8vIDIwCisJCXJlc2VydmVkNDoxMSwJLy8gMzEtMjEKKwkJU0dUQzoyMCwJCS8vIDMyOjUxCisJCXJlc2VydmVkNToxMjsJLy8gNjM6NTIKKwl9IGJpdHM7CisJdW5zaWduZWQgbG9uZyBsb25nIHZhbDsKK307CisKK3VuaW9uIG1zcl9maWR2aWRzdGF0dXMgeworCXN0cnVjdCB7CisJCXVuc2lnbmVkIENGSUQ6NSwJCQkvLyA0OjAKKwkJcmVzZXJ2ZWQxOjMsCS8vIDc6NQorCQlTRklEOjUsCQkJLy8gMTI6OAorCQlyZXNlcnZlZDI6MywJLy8gMTU6MTMKKwkJTUZJRDo1LAkJCS8vIDIwOjE2CisJCXJlc2VydmVkMzoxMSwJLy8gMzE6MjEKKwkJQ1ZJRDo1LAkJCS8vIDM2OjMyCisJCXJlc2VydmVkNDozLAkvLyAzOTozNworCQlTVklEOjUsCQkJLy8gNDQ6NDAKKwkJcmVzZXJ2ZWQ1OjMsCS8vIDQ3OjQ1CisJCU1WSUQ6NSwJCQkvLyA1Mjo0OAorCQlyZXNlcnZlZDY6MTE7CS8vIDYzOjUzCisJfSBiaXRzOworCXVuc2lnbmVkIGxvbmcgbG9uZyB2YWw7Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rOC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rOC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NWZmN2UKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs4LmMKQEAgLTAsMCArMSwxMTM1IEBACisvKgorICogICAoYykgMjAwMywgMjAwNCBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKiAgWW91ciB1c2Ugb2YgdGhpcyBjb2RlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorICogIEdOVSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlIHZlcnNpb24gMi4gU2VlICJDT1BZSU5HIiBvcgorICogIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbAorICoKKyAqICBTdXBwb3J0IDogcGF1bC5kZXZyaWVuZHRAYW1kLmNvbQorICoKKyAqICBCYXNlZCBvbiB0aGUgcG93ZXJub3ctazcuYyBtb2R1bGUgd3JpdHRlbiBieSBEYXZlIEpvbmVzLgorICogIChDKSAyMDAzIERhdmUgSm9uZXMgPGRhdmVqQGNvZGVtb25rZXkub3JnLnVrPiBvbiBiZWhhbGYgb2YgU3VTRSBMYWJzCisgKiAgKEMpIDIwMDQgRG9taW5payBCcm9kb3dza2kgPGxpbnV4QGJyb2RvLmRlPgorICogIChDKSAyMDA0IFBhdmVsIE1hY2hlayA8cGF2ZWxAc3VzZS5jej4KKyAqICBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgTGljZW5zZSB2ZXJzaW9uIDIuCisgKiAgQmFzZWQgdXBvbiBkYXRhc2hlZXRzICYgc2FtcGxlIENQVXMga2luZGx5IHByb3ZpZGVkIGJ5IEFNRC4KKyAqCisgKiAgVmFsdWFibGUgaW5wdXQgZ3JhdGVmdWxseSByZWNlaXZlZCBmcm9tIERhdmUgSm9uZXMsIFBhdmVsIE1hY2hlaywKKyAqICBEb21pbmlrIEJyb2Rvd3NraSwgYW5kIG90aGVycy4KKyAqICBQcm9jZXNzb3IgaW5mb3JtYXRpb24gb2J0YWluZWQgZnJvbSBDaGFwdGVyIDkgKFBvd2VyIGFuZCBUaGVybWFsIE1hbmFnZW1lbnQpCisgKiAgb2YgdGhlICJCSU9TIGFuZCBLZXJuZWwgRGV2ZWxvcGVyJ3MgR3VpZGUgZm9yIHRoZSBBTUQgQXRobG9uIDY0IGFuZCBBTUQKKyAqICBPcHRlcm9uIFByb2Nlc3NvcnMiIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQgZnJvbSB3d3cuYW1kLmNvbQorICoKKyAqICBUYWJsZXMgZm9yIHNwZWNpZmljIENQVXMgY2FuIGJlIGluZnJlcnJlZCBmcm9tCisgKglodHRwOi8vd3d3LmFtZC5jb20vdXMtZW4vYXNzZXRzL2NvbnRlbnRfdHlwZS93aGl0ZV9wYXBlcnNfYW5kX3RlY2hfZG9jcy8zMDQzMC5wZGYKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CisKKyNpZmRlZiBDT05GSUdfWDg2X1BPV0VSTk9XX0s4X0FDUEkKKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8YWNwaS9wcm9jZXNzb3IuaD4KKyNlbmRpZgorCisjZGVmaW5lIFBGWCAicG93ZXJub3ctazg6ICIKKyNkZWZpbmUgQkZYIFBGWCAiQklPUyBlcnJvcjogIgorI2RlZmluZSBWRVJTSU9OICJ2ZXJzaW9uIDEuMDAuMDllIgorI2luY2x1ZGUgInBvd2Vybm93LWs4LmgiCisKKy8qIHNlcmlhbGl6ZSBmcmVxIGNoYW5nZXMgICovCitzdGF0aWMgREVDTEFSRV9NVVRFWChmaWR2aWRfc2VtKTsKKworc3RhdGljIHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpwb3dlcm5vd19kYXRhW05SX0NQVVNdOworCisvKiBSZXR1cm4gYSBmcmVxdWVuY3kgaW4gTUh6LCBnaXZlbiBhbiBpbnB1dCBmaWQgKi8KK3N0YXRpYyB1MzIgZmluZF9mcmVxX2Zyb21fZmlkKHUzMiBmaWQpCit7CisJcmV0dXJuIDgwMCArIChmaWQgKiAxMDApOworfQorCisvKiBSZXR1cm4gYSBmcmVxdWVuY3kgaW4gS0h6LCBnaXZlbiBhbiBpbnB1dCBmaWQgKi8KK3N0YXRpYyB1MzIgZmluZF9raHpfZnJlcV9mcm9tX2ZpZCh1MzIgZmlkKQoreworCXJldHVybiAxMDAwICogZmluZF9mcmVxX2Zyb21fZmlkKGZpZCk7Cit9CisKKy8qIFJldHVybiBhIHZvbHRhZ2UgaW4gbWlsaVZvbHRzLCBnaXZlbiBhbiBpbnB1dCB2aWQgKi8KK3N0YXRpYyB1MzIgZmluZF9taWxsaXZvbHRzX2Zyb21fdmlkKHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhLCB1MzIgdmlkKQoreworCXJldHVybiAxNTUwLXZpZCoyNTsKK30KKworLyogUmV0dXJuIHRoZSB2Y28gZmlkIGZvciBhbiBpbnB1dCBmaWQKKyAqCisgKiBFYWNoICJsb3ciIGZpZCBoYXMgY29ycmVzcG9uZGluZyAiaGlnaCIgZmlkLCBhbmQgeW91IGNhbiBnZXQgdG8gImxvdyIgZmlkcworICogb25seSBmcm9tIGNvcnJlc3BvbmRpbmcgaGlnaCBmaWRzLiBUaGlzIHJldHVybnMgImhpZ2giIGZpZCBjb3JyZXNwb25kaW5nIHRvCisgKiAibG93IiBvbmUuCisgKi8KK3N0YXRpYyB1MzIgY29udmVydF9maWRfdG9fdmNvX2ZpZCh1MzIgZmlkKQoreworCWlmIChmaWQgPCBISV9GSURfVEFCTEVfQk9UVE9NKSB7CisJCXJldHVybiA4ICsgKDIgKiBmaWQpOworCX0gZWxzZSB7CisJCXJldHVybiBmaWQ7CisJfQorfQorCisvKgorICogUmV0dXJuIDEgaWYgdGhlIHBlbmRpbmcgYml0IGlzIHNldC4gVW5sZXNzIHdlIGp1c3QgaW5zdHJ1Y3RlZCB0aGUgcHJvY2Vzc29yCisgKiB0byB0cmFuc2l0aW9uIHRvIGEgbmV3IHN0YXRlLCBzZWVpbmcgdGhpcyBiaXQgc2V0IGlzIHJlYWxseSBiYWQgbmV3cy4KKyAqLworc3RhdGljIGludCBwZW5kaW5nX2JpdF9zdHVjayh2b2lkKQoreworCXUzMiBsbywgaGk7CisKKwlyZG1zcihNU1JfRklEVklEX1NUQVRVUywgbG8sIGhpKTsKKwlyZXR1cm4gbG8gJiBNU1JfU19MT19DSEFOR0VfUEVORElORyA/IDEgOiAwOworfQorCisvKgorICogVXBkYXRlIHRoZSBnbG9iYWwgY3VycmVudCBmaWQgLyB2aWQgdmFsdWVzIGZyb20gdGhlIHN0YXR1cyBtc3IuCisgKiBSZXR1cm5zIDEgb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgcXVlcnlfY3VycmVudF92YWx1ZXNfd2l0aF9wZW5kaW5nX3dhaXQoc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEpCit7CisJdTMyIGxvLCBoaTsKKwl1MzIgaSA9IDA7CisKKwlsbyA9IE1TUl9TX0xPX0NIQU5HRV9QRU5ESU5HOworCXdoaWxlIChsbyAmIE1TUl9TX0xPX0NIQU5HRV9QRU5ESU5HKSB7CisJCWlmIChpKysgPiAweDEwMDAwMDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggImRldGVjdGVkIGNoYW5nZSBwZW5kaW5nIHN0dWNrXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJCXJkbXNyKE1TUl9GSURWSURfU1RBVFVTLCBsbywgaGkpOworCX0KKworCWRhdGEtPmN1cnJ2aWQgPSBoaSAmIE1TUl9TX0hJX0NVUlJFTlRfVklEOworCWRhdGEtPmN1cnJmaWQgPSBsbyAmIE1TUl9TX0xPX0NVUlJFTlRfRklEOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHRoZSBpc29jaHJvbm91cyByZWxpZWYgdGltZSAqLworc3RhdGljIHZvaWQgY291bnRfb2ZmX2lydChzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSkKK3sKKwl1ZGVsYXkoKDEgPDwgZGF0YS0+aXJ0KSAqIDEwKTsKKwlyZXR1cm47Cit9CisKKy8qIHRoZSB2b2x0YWdlIHN0YWJhbGl6YXRpb24gdGltZSAqLworc3RhdGljIHZvaWQgY291bnRfb2ZmX3ZzdChzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSkKK3sKKwl1ZGVsYXkoZGF0YS0+dnN0YWJsZSAqIFZTVF9VTklUU18yMFVTKTsKKwlyZXR1cm47Cit9CisKKy8qIG5lZWQgdG8gaW5pdCB0aGUgY29udHJvbCBtc3IgdG8gYSBzYWZlIHZhbHVlIChmb3IgZWFjaCBjcHUpICovCitzdGF0aWMgdm9pZCBmaWR2aWRfbXNyX2luaXQodm9pZCkKK3sKKwl1MzIgbG8sIGhpOworCXU4IGZpZCwgdmlkOworCisJcmRtc3IoTVNSX0ZJRFZJRF9TVEFUVVMsIGxvLCBoaSk7CisJdmlkID0gaGkgJiBNU1JfU19ISV9DVVJSRU5UX1ZJRDsKKwlmaWQgPSBsbyAmIE1TUl9TX0xPX0NVUlJFTlRfRklEOworCWxvID0gZmlkIHwgKHZpZCA8PCBNU1JfQ19MT19WSURfU0hJRlQpOworCWhpID0gTVNSX0NfSElfU1RQX0dOVF9CRU5JR047CisJZHByaW50aygiY3B1JWQsIGluaXQgbG8gMHgleCwgaGkgMHgleFxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpLCBsbywgaGkpOworCXdybXNyKE1TUl9GSURWSURfQ1RMLCBsbywgaGkpOworfQorCisKKy8qIHdyaXRlIHRoZSBuZXcgZmlkIHZhbHVlIGFsb25nIHdpdGggdGhlIG90aGVyIGNvbnRyb2wgZmllbGRzIHRvIHRoZSBtc3IgKi8KK3N0YXRpYyBpbnQgd3JpdGVfbmV3X2ZpZChzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSwgdTMyIGZpZCkKK3sKKwl1MzIgbG87CisJdTMyIHNhdmV2aWQgPSBkYXRhLT5jdXJydmlkOworCisJaWYgKChmaWQgJiBJTlZBTElEX0ZJRF9NQVNLKSB8fCAoZGF0YS0+Y3VycnZpZCAmIElOVkFMSURfVklEX01BU0spKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImludGVybmFsIGVycm9yIC0gb3ZlcmZsb3cgb24gZmlkIHdyaXRlXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJbG8gPSBmaWQgfCAoZGF0YS0+Y3VycnZpZCA8PCBNU1JfQ19MT19WSURfU0hJRlQpIHwgTVNSX0NfTE9fSU5JVF9GSURfVklEOworCisJZHByaW50aygid3JpdGluZyBmaWQgMHgleCwgbG8gMHgleCwgaGkgMHgleFxuIiwKKwkJZmlkLCBsbywgZGF0YS0+cGxsbG9jayAqIFBMTF9MT0NLX0NPTlZFUlNJT04pOworCisJd3Jtc3IoTVNSX0ZJRFZJRF9DVEwsIGxvLCBkYXRhLT5wbGxsb2NrICogUExMX0xPQ0tfQ09OVkVSU0lPTik7CisKKwlpZiAocXVlcnlfY3VycmVudF92YWx1ZXNfd2l0aF9wZW5kaW5nX3dhaXQoZGF0YSkpCisJCXJldHVybiAxOworCisJY291bnRfb2ZmX2lydChkYXRhKTsKKworCWlmIChzYXZldmlkICE9IGRhdGEtPmN1cnJ2aWQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidmlkIGNoYW5nZSBvbiBmaWQgdHJhbnMsIG9sZCAweCV4LCBuZXcgMHgleFxuIiwKKwkJICAgICAgIHNhdmV2aWQsIGRhdGEtPmN1cnJ2aWQpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoZmlkICE9IGRhdGEtPmN1cnJmaWQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZmlkIHRyYW5zIGZhaWxlZCwgZmlkIDB4JXgsIGN1cnIgMHgleFxuIiwgZmlkLAorCQkgICAgICAgIGRhdGEtPmN1cnJmaWQpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogV3JpdGUgYSBuZXcgdmlkIHRvIHRoZSBoYXJkd2FyZSAqLworc3RhdGljIGludCB3cml0ZV9uZXdfdmlkKHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhLCB1MzIgdmlkKQoreworCXUzMiBsbzsKKwl1MzIgc2F2ZWZpZCA9IGRhdGEtPmN1cnJmaWQ7CisKKwlpZiAoKGRhdGEtPmN1cnJmaWQgJiBJTlZBTElEX0ZJRF9NQVNLKSB8fCAodmlkICYgSU5WQUxJRF9WSURfTUFTSykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiaW50ZXJuYWwgZXJyb3IgLSBvdmVyZmxvdyBvbiB2aWQgd3JpdGVcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlsbyA9IGRhdGEtPmN1cnJmaWQgfCAodmlkIDw8IE1TUl9DX0xPX1ZJRF9TSElGVCkgfCBNU1JfQ19MT19JTklUX0ZJRF9WSUQ7CisKKwlkcHJpbnRrKCJ3cml0aW5nIHZpZCAweCV4LCBsbyAweCV4LCBoaSAweCV4XG4iLAorCQl2aWQsIGxvLCBTVE9QX0dSQU5UXzVOUyk7CisKKwl3cm1zcihNU1JfRklEVklEX0NUTCwgbG8sIFNUT1BfR1JBTlRfNU5TKTsKKworCWlmIChxdWVyeV9jdXJyZW50X3ZhbHVlc193aXRoX3BlbmRpbmdfd2FpdChkYXRhKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoc2F2ZWZpZCAhPSBkYXRhLT5jdXJyZmlkKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImZpZCBjaGFuZ2VkIG9uIHZpZCB0cmFucywgb2xkIDB4JXggbmV3IDB4JXhcbiIsCisJCSAgICAgICBzYXZlZmlkLCBkYXRhLT5jdXJyZmlkKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKHZpZCAhPSBkYXRhLT5jdXJydmlkKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggInZpZCB0cmFucyBmYWlsZWQsIHZpZCAweCV4LCBjdXJyIDB4JXhcbiIsIHZpZCwKKwkJCQlkYXRhLT5jdXJydmlkKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWR1Y2UgdGhlIHZpZCBieSB0aGUgbWF4IG9mIHN0ZXAgb3IgcmVxdmlkLgorICogRGVjcmVhc2luZyB2aWQgY29kZXMgcmVwcmVzZW50IGluY3JlYXNpbmcgdm9sdGFnZXM6CisgKiB2aWQgb2YgMCBpcyAxLjU1MFYsIHZpZCBvZiAweDFlIGlzIDAuODAwViwgdmlkIG9mIDB4MWYgaXMgb2ZmLgorICovCitzdGF0aWMgaW50IGRlY3JlYXNlX3ZpZF9jb2RlX2J5X3N0ZXAoc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEsIHUzMiByZXF2aWQsIHUzMiBzdGVwKQoreworCWlmICgoZGF0YS0+Y3VycnZpZCAtIHJlcXZpZCkgPiBzdGVwKQorCQlyZXF2aWQgPSBkYXRhLT5jdXJydmlkIC0gc3RlcDsKKworCWlmICh3cml0ZV9uZXdfdmlkKGRhdGEsIHJlcXZpZCkpCisJCXJldHVybiAxOworCisJY291bnRfb2ZmX3ZzdChkYXRhKTsKKworCXJldHVybiAwOworfQorCisvKiBDaGFuZ2UgdGhlIGZpZCBhbmQgdmlkLCBieSB0aGUgMyBwaGFzZXMuICovCitzdGF0aWMgaW50IHRyYW5zaXRpb25fZmlkX3ZpZChzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSwgdTMyIHJlcWZpZCwgdTMyIHJlcXZpZCkKK3sKKwlpZiAoY29yZV92b2x0YWdlX3ByZV90cmFuc2l0aW9uKGRhdGEsIHJlcXZpZCkpCisJCXJldHVybiAxOworCisJaWYgKGNvcmVfZnJlcXVlbmN5X3RyYW5zaXRpb24oZGF0YSwgcmVxZmlkKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoY29yZV92b2x0YWdlX3Bvc3RfdHJhbnNpdGlvbihkYXRhLCByZXF2aWQpKQorCQlyZXR1cm4gMTsKKworCWlmIChxdWVyeV9jdXJyZW50X3ZhbHVlc193aXRoX3BlbmRpbmdfd2FpdChkYXRhKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoKHJlcWZpZCAhPSBkYXRhLT5jdXJyZmlkKSB8fCAocmVxdmlkICE9IGRhdGEtPmN1cnJ2aWQpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImZhaWxlZCAoY3B1JWQpOiByZXEgMHgleCAweCV4LCBjdXJyIDB4JXggMHgleFxuIiwKKwkJCQlzbXBfcHJvY2Vzc29yX2lkKCksCisJCQkJcmVxZmlkLCByZXF2aWQsIGRhdGEtPmN1cnJmaWQsIGRhdGEtPmN1cnJ2aWQpOworCQlyZXR1cm4gMTsKKwl9CisKKwlkcHJpbnRrKCJ0cmFuc2l0aW9uZWQgKGNwdSVkKTogbmV3IGZpZCAweCV4LCB2aWQgMHgleFxuIiwKKwkJc21wX3Byb2Nlc3Nvcl9pZCgpLCBkYXRhLT5jdXJyZmlkLCBkYXRhLT5jdXJydmlkKTsKKworCXJldHVybiAwOworfQorCisvKiBQaGFzZSAxIC0gY29yZSB2b2x0YWdlIHRyYW5zaXRpb24gLi4uIHNldHVwIHZvbHRhZ2UgKi8KK3N0YXRpYyBpbnQgY29yZV92b2x0YWdlX3ByZV90cmFuc2l0aW9uKHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhLCB1MzIgcmVxdmlkKQoreworCXUzMiBydm9zdGVwcyA9IGRhdGEtPnJ2bzsKKwl1MzIgc2F2ZWZpZCA9IGRhdGEtPmN1cnJmaWQ7CisKKwlkcHJpbnRrKCJwaDEgKGNwdSVkKTogc3RhcnQsIGN1cnJmaWQgMHgleCwgY3VycnZpZCAweCV4LCByZXF2aWQgMHgleCwgcnZvIDB4JXhcbiIsCisJCXNtcF9wcm9jZXNzb3JfaWQoKSwKKwkJZGF0YS0+Y3VycmZpZCwgZGF0YS0+Y3VycnZpZCwgcmVxdmlkLCBkYXRhLT5ydm8pOworCisJd2hpbGUgKGRhdGEtPmN1cnJ2aWQgPiByZXF2aWQpIHsKKwkJZHByaW50aygicGgxOiBjdXJyIDB4JXgsIHJlcSB2aWQgMHgleFxuIiwKKwkJCWRhdGEtPmN1cnJ2aWQsIHJlcXZpZCk7CisJCWlmIChkZWNyZWFzZV92aWRfY29kZV9ieV9zdGVwKGRhdGEsIHJlcXZpZCwgZGF0YS0+dmlkbXZzKSkKKwkJCXJldHVybiAxOworCX0KKworCXdoaWxlICgocnZvc3RlcHMgPiAwKSAgJiYgKChkYXRhLT5ydm8gKyBkYXRhLT5jdXJydmlkKSA+IHJlcXZpZCkpIHsKKwkJaWYgKGRhdGEtPmN1cnJ2aWQgPT0gMCkgeworCQkJcnZvc3RlcHMgPSAwOworCQl9IGVsc2UgeworCQkJZHByaW50aygicGgxOiBjaGFuZ2luZyB2aWQgZm9yIHJ2bywgcmVxIDB4JXhcbiIsCisJCQkJZGF0YS0+Y3VycnZpZCAtIDEpOworCQkJaWYgKGRlY3JlYXNlX3ZpZF9jb2RlX2J5X3N0ZXAoZGF0YSwgZGF0YS0+Y3VycnZpZCAtIDEsIDEpKQorCQkJCXJldHVybiAxOworCQkJcnZvc3RlcHMtLTsKKwkJfQorCX0KKworCWlmIChxdWVyeV9jdXJyZW50X3ZhbHVlc193aXRoX3BlbmRpbmdfd2FpdChkYXRhKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoc2F2ZWZpZCAhPSBkYXRhLT5jdXJyZmlkKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggInBoMSBlcnIsIGN1cnJmaWQgY2hhbmdlZCAweCV4XG4iLCBkYXRhLT5jdXJyZmlkKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZHByaW50aygicGgxIGNvbXBsZXRlLCBjdXJyZmlkIDB4JXgsIGN1cnJ2aWQgMHgleFxuIiwKKwkJZGF0YS0+Y3VycmZpZCwgZGF0YS0+Y3VycnZpZCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogUGhhc2UgMiAtIGNvcmUgZnJlcXVlbmN5IHRyYW5zaXRpb24gKi8KK3N0YXRpYyBpbnQgY29yZV9mcmVxdWVuY3lfdHJhbnNpdGlvbihzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSwgdTMyIHJlcWZpZCkKK3sKKwl1MzIgdmNvcmVxZmlkLCB2Y29jdXJyZmlkLCB2Y29maWRkaWZmLCBzYXZldmlkID0gZGF0YS0+Y3VycnZpZDsKKworCWlmICgocmVxZmlkIDwgSElfRklEX1RBQkxFX0JPVFRPTSkgJiYgKGRhdGEtPmN1cnJmaWQgPCBISV9GSURfVEFCTEVfQk9UVE9NKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJwaDI6IGlsbGVnYWwgbG8tbG8gdHJhbnNpdGlvbiAweCV4IDB4JXhcbiIsCisJCQlyZXFmaWQsIGRhdGEtPmN1cnJmaWQpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoZGF0YS0+Y3VycmZpZCA9PSByZXFmaWQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAicGgyIG51bGwgZmlkIHRyYW5zaXRpb24gMHgleFxuIiwgZGF0YS0+Y3VycmZpZCk7CisJCXJldHVybiAwOworCX0KKworCWRwcmludGsoInBoMiAoY3B1JWQpOiBzdGFydGluZywgY3VycmZpZCAweCV4LCBjdXJydmlkIDB4JXgsIHJlcWZpZCAweCV4XG4iLAorCQlzbXBfcHJvY2Vzc29yX2lkKCksCisJCWRhdGEtPmN1cnJmaWQsIGRhdGEtPmN1cnJ2aWQsIHJlcWZpZCk7CisKKwl2Y29yZXFmaWQgPSBjb252ZXJ0X2ZpZF90b192Y29fZmlkKHJlcWZpZCk7CisJdmNvY3VycmZpZCA9IGNvbnZlcnRfZmlkX3RvX3Zjb19maWQoZGF0YS0+Y3VycmZpZCk7CisJdmNvZmlkZGlmZiA9IHZjb2N1cnJmaWQgPiB2Y29yZXFmaWQgPyB2Y29jdXJyZmlkIC0gdmNvcmVxZmlkCisJICAgIDogdmNvcmVxZmlkIC0gdmNvY3VycmZpZDsKKworCXdoaWxlICh2Y29maWRkaWZmID4gMikgeworCQlpZiAocmVxZmlkID4gZGF0YS0+Y3VycmZpZCkgeworCQkJaWYgKGRhdGEtPmN1cnJmaWQgPiBMT19GSURfVEFCTEVfVE9QKSB7CisJCQkJaWYgKHdyaXRlX25ld19maWQoZGF0YSwgZGF0YS0+Y3VycmZpZCArIDIpKSB7CisJCQkJCXJldHVybiAxOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKHdyaXRlX25ld19maWQKKwkJCQkgICAgKGRhdGEsIDIgKyBjb252ZXJ0X2ZpZF90b192Y29fZmlkKGRhdGEtPmN1cnJmaWQpKSkgeworCQkJCQlyZXR1cm4gMTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAod3JpdGVfbmV3X2ZpZChkYXRhLCBkYXRhLT5jdXJyZmlkIC0gMikpCisJCQkJcmV0dXJuIDE7CisJCX0KKworCQl2Y29jdXJyZmlkID0gY29udmVydF9maWRfdG9fdmNvX2ZpZChkYXRhLT5jdXJyZmlkKTsKKwkJdmNvZmlkZGlmZiA9IHZjb2N1cnJmaWQgPiB2Y29yZXFmaWQgPyB2Y29jdXJyZmlkIC0gdmNvcmVxZmlkCisJCSAgICA6IHZjb3JlcWZpZCAtIHZjb2N1cnJmaWQ7CisJfQorCisJaWYgKHdyaXRlX25ld19maWQoZGF0YSwgcmVxZmlkKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAocXVlcnlfY3VycmVudF92YWx1ZXNfd2l0aF9wZW5kaW5nX3dhaXQoZGF0YSkpCisJCXJldHVybiAxOworCisJaWYgKGRhdGEtPmN1cnJmaWQgIT0gcmVxZmlkKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJCSJwaDI6IG1pc21hdGNoLCBmYWlsZWQgZmlkIHRyYW5zaXRpb24sIGN1cnIgMHgleCwgcmVxIDB4JXhcbiIsCisJCQlkYXRhLT5jdXJyZmlkLCByZXFmaWQpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoc2F2ZXZpZCAhPSBkYXRhLT5jdXJydmlkKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggInBoMjogdmlkIGNoYW5nZWQsIHNhdmUgMHgleCwgY3VyciAweCV4XG4iLAorCQkJc2F2ZXZpZCwgZGF0YS0+Y3VycnZpZCk7CisJCXJldHVybiAxOworCX0KKworCWRwcmludGsoInBoMiBjb21wbGV0ZSwgY3VycmZpZCAweCV4LCBjdXJydmlkIDB4JXhcbiIsCisJCWRhdGEtPmN1cnJmaWQsIGRhdGEtPmN1cnJ2aWQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFBoYXNlIDMgLSBjb3JlIHZvbHRhZ2UgdHJhbnNpdGlvbiBmbG93IC4uLiBqdW1wIHRvIHRoZSBmaW5hbCB2aWQuICovCitzdGF0aWMgaW50IGNvcmVfdm9sdGFnZV9wb3N0X3RyYW5zaXRpb24oc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEsIHUzMiByZXF2aWQpCit7CisJdTMyIHNhdmVmaWQgPSBkYXRhLT5jdXJyZmlkOworCXUzMiBzYXZlcmVxdmlkID0gcmVxdmlkOworCisJZHByaW50aygicGgzIChjcHUlZCk6IHN0YXJ0aW5nLCBjdXJyZmlkIDB4JXgsIGN1cnJ2aWQgMHgleFxuIiwKKwkJc21wX3Byb2Nlc3Nvcl9pZCgpLAorCQlkYXRhLT5jdXJyZmlkLCBkYXRhLT5jdXJydmlkKTsKKworCWlmIChyZXF2aWQgIT0gZGF0YS0+Y3VycnZpZCkgeworCQlpZiAod3JpdGVfbmV3X3ZpZChkYXRhLCByZXF2aWQpKQorCQkJcmV0dXJuIDE7CisKKwkJaWYgKHNhdmVmaWQgIT0gZGF0YS0+Y3VycmZpZCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkJICAgICAgICJwaDM6IGJhZCBmaWQgY2hhbmdlLCBzYXZlIDB4JXgsIGN1cnIgMHgleFxuIiwKKwkJCSAgICAgICBzYXZlZmlkLCBkYXRhLT5jdXJyZmlkKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJaWYgKGRhdGEtPmN1cnJ2aWQgIT0gcmVxdmlkKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCQkgICAgICAgInBoMzogZmFpbGVkIHZpZCB0cmFuc2l0aW9uXG4sIHJlcSAweCV4LCBjdXJyIDB4JXgiLAorCQkJICAgICAgIHJlcXZpZCwgZGF0YS0+Y3VycnZpZCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCWlmIChxdWVyeV9jdXJyZW50X3ZhbHVlc193aXRoX3BlbmRpbmdfd2FpdChkYXRhKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoc2F2ZXJlcXZpZCAhPSBkYXRhLT5jdXJydmlkKSB7CisJCWRwcmludGsoInBoMyBmYWlsZWQsIGN1cnJ2aWQgMHgleFxuIiwgZGF0YS0+Y3VycnZpZCk7CisJCXJldHVybiAxOworCX0KKworCWlmIChzYXZlZmlkICE9IGRhdGEtPmN1cnJmaWQpIHsKKwkJZHByaW50aygicGgzIGZhaWxlZCwgY3VycmZpZCBjaGFuZ2VkIDB4JXhcbiIsCisJCQlkYXRhLT5jdXJyZmlkKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZHByaW50aygicGgzIGNvbXBsZXRlLCBjdXJyZmlkIDB4JXgsIGN1cnJ2aWQgMHgleFxuIiwKKwkJZGF0YS0+Y3VycmZpZCwgZGF0YS0+Y3VycnZpZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaGVja19zdXBwb3J0ZWRfY3B1KHVuc2lnbmVkIGludCBjcHUpCit7CisJY3B1bWFza190IG9sZG1hc2sgPSBDUFVfTUFTS19BTEw7CisJdTMyIGVheCwgZWJ4LCBlY3gsIGVkeDsKKwl1bnNpZ25lZCBpbnQgcmMgPSAwOworCisJb2xkbWFzayA9IGN1cnJlbnQtPmNwdXNfYWxsb3dlZDsKKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIGNwdW1hc2tfb2ZfY3B1KGNwdSkpOworCXNjaGVkdWxlKCk7CisKKwlpZiAoc21wX3Byb2Nlc3Nvcl9pZCgpICE9IGNwdSkgeworCQlwcmludGsoS0VSTl9FUlIgImxpbWl0aW5nIHRvIGNwdSAldSBmYWlsZWRcbiIsIGNwdSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChjdXJyZW50X2NwdV9kYXRhLng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9BTUQpCisJCWdvdG8gb3V0OworCisJZWF4ID0gY3B1aWRfZWF4KENQVUlEX1BST0NFU1NPUl9TSUdOQVRVUkUpOworCWlmICgoKGVheCAmIENQVUlEX1VTRV9YRkFNX1hNT0QpICE9IENQVUlEX1VTRV9YRkFNX1hNT0QpIHx8CisJICAgICgoZWF4ICYgQ1BVSURfWEZBTSkgIT0gQ1BVSURfWEZBTV9LOCkgfHwKKwkgICAgKChlYXggJiBDUFVJRF9YTU9EKSA+IENQVUlEX1hNT0RfUkVWX0UpKSB7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJQcm9jZXNzb3IgY3B1aWQgJXggbm90IHN1cHBvcnRlZFxuIiwgZWF4KTsKKwkJZ290byBvdXQ7CisJfQorCisJZWF4ID0gY3B1aWRfZWF4KENQVUlEX0dFVF9NQVhfQ0FQQUJJTElUSUVTKTsKKwlpZiAoZWF4IDwgQ1BVSURfRlJFUV9WT0xUX0NBUEFCSUxJVElFUykgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWAorCQkgICAgICAgIk5vIGZyZXF1ZW5jeSBjaGFuZ2UgY2FwYWJpbGl0aWVzIGRldGVjdGVkXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJY3B1aWQoQ1BVSURfRlJFUV9WT0xUX0NBUEFCSUxJVElFUywgJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7CisJaWYgKChlZHggJiBQX1NUQVRFX1RSQU5TSVRJT05fQ0FQQUJMRSkgIT0gUF9TVEFURV9UUkFOU0lUSU9OX0NBUEFCTEUpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlBvd2VyIHN0YXRlIHRyYW5zaXRpb25zIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlyYyA9IDE7CisKK291dDoKKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIG9sZG1hc2spOworCXNjaGVkdWxlKCk7CisJcmV0dXJuIHJjOworCit9CisKK3N0YXRpYyBpbnQgY2hlY2tfcHN0X3RhYmxlKHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhLCBzdHJ1Y3QgcHN0X3MgKnBzdCwgdTggbWF4dmlkKQoreworCXVuc2lnbmVkIGludCBqOworCXU4IGxhc3RmaWQgPSAweGZmOworCisJZm9yIChqID0gMDsgaiA8IGRhdGEtPm51bXBzOyBqKyspIHsKKwkJaWYgKHBzdFtqXS52aWQgPiBMRUFTVF9WSUQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggInZpZCAlZCBpbnZhbGlkIDogMHgleFxuIiwgaiwgcHN0W2pdLnZpZCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAocHN0W2pdLnZpZCA8IGRhdGEtPnJ2bykgewkvKiB2aWQgKyBydm8gPj0gMCAqLworCQkJcHJpbnRrKEtFUk5fRVJSIEJGWCAiMCB2aWQgZXhjZWVkZWQgd2l0aCBwc3RhdGUgJWRcbiIsIGopOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJaWYgKHBzdFtqXS52aWQgPCBtYXh2aWQgKyBkYXRhLT5ydm8pIHsJLyogdmlkICsgcnZvID49IG1heHZpZCAqLworCQkJcHJpbnRrKEtFUk5fRVJSIEJGWCAibWF4dmlkIGV4Y2VlZGVkIHdpdGggcHN0YXRlICVkXG4iLCBqKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCWlmICgocHN0W2pdLmZpZCA+IE1BWF9GSUQpCisJCSAgICB8fCAocHN0W2pdLmZpZCAmIDEpCisJCSAgICB8fCAoaiAmJiAocHN0W2pdLmZpZCA8IEhJX0ZJRF9UQUJMRV9CT1RUT00pKSkgeworCQkJLyogT25seSBmaXJzdCBmaWQgaXMgYWxsb3dlZCB0byBiZSBpbiAibG93IiByYW5nZSAqLworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidHdvIGxvdyBmaWRzIC0gJWQgOiAweCV4XG4iLCBqLCBwc3Rbal0uZmlkKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmIChwc3Rbal0uZmlkIDwgbGFzdGZpZCkKKwkJCWxhc3RmaWQgPSBwc3Rbal0uZmlkOworCX0KKwlpZiAobGFzdGZpZCAmIDEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAibGFzdGZpZCBpbnZhbGlkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChsYXN0ZmlkID4gTE9fRklEX1RBQkxFX1RPUCkKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggICJmaXJzdCBmaWQgbm90IGZyb20gbG8gZnJlcSB0YWJsZVxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfYmFzaWNzKHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhKQoreworCWludCBqOworCWZvciAoaiA9IDA7IGogPCBkYXRhLT5udW1wczsgaisrKSB7CisJCWlmIChkYXRhLT5wb3dlcm5vd190YWJsZVtqXS5mcmVxdWVuY3kgIT0gQ1BVRlJFUV9FTlRSWV9JTlZBTElEKQorCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiAgICVkIDogZmlkIDB4JXggKCVkIE1IeiksIHZpZCAweCV4ICglZCBtVilcbiIsIGosCisJCQkJZGF0YS0+cG93ZXJub3dfdGFibGVbal0uaW5kZXggJiAweGZmLAorCQkJCWRhdGEtPnBvd2Vybm93X3RhYmxlW2pdLmZyZXF1ZW5jeS8xMDAwLAorCQkJCWRhdGEtPnBvd2Vybm93X3RhYmxlW2pdLmluZGV4ID4+IDgsCisJCQkJZmluZF9taWxsaXZvbHRzX2Zyb21fdmlkKGRhdGEsIGRhdGEtPnBvd2Vybm93X3RhYmxlW2pdLmluZGV4ID4+IDgpKTsKKwl9CisJaWYgKGRhdGEtPmJhdHBzKQorCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiT25seSAlZCBwc3RhdGVzIG9uIGJhdHRlcnlcbiIsIGRhdGEtPmJhdHBzKTsKK30KKworc3RhdGljIGludCBmaWxsX3Bvd2Vybm93X3RhYmxlKHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhLCBzdHJ1Y3QgcHN0X3MgKnBzdCwgdTggbWF4dmlkKQoreworCXN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqcG93ZXJub3dfdGFibGU7CisJdW5zaWduZWQgaW50IGo7CisKKwlpZiAoZGF0YS0+YmF0cHMpIHsgICAgLyogdXNlIEFDUEkgc3VwcG9ydCB0byBnZXQgZnVsbCBzcGVlZCBvbiBtYWlucyBwb3dlciAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiT25seSAlZCBwc3RhdGVzIHVzYWJsZSAodXNlIEFDUEkgZHJpdmVyIGZvciBmdWxsIHJhbmdlXG4iLCBkYXRhLT5iYXRwcyk7CisJCWRhdGEtPm51bXBzID0gZGF0YS0+YmF0cHM7CisJfQorCisJZm9yICggaj0xOyBqPGRhdGEtPm51bXBzOyBqKysgKSB7CisJCWlmIChwc3Rbai0xXS5maWQgPj0gcHN0W2pdLmZpZCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiUFNUIG91dCBvZiBzZXF1ZW5jZVxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCWlmIChkYXRhLT5udW1wcyA8IDIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAibm8gcCBzdGF0ZXMgdG8gdHJhbnNpdGlvblxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChjaGVja19wc3RfdGFibGUoZGF0YSwgcHN0LCBtYXh2aWQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBvd2Vybm93X3RhYmxlID0ga21hbGxvYygoc2l6ZW9mKHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSkKKwkJKiAoZGF0YS0+bnVtcHMgKyAxKSksIEdGUF9LRVJORUwpOworCWlmICghcG93ZXJub3dfdGFibGUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAicG93ZXJub3dfdGFibGUgbWVtb3J5IGFsbG9jIGZhaWx1cmVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmb3IgKGogPSAwOyBqIDwgZGF0YS0+bnVtcHM7IGorKykgeworCQlwb3dlcm5vd190YWJsZVtqXS5pbmRleCA9IHBzdFtqXS5maWQ7IC8qIGxvd2VyIDggYml0cyAqLworCQlwb3dlcm5vd190YWJsZVtqXS5pbmRleCB8PSAocHN0W2pdLnZpZCA8PCA4KTsgLyogdXBwZXIgOCBiaXRzICovCisJCXBvd2Vybm93X3RhYmxlW2pdLmZyZXF1ZW5jeSA9IGZpbmRfa2h6X2ZyZXFfZnJvbV9maWQocHN0W2pdLmZpZCk7CisJfQorCXBvd2Vybm93X3RhYmxlW2RhdGEtPm51bXBzXS5mcmVxdWVuY3kgPSBDUFVGUkVRX1RBQkxFX0VORDsKKwlwb3dlcm5vd190YWJsZVtkYXRhLT5udW1wc10uaW5kZXggPSAwOworCisJaWYgKHF1ZXJ5X2N1cnJlbnRfdmFsdWVzX3dpdGhfcGVuZGluZ193YWl0KGRhdGEpKSB7CisJCWtmcmVlKHBvd2Vybm93X3RhYmxlKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJZHByaW50aygiY2ZpZCAweCV4LCBjdmlkIDB4JXhcbiIsIGRhdGEtPmN1cnJmaWQsIGRhdGEtPmN1cnJ2aWQpOworCWRhdGEtPnBvd2Vybm93X3RhYmxlID0gcG93ZXJub3dfdGFibGU7CisJcHJpbnRfYmFzaWNzKGRhdGEpOworCisJZm9yIChqID0gMDsgaiA8IGRhdGEtPm51bXBzOyBqKyspCisJCWlmICgocHN0W2pdLmZpZD09ZGF0YS0+Y3VycmZpZCkgJiYgKHBzdFtqXS52aWQ9PWRhdGEtPmN1cnJ2aWQpKQorCQkJcmV0dXJuIDA7CisKKwlkcHJpbnRrKCJjdXJyZmlkL3ZpZCBkbyBub3QgbWF0Y2ggUFNULCBpZ25vcmluZ1xuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qIEZpbmQgYW5kIHZhbGlkYXRlIHRoZSBQU0IvUFNUIHRhYmxlIGluIEJJT1MuICovCitzdGF0aWMgaW50IGZpbmRfcHNiX3RhYmxlKHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhKQoreworCXN0cnVjdCBwc2JfcyAqcHNiOworCXVuc2lnbmVkIGludCBpOworCXUzMiBtdnM7CisJdTggbWF4dmlkOworCXUzMiBjcHN0ID0gMDsKKwl1MzIgdGhpc2NwdWlkOworCisJZm9yIChpID0gMHhjMDAwMDsgaSA8IDB4ZmZmZjA7IGkgKz0gMHgxMCkgeworCQkvKiBTY2FuIEJJT1MgbG9va2luZyBmb3IgdGhlIHNpZ25hdHVyZS4gKi8KKwkJLyogSXQgY2FuIG5vdCBiZSBhdCBmZmZmMCAtIGl0IGlzIHRvbyBiaWcuICovCisKKwkJcHNiID0gcGh5c190b192aXJ0KGkpOworCQlpZiAobWVtY21wKHBzYiwgUFNCX0lEX1NUUklORywgUFNCX0lEX1NUUklOR19MRU4pICE9IDApCisJCQljb250aW51ZTsKKworCQlkcHJpbnRrKCJmb3VuZCBQU0IgaGVhZGVyIGF0IDB4JXBcbiIsIHBzYik7CisKKwkJZHByaW50aygidGFibGUgdmVyczogMHgleFxuIiwgcHNiLT50YWJsZXZlcnNpb24pOworCQlpZiAocHNiLT50YWJsZXZlcnNpb24gIT0gUFNCX1ZFUlNJT05fMV80KSB7CisJCQlwcmludGsoS0VSTl9JTkZPIEJGWCAiUFNCIHRhYmxlIGlzIG5vdCB2MS40XG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisKKwkJZHByaW50aygiZmxhZ3M6IDB4JXhcbiIsIHBzYi0+ZmxhZ3MxKTsKKwkJaWYgKHBzYi0+ZmxhZ3MxKSB7CisJCQlwcmludGsoS0VSTl9FUlIgQkZYICJ1bmtub3duIGZsYWdzXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisKKwkJZGF0YS0+dnN0YWJsZSA9IHBzYi0+dnN0YWJsZTsKKwkJZHByaW50aygidm9sdGFnZSBzdGFiaWxpemF0aW9uIHRpbWU6ICVkKCoyMHVzKVxuIiwgZGF0YS0+dnN0YWJsZSk7CisKKwkJZHByaW50aygiZmxhZ3MyOiAweCV4XG4iLCBwc2ItPmZsYWdzMik7CisJCWRhdGEtPnJ2byA9IHBzYi0+ZmxhZ3MyICYgMzsKKwkJZGF0YS0+aXJ0ID0gKChwc2ItPmZsYWdzMikgPj4gMikgJiAzOworCQltdnMgPSAoKHBzYi0+ZmxhZ3MyKSA+PiA0KSAmIDM7CisJCWRhdGEtPnZpZG12cyA9IDEgPDwgbXZzOworCQlkYXRhLT5iYXRwcyA9ICgocHNiLT5mbGFnczIpID4+IDYpICYgMzsKKworCQlkcHJpbnRrKCJyYW1wIHZvbHRhZ2Ugb2Zmc2V0OiAlZFxuIiwgZGF0YS0+cnZvKTsKKwkJZHByaW50aygiaXNvY2hyb25vdXMgcmVsaWVmIHRpbWU6ICVkXG4iLCBkYXRhLT5pcnQpOworCQlkcHJpbnRrKCJtYXhpbXVtIHZvbHRhZ2Ugc3RlcDogJWQgLSAweCV4XG4iLCBtdnMsIGRhdGEtPnZpZG12cyk7CisKKwkJZHByaW50aygibnVtcHN0OiAweCV4XG4iLCBwc2ItPm51bV90YWJsZXMpOworCQljcHN0ID0gcHNiLT5udW1fdGFibGVzOworCQlpZiAoKHBzYi0+Y3B1aWQgPT0gMHgwMDAwMGZjMCkgfHwgKHBzYi0+Y3B1aWQgPT0gMHgwMDAwMGZlMCkgKXsKKwkJCXRoaXNjcHVpZCA9IGNwdWlkX2VheChDUFVJRF9QUk9DRVNTT1JfU0lHTkFUVVJFKTsKKwkJCWlmICgodGhpc2NwdWlkID09IDB4MDAwMDBmYzApIHx8ICh0aGlzY3B1aWQgPT0gMHgwMDAwMGZlMCkgKSB7CisJCQkJY3BzdCA9IDE7CisJCQl9CisJCX0KKwkJaWYgKGNwc3QgIT0gMSkgeworCQkJcHJpbnRrKEtFUk5fRVJSIEJGWCAibnVtcHN0IG11c3QgYmUgMVxuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCisJCWRhdGEtPnBsbGxvY2sgPSBwc2ItPnBsbGxvY2t0aW1lOworCQlkcHJpbnRrKCJwbGxsb2NrdGltZTogMHgleCAodW5pdHMgMXVzKVxuIiwgcHNiLT5wbGxsb2NrdGltZSk7CisJCWRwcmludGsoIm1heGZpZDogMHgleFxuIiwgcHNiLT5tYXhmaWQpOworCQlkcHJpbnRrKCJtYXh2aWQ6IDB4JXhcbiIsIHBzYi0+bWF4dmlkKTsKKwkJbWF4dmlkID0gcHNiLT5tYXh2aWQ7CisKKwkJZGF0YS0+bnVtcHMgPSBwc2ItPm51bXBzOworCQlkcHJpbnRrKCJudW1wc3RhdGVzOiAweCV4XG4iLCBkYXRhLT5udW1wcyk7CisJCXJldHVybiBmaWxsX3Bvd2Vybm93X3RhYmxlKGRhdGEsIChzdHJ1Y3QgcHN0X3MgKikocHNiKzEpLCBtYXh2aWQpOworCX0KKwkvKgorCSAqIElmIHlvdSBzZWUgdGhpcyBtZXNzYWdlLCBjb21wbGFpbiB0byBCSU9TIG1hbnVmYWN0dXJlci4gSWYKKwkgKiBoZSB0ZWxscyB5b3UgIndlIGRvIG5vdCBzdXBwb3J0IExpbnV4IiBvciBzb21lIHNpbWlsYXIKKwkgKiBub25zZW5zZSwgcmVtZW1iZXIgdGhhdCBXaW5kb3dzIDIwMDAgdXNlcyB0aGUgc2FtZSBsZWdhY3kKKwkgKiBtZWNoYW5pc20gdGhhdCB0aGUgb2xkIExpbnV4IFBTQiBkcml2ZXIgdXNlcy4gVGVsbCB0aGVtIGl0CisJICogaXMgYnJva2VuIHdpdGggV2luZG93cyAyMDAwLgorCSAqCisJICogVGhlIHJlZmVyZW5jZSB0byB0aGUgQU1EIGRvY3VtZW50YXRpb24gaXMgY2hhcHRlciA5IGluIHRoZQorCSAqIEJJT1MgYW5kIEtlcm5lbCBEZXZlbG9wZXIncyBHdWlkZSwgd2hpY2ggaXMgYXZhaWxhYmxlIG9uCisJICogd3d3LmFtZC5jb20KKwkgKi8KKwlwcmludGsoS0VSTl9FUlIgUEZYICJCSU9TIGVycm9yIC0gbm8gUFNCXG4iKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworI2lmZGVmIENPTkZJR19YODZfUE9XRVJOT1dfSzhfQUNQSQorc3RhdGljIHZvaWQgcG93ZXJub3dfazhfYWNwaV9wc3RfdmFsdWVzKHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhLCB1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJaWYgKCFkYXRhLT5hY3BpX2RhdGEuc3RhdGVfY291bnQpCisJCXJldHVybjsKKworCWRhdGEtPmlydCA9IChkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW2luZGV4XS5jb250cm9sID4+IElSVF9TSElGVCkgJiBJUlRfTUFTSzsKKwlkYXRhLT5ydm8gPSAoZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpbmRleF0uY29udHJvbCA+PiBSVk9fU0hJRlQpICYgUlZPX01BU0s7CisJZGF0YS0+cGxsbG9jayA9IChkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW2luZGV4XS5jb250cm9sID4+IFBMTF9MX1NISUZUKSAmIFBMTF9MX01BU0s7CisJZGF0YS0+dmlkbXZzID0gMSA8PCAoKGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbaW5kZXhdLmNvbnRyb2wgPj4gTVZTX1NISUZUKSAmIE1WU19NQVNLKTsKKwlkYXRhLT52c3RhYmxlID0gKGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbaW5kZXhdLmNvbnRyb2wgPj4gVlNUX1NISUZUKSAmIFZTVF9NQVNLOworfQorCitzdGF0aWMgaW50IHBvd2Vybm93X2s4X2NwdV9pbml0X2FjcGkoc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEpCit7CisJaW50IGk7CisJaW50IGNudGxvZnJlcSA9IDA7CisJc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICpwb3dlcm5vd190YWJsZTsKKworCWlmIChhY3BpX3Byb2Nlc3Nvcl9yZWdpc3Rlcl9wZXJmb3JtYW5jZSgmZGF0YS0+YWNwaV9kYXRhLCBkYXRhLT5jcHUpKSB7CisJCWRwcmludGsoInJlZ2lzdGVyIHBlcmZvcm1hbmNlIGZhaWxlZFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIHZlcmlmeSB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIEFDUEkgc3RydWN0dXJlcyAqLworCWlmIChkYXRhLT5hY3BpX2RhdGEuc3RhdGVfY291bnQgPD0gMSkgeworCQlkcHJpbnRrKCJObyBBQ1BJIFAtU3RhdGVzXG4iKTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCWlmICgoZGF0YS0+YWNwaV9kYXRhLmNvbnRyb2xfcmVnaXN0ZXIuc3BhY2VfaWQgIT0gQUNQSV9BRFJfU1BBQ0VfRklYRURfSEFSRFdBUkUpIHx8CisJCShkYXRhLT5hY3BpX2RhdGEuc3RhdHVzX3JlZ2lzdGVyLnNwYWNlX2lkICE9IEFDUElfQURSX1NQQUNFX0ZJWEVEX0hBUkRXQVJFKSkgeworCQlkcHJpbnRrKCJJbnZhbGlkIGNvbnRyb2wvc3RhdHVzIHJlZ2lzdGVycyAoJXggLSAleClcbiIsCisJCQlkYXRhLT5hY3BpX2RhdGEuY29udHJvbF9yZWdpc3Rlci5zcGFjZV9pZCwKKwkJCWRhdGEtPmFjcGlfZGF0YS5zdGF0dXNfcmVnaXN0ZXIuc3BhY2VfaWQpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJLyogZmlsbCBpbiBkYXRhLT5wb3dlcm5vd190YWJsZSAqLworCXBvd2Vybm93X3RhYmxlID0ga21hbGxvYygoc2l6ZW9mKHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSkKKwkJKiAoZGF0YS0+YWNwaV9kYXRhLnN0YXRlX2NvdW50ICsgMSkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBvd2Vybm93X3RhYmxlKSB7CisJCWRwcmludGsoInBvd2Vybm93X3RhYmxlIG1lbW9yeSBhbGxvYyBmYWlsdXJlXG4iKTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5hY3BpX2RhdGEuc3RhdGVfY291bnQ7IGkrKykgeworCQl1MzIgZmlkID0gZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpXS5jb250cm9sICYgRklEX01BU0s7CisJCXUzMiB2aWQgPSAoZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpXS5jb250cm9sID4+IFZJRF9TSElGVCkgJiBWSURfTUFTSzsKKworCQlkcHJpbnRrKCIgICAlZCA6IGZpZCAweCV4LCB2aWQgMHgleFxuIiwgaSwgZmlkLCB2aWQpOworCisJCXBvd2Vybm93X3RhYmxlW2ldLmluZGV4ID0gZmlkOyAvKiBsb3dlciA4IGJpdHMgKi8KKwkJcG93ZXJub3dfdGFibGVbaV0uaW5kZXggfD0gKHZpZCA8PCA4KTsgLyogdXBwZXIgOCBiaXRzICovCisJCXBvd2Vybm93X3RhYmxlW2ldLmZyZXF1ZW5jeSA9IGZpbmRfa2h6X2ZyZXFfZnJvbV9maWQoZmlkKTsKKworCQkvKiB2ZXJpZnkgZnJlcXVlbmN5IGlzIE9LICovCisJCWlmICgocG93ZXJub3dfdGFibGVbaV0uZnJlcXVlbmN5ID4gKE1BWF9GUkVRICogMTAwMCkpIHx8CisJCQkocG93ZXJub3dfdGFibGVbaV0uZnJlcXVlbmN5IDwgKE1JTl9GUkVRICogMTAwMCkpKSB7CisJCQlkcHJpbnRrKCJpbnZhbGlkIGZyZXEgJXUga0h6LCBpZ25vcmluZ1xuIiwgcG93ZXJub3dfdGFibGVbaV0uZnJlcXVlbmN5KTsKKwkJCXBvd2Vybm93X3RhYmxlW2ldLmZyZXF1ZW5jeSA9IENQVUZSRVFfRU5UUllfSU5WQUxJRDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogdmVyaWZ5IHZvbHRhZ2UgaXMgT0sgLSBCSU9TcyBhcmUgdXNpbmcgIm9mZiIgdG8gaW5kaWNhdGUgaW52YWxpZCAqLworCQlpZiAodmlkID09IDB4MWYpIHsKKwkJCWRwcmludGsoImludmFsaWQgdmlkICV1LCBpZ25vcmluZ1xuIiwgdmlkKTsKKwkJCXBvd2Vybm93X3RhYmxlW2ldLmZyZXF1ZW5jeSA9IENQVUZSRVFfRU5UUllfSU5WQUxJRDsKKwkJCWNvbnRpbnVlOworCQl9CisKKyAJCWlmIChmaWQgPCBISV9GSURfVEFCTEVfQk9UVE9NKSB7CisgCQkJaWYgKGNudGxvZnJlcSkgeworIAkJCQkvKiBpZiBib3RoIGVudHJpZXMgYXJlIHRoZSBzYW1lLCBpZ25vcmUgdGhpcworIAkJCQkgKiBvbmUuLi4gCisgCQkJCSAqLworIAkJCQlpZiAoKHBvd2Vybm93X3RhYmxlW2ldLmZyZXF1ZW5jeSAhPSBwb3dlcm5vd190YWJsZVtjbnRsb2ZyZXFdLmZyZXF1ZW5jeSkgfHwKKyAJCQkJICAgIChwb3dlcm5vd190YWJsZVtpXS5pbmRleCAhPSBwb3dlcm5vd190YWJsZVtjbnRsb2ZyZXFdLmluZGV4KSkgeworIAkJCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVG9vIG1hbnkgbG8gZnJlcSB0YWJsZSBlbnRyaWVzXG4iKTsKKyAJCQkJCWdvdG8gZXJyX291dF9tZW07CisgCQkJCX0KKwkJCQkKKyAJCQkJZHByaW50aygiZG91YmxlIGxvdyBmcmVxdWVuY3kgdGFibGUgZW50cnksIGlnbm9yaW5nIGl0LlxuIik7CisgCQkJCXBvd2Vybm93X3RhYmxlW2ldLmZyZXF1ZW5jeSA9IENQVUZSRVFfRU5UUllfSU5WQUxJRDsKKyAJCQkJY29udGludWU7CisgCQkJfSBlbHNlCisgCQkJCWNudGxvZnJlcSA9IGk7CisJCX0KKworCQlpZiAocG93ZXJub3dfdGFibGVbaV0uZnJlcXVlbmN5ICE9IChkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW2ldLmNvcmVfZnJlcXVlbmN5ICogMTAwMCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJpbnZhbGlkIGZyZXEgZW50cmllcyAldSBrSHogdnMuICV1IGtIelxuIiwKKwkJCQlwb3dlcm5vd190YWJsZVtpXS5mcmVxdWVuY3ksCisJCQkJKHVuc2lnbmVkIGludCkgKGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbaV0uY29yZV9mcmVxdWVuY3kgKiAxMDAwKSk7CisJCQlwb3dlcm5vd190YWJsZVtpXS5mcmVxdWVuY3kgPSBDUFVGUkVRX0VOVFJZX0lOVkFMSUQ7CisJCQljb250aW51ZTsKKwkJfQorCX0KKworCXBvd2Vybm93X3RhYmxlW2RhdGEtPmFjcGlfZGF0YS5zdGF0ZV9jb3VudF0uZnJlcXVlbmN5ID0gQ1BVRlJFUV9UQUJMRV9FTkQ7CisJcG93ZXJub3dfdGFibGVbZGF0YS0+YWNwaV9kYXRhLnN0YXRlX2NvdW50XS5pbmRleCA9IDA7CisJZGF0YS0+cG93ZXJub3dfdGFibGUgPSBwb3dlcm5vd190YWJsZTsKKworCS8qIGZpbGwgaW4gZGF0YSAqLworCWRhdGEtPm51bXBzID0gZGF0YS0+YWNwaV9kYXRhLnN0YXRlX2NvdW50OworCXByaW50X2Jhc2ljcyhkYXRhKTsKKwlwb3dlcm5vd19rOF9hY3BpX3BzdF92YWx1ZXMoZGF0YSwgMCk7CisKKwkvKiBub3RpZnkgQklPUyB0aGF0IHdlIGV4aXN0ICovCisJYWNwaV9wcm9jZXNzb3Jfbm90aWZ5X3NtbShUSElTX01PRFVMRSk7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9tZW06CisJa2ZyZWUocG93ZXJub3dfdGFibGUpOworCitlcnJfb3V0OgorCWFjcGlfcHJvY2Vzc29yX3VucmVnaXN0ZXJfcGVyZm9ybWFuY2UoJmRhdGEtPmFjcGlfZGF0YSwgZGF0YS0+Y3B1KTsKKworCS8qIGRhdGEtPmFjcGlfZGF0YS5zdGF0ZV9jb3VudCBpbmZvcm1zIHVzIGF0IC0+ZXhpdCgpIHdoZXRoZXIgQUNQSSB3YXMgdXNlZCAqLworCWRhdGEtPmFjcGlfZGF0YS5zdGF0ZV9jb3VudCA9IDA7CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHZvaWQgcG93ZXJub3dfazhfY3B1X2V4aXRfYWNwaShzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSkKK3sKKwlpZiAoZGF0YS0+YWNwaV9kYXRhLnN0YXRlX2NvdW50KQorCQlhY3BpX3Byb2Nlc3Nvcl91bnJlZ2lzdGVyX3BlcmZvcm1hbmNlKCZkYXRhLT5hY3BpX2RhdGEsIGRhdGEtPmNwdSk7Cit9CisKKyNlbHNlCitzdGF0aWMgaW50IHBvd2Vybm93X2s4X2NwdV9pbml0X2FjcGkoc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEpIHsgcmV0dXJuIC1FTk9ERVY7IH0KK3N0YXRpYyB2b2lkIHBvd2Vybm93X2s4X2NwdV9leGl0X2FjcGkoc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEpIHsgcmV0dXJuOyB9CitzdGF0aWMgdm9pZCBwb3dlcm5vd19rOF9hY3BpX3BzdF92YWx1ZXMoc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEsIHVuc2lnbmVkIGludCBpbmRleCkgeyByZXR1cm47IH0KKyNlbmRpZiAvKiBDT05GSUdfWDg2X1BPV0VSTk9XX0s4X0FDUEkgKi8KKworLyogVGFrZSBhIGZyZXF1ZW5jeSwgYW5kIGlzc3VlIHRoZSBmaWQvdmlkIHRyYW5zaXRpb24gY29tbWFuZCAqLworc3RhdGljIGludCB0cmFuc2l0aW9uX2ZyZXF1ZW5jeShzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSwgdW5zaWduZWQgaW50IGluZGV4KQoreworCXUzMiBmaWQ7CisJdTMyIHZpZDsKKwlpbnQgcmVzOworCXN0cnVjdCBjcHVmcmVxX2ZyZXFzIGZyZXFzOworCisJZHByaW50aygiY3B1ICVkIHRyYW5zaXRpb24gdG8gaW5kZXggJXVcbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSwgaW5kZXgpOworCisJLyogZmlkIGFyZSB0aGUgbG93ZXIgOCBiaXRzIG9mIHRoZSBpbmRleCB3ZSBzdG9yZWQgaW50bworCSAqIHRoZSBjcHVmcmVxIGZyZXF1ZW5jeSB0YWJsZSBpbiBmaW5kX3BzYl90YWJsZSwgdmlkIGFyZSAKKwkgKiB0aGUgdXBwZXIgOCBiaXRzLgorCSAqLworCisJZmlkID0gZGF0YS0+cG93ZXJub3dfdGFibGVbaW5kZXhdLmluZGV4ICYgMHhGRjsKKwl2aWQgPSAoZGF0YS0+cG93ZXJub3dfdGFibGVbaW5kZXhdLmluZGV4ICYgMHhGRjAwKSA+PiA4OworCisJZHByaW50aygidGFibGUgbWF0Y2hlZCBmaWQgMHgleCwgZ2l2aW5nIHZpZCAweCV4XG4iLCBmaWQsIHZpZCk7CisKKwlpZiAocXVlcnlfY3VycmVudF92YWx1ZXNfd2l0aF9wZW5kaW5nX3dhaXQoZGF0YSkpCisJCXJldHVybiAxOworCisJaWYgKChkYXRhLT5jdXJydmlkID09IHZpZCkgJiYgKGRhdGEtPmN1cnJmaWQgPT0gZmlkKSkgeworCQlkcHJpbnRrKCJ0YXJnZXQgbWF0Y2hlcyBjdXJyZW50IHZhbHVlcyAoZmlkIDB4JXgsIHZpZCAweCV4KVxuIiwKKwkJCWZpZCwgdmlkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKChmaWQgPCBISV9GSURfVEFCTEVfQk9UVE9NKSAmJiAoZGF0YS0+Y3VycmZpZCA8IEhJX0ZJRF9UQUJMRV9CT1RUT00pKSB7CisJCXByaW50aygiaWdub3JpbmcgaWxsZWdhbCBjaGFuZ2UgaW4gbG8gZnJlcSB0YWJsZS0leCB0byAweCV4XG4iLAorCQkgICAgICAgZGF0YS0+Y3VycmZpZCwgZmlkKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZHByaW50aygiY3B1ICVkLCBjaGFuZ2luZyB0byBmaWQgMHgleCwgdmlkIDB4JXhcbiIsCisJCXNtcF9wcm9jZXNzb3JfaWQoKSwgZmlkLCB2aWQpOworCisJZnJlcXMuY3B1ID0gZGF0YS0+Y3B1OworCisJZnJlcXMub2xkID0gZmluZF9raHpfZnJlcV9mcm9tX2ZpZChkYXRhLT5jdXJyZmlkKTsKKwlmcmVxcy5uZXcgPSBmaW5kX2toel9mcmVxX2Zyb21fZmlkKGZpZCk7CisJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUFJFQ0hBTkdFKTsKKworCWRvd24oJmZpZHZpZF9zZW0pOworCXJlcyA9IHRyYW5zaXRpb25fZmlkX3ZpZChkYXRhLCBmaWQsIHZpZCk7CisJdXAoJmZpZHZpZF9zZW0pOworCisJZnJlcXMubmV3ID0gZmluZF9raHpfZnJlcV9mcm9tX2ZpZChkYXRhLT5jdXJyZmlkKTsKKwljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QT1NUQ0hBTkdFKTsKKworCXJldHVybiByZXM7Cit9CisKKy8qIERyaXZlciBlbnRyeSBwb2ludCB0byBzd2l0Y2ggdG8gdGhlIHRhcmdldCBmcmVxdWVuY3kgKi8KK3N0YXRpYyBpbnQgcG93ZXJub3drOF90YXJnZXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2wsIHVuc2lnbmVkIHRhcmdmcmVxLCB1bnNpZ25lZCByZWxhdGlvbikKK3sKKwljcHVtYXNrX3Qgb2xkbWFzayA9IENQVV9NQVNLX0FMTDsKKwlzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSA9IHBvd2Vybm93X2RhdGFbcG9sLT5jcHVdOworCXUzMiBjaGVja2ZpZCA9IGRhdGEtPmN1cnJmaWQ7CisJdTMyIGNoZWNrdmlkID0gZGF0YS0+Y3VycnZpZDsKKwl1bnNpZ25lZCBpbnQgbmV3c3RhdGU7CisJaW50IHJldCA9IC1FSU87CisKKwkvKiBvbmx5IHJ1biBvbiBzcGVjaWZpYyBDUFUgZnJvbSBoZXJlIG9uICovCisJb2xkbWFzayA9IGN1cnJlbnQtPmNwdXNfYWxsb3dlZDsKKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIGNwdW1hc2tfb2ZfY3B1KHBvbC0+Y3B1KSk7CisJc2NoZWR1bGUoKTsKKworCWlmIChzbXBfcHJvY2Vzc29yX2lkKCkgIT0gcG9sLT5jcHUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJsaW1pdGluZyB0byBjcHUgJXUgZmFpbGVkXG4iLCBwb2wtPmNwdSk7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlpZiAocGVuZGluZ19iaXRfc3R1Y2soKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJmYWlsaW5nIHRhcmcsIGNoYW5nZSBwZW5kaW5nIGJpdCBzZXRcbiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJZHByaW50aygidGFyZzogY3B1ICVkLCAlZCBrSHosIG1pbiAlZCwgbWF4ICVkLCByZWxhdGlvbiAlZFxuIiwKKwkJcG9sLT5jcHUsIHRhcmdmcmVxLCBwb2wtPm1pbiwgcG9sLT5tYXgsIHJlbGF0aW9uKTsKKworCWlmIChxdWVyeV9jdXJyZW50X3ZhbHVlc193aXRoX3BlbmRpbmdfd2FpdChkYXRhKSkgeworCQlyZXQgPSAtRUlPOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJZHByaW50aygidGFyZzogY3VyciBmaWQgMHgleCwgdmlkIDB4JXhcbiIsCisJCWRhdGEtPmN1cnJmaWQsIGRhdGEtPmN1cnJ2aWQpOworCisJaWYgKChjaGVja3ZpZCAhPSBkYXRhLT5jdXJydmlkKSB8fCAoY2hlY2tmaWQgIT0gZGF0YS0+Y3VycmZpZCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkgICAgICAgImVycm9yIC0gb3V0IG9mIHN5bmMsIGZpZCAweCV4IDB4JXgsIHZpZCAweCV4IDB4JXhcbiIsCisJCSAgICAgICBjaGVja2ZpZCwgZGF0YS0+Y3VycmZpZCwgY2hlY2t2aWQsIGRhdGEtPmN1cnJ2aWQpOworCX0KKworCWlmIChjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQocG9sLCBkYXRhLT5wb3dlcm5vd190YWJsZSwgdGFyZ2ZyZXEsIHJlbGF0aW9uLCAmbmV3c3RhdGUpKQorCQlnb3RvIGVycl9vdXQ7CisKKwlwb3dlcm5vd19rOF9hY3BpX3BzdF92YWx1ZXMoZGF0YSwgbmV3c3RhdGUpOworCisJaWYgKHRyYW5zaXRpb25fZnJlcXVlbmN5KGRhdGEsIG5ld3N0YXRlKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJ0cmFuc2l0aW9uIGZyZXF1ZW5jeSBmYWlsZWRcbiIpOworCQlyZXQgPSAxOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJcG9sLT5jdXIgPSBmaW5kX2toel9mcmVxX2Zyb21fZmlkKGRhdGEtPmN1cnJmaWQpOworCXJldCA9IDA7CisKK2Vycl9vdXQ6CisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBvbGRtYXNrKTsKKwlzY2hlZHVsZSgpOworCisJcmV0dXJuIHJldDsKK30KKworLyogRHJpdmVyIGVudHJ5IHBvaW50IHRvIHZlcmlmeSB0aGUgcG9saWN5IGFuZCByYW5nZSBvZiBmcmVxdWVuY2llcyAqLworc3RhdGljIGludCBwb3dlcm5vd2s4X3ZlcmlmeShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbCkKK3sKKwlzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSA9IHBvd2Vybm93X2RhdGFbcG9sLT5jcHVdOworCisJcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3ZlcmlmeShwb2wsIGRhdGEtPnBvd2Vybm93X3RhYmxlKTsKK30KKworLyogcGVyIENQVSBpbml0IGVudHJ5IHBvaW50IHRvIHRoZSBkcml2ZXIgKi8KK3N0YXRpYyBpbnQgX19pbml0IHBvd2Vybm93azhfY3B1X2luaXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2wpCit7CisJc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGE7CisJY3B1bWFza190IG9sZG1hc2sgPSBDUFVfTUFTS19BTEw7CisJaW50IHJjOworCisJaWYgKCFjaGVja19zdXBwb3J0ZWRfY3B1KHBvbC0+Y3B1KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlkYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBvd2Vybm93X2s4X2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidW5hYmxlIHRvIGFsbG9jIHBvd2Vybm93X2s4X2RhdGEiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChkYXRhLDAsc2l6ZW9mKHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhKSk7CisKKwlkYXRhLT5jcHUgPSBwb2wtPmNwdTsKKworCWlmIChwb3dlcm5vd19rOF9jcHVfaW5pdF9hY3BpKGRhdGEpKSB7CisJCS8qCisJCSAqIFVzZSB0aGUgUFNCIEJJT1Mgc3RydWN0dXJlLiBUaGlzIGlzIG9ubHkgYXZhaWxhYmUgb24KKwkJICogYW4gVVAgdmVyc2lvbiwgYW5kIGlzIGRlcHJlY2F0ZWQgYnkgQU1ELgorCQkgKi8KKworCQlpZiAoKG51bV9vbmxpbmVfY3B1cygpICE9IDEpIHx8IChudW1fcG9zc2libGVfY3B1cygpICE9IDEpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiTVAgc3lzdGVtcyBub3Qgc3VwcG9ydGVkIGJ5IFBTQiBCSU9TIHN0cnVjdHVyZVxuIik7CisJCQlrZnJlZShkYXRhKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCWlmIChwb2wtPmNwdSAhPSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJpbml0IG5vdCBjcHUgMFxuIik7CisJCQlrZnJlZShkYXRhKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCXJjID0gZmluZF9wc2JfdGFibGUoZGF0YSk7CisJCWlmIChyYykgeworCQkJa2ZyZWUoZGF0YSk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKworCS8qIG9ubHkgcnVuIG9uIHNwZWNpZmljIENQVSBmcm9tIGhlcmUgb24gKi8KKwlvbGRtYXNrID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOworCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgY3B1bWFza19vZl9jcHUocG9sLT5jcHUpKTsKKwlzY2hlZHVsZSgpOworCisJaWYgKHNtcF9wcm9jZXNzb3JfaWQoKSAhPSBwb2wtPmNwdSkgeworCQlwcmludGsoS0VSTl9FUlIgImxpbWl0aW5nIHRvIGNwdSAldSBmYWlsZWRcbiIsIHBvbC0+Y3B1KTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCWlmIChwZW5kaW5nX2JpdF9zdHVjaygpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImZhaWxpbmcgaW5pdCwgY2hhbmdlIHBlbmRpbmcgYml0IHNldFxuIik7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlpZiAocXVlcnlfY3VycmVudF92YWx1ZXNfd2l0aF9wZW5kaW5nX3dhaXQoZGF0YSkpCisJCWdvdG8gZXJyX291dDsKKworCWZpZHZpZF9tc3JfaW5pdCgpOworCisJLyogcnVuIG9uIGFueSBDUFUgYWdhaW4gKi8KKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIG9sZG1hc2spOworCXNjaGVkdWxlKCk7CisKKwlwb2wtPmdvdmVybm9yID0gQ1BVRlJFUV9ERUZBVUxUX0dPVkVSTk9SOworCisJLyogVGFrZSBhIGNydWRlIGd1ZXNzIGhlcmUuIAorCSAqIFRoYXQgZ3Vlc3Mgd2FzIGluIG1pY3Jvc2Vjb25kcywgc28gbXVsdGlwbHkgd2l0aCAxMDAwICovCisJcG9sLT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9ICgoKGRhdGEtPnJ2byArIDgpICogZGF0YS0+dnN0YWJsZSAqIFZTVF9VTklUU18yMFVTKQorCSAgICArICgzICogKDEgPDwgZGF0YS0+aXJ0KSAqIDEwKSkgKiAxMDAwOworCisJcG9sLT5jdXIgPSBmaW5kX2toel9mcmVxX2Zyb21fZmlkKGRhdGEtPmN1cnJmaWQpOworCWRwcmludGsoInBvbGljeSBjdXJyZW50IGZyZXF1ZW5jeSAlZCBrSHpcbiIsIHBvbC0+Y3VyKTsKKworCS8qIG1pbi9tYXggdGhlIGNwdSBpcyBjYXBhYmxlIG9mICovCisJaWYgKGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2NwdWluZm8ocG9sLCBkYXRhLT5wb3dlcm5vd190YWJsZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiaW52YWxpZCBwb3dlcm5vd190YWJsZVxuIik7CisJCXBvd2Vybm93X2s4X2NwdV9leGl0X2FjcGkoZGF0YSk7CisJCWtmcmVlKGRhdGEtPnBvd2Vybm93X3RhYmxlKTsKKwkJa2ZyZWUoZGF0YSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2dldF9hdHRyKGRhdGEtPnBvd2Vybm93X3RhYmxlLCBwb2wtPmNwdSk7CisKKwlwcmludGsoImNwdV9pbml0IGRvbmUsIGN1cnJlbnQgZmlkIDB4JXgsIHZpZCAweCV4XG4iLAorCSAgICAgICBkYXRhLT5jdXJyZmlkLCBkYXRhLT5jdXJydmlkKTsKKworCXBvd2Vybm93X2RhdGFbcG9sLT5jcHVdID0gZGF0YTsKKworCXJldHVybiAwOworCitlcnJfb3V0OgorCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgb2xkbWFzayk7CisJc2NoZWR1bGUoKTsKKwlwb3dlcm5vd19rOF9jcHVfZXhpdF9hY3BpKGRhdGEpOworCisJa2ZyZWUoZGF0YSk7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHBvd2Vybm93azhfY3B1X2V4aXQgKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9sKQoreworCXN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhID0gcG93ZXJub3dfZGF0YVtwb2wtPmNwdV07CisKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtRUlOVkFMOworCisJcG93ZXJub3dfazhfY3B1X2V4aXRfYWNwaShkYXRhKTsKKworCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3B1dF9hdHRyKHBvbC0+Y3B1KTsKKworCWtmcmVlKGRhdGEtPnBvd2Vybm93X3RhYmxlKTsKKwlrZnJlZShkYXRhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHBvd2Vybm93azhfZ2V0ICh1bnNpZ25lZCBpbnQgY3B1KQoreworCXN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhID0gcG93ZXJub3dfZGF0YVtjcHVdOworCWNwdW1hc2tfdCBvbGRtYXNrID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOworCXVuc2lnbmVkIGludCBraHogPSAwOworCisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjcHVtYXNrX29mX2NwdShjcHUpKTsKKwlpZiAoc21wX3Byb2Nlc3Nvcl9pZCgpICE9IGNwdSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJsaW1pdGluZyB0byBDUFUgJWQgZmFpbGVkIGluIHBvd2Vybm93azhfZ2V0XG4iLCBjcHUpOworCQlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIG9sZG1hc2spOworCQlyZXR1cm4gMDsKKwl9CisJcHJlZW1wdF9kaXNhYmxlKCk7CisKKwlpZiAocXVlcnlfY3VycmVudF92YWx1ZXNfd2l0aF9wZW5kaW5nX3dhaXQoZGF0YSkpCisJCWdvdG8gb3V0OworCisJa2h6ID0gZmluZF9raHpfZnJlcV9mcm9tX2ZpZChkYXRhLT5jdXJyZmlkKTsKKworIG91dDoKKwlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBvbGRtYXNrKTsKKworCXJldHVybiBraHo7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZnJlcV9hdHRyKiBwb3dlcm5vd19rOF9hdHRyW10gPSB7CisJJmNwdWZyZXFfZnJlcV9hdHRyX3NjYWxpbmdfYXZhaWxhYmxlX2ZyZXFzLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZHJpdmVyIGNwdWZyZXFfYW1kNjRfZHJpdmVyID0geworCS52ZXJpZnkgPSBwb3dlcm5vd2s4X3ZlcmlmeSwKKwkudGFyZ2V0ID0gcG93ZXJub3drOF90YXJnZXQsCisJLmluaXQgPSBwb3dlcm5vd2s4X2NwdV9pbml0LAorCS5leGl0ID0gX19kZXZleGl0X3AocG93ZXJub3drOF9jcHVfZXhpdCksCisJLmdldCA9IHBvd2Vybm93azhfZ2V0LAorCS5uYW1lID0gInBvd2Vybm93LWs4IiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkuYXR0ciA9IHBvd2Vybm93X2s4X2F0dHIsCit9OworCisvKiBkcml2ZXIgZW50cnkgcG9pbnQgZm9yIGluaXQgKi8KK3N0YXRpYyBpbnQgX19pbml0IHBvd2Vybm93azhfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGludCBpLCBzdXBwb3J0ZWRfY3B1cyA9IDA7CisKKwlmb3IgKGk9MDsgaTxOUl9DUFVTOyBpKyspIHsKKwkJaWYgKCFjcHVfb25saW5lKGkpKQorCQkJY29udGludWU7CisJCWlmIChjaGVja19zdXBwb3J0ZWRfY3B1KGkpKQorCQkJc3VwcG9ydGVkX2NwdXMrKzsKKwl9CisKKwlpZiAoc3VwcG9ydGVkX2NwdXMgPT0gbnVtX29ubGluZV9jcHVzKCkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkZvdW5kICVkIEFNRCBBdGhsb24gNjQgLyBPcHRlcm9uIHByb2Nlc3NvcnMgKCIgVkVSU0lPTiAiKVxuIiwKKwkJCXN1cHBvcnRlZF9jcHVzKTsKKwkJcmV0dXJuIGNwdWZyZXFfcmVnaXN0ZXJfZHJpdmVyKCZjcHVmcmVxX2FtZDY0X2RyaXZlcik7CisJfQorCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKy8qIGRyaXZlciBlbnRyeSBwb2ludCBmb3IgdGVybSAqLworc3RhdGljIHZvaWQgX19leGl0IHBvd2Vybm93azhfZXhpdCh2b2lkKQoreworCWRwcmludGsoImV4aXRcbiIpOworCisJY3B1ZnJlcV91bnJlZ2lzdGVyX2RyaXZlcigmY3B1ZnJlcV9hbWQ2NF9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJQYXVsIERldnJpZW5kdCA8cGF1bC5kZXZyaWVuZHRAYW1kLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQU1EIEF0aGxvbiA2NCBhbmQgT3B0ZXJvbiBwcm9jZXNzb3IgZnJlcXVlbmN5IGRyaXZlci4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbGF0ZV9pbml0Y2FsbChwb3dlcm5vd2s4X2luaXQpOworbW9kdWxlX2V4aXQocG93ZXJub3drOF9leGl0KTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazguaCBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2ViYzg0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rOC5oCkBAIC0wLDAgKzEsMTc2IEBACisvKgorICogIChjKSAyMDAzLCAyMDA0IEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KKyAqICBZb3VyIHVzZSBvZiB0aGlzIGNvZGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCisgKiAgR05VIGdlbmVyYWwgcHVibGljIGxpY2Vuc2UgdmVyc2lvbiAyLiBTZWUgIkNPUFlJTkciIG9yCisgKiAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sCisgKi8KKworc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgeworCXVuc2lnbmVkIGludCBjcHU7CisKKwl1MzIgbnVtcHM7ICAvKiBudW1iZXIgb2YgcC1zdGF0ZXMgKi8KKwl1MzIgYmF0cHM7ICAvKiBudW1iZXIgb2YgcC1zdGF0ZXMgc3VwcG9ydGVkIG9uIGJhdHRlcnkgKi8KKworCS8qIHRoZXNlIHZhbHVlcyBhcmUgY29uc3RhbnQgd2hlbiB0aGUgUFNCIGlzIHVzZWQgdG8gZGV0ZXJtaW5lCisJICogdmlkL2ZpZCBwYWlyaW5ncywgYnV0IGFyZSBtb2RpZmllZCBkdXJpbmcgdGhlIC0+dGFyZ2V0KCkgY2FsbAorCSAqIHdoZW4gQUNQSSBpcyB1c2VkICovCisJdTMyIHJ2bzsgICAgIC8qIHJhbXAgdm9sdGFnZSBvZmZzZXQgKi8KKwl1MzIgaXJ0OyAgICAgLyogaXNvY2hyb25vdXMgcmVsaWVmIHRpbWUgKi8KKwl1MzIgdmlkbXZzOyAgLyogdXNhYmxlIHZhbHVlIGNhbGN1bGF0ZWQgZnJvbSBtdnMgKi8KKwl1MzIgdnN0YWJsZTsgLyogdm9sdGFnZSBzdGFiaWxpemF0aW9uIHRpbWUsIHVuaXRzIDIwIHVzICovCisJdTMyIHBsbGxvY2s7IC8qIHBsbCBsb2NrIHRpbWUsIHVuaXRzIDEgdXMgKi8KKworCS8qIGtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgZmlkIC8gdmlkICovCisJdTMyIGN1cnJ2aWQsIGN1cnJmaWQ7CisKKwkvKiB0aGUgcG93ZXJub3dfdGFibGUgaW5jbHVkZXMgYWxsIGZyZXF1ZW5jeSBhbmQgdmlkL2ZpZCBwYWlyaW5nczoKKwkgKiBmaWQgYXJlIHRoZSBsb3dlciA4IGJpdHMgb2YgdGhlIGluZGV4LCB2aWQgYXJlIHRoZSB1cHBlciA4IGJpdHMuCisJICogZnJlcXVlbmN5IGlzIGluIGtIeiAqLworCXN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAgKnBvd2Vybm93X3RhYmxlOworCisjaWZkZWYgQ09ORklHX1g4Nl9QT1dFUk5PV19LOF9BQ1BJCisJLyogdGhlIGFjcGkgdGFibGUgbmVlZHMgdG8gYmUga2VwdC4gaXQncyBvbmx5IGF2YWlsYWJsZSBpZiBBQ1BJIHdhcworCSAqIHVzZWQgdG8gZGV0ZXJtaW5lIHZhbGlkIGZyZXF1ZW5jeS92aWQvZmlkIHN0YXRlcyAqLworCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZSBhY3BpX2RhdGE7CisjZW5kaWYKK307CisKKworLyogcHJvY2Vzc29yJ3MgY3B1aWQgaW5zdHJ1Y3Rpb24gc3VwcG9ydCAqLworI2RlZmluZSBDUFVJRF9QUk9DRVNTT1JfU0lHTkFUVVJFCTEJLyogZnVuY3Rpb24gMSAqLworI2RlZmluZSBDUFVJRF9YRkFNCQkJMHgwZmYwMDAwMAkvKiBleHRlbmRlZCBmYW1pbHkgKi8KKyNkZWZpbmUgQ1BVSURfWEZBTV9LOAkJCTAKKyNkZWZpbmUgQ1BVSURfWE1PRAkJCTB4MDAwZjAwMDAJLyogZXh0ZW5kZWQgbW9kZWwgKi8KKyNkZWZpbmUgQ1BVSURfWE1PRF9SRVZfRQkJMHgwMDAyMDAwMAorI2RlZmluZSBDUFVJRF9VU0VfWEZBTV9YTU9ECQkweDAwMDAwZjAwCisjZGVmaW5lIENQVUlEX0dFVF9NQVhfQ0FQQUJJTElUSUVTCTB4ODAwMDAwMDAKKyNkZWZpbmUgQ1BVSURfRlJFUV9WT0xUX0NBUEFCSUxJVElFUwkweDgwMDAwMDA3CisjZGVmaW5lIFBfU1RBVEVfVFJBTlNJVElPTl9DQVBBQkxFCTYKKworLyogTW9kZWwgU3BlY2lmaWMgUmVnaXN0ZXJzIGZvciBwLXN0YXRlIHRyYW5zaXRpb25zLiBNU1JzIGFyZSA2NC1iaXQuIEZvciAgICAgKi8KKy8qIHdyaXRlcyAod3Jtc3IgLSBvcGNvZGUgMGYgMzApLCB0aGUgcmVnaXN0ZXIgbnVtYmVyIGlzIHBsYWNlZCBpbiBlY3gsIGFuZCAgICovCisvKiB0aGUgdmFsdWUgdG8gd3JpdGUgaXMgcGxhY2VkIGluIGVkeDplYXguIEZvciByZWFkcyAocmRtc3IgLSBvcGNvZGUgMGYgMzIpLCAqLworLyogdGhlIHJlZ2lzdGVyIG51bWJlciBpcyBwbGFjZWQgaW4gZWN4LCBhbmQgdGhlIGRhdGEgaXMgcmV0dXJuZWQgaW4gZWR4OmVheC4gKi8KKworI2RlZmluZSBNU1JfRklEVklEX0NUTCAgICAgIDB4YzAwMTAwNDEKKyNkZWZpbmUgTVNSX0ZJRFZJRF9TVEFUVVMgICAweGMwMDEwMDQyCisKKy8qIEZpZWxkIGRlZmluaXRpb25zIHdpdGhpbiB0aGUgRklEIFZJRCBMb3cgQ29udHJvbCBNU1IgOiAqLworI2RlZmluZSBNU1JfQ19MT19JTklUX0ZJRF9WSUQgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgTVNSX0NfTE9fTkVXX1ZJRCAgICAgICAgICAweDAwMDAxZjAwCisjZGVmaW5lIE1TUl9DX0xPX05FV19GSUQgICAgICAgICAgMHgwMDAwMDAyZgorI2RlZmluZSBNU1JfQ19MT19WSURfU0hJRlQgICAgICAgIDgKKworLyogRmllbGQgZGVmaW5pdGlvbnMgd2l0aGluIHRoZSBGSUQgVklEIEhpZ2ggQ29udHJvbCBNU1IgOiAqLworI2RlZmluZSBNU1JfQ19ISV9TVFBfR05UX1RPICAgICAgIDB4MDAwZmZmZmYKKworLyogRmllbGQgZGVmaW5pdGlvbnMgd2l0aGluIHRoZSBGSUQgVklEIExvdyBTdGF0dXMgTVNSIDogKi8KKyNkZWZpbmUgTVNSX1NfTE9fQ0hBTkdFX1BFTkRJTkcgICAweDgwMDAwMDAwCS8qIGNsZWFyZWQgd2hlbiBjb21wbGV0ZWQgKi8KKyNkZWZpbmUgTVNSX1NfTE9fTUFYX1JBTVBfVklEICAgICAweDFmMDAwMDAwCisjZGVmaW5lIE1TUl9TX0xPX01BWF9GSUQgICAgICAgICAgMHgwMDNmMDAwMAorI2RlZmluZSBNU1JfU19MT19TVEFSVF9GSUQgICAgICAgIDB4MDAwMDNmMDAKKyNkZWZpbmUgTVNSX1NfTE9fQ1VSUkVOVF9GSUQgICAgICAweDAwMDAwMDNmCisKKy8qIEZpZWxkIGRlZmluaXRpb25zIHdpdGhpbiB0aGUgRklEIFZJRCBIaWdoIFN0YXR1cyBNU1IgOiAqLworI2RlZmluZSBNU1JfU19ISV9NQVhfV09SS0lOR19WSUQgIDB4MDAxZjAwMDAKKyNkZWZpbmUgTVNSX1NfSElfU1RBUlRfVklEICAgICAgICAweDAwMDAxZjAwCisjZGVmaW5lIE1TUl9TX0hJX0NVUlJFTlRfVklEICAgICAgMHgwMDAwMDAxZgorI2RlZmluZSBNU1JfQ19ISV9TVFBfR05UX0JFTklHTiAgIDB4MDAwMDAwMDEKKworLyoKKyAqIFRoZXJlIGFyZSByZXN0cmljdGlvbnMgZnJlcXVlbmNpZXMgaGF2ZSB0byBmb2xsb3c6CisgKiAtIG9ubHkgMSBlbnRyeSBpbiB0aGUgbG93IGZpZCB0YWJsZSAoIDw9MS40R0h6ICkKKyAqIC0gbG93ZXN0IGVudHJ5IGluIHRoZSBoaWdoIGZpZCB0YWJsZSBtdXN0IGJlID49IDIgKiB0aGUgZW50cnkgaW4gdGhlCisgKiAgIGxvdyBmaWQgdGFibGUKKyAqIC0gbG93ZXN0IGVudHJ5IGluIHRoZSBoaWdoIGZpZCB0YWJsZSBtdXN0IGJlIGEgPD0gMjAwTUh6ICsgMiAqIHRoZSBlbnRyeQorICogICBpbiB0aGUgbG93IGZpZCB0YWJsZQorICogLSB0aGUgcGFydHMgY2FuIG9ubHkgc3RlcCBhdCAyMDAgTUh6IGludGVydmFscywgc28gMS45IEdIeiBpcyBuZXZlciB2YWxpZAorICogLSBsb3dlc3QgZnJlcXVlbmN5IG11c3QgYmUgPj0gaW50ZXJwcm9jZXNzb3IgaHlwZXJ0cmFuc3BvcnQgbGluayBzcGVlZAorICogICAob25seSBhcHBsaWVzIHRvIE1QIHN5c3RlbXMgb2J2aW91c2x5KQorICovCisKKy8qIGZpZHMgKGZyZXF1ZW5jeSBpZGVudGlmaWVycykgYXJlIGFycmFuZ2VkIGluIDIgdGFibGVzIC0gbG8gYW5kIGhpICovCisjZGVmaW5lIExPX0ZJRF9UQUJMRV9UT1AgICAgIDYJLyogZmlkIHZhbHVlcyBtYXJraW5nIHRoZSBib3VuZGFyeSAgICAqLworI2RlZmluZSBISV9GSURfVEFCTEVfQk9UVE9NICA4CS8qIGJldHdlZW4gdGhlIGxvdyBhbmQgaGlnaCB0YWJsZXMgICAgKi8KKworI2RlZmluZSBMT19WQ09GUkVRX1RBQkxFX1RPUCAgICAxNDAwCS8qIGNvcnJlc3BvbmRpbmcgdmNvIGZyZXF1ZW5jeSB2YWx1ZXMgKi8KKyNkZWZpbmUgSElfVkNPRlJFUV9UQUJMRV9CT1RUT00gMTYwMAorCisjZGVmaW5lIE1JTl9GUkVRX1JFU09MVVRJT04gIDIwMCAvKiBmaWRzIGp1bXAgYnkgMiBtYXRjaGluZyBmcmVxIGp1bXBzIGJ5IDIwMCAqLworCisjZGVmaW5lIE1BWF9GSUQgMHgyYQkvKiBTcGVjIG9ubHkgZ2l2ZXMgRklEIHZhbHVlcyBhcyBmYXIgYXMgNSBHSHogKi8KKyNkZWZpbmUgTEVBU1RfVklEIDB4MWUJLyogTG93ZXN0IChudW1lcmljYWxseSBoaWdoZXN0KSB1c2VmdWwgdmlkIHZhbHVlICovCisKKyNkZWZpbmUgTUlOX0ZSRVEgODAwCS8qIE1pbiBhbmQgbWF4IGZyZXFzLCBwZXIgc3BlYyAqLworI2RlZmluZSBNQVhfRlJFUSA1MDAwCisKKyNkZWZpbmUgSU5WQUxJRF9GSURfTUFTSyAweGZmZmZmZmMxICAvKiBub3QgYSB2YWxpZCBmaWQgaWYgdGhlc2UgYml0cyBhcmUgc2V0ICovCisjZGVmaW5lIElOVkFMSURfVklEX01BU0sgMHhmZmZmZmZlMCAgLyogbm90IGEgdmFsaWQgdmlkIGlmIHRoZXNlIGJpdHMgYXJlIHNldCAqLworCisjZGVmaW5lIFNUT1BfR1JBTlRfNU5TIDEgLyogbWluIHBvc3MgbWVtb3J5IGFjY2VzcyBsYXRlbmN5IGZvciB2b2x0YWdlIGNoYW5nZSAqLworCisjZGVmaW5lIFBMTF9MT0NLX0NPTlZFUlNJT04gKDEwMDAvNSkgLyogbXMgdG8gbnMsIHRoZW4gZGl2aWRlIGJ5IGNsb2NrIHBlcmlvZCAqLworCisjZGVmaW5lIE1BWElNVU1fVklEX1NURVBTIDEgIC8qIEN1cnJlbnQgY3B1cyBvbmx5IGFsbG93IGEgc2luZ2xlIHN0ZXAgb2YgMjVtViAqLworI2RlZmluZSBWU1RfVU5JVFNfMjBVUyAyMCAgIC8qIFZvbHRhZ2UgU3RhYmFsaXphdGlvbiBUaW1lIGlzIGluIHVuaXRzIG9mIDIwdXMgKi8KKworLyoKKyAqIE1vc3QgdmFsdWVzIG9mIGludGVyZXN0IGFyZSBlbm9jb2RlZCBpbiBhIHNpbmdsZSBmaWVsZCBvZiB0aGUgX1BTUworICogZW50cmllczogdGhlICJjb250cm9sIiB2YWx1ZS4KKyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBJUlRfU0hJRlQgICAgICAzMAorI2RlZmluZSBSVk9fU0hJRlQgICAgICAyOAorI2RlZmluZSBQTExfTF9TSElGVCAgICAyMAorI2RlZmluZSBNVlNfU0hJRlQgICAgICAxOAorI2RlZmluZSBWU1RfU0hJRlQgICAgICAxMQorI2RlZmluZSBWSURfU0hJRlQgICAgICAgNgorI2RlZmluZSBJUlRfTUFTSyAgICAgICAgMworI2RlZmluZSBSVk9fTUFTSyAgICAgICAgMworI2RlZmluZSBQTExfTF9NQVNLICAgMHg3ZgorI2RlZmluZSBNVlNfTUFTSyAgICAgICAgMworI2RlZmluZSBWU1RfTUFTSyAgICAgMHg3ZgorI2RlZmluZSBWSURfTUFTSyAgICAgMHgxZgorI2RlZmluZSBGSURfTUFTSyAgICAgMHgzZgorCisKKy8qCisgKiBWZXJzaW9uIDEuNCBvZiB0aGUgUFNCIHRhYmxlLiBUaGlzIHRhYmxlIGlzIGNvbnN0cnVjdGVkIGJ5IEJJT1MgYW5kIGlzCisgKiB0byB0ZWxsIHRoZSBPUydzIHBvd2VyIG1hbmFnZW1lbnQgZHJpdmVyIHdoaWNoIFZJRHMgYW5kIEZJRHMgYXJlCisgKiBzdXBwb3J0ZWQgYnkgdGhpcyBwYXJ0aWN1bGFyIHByb2Nlc3Nvci4KKyAqIElmIHRoZSBkYXRhIGluIHRoZSBQU0IgLyBQU1QgaXMgd3JvbmcsIHRoZW4gdGhpcyBkcml2ZXIgd2lsbCBwcm9ncmFtIHRoZQorICogd3JvbmcgdmFsdWVzIGludG8gaGFyZHdhcmUsIHdoaWNoIGlzIHZlcnkgbGlrZWx5IHRvIGxlYWQgdG8gYSBjcmFzaC4KKyAqLworCisjZGVmaW5lIFBTQl9JRF9TVFJJTkcgICAgICAiQU1ESzdQTk9XISIKKyNkZWZpbmUgUFNCX0lEX1NUUklOR19MRU4gIDEwCisKKyNkZWZpbmUgUFNCX1ZFUlNJT05fMV80ICAweDE0CisKK3N0cnVjdCBwc2JfcyB7CisJdTggc2lnbmF0dXJlWzEwXTsKKwl1OCB0YWJsZXZlcnNpb247CisJdTggZmxhZ3MxOworCXUxNiB2c3RhYmxlOworCXU4IGZsYWdzMjsKKwl1OCBudW1fdGFibGVzOworCXUzMiBjcHVpZDsKKwl1OCBwbGxsb2NrdGltZTsKKwl1OCBtYXhmaWQ7CisJdTggbWF4dmlkOworCXU4IG51bXBzOworfTsKKworLyogUGFpcnMgb2YgZmlkL3ZpZCB2YWx1ZXMgYXJlIGFwcGVuZGVkIHRvIHRoZSB2ZXJzaW9uIDEuNCBQU0IgdGFibGUuICovCitzdHJ1Y3QgcHN0X3MgeworCXU4IGZpZDsKKwl1OCB2aWQ7Cit9OworCisjZGVmaW5lIGRwcmludGsobXNnLi4uKSBjcHVmcmVxX2RlYnVnX3ByaW50ayhDUFVGUkVRX0RFQlVHX0RSSVZFUiwgInBvd2Vybm93LWs4IiwgbXNnKQorCitzdGF0aWMgaW50IGNvcmVfdm9sdGFnZV9wcmVfdHJhbnNpdGlvbihzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSwgdTMyIHJlcXZpZCk7CitzdGF0aWMgaW50IGNvcmVfdm9sdGFnZV9wb3N0X3RyYW5zaXRpb24oc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEsIHUzMiByZXF2aWQpOworc3RhdGljIGludCBjb3JlX2ZyZXF1ZW5jeV90cmFuc2l0aW9uKHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhLCB1MzIgcmVxZmlkKTsKKworc3RhdGljIHZvaWQgcG93ZXJub3dfazhfYWNwaV9wc3RfdmFsdWVzKHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhLCB1bnNpZ25lZCBpbnQgaW5kZXgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtY2VudHJpbm8uYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWNlbnRyaW5vLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdkNTYxMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWNlbnRyaW5vLmMKQEAgLTAsMCArMSw3MTUgQEAKKy8qCisgKiBjcHVmcmVxIGRyaXZlciBmb3IgRW5oYW5jZWQgU3BlZWRTdGVwLCBhcyBmb3VuZCBpbiBJbnRlbCdzIFBlbnRpdW0KKyAqIE0gKHBhcnQgb2YgdGhlIENlbnRyaW5vIGNoaXBzZXQpLgorICoKKyAqIERlc3BpdGUgdGhlICJTcGVlZFN0ZXAiIGluIHRoZSBuYW1lLCB0aGlzIGlzIGFsbW9zdCBlbnRpcmVseSB1bmxpa2UKKyAqIHRyYWRpdGlvbmFsIFNwZWVkU3RlcC4KKyAqCisgKiBNb2RlbGxlZCBvbiBzcGVlZHN0ZXAuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBKZXJlbXkgRml0emhhcmRpbmdlIDxqZXJlbXlAZ29vcC5vcmc+CisgKgorICogV0FSTklORyBXQVJOSU5HIFdBUk5JTkcKKyAqCisgKiBUaGlzIGRyaXZlciBtYW5pcHVsYXRlcyB0aGUgUEVSRl9DVEwgTVNSLCB3aGljaCBpcyBvbmx5IHNvbWV3aGF0CisgKiBkb2N1bWVudGVkLiAgV2hpbGUgaXQgc2VlbXMgdG8gd29yayBvbiBteSBsYXB0b3AsIGl0IGhhcyBub3QgYmVlbgorICogdGVzdGVkIGFueXdoZXJlIGVsc2UsIGFuZCBpdCBtYXkgbm90IHdvcmsgZm9yIHlvdSwgZG8gc3RyYW5nZQorICogdGhpbmdzIG9yIHNpbXBseSBjcmFzaC4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisKKyNpZmRlZiBDT05GSUdfWDg2X1NQRUVEU1RFUF9DRU5UUklOT19BQ1BJCisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGFjcGkvcHJvY2Vzc29yLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzbS9tc3IuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4KKworI2luY2x1ZGUgInNwZWVkc3RlcC1lc3QtY29tbW9uLmgiCisKKyNkZWZpbmUgUEZYCQkic3BlZWRzdGVwLWNlbnRyaW5vOiAiCisjZGVmaW5lIE1BSU5UQUlORVIJIkplcmVteSBGaXR6aGFyZGluZ2UgPGplcmVteUBnb29wLm9yZz4iCisKKyNkZWZpbmUgZHByaW50ayhtc2cuLi4pIGNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfRFJJVkVSLCAic3BlZWRzdGVwLWNlbnRyaW5vIiwgbXNnKQorCisKK3N0cnVjdCBjcHVfaWQKK3sKKwlfX3U4CXg4NjsgICAgICAgICAgICAvKiBDUFUgZmFtaWx5ICovCisJX191OAl4ODZfbW9kZWw7CS8qIG1vZGVsICovCisJX191OAl4ODZfbWFzazsJLyogc3RlcHBpbmcgKi8KK307CisKK2VudW0geworCUNQVV9CQU5JQVMsCisJQ1BVX0RPVEhBTl9BMSwKKwlDUFVfRE9USEFOX0EyLAorCUNQVV9ET1RIQU5fQjAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNwdV9pZCBjcHVfaWRzW10gPSB7CisJW0NQVV9CQU5JQVNdCT0geyA2LCAgOSwgNSB9LAorCVtDUFVfRE9USEFOX0ExXQk9IHsgNiwgMTMsIDEgfSwKKwlbQ1BVX0RPVEhBTl9BMl0JPSB7IDYsIDEzLCAyIH0sCisJW0NQVV9ET1RIQU5fQjBdCT0geyA2LCAxMywgNiB9LAorfTsKKyNkZWZpbmUgTl9JRFMJKHNpemVvZihjcHVfaWRzKS9zaXplb2YoY3B1X2lkc1swXSkpCisKK3N0cnVjdCBjcHVfbW9kZWwKK3sKKwljb25zdCBzdHJ1Y3QgY3B1X2lkICpjcHVfaWQ7CisJY29uc3QgY2hhcgkqbW9kZWxfbmFtZTsKKwl1bnNpZ25lZAltYXhfZnJlcTsgLyogbWF4IGNsb2NrIGluIGtIeiAqLworCisJc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICpvcF9wb2ludHM7IC8qIGNsb2NrL3ZvbHRhZ2UgcGFpcnMgKi8KK307CitzdGF0aWMgaW50IGNlbnRyaW5vX3ZlcmlmeV9jcHVfaWQoY29uc3Qgc3RydWN0IGNwdWluZm9feDg2ICpjLCBjb25zdCBzdHJ1Y3QgY3B1X2lkICp4KTsKKworLyogT3BlcmF0aW5nIHBvaW50cyBmb3IgY3VycmVudCBDUFUgKi8KK3N0YXRpYyBzdHJ1Y3QgY3B1X21vZGVsICpjZW50cmlub19tb2RlbFtOUl9DUFVTXTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3B1X2lkICpjZW50cmlub19jcHVbTlJfQ1BVU107CisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIgY2VudHJpbm9fZHJpdmVyOworCisjaWZkZWYgQ09ORklHX1g4Nl9TUEVFRFNURVBfQ0VOVFJJTk9fVEFCTEUKKworLyogQ29tcHV0ZXMgdGhlIGNvcnJlY3QgZm9ybSBmb3IgSUEzMl9QRVJGX0NUTCBNU1IgZm9yIGEgcGFydGljdWxhcgorICAgZnJlcXVlbmN5L3ZvbHRhZ2Ugb3BlcmF0aW5nIHBvaW50OyBmcmVxdWVuY3kgaW4gTUh6LCB2b2x0cyBpbiBtVi4KKyAgIFRoaXMgaXMgc3RvcmVkIGFzICJpbmRleCIgaW4gdGhlIHN0cnVjdHVyZS4gKi8KKyNkZWZpbmUgT1AobWh6LCBtdikJCQkJCQkJXAorCXsJCQkJCQkJCVwKKwkJLmZyZXF1ZW5jeSA9IChtaHopICogMTAwMCwJCQkJXAorCQkuaW5kZXggPSAoKChtaHopLzEwMCkgPDwgOCkgfCAoKG12IC0gNzAwKSAvIDE2KQkJXAorCX0KKworLyoKKyAqIFRoZXNlIHZvbHRhZ2UgdGFibGVzIHdlcmUgZGVyaXZlZCBmcm9tIHRoZSBJbnRlbCBQZW50aXVtIE0KKyAqIGRhdGFzaGVldCwgZG9jdW1lbnQgMjUyNjEyMDIucGRmLCBUYWJsZSA1LiAgSSBoYXZlIHZlcmlmaWVkIHRoZXkKKyAqIGFyZSBjb25zaXN0ZW50IHdpdGggbXkgSUJNIFRoaW5rUGFkIFgzMSwgd2hpY2ggaGFzIGEgMS4zR0h6IFBlbnRpdW0KKyAqIE0uCisgKi8KKworLyogVWx0cmEgTG93IFZvbHRhZ2UgSW50ZWwgUGVudGl1bSBNIHByb2Nlc3NvciA5MDBNSHogKEJhbmlhcykgKi8KK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgYmFuaWFzXzkwMFtdID0KK3sKKwlPUCg2MDAsICA4NDQpLAorCU9QKDgwMCwgIDk4OCksCisJT1AoOTAwLCAxMDA0KSwKKwl7IC5mcmVxdWVuY3kgPSBDUFVGUkVRX1RBQkxFX0VORCB9Cit9OworCisvKiBVbHRyYSBMb3cgVm9sdGFnZSBJbnRlbCBQZW50aXVtIE0gcHJvY2Vzc29yIDEwMDBNSHogKEJhbmlhcykgKi8KK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgYmFuaWFzXzEwMDBbXSA9Cit7CisJT1AoNjAwLCAgIDg0NCksCisJT1AoODAwLCAgIDk3MiksCisJT1AoOTAwLCAgIDk4OCksCisJT1AoMTAwMCwgMTAwNCksCisJeyAuZnJlcXVlbmN5ID0gQ1BVRlJFUV9UQUJMRV9FTkQgfQorfTsKKworLyogTG93IFZvbHRhZ2UgSW50ZWwgUGVudGl1bSBNIHByb2Nlc3NvciAxLjEwR0h6IChCYW5pYXMpICovCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlIGJhbmlhc18xMTAwW10gPQoreworCU9QKCA2MDAsICA5NTYpLAorCU9QKCA4MDAsIDEwMjApLAorCU9QKCA5MDAsIDExMDApLAorCU9QKDEwMDAsIDExNjQpLAorCU9QKDExMDAsIDExODApLAorCXsgLmZyZXF1ZW5jeSA9IENQVUZSRVFfVEFCTEVfRU5EIH0KK307CisKKworLyogTG93IFZvbHRhZ2UgSW50ZWwgUGVudGl1bSBNIHByb2Nlc3NvciAxLjIwR0h6IChCYW5pYXMpICovCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlIGJhbmlhc18xMjAwW10gPQoreworCU9QKCA2MDAsICA5NTYpLAorCU9QKCA4MDAsIDEwMDQpLAorCU9QKCA5MDAsIDEwMjApLAorCU9QKDEwMDAsIDExMDApLAorCU9QKDExMDAsIDExNjQpLAorCU9QKDEyMDAsIDExODApLAorCXsgLmZyZXF1ZW5jeSA9IENQVUZSRVFfVEFCTEVfRU5EIH0KK307CisKKy8qIEludGVsIFBlbnRpdW0gTSBwcm9jZXNzb3IgMS4zMEdIeiAoQmFuaWFzKSAqLworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSBiYW5pYXNfMTMwMFtdID0KK3sKKwlPUCggNjAwLCAgOTU2KSwKKwlPUCggODAwLCAxMjYwKSwKKwlPUCgxMDAwLCAxMjkyKSwKKwlPUCgxMjAwLCAxMzU2KSwKKwlPUCgxMzAwLCAxMzg4KSwKKwl7IC5mcmVxdWVuY3kgPSBDUFVGUkVRX1RBQkxFX0VORCB9Cit9OworCisvKiBJbnRlbCBQZW50aXVtIE0gcHJvY2Vzc29yIDEuNDBHSHogKEJhbmlhcykgKi8KK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgYmFuaWFzXzE0MDBbXSA9Cit7CisJT1AoIDYwMCwgIDk1NiksCisJT1AoIDgwMCwgMTE4MCksCisJT1AoMTAwMCwgMTMwOCksCisJT1AoMTIwMCwgMTQzNiksCisJT1AoMTQwMCwgMTQ4NCksCisJeyAuZnJlcXVlbmN5ID0gQ1BVRlJFUV9UQUJMRV9FTkQgfQorfTsKKworLyogSW50ZWwgUGVudGl1bSBNIHByb2Nlc3NvciAxLjUwR0h6IChCYW5pYXMpICovCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlIGJhbmlhc18xNTAwW10gPQoreworCU9QKCA2MDAsICA5NTYpLAorCU9QKCA4MDAsIDExMTYpLAorCU9QKDEwMDAsIDEyMjgpLAorCU9QKDEyMDAsIDEzNTYpLAorCU9QKDE0MDAsIDE0NTIpLAorCU9QKDE1MDAsIDE0ODQpLAorCXsgLmZyZXF1ZW5jeSA9IENQVUZSRVFfVEFCTEVfRU5EIH0KK307CisKKy8qIEludGVsIFBlbnRpdW0gTSBwcm9jZXNzb3IgMS42MEdIeiAoQmFuaWFzKSAqLworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSBiYW5pYXNfMTYwMFtdID0KK3sKKwlPUCggNjAwLCAgOTU2KSwKKwlPUCggODAwLCAxMDM2KSwKKwlPUCgxMDAwLCAxMTY0KSwKKwlPUCgxMjAwLCAxMjc2KSwKKwlPUCgxNDAwLCAxNDIwKSwKKwlPUCgxNjAwLCAxNDg0KSwKKwl7IC5mcmVxdWVuY3kgPSBDUFVGUkVRX1RBQkxFX0VORCB9Cit9OworCisvKiBJbnRlbCBQZW50aXVtIE0gcHJvY2Vzc29yIDEuNzBHSHogKEJhbmlhcykgKi8KK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgYmFuaWFzXzE3MDBbXSA9Cit7CisJT1AoIDYwMCwgIDk1NiksCisJT1AoIDgwMCwgMTAwNCksCisJT1AoMTAwMCwgMTExNiksCisJT1AoMTIwMCwgMTIyOCksCisJT1AoMTQwMCwgMTMwOCksCisJT1AoMTcwMCwgMTQ4NCksCisJeyAuZnJlcXVlbmN5ID0gQ1BVRlJFUV9UQUJMRV9FTkQgfQorfTsKKyN1bmRlZiBPUAorCisjZGVmaW5lIF9CQU5JQVMoY3B1aWQsIG1heCwgbmFtZSkJXAorewkuY3B1X2lkCQk9IGNwdWlkLAlcCisJLm1vZGVsX25hbWUJPSAiSW50ZWwoUikgUGVudGl1bShSKSBNIHByb2Nlc3NvciAiIG5hbWUgIk1IeiIsIFwKKwkubWF4X2ZyZXEJPSAobWF4KSoxMDAwLAlcCisJLm9wX3BvaW50cwk9IGJhbmlhc18jI21heCwJXAorfQorI2RlZmluZSBCQU5JQVMobWF4KQlfQkFOSUFTKCZjcHVfaWRzW0NQVV9CQU5JQVNdLCBtYXgsICNtYXgpCisKKy8qIENQVSBtb2RlbHMsIHRoZWlyIG9wZXJhdGluZyBmcmVxdWVuY3kgcmFuZ2UsIGFuZCBmcmVxL3ZvbHRhZ2UKKyAgIG9wZXJhdGluZyBwb2ludHMgKi8KK3N0YXRpYyBzdHJ1Y3QgY3B1X21vZGVsIG1vZGVsc1tdID0KK3sKKwlfQkFOSUFTKCZjcHVfaWRzW0NQVV9CQU5JQVNdLCA5MDAsICIgOTAwIiksCisJQkFOSUFTKDEwMDApLAorCUJBTklBUygxMTAwKSwKKwlCQU5JQVMoMTIwMCksCisJQkFOSUFTKDEzMDApLAorCUJBTklBUygxNDAwKSwKKwlCQU5JQVMoMTUwMCksCisJQkFOSUFTKDE2MDApLAorCUJBTklBUygxNzAwKSwKKworCS8qIE5VTEwgbW9kZWxfbmFtZSBpcyBhIHdpbGRjYXJkICovCisJeyAmY3B1X2lkc1tDUFVfRE9USEFOX0ExXSwgTlVMTCwgMCwgTlVMTCB9LAorCXsgJmNwdV9pZHNbQ1BVX0RPVEhBTl9BMl0sIE5VTEwsIDAsIE5VTEwgfSwKKwl7ICZjcHVfaWRzW0NQVV9ET1RIQU5fQjBdLCBOVUxMLCAwLCBOVUxMIH0sCisKKwl7IE5VTEwsIH0KK307CisjdW5kZWYgX0JBTklBUworI3VuZGVmIEJBTklBUworCitzdGF0aWMgaW50IGNlbnRyaW5vX2NwdV9pbml0X3RhYmxlKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXN0cnVjdCBjcHVpbmZvX3g4NiAqY3B1ID0gJmNwdV9kYXRhW3BvbGljeS0+Y3B1XTsKKwlzdHJ1Y3QgY3B1X21vZGVsICptb2RlbDsKKworCWZvcihtb2RlbCA9IG1vZGVsczsgbW9kZWwtPmNwdV9pZCAhPSBOVUxMOyBtb2RlbCsrKQorCQlpZiAoY2VudHJpbm9fdmVyaWZ5X2NwdV9pZChjcHUsIG1vZGVsLT5jcHVfaWQpICYmCisJCSAgICAobW9kZWwtPm1vZGVsX25hbWUgPT0gTlVMTCB8fAorCQkgICAgIHN0cmNtcChjcHUtPng4Nl9tb2RlbF9pZCwgbW9kZWwtPm1vZGVsX25hbWUpID09IDApKQorCQkJYnJlYWs7CisKKwlpZiAobW9kZWwtPmNwdV9pZCA9PSBOVUxMKSB7CisJCS8qIE5vIG1hdGNoIGF0IGFsbCAqLworCQlkcHJpbnRrKEtFUk5fSU5GTyBQRlggIm5vIHN1cHBvcnQgZm9yIENQVSBtb2RlbCBcIiVzXCI6ICIKKwkJICAgICAgICJzZW5kIC9wcm9jL2NwdWluZm8gdG8gIiBNQUlOVEFJTkVSICJcbiIsCisJCSAgICAgICBjcHUtPng4Nl9tb2RlbF9pZCk7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCWlmIChtb2RlbC0+b3BfcG9pbnRzID09IE5VTEwpIHsKKwkJLyogTWF0Y2hlZCBhIG5vbi1tYXRjaCAqLworCQlkcHJpbnRrKEtFUk5fSU5GTyBQRlggIm5vIHRhYmxlIHN1cHBvcnQgZm9yIENQVSBtb2RlbCBcIiVzXCI6IFxuIiwKKwkJICAgICAgIGNwdS0+eDg2X21vZGVsX2lkKTsKKyNpZm5kZWYgQ09ORklHX1g4Nl9TUEVFRFNURVBfQ0VOVFJJTk9fQUNQSQorCQlkcHJpbnRrKEtFUk5fSU5GTyBQRlggInRyeSBjb21waWxpbmcgd2l0aCBDT05GSUdfWDg2X1NQRUVEU1RFUF9DRU5UUklOT19BQ1BJIGVuYWJsZWRcbiIpOworI2VuZGlmCisJCXJldHVybiAtRU5PRU5UOworCX0KKworCWNlbnRyaW5vX21vZGVsW3BvbGljeS0+Y3B1XSA9IG1vZGVsOworCisJZHByaW50aygiZm91bmQgXCIlc1wiOiBtYXggZnJlcXVlbmN5OiAlZGtIelxuIiwKKwkgICAgICAgbW9kZWwtPm1vZGVsX25hbWUsIG1vZGVsLT5tYXhfZnJlcSk7CisKKwlyZXR1cm4gMDsKK30KKworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGNlbnRyaW5vX2NwdV9pbml0X3RhYmxlKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KSB7IHJldHVybiAtRU5PREVWOyB9CisjZW5kaWYgLyogQ09ORklHX1g4Nl9TUEVFRFNURVBfQ0VOVFJJTk9fVEFCTEUgKi8KKworc3RhdGljIGludCBjZW50cmlub192ZXJpZnlfY3B1X2lkKGNvbnN0IHN0cnVjdCBjcHVpbmZvX3g4NiAqYywgY29uc3Qgc3RydWN0IGNwdV9pZCAqeCkKK3sKKwlpZiAoKGMtPng4NiA9PSB4LT54ODYpICYmCisJICAgIChjLT54ODZfbW9kZWwgPT0geC0+eDg2X21vZGVsKSAmJgorCSAgICAoYy0+eDg2X21hc2sgPT0geC0+eDg2X21hc2spKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworLyogVG8gYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgY2VudHJpbm9fbW9kZWwgaXMgaW5pdGlhbGl6ZWQgKi8KK3N0YXRpYyB1bnNpZ25lZCBleHRyYWN0X2Nsb2NrKHVuc2lnbmVkIG1zciwgdW5zaWduZWQgaW50IGNwdSwgaW50IGZhaWxzYWZlKQoreworCWludCBpOworCisJLyoKKwkgKiBFeHRyYWN0IGNsb2NrIGluIGtIeiBmcm9tIFBFUkZfQ1RMIHZhbHVlCisJICogZm9yIGNlbnRyaW5vLCBhcyBzb21lIERTRFRzIGFyZSBidWdneS4KKwkgKiBJZGVhbGx5LCB0aGlzIGNhbiBiZSBkb25lIHVzaW5nIHRoZSBhY3BpX2RhdGEgc3RydWN0dXJlLgorCSAqLworCWlmICgoY2VudHJpbm9fY3B1W2NwdV0gPT0gJmNwdV9pZHNbQ1BVX0JBTklBU10pIHx8CisJICAgIChjZW50cmlub19jcHVbY3B1XSA9PSAmY3B1X2lkc1tDUFVfRE9USEFOX0ExXSkgfHwKKwkgICAgKGNlbnRyaW5vX2NwdVtjcHVdID09ICZjcHVfaWRzW0NQVV9ET1RIQU5fQjBdKSkgeworCQltc3IgPSAobXNyID4+IDgpICYgMHhmZjsKKwkJcmV0dXJuIG1zciAqIDEwMDAwMDsKKwl9CisKKwlpZiAoKCFjZW50cmlub19tb2RlbFtjcHVdKSB8fCAoIWNlbnRyaW5vX21vZGVsW2NwdV0tPm9wX3BvaW50cykpCisJCXJldHVybiAwOworCisJbXNyICY9IDB4ZmZmZjsKKwlmb3IgKGk9MDtjZW50cmlub19tb2RlbFtjcHVdLT5vcF9wb2ludHNbaV0uZnJlcXVlbmN5ICE9IENQVUZSRVFfVEFCTEVfRU5EOyBpKyspIHsKKwkJaWYgKG1zciA9PSBjZW50cmlub19tb2RlbFtjcHVdLT5vcF9wb2ludHNbaV0uaW5kZXgpCisJCQlyZXR1cm4gY2VudHJpbm9fbW9kZWxbY3B1XS0+b3BfcG9pbnRzW2ldLmZyZXF1ZW5jeTsKKwl9CisJaWYgKGZhaWxzYWZlKQorCQlyZXR1cm4gY2VudHJpbm9fbW9kZWxbY3B1XS0+b3BfcG9pbnRzW2ktMV0uZnJlcXVlbmN5OworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybiB0aGUgY3VycmVudCBDUFUgZnJlcXVlbmN5IGluIGtIeiAqLworc3RhdGljIHVuc2lnbmVkIGludCBnZXRfY3VyX2ZyZXEodW5zaWduZWQgaW50IGNwdSkKK3sKKwl1bnNpZ25lZCBsLCBoOworCXVuc2lnbmVkIGNsb2NrX2ZyZXE7CisJY3B1bWFza190IHNhdmVkX21hc2s7CisKKwlzYXZlZF9tYXNrID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOworCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgY3B1bWFza19vZl9jcHUoY3B1KSk7CisJaWYgKHNtcF9wcm9jZXNzb3JfaWQoKSAhPSBjcHUpCisJCXJldHVybiAwOworCisJcmRtc3IoTVNSX0lBMzJfUEVSRl9TVEFUVVMsIGwsIGgpOworCWNsb2NrX2ZyZXEgPSBleHRyYWN0X2Nsb2NrKGwsIGNwdSwgMCk7CisKKwlpZiAodW5saWtlbHkoY2xvY2tfZnJlcSA9PSAwKSkgeworCQkvKgorCQkgKiBPbiBzb21lIENQVXMsIHdlIGNhbiBzZWUgdHJhbnNpZW50IE1TUiB2YWx1ZXMgKHdoaWNoIGFyZQorCQkgKiBub3QgcHJlc2VudCBpbiBfUFNTKSwgd2hpbGUgQ1BVIGlzIGRvaW5nIHNvbWUgYXV0b21hdGljCisJCSAqIFAtc3RhdGUgdHJhbnNpdGlvbiAobGlrZSBUTTIpLiBHZXQgdGhlIGxhc3QgZnJlcSBzZXQgCisJCSAqIGluIFBFUkZfQ1RMLgorCQkgKi8KKwkJcmRtc3IoTVNSX0lBMzJfUEVSRl9DVEwsIGwsIGgpOworCQljbG9ja19mcmVxID0gZXh0cmFjdF9jbG9jayhsLCBjcHUsIDEpOworCX0KKworCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgc2F2ZWRfbWFzayk7CisJcmV0dXJuIGNsb2NrX2ZyZXE7Cit9CisKKworI2lmZGVmIENPTkZJR19YODZfU1BFRURTVEVQX0NFTlRSSU5PX0FDUEkKKworc3RhdGljIHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZSBwOworCisvKgorICogY2VudHJpbm9fY3B1X2luaXRfYWNwaSAtIHJlZ2lzdGVyIHdpdGggQUNQSSBQLVN0YXRlcyBsaWJyYXJ5CisgKgorICogUmVnaXN0ZXIgd2l0aCB0aGUgQUNQSSBQLVN0YXRlcyBsaWJyYXJ5IChwYXJ0IG9mIGRyaXZlcnMvYWNwaS9wcm9jZXNzb3IuYykKKyAqIGluIG9yZGVyIHRvIGRldGVybWluZSBjb3JyZWN0IGZyZXF1ZW5jeSBhbmQgdm9sdGFnZSBwYWlyaW5ncyBieSByZWFkaW5nCisgKiB0aGUgX1BTUyBvZiB0aGUgQUNQSSBEU0RUIG9yIFNTRFQgdGFibGVzLgorICovCitzdGF0aWMgaW50IGNlbnRyaW5vX2NwdV9pbml0X2FjcGkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJdW5pb24gYWNwaV9vYmplY3QJCWFyZzAgPSB7QUNQSV9UWVBFX0JVRkZFUn07CisJdTMyCQkJCWFyZzBfYnVmWzNdOworCXN0cnVjdCBhY3BpX29iamVjdF9saXN0CQlhcmdfbGlzdCA9IHsxLCAmYXJnMH07CisJdW5zaWduZWQgbG9uZwkJCWN1cl9mcmVxOworCWludAkJCQlyZXN1bHQgPSAwLCBpOworCXVuc2lnbmVkIGludAkJCWNwdSA9IHBvbGljeS0+Y3B1OworCisJLyogX1BEQyBzZXR0aW5ncyAqLworCWFyZzAuYnVmZmVyLmxlbmd0aCA9IDEyOworCWFyZzAuYnVmZmVyLnBvaW50ZXIgPSAodTggKikgYXJnMF9idWY7CisJYXJnMF9idWZbMF0gPSBBQ1BJX1BEQ19SRVZJU0lPTl9JRDsKKwlhcmcwX2J1ZlsxXSA9IDE7CisJYXJnMF9idWZbMl0gPSBBQ1BJX1BEQ19FU1RfQ0FQQUJJTElUWV9TTVAgfCBBQ1BJX1BEQ19FU1RfQ0FQQUJJTElUWV9NU1I7CisKKwlwLnBkYyA9ICZhcmdfbGlzdDsKKworCS8qIHJlZ2lzdGVyIHdpdGggQUNQSSBjb3JlICovCisJaWYgKGFjcGlfcHJvY2Vzc29yX3JlZ2lzdGVyX3BlcmZvcm1hbmNlKCZwLCBjcHUpKSB7CisJCWRwcmludGsoS0VSTl9JTkZPIFBGWCAib2J0YWluaW5nIEFDUEkgZGF0YSBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiB2ZXJpZnkgdGhlIGFjcGlfZGF0YSAqLworCWlmIChwLnN0YXRlX2NvdW50IDw9IDEpIHsKKwkJZHByaW50aygiTm8gUC1TdGF0ZXNcbiIpOworCQlyZXN1bHQgPSAtRU5PREVWOworCQlnb3RvIGVycl91bnJlZzsKKwl9CisKKwlpZiAoKHAuY29udHJvbF9yZWdpc3Rlci5zcGFjZV9pZCAhPSBBQ1BJX0FEUl9TUEFDRV9GSVhFRF9IQVJEV0FSRSkgfHwKKwkgICAgKHAuc3RhdHVzX3JlZ2lzdGVyLnNwYWNlX2lkICE9IEFDUElfQURSX1NQQUNFX0ZJWEVEX0hBUkRXQVJFKSkgeworCQlkcHJpbnRrKCJJbnZhbGlkIGNvbnRyb2wvc3RhdHVzIHJlZ2lzdGVycyAoJXggLSAleClcbiIsCisJCQlwLmNvbnRyb2xfcmVnaXN0ZXIuc3BhY2VfaWQsIHAuc3RhdHVzX3JlZ2lzdGVyLnNwYWNlX2lkKTsKKwkJcmVzdWx0ID0gLUVJTzsKKwkJZ290byBlcnJfdW5yZWc7CisJfQorCisJZm9yIChpPTA7IGk8cC5zdGF0ZV9jb3VudDsgaSsrKSB7CisJCWlmIChwLnN0YXRlc1tpXS5jb250cm9sICE9IHAuc3RhdGVzW2ldLnN0YXR1cykgeworCQkJZHByaW50aygiRGlmZmVyZW50IGNvbnRyb2wgKCV4KSBhbmQgc3RhdHVzIHZhbHVlcyAoJXgpXG4iLAorCQkJCXAuc3RhdGVzW2ldLmNvbnRyb2wsIHAuc3RhdGVzW2ldLnN0YXR1cyk7CisJCQlyZXN1bHQgPSAtRUlOVkFMOworCQkJZ290byBlcnJfdW5yZWc7CisJCX0KKworCQlpZiAoIXAuc3RhdGVzW2ldLmNvcmVfZnJlcXVlbmN5KSB7CisJCQlkcHJpbnRrKCJaZXJvIGNvcmUgZnJlcXVlbmN5IGZvciBzdGF0ZSAldVxuIiwgaSk7CisJCQlyZXN1bHQgPSAtRUlOVkFMOworCQkJZ290byBlcnJfdW5yZWc7CisJCX0KKworCQlpZiAocC5zdGF0ZXNbaV0uY29yZV9mcmVxdWVuY3kgPiBwLnN0YXRlc1swXS5jb3JlX2ZyZXF1ZW5jeSkgeworCQkJZHByaW50aygiUCV1IGhhcyBsYXJnZXIgZnJlcXVlbmN5ICgldSkgdGhhbiBQMCAoJXUpLCBza2lwcGluZ1xuIiwgaSwKKwkJCQlwLnN0YXRlc1tpXS5jb3JlX2ZyZXF1ZW5jeSwgcC5zdGF0ZXNbMF0uY29yZV9mcmVxdWVuY3kpOworCQkJcC5zdGF0ZXNbaV0uY29yZV9mcmVxdWVuY3kgPSAwOworCQkJY29udGludWU7CisJCX0KKwl9CisKKwljZW50cmlub19tb2RlbFtjcHVdID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNwdV9tb2RlbCksIEdGUF9LRVJORUwpOworCWlmICghY2VudHJpbm9fbW9kZWxbY3B1XSkgeworCQlyZXN1bHQgPSAtRU5PTUVNOworCQlnb3RvIGVycl91bnJlZzsKKwl9CisJbWVtc2V0KGNlbnRyaW5vX21vZGVsW2NwdV0sIDAsIHNpemVvZihzdHJ1Y3QgY3B1X21vZGVsKSk7CisKKwljZW50cmlub19tb2RlbFtjcHVdLT5tb2RlbF9uYW1lPU5VTEw7CisJY2VudHJpbm9fbW9kZWxbY3B1XS0+bWF4X2ZyZXEgPSBwLnN0YXRlc1swXS5jb3JlX2ZyZXF1ZW5jeSAqIDEwMDA7CisJY2VudHJpbm9fbW9kZWxbY3B1XS0+b3BfcG9pbnRzID0gIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSkgKgorCQkJCQkgICAgIChwLnN0YXRlX2NvdW50ICsgMSksIEdGUF9LRVJORUwpOworICAgICAgICBpZiAoIWNlbnRyaW5vX21vZGVsW2NwdV0tPm9wX3BvaW50cykgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgZ290byBlcnJfa2ZyZWU7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGk9MDsgaTxwLnN0YXRlX2NvdW50OyBpKyspIHsKKwkJY2VudHJpbm9fbW9kZWxbY3B1XS0+b3BfcG9pbnRzW2ldLmluZGV4ID0gcC5zdGF0ZXNbaV0uY29udHJvbDsKKwkJY2VudHJpbm9fbW9kZWxbY3B1XS0+b3BfcG9pbnRzW2ldLmZyZXF1ZW5jeSA9IHAuc3RhdGVzW2ldLmNvcmVfZnJlcXVlbmN5ICogMTAwMDsKKwkJZHByaW50aygiYWRkaW5nIHN0YXRlICVpIHdpdGggZnJlcXVlbmN5ICV1IGFuZCBjb250cm9sIHZhbHVlICUwNHhcbiIsIAorCQkJaSwgY2VudHJpbm9fbW9kZWxbY3B1XS0+b3BfcG9pbnRzW2ldLmZyZXF1ZW5jeSwgY2VudHJpbm9fbW9kZWxbY3B1XS0+b3BfcG9pbnRzW2ldLmluZGV4KTsKKwl9CisJY2VudHJpbm9fbW9kZWxbY3B1XS0+b3BfcG9pbnRzW3Auc3RhdGVfY291bnRdLmZyZXF1ZW5jeSA9IENQVUZSRVFfVEFCTEVfRU5EOworCisJY3VyX2ZyZXEgPSBnZXRfY3VyX2ZyZXEoY3B1KTsKKworCWZvciAoaT0wOyBpPHAuc3RhdGVfY291bnQ7IGkrKykgeworCQlpZiAoIXAuc3RhdGVzW2ldLmNvcmVfZnJlcXVlbmN5KSB7CisJCQlkcHJpbnRrKCJza2lwcGluZyBzdGF0ZSAldVxuIiwgaSk7CisJCQljZW50cmlub19tb2RlbFtjcHVdLT5vcF9wb2ludHNbaV0uZnJlcXVlbmN5ID0gQ1BVRlJFUV9FTlRSWV9JTlZBTElEOworCQkJY29udGludWU7CisJCX0KKwkJCisJCWlmIChleHRyYWN0X2Nsb2NrKGNlbnRyaW5vX21vZGVsW2NwdV0tPm9wX3BvaW50c1tpXS5pbmRleCwgY3B1LCAwKSAhPQorCQkgICAgKGNlbnRyaW5vX21vZGVsW2NwdV0tPm9wX3BvaW50c1tpXS5mcmVxdWVuY3kpKSB7CisJCQlkcHJpbnRrKCJJbnZhbGlkIGVuY29kZWQgZnJlcXVlbmN5ICgldSB2cy4gJXUpXG4iLAorCQkJCWV4dHJhY3RfY2xvY2soY2VudHJpbm9fbW9kZWxbY3B1XS0+b3BfcG9pbnRzW2ldLmluZGV4LCBjcHUsIDApLAorCQkJCWNlbnRyaW5vX21vZGVsW2NwdV0tPm9wX3BvaW50c1tpXS5mcmVxdWVuY3kpOworCQkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyX2tmcmVlX2FsbDsKKwkJfQorCisJCWlmIChjdXJfZnJlcSA9PSBjZW50cmlub19tb2RlbFtjcHVdLT5vcF9wb2ludHNbaV0uZnJlcXVlbmN5KQorCQkJcC5zdGF0ZSA9IGk7CisJfQorCisJLyogbm90aWZ5IEJJT1MgdGhhdCB3ZSBleGlzdCAqLworCWFjcGlfcHJvY2Vzc29yX25vdGlmeV9zbW0oVEhJU19NT0RVTEUpOworCisJcmV0dXJuIDA7CisKKyBlcnJfa2ZyZWVfYWxsOgorCWtmcmVlKGNlbnRyaW5vX21vZGVsW2NwdV0tPm9wX3BvaW50cyk7CisgZXJyX2tmcmVlOgorCWtmcmVlKGNlbnRyaW5vX21vZGVsW2NwdV0pOworIGVycl91bnJlZzoKKwlhY3BpX3Byb2Nlc3Nvcl91bnJlZ2lzdGVyX3BlcmZvcm1hbmNlKCZwLCBjcHUpOworCWRwcmludGsoS0VSTl9JTkZPIFBGWCAiaW52YWxpZCBBQ1BJIGRhdGFcbiIpOworCXJldHVybiAocmVzdWx0KTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBjZW50cmlub19jcHVfaW5pdF9hY3BpKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KSB7IHJldHVybiAtRU5PREVWOyB9CisjZW5kaWYKKworc3RhdGljIGludCBjZW50cmlub19jcHVfaW5pdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmNwdSA9ICZjcHVfZGF0YVtwb2xpY3ktPmNwdV07CisJdW5zaWduZWQgZnJlcTsKKwl1bnNpZ25lZCBsLCBoOworCWludCByZXQ7CisJaW50IGk7CisKKwkvKiBPbmx5IEludGVsIG1ha2VzIEVuaGFuY2VkIFNwZWVkc3RlcC1jYXBhYmxlIENQVXMgKi8KKwlpZiAoY3B1LT54ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1JfSU5URUwgfHwgIWNwdV9oYXMoY3B1LCBYODZfRkVBVFVSRV9FU1QpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWZvciAoaSA9IDA7IGkgPCBOX0lEUzsgaSsrKQorCQlpZiAoY2VudHJpbm9fdmVyaWZ5X2NwdV9pZChjcHUsICZjcHVfaWRzW2ldKSkKKwkJCWJyZWFrOworCisJaWYgKGkgIT0gTl9JRFMpCisJCWNlbnRyaW5vX2NwdVtwb2xpY3ktPmNwdV0gPSAmY3B1X2lkc1tpXTsKKworCWlmIChpc19jb25zdF9sb29wc19jcHUocG9saWN5LT5jcHUpKSB7CisJCWNlbnRyaW5vX2RyaXZlci5mbGFncyB8PSBDUFVGUkVRX0NPTlNUX0xPT1BTOworCX0KKworCWlmIChjZW50cmlub19jcHVfaW5pdF9hY3BpKHBvbGljeSkpIHsKKwkJaWYgKHBvbGljeS0+Y3B1ICE9IDApCisJCQlyZXR1cm4gLUVOT0RFVjsKKworCQlpZiAoIWNlbnRyaW5vX2NwdVtwb2xpY3ktPmNwdV0pIHsKKwkJCWRwcmludGsoS0VSTl9JTkZPIFBGWCAiZm91bmQgdW5zdXBwb3J0ZWQgQ1BVIHdpdGggIgorCQkJIkVuaGFuY2VkIFNwZWVkU3RlcDogc2VuZCAvcHJvYy9jcHVpbmZvIHRvICIKKwkJCU1BSU5UQUlORVIgIlxuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCisJCWlmIChjZW50cmlub19jcHVfaW5pdF90YWJsZShwb2xpY3kpKSB7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKworCS8qIENoZWNrIHRvIHNlZSBpZiBFbmhhbmNlZCBTcGVlZFN0ZXAgaXMgZW5hYmxlZCwgYW5kIHRyeSB0bworCSAgIGVuYWJsZSBpdCBpZiBub3QuICovCisJcmRtc3IoTVNSX0lBMzJfTUlTQ19FTkFCTEUsIGwsIGgpOworCisJaWYgKCEobCAmICgxPDwxNikpKSB7CisJCWwgfD0gKDE8PDE2KTsKKwkJZHByaW50aygidHJ5aW5nIHRvIGVuYWJsZSBFbmhhbmNlZCBTcGVlZFN0ZXAgKCV4KVxuIiwgbCk7CisJCXdybXNyKE1TUl9JQTMyX01JU0NfRU5BQkxFLCBsLCBoKTsKKworCQkvKiBjaGVjayB0byBzZWUgaWYgaXQgc3R1Y2sgKi8KKwkJcmRtc3IoTVNSX0lBMzJfTUlTQ19FTkFCTEUsIGwsIGgpOworCQlpZiAoIShsICYgKDE8PDE2KSkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJjb3VsZG4ndCBlbmFibGUgRW5oYW5jZWQgU3BlZWRTdGVwXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJZnJlcSA9IGdldF9jdXJfZnJlcShwb2xpY3ktPmNwdSk7CisKKwlwb2xpY3ktPmdvdmVybm9yID0gQ1BVRlJFUV9ERUZBVUxUX0dPVkVSTk9SOworCXBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kgPSAxMDAwMDsgLyogMTB1UyB0cmFuc2l0aW9uIGxhdGVuY3kgKi8KKwlwb2xpY3ktPmN1ciA9IGZyZXE7CisKKwlkcHJpbnRrKCJjZW50cmlub19jcHVfaW5pdDogY3VyPSVka0h6XG4iLCBwb2xpY3ktPmN1cik7CisKKwlyZXQgPSBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9jcHVpbmZvKHBvbGljeSwgY2VudHJpbm9fbW9kZWxbcG9saWN5LT5jcHVdLT5vcF9wb2ludHMpOworCWlmIChyZXQpCisJCXJldHVybiAocmV0KTsKKworCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2dldF9hdHRyKGNlbnRyaW5vX21vZGVsW3BvbGljeS0+Y3B1XS0+b3BfcG9pbnRzLCBwb2xpY3ktPmNwdSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjZW50cmlub19jcHVfZXhpdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwl1bnNpZ25lZCBpbnQgY3B1ID0gcG9saWN5LT5jcHU7CisKKwlpZiAoIWNlbnRyaW5vX21vZGVsW2NwdV0pCisJCXJldHVybiAtRU5PREVWOworCisJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfcHV0X2F0dHIoY3B1KTsKKworI2lmZGVmIENPTkZJR19YODZfU1BFRURTVEVQX0NFTlRSSU5PX0FDUEkKKwlpZiAoIWNlbnRyaW5vX21vZGVsW2NwdV0tPm1vZGVsX25hbWUpIHsKKwkJZHByaW50aygidW5yZWdpc3RlcmluZyBhbmQgZnJlZWluZyBBQ1BJIGRhdGFcbiIpOworCQlhY3BpX3Byb2Nlc3Nvcl91bnJlZ2lzdGVyX3BlcmZvcm1hbmNlKCZwLCBjcHUpOworCQlrZnJlZShjZW50cmlub19tb2RlbFtjcHVdLT5vcF9wb2ludHMpOworCQlrZnJlZShjZW50cmlub19tb2RlbFtjcHVdKTsKKwl9CisjZW5kaWYKKworCWNlbnRyaW5vX21vZGVsW2NwdV0gPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY2VudHJpbm9fdmVyaWZ5IC0gdmVyaWZpZXMgYSBuZXcgQ1BVRnJlcSBwb2xpY3kKKyAqIEBwb2xpY3k6IG5ldyBwb2xpY3kKKyAqCisgKiBMaW1pdCBtdXN0IGJlIHdpdGhpbiB0aGlzIG1vZGVsJ3MgZnJlcXVlbmN5IHJhbmdlIGF0IGxlYXN0IG9uZQorICogYm9yZGVyIGluY2x1ZGVkLgorICovCitzdGF0aWMgaW50IGNlbnRyaW5vX3ZlcmlmeSAoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3ZlcmlmeShwb2xpY3ksIGNlbnRyaW5vX21vZGVsW3BvbGljeS0+Y3B1XS0+b3BfcG9pbnRzKTsKK30KKworLyoqCisgKiBjZW50cmlub19zZXRwb2xpY3kgLSBzZXQgYSBuZXcgQ1BVRnJlcSBwb2xpY3kKKyAqIEBwb2xpY3k6IG5ldyBwb2xpY3kKKyAqIEB0YXJnZXRfZnJlcTogdGhlIHRhcmdldCBmcmVxdWVuY3kKKyAqIEByZWxhdGlvbjogaG93IHRoYXQgZnJlcXVlbmN5IHJlbGF0ZXMgdG8gYWNoaWV2ZWQgZnJlcXVlbmN5IChDUFVGUkVRX1JFTEFUSU9OX0wgb3IgQ1BVRlJFUV9SRUxBVElPTl9IKQorICoKKyAqIFNldHMgYSBuZXcgQ1BVRnJlcSBwb2xpY3kuCisgKi8KK3N0YXRpYyBpbnQgY2VudHJpbm9fdGFyZ2V0IChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgdGFyZ2V0X2ZyZXEsCisJCQkgICAgdW5zaWduZWQgaW50IHJlbGF0aW9uKQoreworCXVuc2lnbmVkIGludCAgICBuZXdzdGF0ZSA9IDA7CisJdW5zaWduZWQgaW50CW1zciwgb2xkbXNyLCBoLCBjcHUgPSBwb2xpY3ktPmNwdTsKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcwlmcmVxczsKKwljcHVtYXNrX3QJCXNhdmVkX21hc2s7CisJaW50CQkJcmV0dmFsOworCisJaWYgKGNlbnRyaW5vX21vZGVsW2NwdV0gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKgorCSAqIFN1cHBvcnQgZm9yIFNNUCBzeXN0ZW1zLgorCSAqIE1ha2Ugc3VyZSB3ZSBhcmUgcnVubmluZyBvbiB0aGUgQ1BVIHRoYXQgd2FudHMgdG8gY2hhbmdlIGZyZXF1ZW5jeQorCSAqLworCXNhdmVkX21hc2sgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBwb2xpY3ktPmNwdXMpOworCWlmICghY3B1X2lzc2V0KHNtcF9wcm9jZXNzb3JfaWQoKSwgcG9saWN5LT5jcHVzKSkgeworCQlkcHJpbnRrKCJjb3VsZG4ndCBsaW1pdCB0byBDUFVzIGluIHRoaXMgZG9tYWluXG4iKTsKKwkJcmV0dXJuKC1FQUdBSU4pOworCX0KKworCWlmIChjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQocG9saWN5LCBjZW50cmlub19tb2RlbFtjcHVdLT5vcF9wb2ludHMsIHRhcmdldF9mcmVxLAorCQkJCQkgICByZWxhdGlvbiwgJm5ld3N0YXRlKSkgeworCQlyZXR2YWwgPSAtRUlOVkFMOworCQlnb3RvIG1pZ3JhdGVfZW5kOworCX0KKworCW1zciA9IGNlbnRyaW5vX21vZGVsW2NwdV0tPm9wX3BvaW50c1tuZXdzdGF0ZV0uaW5kZXg7CisJcmRtc3IoTVNSX0lBMzJfUEVSRl9DVEwsIG9sZG1zciwgaCk7CisKKwlpZiAobXNyID09IChvbGRtc3IgJiAweGZmZmYpKSB7CisJCXJldHZhbCA9IDA7CisJCWRwcmludGsoIm5vIGNoYW5nZSBuZWVkZWQgLSBtc3Igd2FzIGFuZCBuZWVkcyB0byBiZSAleFxuIiwgb2xkbXNyKTsKKwkJZ290byBtaWdyYXRlX2VuZDsKKwl9CisKKwlmcmVxcy5jcHUgPSBjcHU7CisJZnJlcXMub2xkID0gZXh0cmFjdF9jbG9jayhvbGRtc3IsIGNwdSwgMCk7CisJZnJlcXMubmV3ID0gZXh0cmFjdF9jbG9jayhtc3IsIGNwdSwgMCk7CisKKwlkcHJpbnRrKCJ0YXJnZXQ9JWRrSHogb2xkPSVkIG5ldz0lZCBtc3I9JTA0eFxuIiwKKwkJdGFyZ2V0X2ZyZXEsIGZyZXFzLm9sZCwgZnJlcXMubmV3LCBtc3IpOworCisJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUFJFQ0hBTkdFKTsKKworCS8qIGFsbCBidXQgMTYgTFNCIGFyZSAicmVzZXJ2ZWQiLCBzbyB0cmVhdCB0aGVtIHdpdGgKKwkgICBjYXJlICovCisJb2xkbXNyICY9IH4weGZmZmY7CisJbXNyICY9IDB4ZmZmZjsKKwlvbGRtc3IgfD0gbXNyOworCisJd3Jtc3IoTVNSX0lBMzJfUEVSRl9DVEwsIG9sZG1zciwgaCk7CisKKwljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QT1NUQ0hBTkdFKTsKKworCXJldHZhbCA9IDA7CittaWdyYXRlX2VuZDoKKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIHNhdmVkX21hc2spOworCXJldHVybiAocmV0dmFsKTsKK30KKworc3RhdGljIHN0cnVjdCBmcmVxX2F0dHIqIGNlbnRyaW5vX2F0dHJbXSA9IHsKKwkmY3B1ZnJlcV9mcmVxX2F0dHJfc2NhbGluZ19hdmFpbGFibGVfZnJlcXMsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIgY2VudHJpbm9fZHJpdmVyID0geworCS5uYW1lCQk9ICJjZW50cmlubyIsIC8qIHNob3VsZCBiZSBzcGVlZHN0ZXAtY2VudHJpbm8sCisJCQkJCSBidXQgdGhlcmUncyBhIDE2IGNoYXIgbGltaXQgKi8KKwkuaW5pdAkJPSBjZW50cmlub19jcHVfaW5pdCwKKwkuZXhpdAkJPSBjZW50cmlub19jcHVfZXhpdCwKKwkudmVyaWZ5CQk9IGNlbnRyaW5vX3ZlcmlmeSwKKwkudGFyZ2V0CQk9IGNlbnRyaW5vX3RhcmdldCwKKwkuZ2V0CQk9IGdldF9jdXJfZnJlcSwKKwkuYXR0ciAgICAgICAgICAgPSBjZW50cmlub19hdHRyLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKKworLyoqCisgKiBjZW50cmlub19pbml0IC0gaW5pdGlhbGl6ZXMgdGhlIEVuaGFuY2VkIFNwZWVkU3RlcCBDUFVGcmVxIGRyaXZlcgorICoKKyAqIEluaXRpYWxpemVzIHRoZSBFbmhhbmNlZCBTcGVlZFN0ZXAgc3VwcG9ydC4gUmV0dXJucyAtRU5PREVWIG9uCisgKiB1bnN1cHBvcnRlZCBkZXZpY2VzLCAtRU5PRU5UIGlmIHRoZXJlJ3Mgbm8gdm9sdGFnZSB0YWJsZSBmb3IgdGhpcworICogcGFydGljdWxhciBDUFUgbW9kZWwsIC1FSU5WQUwgb24gcHJvYmxlbXMgZHVyaW5nIGluaXRpYXRpemF0aW9uLAorICogYW5kIHplcm8gb24gc3VjY2Vzcy4KKyAqCisgKiBUaGlzIGlzIHF1aXRlIHBpY2t5LiAgTm90IG9ubHkgZG9lcyB0aGUgQ1BVIGhhdmUgdG8gYWR2ZXJ0aXNlIHRoZQorICogImVzdCIgZmxhZyBpbiB0aGUgY3B1aWQgY2FwYWJpbGl0eSBmbGFncywgd2UgbG9vayBmb3IgYSBzcGVjaWZpYworICogQ1BVIG1vZGVsIGFuZCBzdGVwcGluZywgYW5kIHdlIG5lZWQgdG8gaGF2ZSB0aGUgZXhhY3QgbW9kZWwgbmFtZSBpbgorICogb3VyIHZvbHRhZ2UgdGFibGVzLiAgVGhhdCBpcywgYmUgcGFyYW5vaWQgYWJvdXQgbm90IHJlbGVhc2luZworICogc29tZW9uZSdzIHZhbHVhYmxlIG1hZ2ljIHNtb2tlLgorICovCitzdGF0aWMgaW50IF9faW5pdCBjZW50cmlub19pbml0KHZvaWQpCit7CisJc3RydWN0IGNwdWluZm9feDg2ICpjcHUgPSBjcHVfZGF0YTsKKworCWlmICghY3B1X2hhcyhjcHUsIFg4Nl9GRUFUVVJFX0VTVCkpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIGNwdWZyZXFfcmVnaXN0ZXJfZHJpdmVyKCZjZW50cmlub19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2VudHJpbm9fZXhpdCh2b2lkKQoreworCWNwdWZyZXFfdW5yZWdpc3Rlcl9kcml2ZXIoJmNlbnRyaW5vX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IgKCJKZXJlbXkgRml0emhhcmRpbmdlIDxqZXJlbXlAZ29vcC5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04gKCJFbmhhbmNlZCBTcGVlZFN0ZXAgZHJpdmVyIGZvciBJbnRlbCBQZW50aXVtIE0gcHJvY2Vzc29ycy4iKTsKK01PRFVMRV9MSUNFTlNFICgiR1BMIik7CisKK2xhdGVfaW5pdGNhbGwoY2VudHJpbm9faW5pdCk7Cittb2R1bGVfZXhpdChjZW50cmlub19leGl0KTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWVzdC1jb21tb24uaCBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWVzdC1jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2U5OTVjOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWVzdC1jb21tb24uaApAQCAtMCwwICsxLDI1IEBACisvKgorICogUm91dGluZXMgY29tbW9uIGZvciBkcml2ZXJzIGhhbmRsaW5nIEVuaGFuY2VkIFNwZWVkc3RlcCBUZWNobm9sb2d5CisgKiAgQ29weXJpZ2h0IChDKSAyMDA0IFZlbmthdGVzaCBQYWxsaXBhZGkgPHZlbmthdGVzaC5wYWxsaXBhZGlAaW50ZWwuY29tPgorICoKKyAqICBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgTGljZW5zZSB2ZXJzaW9uIDIgLS0gc2VlCisgKiAgQ09QWUlORyBmb3IgZGV0YWlscy4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCBpc19jb25zdF9sb29wc19jcHUodW5zaWduZWQgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgY3B1aW5mb194ODYgCSpjID0gY3B1X2RhdGEgKyBjcHU7CisKKwlpZiAoYy0+eDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0lOVEVMIHx8ICFjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX0VTVCkpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBvbiBQLTRzLCB0aGUgVFNDIHJ1bnMgd2l0aCBjb25zdGFudCBmcmVxdWVuY3kgaW5kZXBlbmRlbnQgb2YgY3B1IGZyZXEKKwkgKiB3aGVuIHdlIHVzZSBFU1QKKwkgKi8KKwlpZiAoYy0+eDg2ID09IDB4ZikKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtaWNoLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1pY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjdkMThhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtaWNoLmMKQEAgLTAsMCArMSw0MjQgQEAKKy8qCisgKiAoQykgMjAwMSAgRGF2ZSBKb25lcywgQXJqYW4gdmFuIGRlIHZlbi4KKyAqIChDKSAyMDAyIC0gMjAwMyAgRG9taW5payBCcm9kb3dza2kgPGxpbnV4QGJyb2RvLmRlPgorICoKKyAqICBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgTGljZW5zZSB2ZXJzaW9uIDIuCisgKiAgQmFzZWQgdXBvbiByZXZlcnNlIGVuZ2luZWVyZWQgaW5mb3JtYXRpb24sIGFuZCBvbiBJbnRlbCBkb2N1bWVudGF0aW9uCisgKiAgZm9yIGNoaXBzZXRzIElDSDItTSBhbmQgSUNIMy1NLgorICoKKyAqICBNYW55IHRoYW5rcyB0byBEdWNyb3QgQnJ1bm8gZm9yIGZpbmRpbmcgYW5kIGZpeGluZyB0aGUgbGFzdAorICogICJtaXNzaW5nIGxpbmsiIGZvciBJQ0gyLU0vSUNIMy1NIHN1cHBvcnQsIGFuZCB0byBUaG9tYXMgV2lua2xlcgorICogIGZvciBleHRlbnNpdmUgdGVzdGluZy4KKyAqCisgKiAgQklHIEZBVCBESVNDTEFJTUVSOiBXb3JrIGluIHByb2dyZXNzIGNvZGUuIFBvc3NpYmx5ICpkYW5nZXJvdXMqCisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgIFNQRUVEU1RFUCAtIERFRklOSVRJT05TICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJzcGVlZHN0ZXAtbGliLmgiCisKKworLyogc3BlZWRzdGVwX2NoaXBzZXQ6CisgKiAgIEl0IGlzIG5lY2Vzc2FyeSB0byBrbm93IHdoaWNoIGNoaXBzZXQgaXMgdXNlZC4gQXMgYWNjZXNzZXMgdG8KKyAqIHRoaXMgZGV2aWNlIG9jY3VyIGF0IHZhcmlvdXMgcGxhY2VzIGluIHRoaXMgbW9kdWxlLCB3ZSBuZWVkIGEKKyAqIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldiAqIHBvaW50aW5nIHRvIHRoYXQgZGV2aWNlLgorICovCitzdGF0aWMgc3RydWN0IHBjaV9kZXYgKnNwZWVkc3RlcF9jaGlwc2V0X2RldjsKKworCisvKiBzcGVlZHN0ZXBfcHJvY2Vzc29yCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3BlZWRzdGVwX3Byb2Nlc3NvciA9IDA7CisKKworLyoKKyAqICAgVGhlcmUgYXJlIG9ubHkgdHdvIGZyZXF1ZW5jeSBzdGF0ZXMgZm9yIGVhY2ggcHJvY2Vzc29yLiBWYWx1ZXMKKyAqIGFyZSBpbiBrSHogZm9yIHRoZSB0aW1lIGJlaW5nLgorICovCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlIHNwZWVkc3RlcF9mcmVxc1tdID0geworCXtTUEVFRFNURVBfSElHSCwJMH0sCisJe1NQRUVEU1RFUF9MT1csCQkwfSwKKwl7MCwJCQlDUFVGUkVRX1RBQkxFX0VORH0sCit9OworCisKKyNkZWZpbmUgZHByaW50ayhtc2cuLi4pIGNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfRFJJVkVSLCAic3BlZWRzdGVwLWljaCIsIG1zZykKKworCisvKioKKyAqIHNwZWVkc3RlcF9zZXRfc3RhdGUgLSBzZXQgdGhlIFNwZWVkU3RlcCBzdGF0ZQorICogQHN0YXRlOiBuZXcgcHJvY2Vzc29yIGZyZXF1ZW5jeSBzdGF0ZSAoU1BFRURTVEVQX0xPVyBvciBTUEVFRFNURVBfSElHSCkKKyAqCisgKiAgIFRyaWVzIHRvIGNoYW5nZSB0aGUgU3BlZWRTdGVwIHN0YXRlLgorICovCitzdGF0aWMgdm9pZCBzcGVlZHN0ZXBfc2V0X3N0YXRlICh1bnNpZ25lZCBpbnQgc3RhdGUpCit7CisJdTMyIHBtYmFzZTsKKwl1OCBwbTJfYmxrOworCXU4IHZhbHVlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIXNwZWVkc3RlcF9jaGlwc2V0X2RldiB8fCAoc3RhdGUgPiAweDEpKQorCQlyZXR1cm47CisKKwkvKiBnZXQgUE1CQVNFICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNwZWVkc3RlcF9jaGlwc2V0X2RldiwgMHg0MCwgJnBtYmFzZSk7CisJaWYgKCEocG1iYXNlICYgMHgwMSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzcGVlZHN0ZXAtaWNoOiBjb3VsZCBub3QgZmluZCBzcGVlZHN0ZXAgcmVnaXN0ZXJcbiIpOworCQlyZXR1cm47CisJfQorCisJcG1iYXNlICY9IDB4RkZGRkZGRkU7CisJaWYgKCFwbWJhc2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzcGVlZHN0ZXAtaWNoOiBjb3VsZCBub3QgZmluZCBzcGVlZHN0ZXAgcmVnaXN0ZXJcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogRGlzYWJsZSBJUlFzICovCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJLyogcmVhZCBzdGF0ZSAqLworCXZhbHVlID0gaW5iKHBtYmFzZSArIDB4NTApOworCisJZHByaW50aygicmVhZCBhdCBwbWJhc2UgMHgleCArIDB4NTAgcmV0dXJuZWQgMHgleFxuIiwgcG1iYXNlLCB2YWx1ZSk7CisKKwkvKiB3cml0ZSBuZXcgc3RhdGUgKi8KKwl2YWx1ZSAmPSAweEZFOworCXZhbHVlIHw9IHN0YXRlOworCisJZHByaW50aygid3JpdGluZyAweCV4IHRvIHBtYmFzZSAweCV4ICsgMHg1MFxuIiwgdmFsdWUsIHBtYmFzZSk7CisKKwkvKiBEaXNhYmxlIGJ1cyBtYXN0ZXIgYXJiaXRyYXRpb24gKi8KKwlwbTJfYmxrID0gaW5iKHBtYmFzZSArIDB4MjApOworCXBtMl9ibGsgfD0gMHgwMTsKKwlvdXRiKHBtMl9ibGssIChwbWJhc2UgKyAweDIwKSk7CisKKwkvKiBBY3R1YWwgdHJhbnNpdGlvbiAqLworCW91dGIodmFsdWUsIChwbWJhc2UgKyAweDUwKSk7CisKKwkvKiBSZXN0b3JlIGJ1cyBtYXN0ZXIgYXJiaXRyYXRpb24gKi8KKwlwbTJfYmxrICY9IDB4ZmU7CisJb3V0YihwbTJfYmxrLCAocG1iYXNlICsgMHgyMCkpOworCisJLyogY2hlY2sgaWYgdHJhbnNpdGlvbiB3YXMgc3VjY2Vzc2Z1bCAqLworCXZhbHVlID0gaW5iKHBtYmFzZSArIDB4NTApOworCisJLyogRW5hYmxlIElSUXMgKi8KKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlkcHJpbnRrKCJyZWFkIGF0IHBtYmFzZSAweCV4ICsgMHg1MCByZXR1cm5lZCAweCV4XG4iLCBwbWJhc2UsIHZhbHVlKTsKKworCWlmIChzdGF0ZSA9PSAodmFsdWUgJiAweDEpKSB7CisJCWRwcmludGsoImNoYW5nZSB0byAldSBNSHogc3VjY2VlZGVkXG4iLCAoc3BlZWRzdGVwX2dldF9wcm9jZXNzb3JfZnJlcXVlbmN5KHNwZWVkc3RlcF9wcm9jZXNzb3IpIC8gMTAwMCkpOworCX0gZWxzZSB7CisJCXByaW50ayAoS0VSTl9FUlIgImNwdWZyZXE6IGNoYW5nZSBmYWlsZWQgLSBJL08gZXJyb3JcbiIpOworCX0KKworCXJldHVybjsKK30KKworCisvKioKKyAqIHNwZWVkc3RlcF9hY3RpdmF0ZSAtIGFjdGl2YXRlIFNwZWVkU3RlcCBjb250cm9sIGluIHRoZSBjaGlwc2V0CisgKgorICogICBUcmllcyB0byBhY3RpdmF0ZSB0aGUgU3BlZWRTdGVwIHN0YXR1cyBhbmQgY29udHJvbCByZWdpc3RlcnMuCisgKiBSZXR1cm5zIC1FSU5WQUwgb24gYW4gdW5zdXBwb3J0ZWQgY2hpcHNldCwgYW5kIHplcm8gb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGludCBzcGVlZHN0ZXBfYWN0aXZhdGUgKHZvaWQpCit7CisJdTE2IHZhbHVlID0gMDsKKworCWlmICghc3BlZWRzdGVwX2NoaXBzZXRfZGV2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHNwZWVkc3RlcF9jaGlwc2V0X2RldiwgMHgwMEEwLCAmdmFsdWUpOworCWlmICghKHZhbHVlICYgMHgwOCkpIHsKKwkJdmFsdWUgfD0gMHgwODsKKwkJZHByaW50aygiYWN0aXZhdGluZyBTcGVlZFN0ZXAgKFRNKSByZWdpc3RlcnNcbiIpOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoc3BlZWRzdGVwX2NoaXBzZXRfZGV2LCAweDAwQTAsIHZhbHVlKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIHNwZWVkc3RlcF9kZXRlY3RfY2hpcHNldCAtIGRldGVjdCB0aGUgU291dGhicmlkZ2Ugd2hpY2ggY29udGFpbnMgU3BlZWRTdGVwIGxvZ2ljCisgKgorICogICBEZXRlY3RzIElDSDItTSwgSUNIMy1NIGFuZCBJQ0g0LU0gc28gZmFyLiBUaGUgcGNpX2RldiBwb2ludHMgdG8KKyAqIHRoZSBMUEMgYnJpZGdlIC8gUE0gbW9kdWxlIHdoaWNoIGNvbnRhaW5zIGFsbCBwb3dlci1tYW5hZ2VtZW50CisgKiBmdW5jdGlvbnMuIFJldHVybnMgdGhlIFNQRUVEU1RFUF9DSElQU0VUXy1udW1iZXIgZm9yIHRoZSBkZXRlY3RlZAorICogY2hpcHNldCwgb3IgemVybyBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHNwZWVkc3RlcF9kZXRlY3RfY2hpcHNldCAodm9pZCkKK3sKKwlzcGVlZHN0ZXBfY2hpcHNldF9kZXYgPSBwY2lfZ2V0X3N1YnN5cyhQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQkJICAgICAgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMURCXzEyLAorCQkJICAgICAgUENJX0FOWV9JRCwKKwkJCSAgICAgIFBDSV9BTllfSUQsCisJCQkgICAgICBOVUxMKTsKKwlpZiAoc3BlZWRzdGVwX2NoaXBzZXRfZGV2KQorCQlyZXR1cm4gNDsgLyogNC1NICovCisKKwlzcGVlZHN0ZXBfY2hpcHNldF9kZXYgPSBwY2lfZ2V0X3N1YnN5cyhQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQkJICAgICAgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUNBXzEyLAorCQkJICAgICAgUENJX0FOWV9JRCwKKwkJCSAgICAgIFBDSV9BTllfSUQsCisJCQkgICAgICBOVUxMKTsKKwlpZiAoc3BlZWRzdGVwX2NoaXBzZXRfZGV2KQorCQlyZXR1cm4gMzsgLyogMy1NICovCisKKworCXNwZWVkc3RlcF9jaGlwc2V0X2RldiA9IHBjaV9nZXRfc3Vic3lzKFBDSV9WRU5ET1JfSURfSU5URUwsCisJCQkgICAgICBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQkFfMTAsCisJCQkgICAgICBQQ0lfQU5ZX0lELAorCQkJICAgICAgUENJX0FOWV9JRCwKKwkJCSAgICAgIE5VTEwpOworCWlmIChzcGVlZHN0ZXBfY2hpcHNldF9kZXYpIHsKKwkJLyogc3BlZWRzdGVwLmMgY2F1c2VzIGxvY2t1cHMgb24gRGVsbCBJbnNwaXJvbnMgODAwMCBhbmQKKwkJICogODEwMCB3aGljaCB1c2UgYSBwcmV0dHkgb2xkIHJldmlzaW9uIG9mIHRoZSA4MjgxNQorCQkgKiBob3N0IGJyaWdlLiBBYm9ydCBvbiB0aGVzZSBzeXN0ZW1zLgorCQkgKi8KKwkJc3RhdGljIHN0cnVjdCBwY2lfZGV2ICpob3N0YnJpZGdlOworCQl1OCByZXYgPSAwOworCisJCWhvc3RicmlkZ2UgID0gcGNpX2dldF9zdWJzeXMoUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJCSAgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MTVfTUMsCisJCQkgICAgICBQQ0lfQU5ZX0lELAorCQkJICAgICAgUENJX0FOWV9JRCwKKwkJCSAgICAgIE5VTEwpOworCisJCWlmICghaG9zdGJyaWRnZSkKKwkJCXJldHVybiAyOyAvKiAyLU0gKi8KKworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShob3N0YnJpZGdlLCBQQ0lfUkVWSVNJT05fSUQsICZyZXYpOworCQlpZiAocmV2IDwgNSkgeworCQkJZHByaW50aygiaG9zdGJyaWRnZSBkb2VzIG5vdCBzdXBwb3J0IHNwZWVkc3RlcFxuIik7CisJCQlzcGVlZHN0ZXBfY2hpcHNldF9kZXYgPSBOVUxMOworCQkJcGNpX2Rldl9wdXQoaG9zdGJyaWRnZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXBjaV9kZXZfcHV0KGhvc3RicmlkZ2UpOworCQlyZXR1cm4gMjsgLyogMi1NICovCisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX3NwZWVkc3RlcF9nZXQoY3B1bWFza190IGNwdXMpCit7CisJdW5zaWduZWQgaW50IHNwZWVkOworCWNwdW1hc2tfdCBjcHVzX2FsbG93ZWQ7CisKKwljcHVzX2FsbG93ZWQgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjcHVzKTsKKwlzcGVlZCA9IHNwZWVkc3RlcF9nZXRfcHJvY2Vzc29yX2ZyZXF1ZW5jeShzcGVlZHN0ZXBfcHJvY2Vzc29yKTsKKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIGNwdXNfYWxsb3dlZCk7CisJZHByaW50aygiZGV0ZWN0ZWQgJXUga0h6IGFzIGN1cnJlbnQgZnJlcXVlbmN5XG4iLCBzcGVlZCk7CisJcmV0dXJuIHNwZWVkOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHNwZWVkc3RlcF9nZXQodW5zaWduZWQgaW50IGNwdSkKK3sKKwlyZXR1cm4gX3NwZWVkc3RlcF9nZXQoY3B1bWFza19vZl9jcHUoY3B1KSk7Cit9CisKKy8qKgorICogc3BlZWRzdGVwX3RhcmdldCAtIHNldCBhIG5ldyBDUFVGcmVxIHBvbGljeQorICogQHBvbGljeTogbmV3IHBvbGljeQorICogQHRhcmdldF9mcmVxOiB0aGUgdGFyZ2V0IGZyZXF1ZW5jeQorICogQHJlbGF0aW9uOiBob3cgdGhhdCBmcmVxdWVuY3kgcmVsYXRlcyB0byBhY2hpZXZlZCBmcmVxdWVuY3kgKENQVUZSRVFfUkVMQVRJT05fTCBvciBDUFVGUkVRX1JFTEFUSU9OX0gpCisgKgorICogU2V0cyBhIG5ldyBDUFVGcmVxIHBvbGljeS4KKyAqLworc3RhdGljIGludCBzcGVlZHN0ZXBfdGFyZ2V0IChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKKwkJCSAgICAgdW5zaWduZWQgaW50IHRhcmdldF9mcmVxLAorCQkJICAgICB1bnNpZ25lZCBpbnQgcmVsYXRpb24pCit7CisJdW5zaWduZWQgaW50IG5ld3N0YXRlID0gMDsKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyBmcmVxczsKKwljcHVtYXNrX3QgY3B1c19hbGxvd2VkOworCWludCBpOworCisJaWYgKGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3RhcmdldChwb2xpY3ksICZzcGVlZHN0ZXBfZnJlcXNbMF0sIHRhcmdldF9mcmVxLCByZWxhdGlvbiwgJm5ld3N0YXRlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmcmVxcy5vbGQgPSBfc3BlZWRzdGVwX2dldChwb2xpY3ktPmNwdXMpOworCWZyZXFzLm5ldyA9IHNwZWVkc3RlcF9mcmVxc1tuZXdzdGF0ZV0uZnJlcXVlbmN5OworCWZyZXFzLmNwdSA9IHBvbGljeS0+Y3B1OworCisJZHByaW50aygidHJhbnNpdGluZyBmcm9tICV1IHRvICV1IGtIelxuIiwgZnJlcXMub2xkLCBmcmVxcy5uZXcpOworCisJLyogbm8gdHJhbnNpdGlvbiBuZWNlc3NhcnkgKi8KKwlpZiAoZnJlcXMub2xkID09IGZyZXFzLm5ldykKKwkJcmV0dXJuIDA7CisKKwljcHVzX2FsbG93ZWQgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CisKKwlmb3JfZWFjaF9jcHVfbWFzayhpLCBwb2xpY3ktPmNwdXMpIHsKKwkJZnJlcXMuY3B1ID0gaTsKKwkJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUFJFQ0hBTkdFKTsKKwl9CisKKwkvKiBzd2l0Y2ggdG8gcGh5c2ljYWwgQ1BVIHdoZXJlIHN0YXRlIGlzIHRvIGJlIGNoYW5nZWQgKi8KKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIHBvbGljeS0+Y3B1cyk7CisKKwlzcGVlZHN0ZXBfc2V0X3N0YXRlKG5ld3N0YXRlKTsKKworCS8qIGFsbG93IHRvIGJlIHJ1biBvbiBhbGwgQ1BVcyAqLworCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgY3B1c19hbGxvd2VkKTsKKworCWZvcl9lYWNoX2NwdV9tYXNrKGksIHBvbGljeS0+Y3B1cykgeworCQlmcmVxcy5jcHUgPSBpOworCQljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QT1NUQ0hBTkdFKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIHNwZWVkc3RlcF92ZXJpZnkgLSB2ZXJpZmllcyBhIG5ldyBDUFVGcmVxIHBvbGljeQorICogQHBvbGljeTogbmV3IHBvbGljeQorICoKKyAqIExpbWl0IG11c3QgYmUgd2l0aGluIHNwZWVkc3RlcF9sb3dfZnJlcSBhbmQgc3BlZWRzdGVwX2hpZ2hfZnJlcSwgd2l0aAorICogYXQgbGVhc3Qgb25lIGJvcmRlciBpbmNsdWRlZC4KKyAqLworc3RhdGljIGludCBzcGVlZHN0ZXBfdmVyaWZ5IChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwlyZXR1cm4gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdmVyaWZ5KHBvbGljeSwgJnNwZWVkc3RlcF9mcmVxc1swXSk7Cit9CisKKworc3RhdGljIGludCBzcGVlZHN0ZXBfY3B1X2luaXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJaW50IHJlc3VsdCA9IDA7CisJdW5zaWduZWQgaW50IHNwZWVkOworCWNwdW1hc2tfdCBjcHVzX2FsbG93ZWQ7CisKKwkvKiBvbmx5IHJ1biBvbiBDUFUgdG8gYmUgc2V0LCBvciBvbiBpdHMgc2libGluZyAqLworI2lmZGVmIENPTkZJR19TTVAKKwlwb2xpY3ktPmNwdXMgPSBjcHVfc2libGluZ19tYXBbcG9saWN5LT5jcHVdOworI2VuZGlmCisKKwljcHVzX2FsbG93ZWQgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBwb2xpY3ktPmNwdXMpOworCisJLyogZGV0ZWN0IGxvdyBhbmQgaGlnaCBmcmVxdWVuY3kgKi8KKwlyZXN1bHQgPSBzcGVlZHN0ZXBfZ2V0X2ZyZXFzKHNwZWVkc3RlcF9wcm9jZXNzb3IsCisJCQkJICAgICAmc3BlZWRzdGVwX2ZyZXFzW1NQRUVEU1RFUF9MT1ddLmZyZXF1ZW5jeSwKKwkJCQkgICAgICZzcGVlZHN0ZXBfZnJlcXNbU1BFRURTVEVQX0hJR0hdLmZyZXF1ZW5jeSwKKwkJCQkgICAgICZzcGVlZHN0ZXBfc2V0X3N0YXRlKTsKKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIGNwdXNfYWxsb3dlZCk7CisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCS8qIGdldCBjdXJyZW50IHNwZWVkIHNldHRpbmcgKi8KKwlzcGVlZCA9IF9zcGVlZHN0ZXBfZ2V0KHBvbGljeS0+Y3B1cyk7CisJaWYgKCFzcGVlZCkKKwkJcmV0dXJuIC1FSU87CisKKwlkcHJpbnRrKCJjdXJyZW50bHkgYXQgJXMgc3BlZWQgc2V0dGluZyAtICVpIE1IelxuIiwKKwkJKHNwZWVkID09IHNwZWVkc3RlcF9mcmVxc1tTUEVFRFNURVBfTE9XXS5mcmVxdWVuY3kpID8gImxvdyIgOiAiaGlnaCIsCisJCShzcGVlZCAvIDEwMDApKTsKKworCS8qIGNwdWluZm8gYW5kIGRlZmF1bHQgcG9saWN5IHZhbHVlcyAqLworCXBvbGljeS0+Z292ZXJub3IgPSBDUFVGUkVRX0RFRkFVTFRfR09WRVJOT1I7CisJcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9IENQVUZSRVFfRVRFUk5BTDsKKwlwb2xpY3ktPmN1ciA9IHNwZWVkOworCisJcmVzdWx0ID0gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfY3B1aW5mbyhwb2xpY3ksIHNwZWVkc3RlcF9mcmVxcyk7CisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIChyZXN1bHQpOworCisgICAgICAgIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2dldF9hdHRyKHNwZWVkc3RlcF9mcmVxcywgcG9saWN5LT5jcHUpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBzcGVlZHN0ZXBfY3B1X2V4aXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfcHV0X2F0dHIocG9saWN5LT5jcHUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZyZXFfYXR0ciogc3BlZWRzdGVwX2F0dHJbXSA9IHsKKwkmY3B1ZnJlcV9mcmVxX2F0dHJfc2NhbGluZ19hdmFpbGFibGVfZnJlcXMsCisJTlVMTCwKK307CisKKworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBzcGVlZHN0ZXBfZHJpdmVyID0geworCS5uYW1lCT0gInNwZWVkc3RlcC1pY2giLAorCS52ZXJpZnkJPSBzcGVlZHN0ZXBfdmVyaWZ5LAorCS50YXJnZXQJPSBzcGVlZHN0ZXBfdGFyZ2V0LAorCS5pbml0CT0gc3BlZWRzdGVwX2NwdV9pbml0LAorCS5leGl0CT0gc3BlZWRzdGVwX2NwdV9leGl0LAorCS5nZXQJPSBzcGVlZHN0ZXBfZ2V0LAorCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCS5hdHRyCT0gc3BlZWRzdGVwX2F0dHIsCit9OworCisKKy8qKgorICogc3BlZWRzdGVwX2luaXQgLSBpbml0aWFsaXplcyB0aGUgU3BlZWRTdGVwIENQVUZyZXEgZHJpdmVyCisgKgorICogICBJbml0aWFsaXplcyB0aGUgU3BlZWRTdGVwIHN1cHBvcnQuIFJldHVybnMgLUVOT0RFViBvbiB1bnN1cHBvcnRlZAorICogZGV2aWNlcywgLUVJTlZBTCBvbiBwcm9ibGVtcyBkdXJpbmcgaW5pdGlhdGl6YXRpb24sIGFuZCB6ZXJvIG9uCisgKiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50IF9faW5pdCBzcGVlZHN0ZXBfaW5pdCh2b2lkKQoreworCS8qIGRldGVjdCBwcm9jZXNzb3IgKi8KKwlzcGVlZHN0ZXBfcHJvY2Vzc29yID0gc3BlZWRzdGVwX2RldGVjdF9wcm9jZXNzb3IoKTsKKwlpZiAoIXNwZWVkc3RlcF9wcm9jZXNzb3IpIHsKKwkJZHByaW50aygiSW50ZWwoUikgU3BlZWRTdGVwKFRNKSBjYXBhYmxlIHByb2Nlc3NvciBub3QgZm91bmRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBkZXRlY3QgY2hpcHNldCAqLworCWlmICghc3BlZWRzdGVwX2RldGVjdF9jaGlwc2V0KCkpIHsKKwkJZHByaW50aygiSW50ZWwoUikgU3BlZWRTdGVwKFRNKSBmb3IgdGhpcyBjaGlwc2V0IG5vdCAoeWV0KSBhdmFpbGFibGUuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogYWN0aXZhdGUgc3BlZWRzdGVwIHN1cHBvcnQgKi8KKwlpZiAoc3BlZWRzdGVwX2FjdGl2YXRlKCkpIHsKKwkJcGNpX2Rldl9wdXQoc3BlZWRzdGVwX2NoaXBzZXRfZGV2KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIGNwdWZyZXFfcmVnaXN0ZXJfZHJpdmVyKCZzcGVlZHN0ZXBfZHJpdmVyKTsKK30KKworCisvKioKKyAqIHNwZWVkc3RlcF9leGl0IC0gdW5yZWdpc3RlcnMgU3BlZWRTdGVwIHN1cHBvcnQKKyAqCisgKiAgIFVucmVnaXN0ZXJzIFNwZWVkU3RlcCBzdXBwb3J0LgorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgc3BlZWRzdGVwX2V4aXQodm9pZCkKK3sKKwlwY2lfZGV2X3B1dChzcGVlZHN0ZXBfY2hpcHNldF9kZXYpOworCWNwdWZyZXFfdW5yZWdpc3Rlcl9kcml2ZXIoJnNwZWVkc3RlcF9kcml2ZXIpOworfQorCisKK01PRFVMRV9BVVRIT1IgKCJEYXZlIEpvbmVzIDxkYXZlakBjb2RlbW9ua2V5Lm9yZy51az4sIERvbWluaWsgQnJvZG93c2tpIDxsaW51eEBicm9kby5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTiAoIlNwZWVkc3RlcCBkcml2ZXIgZm9yIEludGVsIG1vYmlsZSBwcm9jZXNzb3JzIG9uIGNoaXBzZXRzIHdpdGggSUNILU0gc291dGhicmlkZ2VzLiIpOworTU9EVUxFX0xJQ0VOU0UgKCJHUEwiKTsKKworbW9kdWxlX2luaXQoc3BlZWRzdGVwX2luaXQpOworbW9kdWxlX2V4aXQoc3BlZWRzdGVwX2V4aXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtbGliLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1saWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmE0MzBhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtbGliLmMKQEAgLTAsMCArMSwzODUgQEAKKy8qCisgKiAoQykgMjAwMiAtIDIwMDMgRG9taW5payBCcm9kb3dza2kgPGxpbnV4QGJyb2RvLmRlPgorICoKKyAqICBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgTGljZW5zZSB2ZXJzaW9uIDIuCisgKgorICogIExpYnJhcnkgZm9yIGNvbW1vbiBmdW5jdGlvbnMgZm9yIEludGVsIFNwZWVkU3RlcCB2LjEgYW5kIHYuMiBzdXBwb3J0CisgKgorICogIEJJRyBGQVQgRElTQ0xBSU1FUjogV29yayBpbiBwcm9ncmVzcyBjb2RlLiBQb3NzaWJseSAqZGFuZ2Vyb3VzKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4gCisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgPGFzbS9tc3IuaD4KKyNpbmNsdWRlICJzcGVlZHN0ZXAtbGliLmgiCisKKyNkZWZpbmUgZHByaW50ayhtc2cuLi4pIGNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfRFJJVkVSLCAic3BlZWRzdGVwLWxpYiIsIG1zZykKKworI2lmZGVmIENPTkZJR19YODZfU1BFRURTVEVQX1JFTEFYRURfQ0FQX0NIRUNLCitzdGF0aWMgaW50IHJlbGF4ZWRfY2hlY2sgPSAwOworI2Vsc2UKKyNkZWZpbmUgcmVsYXhlZF9jaGVjayAwCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgR0VUIFBST0NFU1NPUiBDT1JFIFNQRUVEIElOIEtIWiAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBwZW50aXVtM19nZXRfZnJlcXVlbmN5ICh1bnNpZ25lZCBpbnQgcHJvY2Vzc29yKQoreworICAgICAgICAvKiBTZWUgdGFibGUgMTQgb2YgcDNfZHMucGRmIGFuZCB0YWJsZSAyMiBvZiAyOTgzNDAwMy5wZGYgKi8KKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBpbnQgcmF0aW87CS8qIEZyZXF1ZW5jeSBNdWx0aXBsaWVyICh4MTApICovCisJCXU4IGJpdG1hcDsJICAgICAgICAvKiBwb3dlciBvbiBjb25maWd1cmF0aW9uIGJpdHMKKwkJCQkJICAgWzI3LCAyNToyMl0gKGluIE1TUiAweDJhKSAqLworCX0gbXNyX2RlY29kZV9tdWx0IFtdID0geworCQl7IDMwLCAweDAxIH0sCisJCXsgMzUsIDB4MDUgfSwKKwkJeyA0MCwgMHgwMiB9LAorCQl7IDQ1LCAweDA2IH0sCisJCXsgNTAsIDB4MDAgfSwKKwkJeyA1NSwgMHgwNCB9LAorCQl7IDYwLCAweDBiIH0sCisJCXsgNjUsIDB4MGYgfSwKKwkJeyA3MCwgMHgwOSB9LAorCQl7IDc1LCAweDBkIH0sCisJCXsgODAsIDB4MGEgfSwKKwkJeyA4NSwgMHgyNiB9LAorCQl7IDkwLCAweDIwIH0sCisJCXsgMTAwLCAweDJiIH0sCisJCXsgMCwgMHhmZiB9ICAgICAvKiBlcnJvciBvciB1bmtub3duIHZhbHVlICovCisJfTsKKworCS8qIFBJSUkoLU0pIEZTQiBzZXR0aW5nczogc2VlIHRhYmxlIGIxLWIgb2YgMjQ1NDcyMDYucGRmICovCisJc3RydWN0IHsKKwkJdW5zaWduZWQgaW50IHZhbHVlOyAgICAgLyogRnJvbnQgU2lkZSBCdXMgc3BlZWQgaW4gTUh6ICovCisJCXU4IGJpdG1hcDsgICAgICAgICAgICAgIC8qIHBvd2VyIG9uIGNvbmZpZ3VyYXRpb24gYml0cyBbMTg6IDE5XQorCQkJCQkgICAoaW4gTVNSIDB4MmEpICovCisJfSBtc3JfZGVjb2RlX2ZzYiBbXSA9IHsKKwkJeyAgNjYsIDB4MCB9LAorCQl7IDEwMCwgMHgyIH0sCisJCXsgMTMzLCAweDEgfSwKKwkJeyAgIDAsIDB4ZmZ9CisJfTsKKworCXUzMiAgICAgbXNyX2xvLCBtc3JfdG1wOworCWludCAgICAgaSA9IDAsIGogPSAwOworCisJLyogcmVhZCBNU1IgMHgyYSAtIHdlIG9ubHkgbmVlZCB0aGUgbG93IDMyIGJpdHMgKi8KKwlyZG1zcihNU1JfSUEzMl9FQkxfQ1JfUE9XRVJPTiwgbXNyX2xvLCBtc3JfdG1wKTsKKwlkcHJpbnRrKCJQMyAtIE1TUl9JQTMyX0VCTF9DUl9QT1dFUk9OOiAweCV4IDB4JXhcbiIsIG1zcl9sbywgbXNyX3RtcCk7CisJbXNyX3RtcCA9IG1zcl9sbzsKKworCS8qIGRlY29kZSB0aGUgRlNCICovCisJbXNyX3RtcCAmPSAweDAwYzAwMDA7CisJbXNyX3RtcCA+Pj0gMTg7CisJd2hpbGUgKG1zcl90bXAgIT0gbXNyX2RlY29kZV9mc2JbaV0uYml0bWFwKSB7CisJCWlmIChtc3JfZGVjb2RlX2ZzYltpXS5iaXRtYXAgPT0gMHhmZikKKwkJCXJldHVybiAwOworCQlpKys7CisJfQorCisJLyogZGVjb2RlIHRoZSBtdWx0aXBsaWVyICovCisJaWYgKHByb2Nlc3NvciA9PSBTUEVFRFNURVBfUFJPQ0VTU09SX1BJSUlfQ19FQVJMWSkgeworCQlkcHJpbnRrKCJ3b3JrYXJvdW5kIGZvciBlYXJseSBQSUlJc1xuIik7CisJCW1zcl9sbyAmPSAweDAzYzAwMDAwOworCX0gZWxzZQorCQltc3JfbG8gJj0gMHgwYmMwMDAwMDsKKwltc3JfbG8gPj49IDIyOworCXdoaWxlIChtc3JfbG8gIT0gbXNyX2RlY29kZV9tdWx0W2pdLmJpdG1hcCkgeworCQlpZiAobXNyX2RlY29kZV9tdWx0W2pdLmJpdG1hcCA9PSAweGZmKQorCQkJcmV0dXJuIDA7CisJCWorKzsKKwl9CisKKwlkcHJpbnRrKCJzcGVlZCBpcyAldVxuIiwgKG1zcl9kZWNvZGVfbXVsdFtqXS5yYXRpbyAqIG1zcl9kZWNvZGVfZnNiW2ldLnZhbHVlICogMTAwKSk7CisKKwlyZXR1cm4gKG1zcl9kZWNvZGVfbXVsdFtqXS5yYXRpbyAqIG1zcl9kZWNvZGVfZnNiW2ldLnZhbHVlICogMTAwKTsKK30KKworCitzdGF0aWMgdW5zaWduZWQgaW50IHBlbnRpdW1NX2dldF9mcmVxdWVuY3kodm9pZCkKK3sKKwl1MzIgICAgIG1zcl9sbywgbXNyX3RtcDsKKworCXJkbXNyKE1TUl9JQTMyX0VCTF9DUl9QT1dFUk9OLCBtc3JfbG8sIG1zcl90bXApOworCWRwcmludGsoIlBNIC0gTVNSX0lBMzJfRUJMX0NSX1BPV0VST046IDB4JXggMHgleFxuIiwgbXNyX2xvLCBtc3JfdG1wKTsKKworCS8qIHNlZSB0YWJsZSBCLTIgb2YgMjQ1NDcyMTIucGRmICovCisJaWYgKG1zcl9sbyAmIDB4MDAwNDAwMDApIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInNwZWVkc3RlcC1saWI6IFBNIC0gaW52YWxpZCBGU0I6IDB4JXggMHgleFxuIiwgbXNyX2xvLCBtc3JfdG1wKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbXNyX3RtcCA9IChtc3JfbG8gPj4gMjIpICYgMHgxZjsKKwlkcHJpbnRrKCJiaXRzIDIyLTI2IGFyZSAweCV4LCBzcGVlZCBpcyAldVxuIiwgbXNyX3RtcCwgKG1zcl90bXAgKiAxMDAgKiAxMDAwKSk7CisKKwlyZXR1cm4gKG1zcl90bXAgKiAxMDAgKiAxMDAwKTsKK30KKworCitzdGF0aWMgdW5zaWduZWQgaW50IHBlbnRpdW00X2dldF9mcmVxdWVuY3kodm9pZCkKK3sKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSAmYm9vdF9jcHVfZGF0YTsKKwl1MzIgbXNyX2xvLCBtc3JfaGksIG11bHQ7CisJdW5zaWduZWQgaW50IGZzYiA9IDA7CisKKwlyZG1zcigweDJjLCBtc3JfbG8sIG1zcl9oaSk7CisKKwlkcHJpbnRrKCJQNCAtIE1TUl9FQkNfRlJFUVVFTkNZX0lEOiAweCV4IDB4JXhcbiIsIG1zcl9sbywgbXNyX2hpKTsKKworCS8qIGRlY29kZSB0aGUgRlNCOiBzZWUgSUEtMzIgSW50ZWwgKEMpIEFyY2hpdGVjdHVyZSBTb2Z0d2FyZSAKKwkgKiBEZXZlbG9wZXIncyBNYW51YWwsIFZvbHVtZSAzOiBTeXN0ZW0gUHJncmFtbWluZyBHdWlkZSwKKwkgKiByZXZpc2lvbiAjMTIgaW4gVGFibGUgQi0xOiBNU1JzIGluIHRoZSBQZW50aXVtIDQgYW5kCisJICogSW50ZWwgWGVvbiBQcm9jZXNzb3JzLCBvbiBwYWdlIEItNCBhbmQgQi01LgorCSAqLworCWlmIChjLT54ODZfbW9kZWwgPCAyKQorCQlmc2IgPSAxMDAgKiAxMDAwOworCWVsc2UgeworCQl1OCBmc2JfY29kZSA9IChtc3JfbG8gPj4gMTYpICYgMHg3OworCQlzd2l0Y2ggKGZzYl9jb2RlKSB7CisJCWNhc2UgMDoKKwkJCWZzYiA9IDEwMCAqIDEwMDA7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJZnNiID0gMTMzMzMgKiAxMDsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlmc2IgPSAyMDAgKiAxMDAwOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWZzYikKKwkJcHJpbnRrKEtFUk5fREVCVUcgInNwZWVkc3RlcC1saWI6IGNvdWxkbid0IGRldGVjdCBGU0Igc3BlZWQuIFBsZWFzZSBzZW5kIGFuIGUtbWFpbCB0byA8bGludXhAYnJvZG8uZGU+XG4iKTsKKworCS8qIE11bHRpcGxpZXIuICovCisJaWYgKGMtPng4Nl9tb2RlbCA8IDIpCisJCW11bHQgPSBtc3JfbG8gPj4gMjc7CisJZWxzZQorCQltdWx0ID0gbXNyX2xvID4+IDI0OworCisJZHByaW50aygiUDQgLSBGU0IgJXUga0h6OyBNdWx0aXBsaWVyICV1OyBTcGVlZCAldSBrSHpcbiIsIGZzYiwgbXVsdCwgKGZzYiAqIG11bHQpKTsKKworCXJldHVybiAoZnNiICogbXVsdCk7Cit9CisKKyAKK3Vuc2lnbmVkIGludCBzcGVlZHN0ZXBfZ2V0X3Byb2Nlc3Nvcl9mcmVxdWVuY3kodW5zaWduZWQgaW50IHByb2Nlc3NvcikKK3sKKwlzd2l0Y2ggKHByb2Nlc3NvcikgeworCWNhc2UgU1BFRURTVEVQX1BST0NFU1NPUl9QTToKKwkJcmV0dXJuIHBlbnRpdW1NX2dldF9mcmVxdWVuY3koKTsKKwljYXNlIFNQRUVEU1RFUF9QUk9DRVNTT1JfUDREOgorCWNhc2UgU1BFRURTVEVQX1BST0NFU1NPUl9QNE06CisJCXJldHVybiBwZW50aXVtNF9nZXRfZnJlcXVlbmN5KCk7CisJY2FzZSBTUEVFRFNURVBfUFJPQ0VTU09SX1BJSUlfVDoKKwljYXNlIFNQRUVEU1RFUF9QUk9DRVNTT1JfUElJSV9DOgorCWNhc2UgU1BFRURTVEVQX1BST0NFU1NPUl9QSUlJX0NfRUFSTFk6CisJCXJldHVybiBwZW50aXVtM19nZXRfZnJlcXVlbmN5KHByb2Nlc3Nvcik7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwZWVkc3RlcF9nZXRfcHJvY2Vzc29yX2ZyZXF1ZW5jeSk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgIERFVEVDVCBTUEVFRFNURVAtQ0FQQUJMRSBQUk9DRVNTT1IgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordW5zaWduZWQgaW50IHNwZWVkc3RlcF9kZXRlY3RfcHJvY2Vzc29yICh2b2lkKQoreworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9IGNwdV9kYXRhOworCXUzMgkJCWVieCwgbXNyX2xvLCBtc3JfaGk7CisKKwlkcHJpbnRrKCJ4ODY6ICV4LCBtb2RlbDogJXhcbiIsIGMtPng4NiwgYy0+eDg2X21vZGVsKTsKKworCWlmICgoYy0+eDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0lOVEVMKSB8fCAKKwkgICAgKChjLT54ODYgIT0gNikgJiYgKGMtPng4NiAhPSAweEYpKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoYy0+eDg2ID09IDB4RikgeworCQkvKiBJbnRlbCBNb2JpbGUgUGVudGl1bSA0LU0KKwkJICogb3IgSW50ZWwgTW9iaWxlIFBlbnRpdW0gNCB3aXRoIDUzMyBNSHogRlNCICovCisJCWlmIChjLT54ODZfbW9kZWwgIT0gMikKKwkJCXJldHVybiAwOworCisJCWVieCA9IGNwdWlkX2VieCgweDAwMDAwMDAxKTsKKwkJZWJ4ICY9IDB4MDAwMDAwRkY7CisKKwkJZHByaW50aygiZWJ4IHZhbHVlIGlzICV4LCB4ODZfbWFzayBpcyAleFxuIiwgZWJ4LCBjLT54ODZfbWFzayk7CisKKwkJc3dpdGNoIChjLT54ODZfbWFzaykgeworCQljYXNlIDQ6IAorCQkJLyoKKwkJCSAqIEItc3RlcHBpbmcgW00tUDQtTV0gCisJCQkgKiBzYW1wbGUgaGFzIGVieCA9IDB4MGYsIHByb2R1Y3Rpb24gaGFzIDB4MGUuCisJCQkgKi8KKwkJCWlmICgoZWJ4ID09IDB4MGUpIHx8IChlYnggPT0gMHgwZikpCisJCQkJcmV0dXJuIFNQRUVEU1RFUF9QUk9DRVNTT1JfUDRNOworCQkJYnJlYWs7CisJCWNhc2UgNzogCisJCQkvKgorCQkJICogQy1zdGVwcGluZyBbTS1QNC1NXQorCQkJICogbmVlZHMgdG8gaGF2ZSBlYng9MHgwZSwgZWxzZSBpdCdzIGEgY2VsZXJvbjoKKwkJCSAqIGNmLiAyNTEzMDkxNy5wZGYgLyBwYWdlIDcsIGZvb3Rub3RlIDUgZXZlbgorCQkJICogdGhvdWdoIDI1MDcyMTIwLnBkZiAvIHBhZ2UgNyBkb2Vzbid0IHNheQorCQkJICogc2FtcGxlcyBhcmUgb25seSBvZiBCLXN0ZXBwaW5nLi4uCisJCQkgKi8KKwkJCWlmIChlYnggPT0gMHgwZSkKKwkJCQlyZXR1cm4gU1BFRURTVEVQX1BST0NFU1NPUl9QNE07CisJCQlicmVhazsKKwkJY2FzZSA5OgorCQkJLyoKKwkJCSAqIEQtc3RlcHBpbmcgW00tUDQtTSBvciBNLVA0LzUzM10KKwkJCSAqCisJCQkgKiB0aGlzIGlzIHRvdGFsbHkgc3RyYW5nZTogQ1BVSUQgMHgwRjI5IGlzCisJCQkgKiB1c2VkIGJ5IE0tUDQtTSwgTS1QNC81MzMgYW5kKCEpIENlbGVyb24gQ1BVcy4KKwkJCSAqIFRoZSBsYXR0ZXIgbmVlZCB0byBiZSBzb3J0ZWQgb3V0IGFzIHRoZXkgZG9uJ3QKKwkJCSAqIHN1cHBvcnQgc3BlZWRzdGVwLgorCQkJICogQ2VsZXJvbnMgd2l0aCBDUFVJRCAweDBGMjkgbWF5IGhhdmUgZWl0aGVyCisJCQkgKiBlYng9MHg4IG9yIDB4ZiAtLSAyNTEzMDkxNy5wZGYgZG9lc24ndCBzYXkgYW55dGhpbmcKKwkJCSAqIHNwZWNpZmljLgorCQkJICogTS1QNC1NcyBtYXkgaGF2ZSBlaXRoZXIgZWJ4PTB4ZSBvciAweGYgW3NlZSBhYm92ZV0KKwkJCSAqIE0tUDQvNTMzIGhhdmUgZWl0aGVyIGVieD0weGUgb3IgMHhmLiBbMjUzMTc2MDcucGRmXQorCQkJICogYWxzbywgTS1QNE0gSFRzIGhhdmUgZWJ4PTB4OCwgdG9vCisJCQkgKiBGb3Igbm93LCB0aGV5IGFyZSBkaXN0aW5ndWlzaGVkIGJ5IHRoZSBtb2RlbF9pZCBzdHJpbmcKKwkJCSAqLworCQkgICAgICAgIGlmICgoZWJ4ID09IDB4MGUpIHx8IChzdHJzdHIoYy0+eDg2X21vZGVsX2lkLCJNb2JpbGUgSW50ZWwoUikgUGVudGl1bShSKSA0IikgIT0gTlVMTCkpIAorCQkJCXJldHVybiBTUEVFRFNURVBfUFJPQ0VTU09SX1A0TTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJc3dpdGNoIChjLT54ODZfbW9kZWwpIHsKKwljYXNlIDB4MEI6IC8qIEludGVsIFBJSUkgW1R1YWxhdGluXSAqLworCQkvKiBjcHVpZF9lYngoMSkgaXMgMHgwNCBmb3IgZGVza3RvcCBQSUlJLCAKKwkJICAgICAgICAgICAgICAgICAgIDB4MDYgZm9yIG1vYmlsZSBQSUlJLU0gKi8KKwkJZWJ4ID0gY3B1aWRfZWJ4KDB4MDAwMDAwMDEpOworCQlkcHJpbnRrKCJlYnggaXMgJXhcbiIsIGVieCk7CisKKwkJZWJ4ICY9IDB4MDAwMDAwRkY7CisKKwkJaWYgKGVieCAhPSAweDA2KQorCQkJcmV0dXJuIDA7CisKKwkJLyogU28gZmFyIGFsbCBQSUlJLU0gcHJvY2Vzc29ycyBzdXBwb3J0IFNwZWVkU3RlcC4gU2VlCisJCSAqIEludGVsJ3MgMjQ1NDA2NDAucGRmIG9mIEp1bmUgMjAwMyAKKwkJICovCisKKwkJcmV0dXJuIFNQRUVEU1RFUF9QUk9DRVNTT1JfUElJSV9UOworCisJY2FzZSAweDA4OiAvKiBJbnRlbCBQSUlJIFtDb3BwZXJtaW5lXSAqLworCisJCS8qIGFsbCBtb2JpbGUgUElJSSBDb3BwZXJtaW5lcyBoYXZlIEZTQiAxMDAgTUh6CisJCSAqID09PiBzb3J0IG91dCBhIGZldyBkZXNrdG9wIFBJSUlzLiAqLworCQlyZG1zcihNU1JfSUEzMl9FQkxfQ1JfUE9XRVJPTiwgbXNyX2xvLCBtc3JfaGkpOworCQlkcHJpbnRrKCJDb3BwZXJtaW5lOiBNU1JfSUEzMl9FQkxfQ1JfUE9XRVJPTiBpcyAweCV4LCAweCV4XG4iLCBtc3JfbG8sIG1zcl9oaSk7CisJCW1zcl9sbyAmPSAweDAwYzAwMDA7CisJCWlmIChtc3JfbG8gIT0gMHgwMDgwMDAwKQorCQkJcmV0dXJuIDA7CisKKwkJLyoKKwkJICogSWYgdGhlIHByb2Nlc3NvciBpcyBhIG1vYmlsZSB2ZXJzaW9uLAorCQkgKiBwbGF0Zm9ybSBJRCBoYXMgYml0IDUwIHNldAorCQkgKiBpdCBoYXMgU3BlZWRTdGVwIHRlY2hub2xvZ3kgaWYgZWl0aGVyCisJCSAqIGJpdCA1NiBvciA1NyBpcyBzZXQKKwkJICovCisJCXJkbXNyKE1TUl9JQTMyX1BMQVRGT1JNX0lELCBtc3JfbG8sIG1zcl9oaSk7CisJCWRwcmludGsoIkNvcHBlcm1pbmU6IE1TUl9JQTMyX1BMQVRGT1JNIElEIGlzIDB4JXgsIDB4JXhcbiIsIG1zcl9sbywgbXNyX2hpKTsKKwkJaWYgKChtc3JfaGkgJiAoMTw8MTgpKSAmJiAocmVsYXhlZF9jaGVjayA/IDEgOiAobXNyX2hpICYgKDM8PDI0KSkpKSB7CisJCQlpZiAoYy0+eDg2X21hc2sgPT0gMHgwMSkgeworCQkJCWRwcmludGsoImVhcmx5IFBJSUkgdmVyc2lvblxuIik7CisJCQkJcmV0dXJuIFNQRUVEU1RFUF9QUk9DRVNTT1JfUElJSV9DX0VBUkxZOworCQkJfSBlbHNlCisJCQkJcmV0dXJuIFNQRUVEU1RFUF9QUk9DRVNTT1JfUElJSV9DOworCQl9CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcGVlZHN0ZXBfZGV0ZWN0X3Byb2Nlc3Nvcik7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICBERVRFQ1QgU1BFRURTVEVQIFNQRUVEUyAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordW5zaWduZWQgaW50IHNwZWVkc3RlcF9nZXRfZnJlcXModW5zaWduZWQgaW50IHByb2Nlc3NvciwKKwkJCQkgIHVuc2lnbmVkIGludCAqbG93X3NwZWVkLAorCQkJCSAgdW5zaWduZWQgaW50ICpoaWdoX3NwZWVkLAorCQkJCSAgdm9pZCAoKnNldF9zdGF0ZSkgKHVuc2lnbmVkIGludCBzdGF0ZSkpCit7CisJdW5zaWduZWQgaW50IHByZXZfc3BlZWQ7CisJdW5zaWduZWQgaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICgoIXByb2Nlc3NvcikgfHwgKCFsb3dfc3BlZWQpIHx8ICghaGlnaF9zcGVlZCkgfHwgKCFzZXRfc3RhdGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRwcmludGsoInRyeWluZyB0byBkZXRlcm1pbmUgYm90aCBzcGVlZHNcbiIpOworCisJLyogZ2V0IGN1cnJlbnQgc3BlZWQgKi8KKwlwcmV2X3NwZWVkID0gc3BlZWRzdGVwX2dldF9wcm9jZXNzb3JfZnJlcXVlbmN5KHByb2Nlc3Nvcik7CisJaWYgKCFwcmV2X3NwZWVkKQorCQlyZXR1cm4gLUVJTzsKKworCWRwcmludGsoInByZXZpb3VzIHNlcGVkIGlzICV1XG4iLCBwcmV2X3NwZWVkKTsKKwkKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwkvKiBzd2l0Y2ggdG8gbG93IHN0YXRlICovCisJc2V0X3N0YXRlKFNQRUVEU1RFUF9MT1cpOworCSpsb3dfc3BlZWQgPSBzcGVlZHN0ZXBfZ2V0X3Byb2Nlc3Nvcl9mcmVxdWVuY3kocHJvY2Vzc29yKTsKKwlpZiAoISpsb3dfc3BlZWQpIHsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBvdXQ7CisJfQorCisJZHByaW50aygibG93IHNlcGVkIGlzICV1XG4iLCAqbG93X3NwZWVkKTsKKworCS8qIHN3aXRjaCB0byBoaWdoIHN0YXRlICovCisJc2V0X3N0YXRlKFNQRUVEU1RFUF9ISUdIKTsKKwkqaGlnaF9zcGVlZCA9IHNwZWVkc3RlcF9nZXRfcHJvY2Vzc29yX2ZyZXF1ZW5jeShwcm9jZXNzb3IpOworCWlmICghKmhpZ2hfc3BlZWQpIHsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBvdXQ7CisJfQorCisJZHByaW50aygiaGlnaCBzZXBlZCBpcyAldVxuIiwgKmhpZ2hfc3BlZWQpOworCisJaWYgKCpsb3dfc3BlZWQgPT0gKmhpZ2hfc3BlZWQpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCisJLyogc3dpdGNoIHRvIHByZXZpb3VzIHN0YXRlLCBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoKmhpZ2hfc3BlZWQgIT0gcHJldl9zcGVlZCkKKwkJc2V0X3N0YXRlKFNQRUVEU1RFUF9MT1cpOworCisgb3V0OgorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm4gKHJldCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcGVlZHN0ZXBfZ2V0X2ZyZXFzKTsKKworI2lmZGVmIENPTkZJR19YODZfU1BFRURTVEVQX1JFTEFYRURfQ0FQX0NIRUNLCittb2R1bGVfcGFyYW0ocmVsYXhlZF9jaGVjaywgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MocmVsYXhlZF9jaGVjaywgIkRvbid0IGRvIGFsbCBjaGVja3MgZm9yIHNwZWVkc3RlcCBjYXBhYmlsaXR5LiIpOworI2VuZGlmCisKK01PRFVMRV9BVVRIT1IgKCJEb21pbmlrIEJyb2Rvd3NraSA8bGludXhAYnJvZG8uZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04gKCJMaWJyYXJ5IGZvciBJbnRlbCBTcGVlZFN0ZXAgMSBvciAyIGNwdWZyZXEgZHJpdmVycy4iKTsKK01PRFVMRV9MSUNFTlNFICgiR1BMIik7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1saWIuaCBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWxpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MWEyYzkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1saWIuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogKEMpIDIwMDIgLSAyMDAzIERvbWluaWsgQnJvZG93c2tpIDxsaW51eEBicm9kby5kZT4KKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyLgorICoKKyAqICBMaWJyYXJ5IGZvciBjb21tb24gZnVuY3Rpb25zIGZvciBJbnRlbCBTcGVlZFN0ZXAgdi4xIGFuZCB2LjIgc3VwcG9ydAorICoKKyAqICBCSUcgRkFUIERJU0NMQUlNRVI6IFdvcmsgaW4gcHJvZ3Jlc3MgY29kZS4gUG9zc2libHkgKmRhbmdlcm91cyoKKyAqLworCisKKworLyogcHJvY2Vzc29ycyAqLworCisjZGVmaW5lIFNQRUVEU1RFUF9QUk9DRVNTT1JfUElJSV9DX0VBUkxZCTB4MDAwMDAwMDEgIC8qIENvcHBlcm1pbmUgY29yZSAqLworI2RlZmluZSBTUEVFRFNURVBfUFJPQ0VTU09SX1BJSUlfQwkJMHgwMDAwMDAwMiAgLyogQ29wcGVybWluZSBjb3JlICovCisjZGVmaW5lIFNQRUVEU1RFUF9QUk9DRVNTT1JfUElJSV9UIAkJMHgwMDAwMDAwMyAgLyogVHVhbGF0aW4gY29yZSAqLworI2RlZmluZSBTUEVFRFNURVBfUFJPQ0VTU09SX1A0TQkJCTB4MDAwMDAwMDQgIC8qIFA0LU0gICovCisKKy8qIHRoZSBmb2xsb3dpbmcgcHJvY2Vzc29ycyBhcmUgbm90IHNwZWVkc3RlcC1jYXBhYmxlIGFuZCBhcmUgbm90IGF1dG8tZGV0ZWN0ZWQKKyAqIGluIHNwZWVkc3RlcF9kZXRlY3RfcHJvY2Vzc29yKCkuIEhvd2V2ZXIsIHRoZWlyIHNwZWVkIGNhbiBiZSBkZXRlY3RlZCB1c2luZworICogdGhlIHNwZWVkc3RlcF9nZXRfcHJvY2Vzc29yX2ZyZXF1ZW5jeSgpIGNhbGwuICovCisjZGVmaW5lIFNQRUVEU1RFUF9QUk9DRVNTT1JfUE0JCQkweEZGRkZGRjAzICAvKiBQZW50aXVtIE0gICovCisjZGVmaW5lIFNQRUVEU1RFUF9QUk9DRVNTT1JfUDRECQkJMHhGRkZGRkYwNCAgLyogZGVza3RvcCBQNCAgKi8KKworLyogc3BlZWRzdGVwIHN0YXRlcyAtLSBvbmx5IHR3byBvZiB0aGVtICovCisKKyNkZWZpbmUgU1BFRURTVEVQX0hJR0ggICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIFNQRUVEU1RFUF9MT1cgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorCisKKy8qIGRldGVjdCBhIHNwZWVkc3RlcC1jYXBhYmxlIHByb2Nlc3NvciAqLworZXh0ZXJuIHVuc2lnbmVkIGludCBzcGVlZHN0ZXBfZGV0ZWN0X3Byb2Nlc3NvciAodm9pZCk7CisKKy8qIGRldGVjdCB0aGUgY3VycmVudCBzcGVlZCAoaW4ga2h6KSBvZiB0aGUgcHJvY2Vzc29yICovCitleHRlcm4gdW5zaWduZWQgaW50IHNwZWVkc3RlcF9nZXRfcHJvY2Vzc29yX2ZyZXF1ZW5jeSh1bnNpZ25lZCBpbnQgcHJvY2Vzc29yKTsKKworCisvKiBkZXRlY3QgdGhlIGxvdyBhbmQgaGlnaCBzcGVlZHMgb2YgdGhlIHByb2Nlc3Nvci4gVGhlIGNhbGxiYWNrIAorICogc2V0X3N0YXRlIidzIGZpcnN0IGFyZ3VtZW50IGlzIGVpdGhlciBTUEVFRFNURVBfSElHSCBvciAKKyAqIFNQRUVEU1RFUF9MT1c7IHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgemVybyBzbyB0aGF0IG5vIAorICogY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbiBjYWxscyBhcmUgaW5pdGlhdGVkLgorICovCitleHRlcm4gdW5zaWduZWQgaW50IHNwZWVkc3RlcF9nZXRfZnJlcXModW5zaWduZWQgaW50IHByb2Nlc3NvciwKKwkgIHVuc2lnbmVkIGludCAqbG93X3NwZWVkLAorCSAgdW5zaWduZWQgaW50ICpoaWdoX3NwZWVkLAorCSAgdm9pZCAoKnNldF9zdGF0ZSkgKHVuc2lnbmVkIGludCBzdGF0ZSkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtc21pLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1zbWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTQ0MGIzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtc21pLmMKQEAgLTAsMCArMSw0MjQgQEAKKy8qCisgKiBJbnRlbCBTcGVlZFN0ZXAgU01JIGRyaXZlci4KKyAqCisgKiAoQykgMjAwMyAgSGlyb3NoaSBNaXVyYSA8bWl1cmFAZGEtY2hhLm9yZz4KKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyLgorICoKKyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgU1BFRURTVEVQIC0gREVGSU5JVElPTlMgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4gCisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4gCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vaXN0Lmg+CisKKyNpbmNsdWRlICJzcGVlZHN0ZXAtbGliLmgiCisKKy8qIHNwZWVkc3RlcCBzeXN0ZW0gbWFuYWdlbWVudCBpbnRlcmZhY2UgcG9ydC9jb21tYW5kLgorICoKKyAqIFRoZXNlIHBhcmFtZXRlcnMgYXJlIGdvdCBmcm9tIElTVC1TTUkgQklPUyBjYWxsLgorICogSWYgdXNlciBnaXZlcyBpdCwgdGhlc2UgYXJlIHVzZWQuCisgKiAKKyAqLworc3RhdGljIGludAkJc21pX3BvcnQJPSAwOworc3RhdGljIGludAkJc21pX2NtZAkJPSAwOworc3RhdGljIHVuc2lnbmVkIGludAlzbWlfc2lnCQk9IDA7CisKKy8qIGluZm8gYWJvdXQgdGhlIHByb2Nlc3NvciAqLworc3RhdGljIHVuc2lnbmVkIGludAlzcGVlZHN0ZXBfcHJvY2Vzc29yID0gMDsKKworLyogCisgKiAgIFRoZXJlIGFyZSBvbmx5IHR3byBmcmVxdWVuY3kgc3RhdGVzIGZvciBlYWNoIHByb2Nlc3Nvci4gVmFsdWVzCisgKiBhcmUgaW4ga0h6IGZvciB0aGUgdGltZSBiZWluZy4KKyAqLworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSBzcGVlZHN0ZXBfZnJlcXNbXSA9IHsKKwl7U1BFRURTVEVQX0hJR0gsIAkwfSwKKwl7U1BFRURTVEVQX0xPVywJCTB9LAorCXswLAkJCUNQVUZSRVFfVEFCTEVfRU5EfSwKK307CisKKyNkZWZpbmUgR0VUX1NQRUVEU1RFUF9PV05FUiAwCisjZGVmaW5lIEdFVF9TUEVFRFNURVBfU1RBVEUgMQorI2RlZmluZSBTRVRfU1BFRURTVEVQX1NUQVRFIDIKKyNkZWZpbmUgR0VUX1NQRUVEU1RFUF9GUkVRUyA0CisKKy8qIGhvdyBvZnRlbiBzaGFsbCB0aGUgU01JIGNhbGwgYmUgdHJpZWQgaWYgaXQgZmFpbGVkLCBlLmcuIGJlY2F1c2UKKyAqIG9mIERNQSBhY3Rpdml0eSBnb2luZyBvbj8gKi8KKyNkZWZpbmUgU01JX1RSSUVTIDUKKworI2RlZmluZSBkcHJpbnRrKG1zZy4uLikgY3B1ZnJlcV9kZWJ1Z19wcmludGsoQ1BVRlJFUV9ERUJVR19EUklWRVIsICJzcGVlZHN0ZXAtc21pIiwgbXNnKQorCisvKioKKyAqIHNwZWVkc3RlcF9zbWlfb3duZXJzaGlwCisgKi8KK3N0YXRpYyBpbnQgc3BlZWRzdGVwX3NtaV9vd25lcnNoaXAgKHZvaWQpCit7CisJdTMyIGNvbW1hbmQsIHJlc3VsdCwgbWFnaWM7CisJdTMyIGZ1bmN0aW9uID0gR0VUX1NQRUVEU1RFUF9PV05FUjsKKwl1bnNpZ25lZCBjaGFyIG1hZ2ljX2RhdGFbXSA9ICJDb3B5cmlnaHQgKGMpIDE5OTkgSW50ZWwgQ29ycG9yYXRpb24iOworCisJY29tbWFuZCA9IChzbWlfc2lnICYgMHhmZmZmZmYwMCkgfCAoc21pX2NtZCAmIDB4ZmYpOworCW1hZ2ljID0gdmlydF90b19waHlzKG1hZ2ljX2RhdGEpOworCisJZHByaW50aygidHJ5aW5nIHRvIG9idGFpbiBvd25lcnNoaXAgd2l0aCBjb21tYW5kICV4IGF0IHBvcnQgJXhcbiIsIGNvbW1hbmQsIHNtaV9wb3J0KTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkib3V0ICUlYWwsICglJWR4KVxuIgorCQk6ICI9RCIgKHJlc3VsdCkKKwkJOiAiYSIgKGNvbW1hbmQpLCAiYiIgKGZ1bmN0aW9uKSwgImMiICgwKSwgImQiIChzbWlfcG9ydCksICJEIiAoMCksICJTIiAobWFnaWMpCisJKTsKKworCWRwcmludGsoInJlc3VsdCBpcyAleFxuIiwgcmVzdWx0KTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogc3BlZWRzdGVwX3NtaV9nZXRfZnJlcXMgLSBnZXQgU3BlZWRTdGVwIHByZWZlcnJlZCAmIGN1cnJlbnQgZnJlcS4KKyAqIEBsb3c6IHRoZSBsb3cgZnJlcXVlbmN5IHZhbHVlIGlzIHBsYWNlZCBoZXJlCisgKiBAaGlnaDogdGhlIGhpZ2ggZnJlcXVlbmN5IHZhbHVlIGlzIHBsYWNlZCBoZXJlCisgKgorICogT25seSBhdmFpbGFibGUgb24gbGF0ZXIgU3BlZWRTdGVwLWVuYWJsZWQgc3lzdGVtcywgcmV0dXJucyBmYWxzZSByZXN1bHRzIG9yCisgKiBldmVuIGhhbmdzIFtjZi4gYnVnbWUub3NkbC5vcmcgIyAxNDIyXSBvbiBlYXJsaWVyIHN5c3RlbXMuIEVtcGlyaWNhbCB0ZXN0aW5nCisgKiBzaG93cyB0aGF0IHRoZSBsYXR0ZXIgb2NjdXJzIGlmICEoaXN0X2luZm8uZXZlbnQgJiAweEZGRkYpLgorICovCitzdGF0aWMgaW50IHNwZWVkc3RlcF9zbWlfZ2V0X2ZyZXFzICh1bnNpZ25lZCBpbnQgKmxvdywgdW5zaWduZWQgaW50ICpoaWdoKQoreworCXUzMiBjb21tYW5kLCByZXN1bHQgPSAwLCBlZGksIGhpZ2hfbWh6LCBsb3dfbWh6OworCXUzMiBzdGF0ZT0wOworCXUzMiBmdW5jdGlvbiA9IEdFVF9TUEVFRFNURVBfRlJFUVM7CisKKwlpZiAoIShpc3RfaW5mby5ldmVudCAmIDB4RkZGRikpIHsKKwkJZHByaW50aygiYnVnICMxNDIyIC0tIGNhbid0IHJlYWQgZnJlcXMgZnJvbSBCSU9TXG4iLCByZXN1bHQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwljb21tYW5kID0gKHNtaV9zaWcgJiAweGZmZmZmZjAwKSB8IChzbWlfY21kICYgMHhmZik7CisKKwlkcHJpbnRrKCJ0cnlpbmcgdG8gZGV0ZXJtaW5lIGZyZXF1ZW5jaWVzIHdpdGggY29tbWFuZCAleCBhdCBwb3J0ICV4XG4iLCBjb21tYW5kLCBzbWlfcG9ydCk7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92bCAkMCwgJSVlZGlcbiIKKwkJIm91dCAlJWFsLCAoJSVkeClcbiIKKwkJOiAiPWEiIChyZXN1bHQpLCAiPWIiIChoaWdoX21oeiksICI9YyIgKGxvd19taHopLCAiPWQiIChzdGF0ZSksICI9RCIgKGVkaSkKKwkJOiAiYSIgKGNvbW1hbmQpLCAiYiIgKGZ1bmN0aW9uKSwgImMiIChzdGF0ZSksICJkIiAoc21pX3BvcnQpLCAiUyIgKDApCisJKTsKKworCWRwcmludGsoInJlc3VsdCAleCwgbG93X2ZyZXEgJXUsIGhpZ2hfZnJlcSAldVxuIiwgcmVzdWx0LCBsb3dfbWh6LCBoaWdoX21oeik7CisKKwkvKiBhYm9ydCBpZiByZXN1bHRzIGFyZSBvYnZpb3VzbHkgaW5jb3JyZWN0Li4uICovCisJaWYgKChoaWdoX21oeiArIGxvd19taHopIDwgNjAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCSpoaWdoID0gaGlnaF9taHogKiAxMDAwOworCSpsb3cgID0gbG93X21oeiAgKiAxMDAwOworCisJcmV0dXJuIHJlc3VsdDsKK30gCisKKy8qKgorICogc3BlZWRzdGVwX2dldF9zdGF0ZSAtIHNldCB0aGUgU3BlZWRTdGVwIHN0YXRlCisgKiBAc3RhdGU6IHByb2Nlc3NvciBmcmVxdWVuY3kgc3RhdGUgKFNQRUVEU1RFUF9MT1cgb3IgU1BFRURTVEVQX0hJR0gpCisgKgorICovCitzdGF0aWMgaW50IHNwZWVkc3RlcF9nZXRfc3RhdGUgKHZvaWQpCit7CisJdTMyIGZ1bmN0aW9uPUdFVF9TUEVFRFNURVBfU1RBVEU7CisJdTMyIHJlc3VsdCwgc3RhdGUsIGVkaSwgY29tbWFuZDsKKworCWNvbW1hbmQgPSAoc21pX3NpZyAmIDB4ZmZmZmZmMDApIHwgKHNtaV9jbWQgJiAweGZmKTsKKworCWRwcmludGsoInRyeWluZyB0byBkZXRlcm1pbmUgY3VycmVudCBzZXR0aW5nIHdpdGggY29tbWFuZCAleCBhdCBwb3J0ICV4XG4iLCBjb21tYW5kLCBzbWlfcG9ydCk7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92bCAkMCwgJSVlZGlcbiIKKwkJIm91dCAlJWFsLCAoJSVkeClcbiIKKwkJOiAiPWEiIChyZXN1bHQpLCAiPWIiIChzdGF0ZSksICI9RCIgKGVkaSkKKwkJOiAiYSIgKGNvbW1hbmQpLCAiYiIgKGZ1bmN0aW9uKSwgImMiICgwKSwgImQiIChzbWlfcG9ydCksICJTIiAoMCkKKwkpOworCisJZHByaW50aygic3RhdGUgaXMgJXgsIHJlc3VsdCBpcyAleFxuIiwgc3RhdGUsIHJlc3VsdCk7CisKKwlyZXR1cm4gKHN0YXRlICYgMSk7Cit9CisKKworLyoqCisgKiBzcGVlZHN0ZXBfc2V0X3N0YXRlIC0gc2V0IHRoZSBTcGVlZFN0ZXAgc3RhdGUKKyAqIEBzdGF0ZTogbmV3IHByb2Nlc3NvciBmcmVxdWVuY3kgc3RhdGUgKFNQRUVEU1RFUF9MT1cgb3IgU1BFRURTVEVQX0hJR0gpCisgKgorICovCitzdGF0aWMgdm9pZCBzcGVlZHN0ZXBfc2V0X3N0YXRlICh1bnNpZ25lZCBpbnQgc3RhdGUpCit7CisJdW5zaWduZWQgaW50IHJlc3VsdCA9IDAsIGNvbW1hbmQsIG5ld19zdGF0ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBmdW5jdGlvbj1TRVRfU1BFRURTVEVQX1NUQVRFOworCXVuc2lnbmVkIGludCByZXRyeSA9IDA7CisKKwlpZiAoc3RhdGUgPiAweDEpCisJCXJldHVybjsKKworCS8qIERpc2FibGUgSVJRcyAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWNvbW1hbmQgPSAoc21pX3NpZyAmIDB4ZmZmZmZmMDApIHwgKHNtaV9jbWQgJiAweGZmKTsKKworCWRwcmludGsoInRyeWluZyB0byBzZXQgZnJlcXVlbmN5IHRvIHN0YXRlICV1IHdpdGggY29tbWFuZCAleCBhdCBwb3J0ICV4XG4iLCBzdGF0ZSwgY29tbWFuZCwgc21pX3BvcnQpOworCisJZG8geworCQlpZiAocmV0cnkpIHsKKwkJCWRwcmludGsoInJldHJ5ICV1LCBwcmV2aW91cyByZXN1bHQgJXUsIHdhaXRpbmcuLi5cbiIsIHJldHJ5LCByZXN1bHQpOworCQkJbWRlbGF5KHJldHJ5ICogNTApOworCQl9CisJCXJldHJ5Kys7CisJCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkJIm1vdmwgJDAsICUlZWRpXG4iCisJCQkib3V0ICUlYWwsICglJWR4KVxuIgorCQkJOiAiPWIiIChuZXdfc3RhdGUpLCAiPUQiIChyZXN1bHQpCisJCQk6ICJhIiAoY29tbWFuZCksICJiIiAoZnVuY3Rpb24pLCAiYyIgKHN0YXRlKSwgImQiIChzbWlfcG9ydCksICJTIiAoMCkKKwkJCSk7CisJfSB3aGlsZSAoKG5ld19zdGF0ZSAhPSBzdGF0ZSkgJiYgKHJldHJ5IDw9IFNNSV9UUklFUykpOworCisJLyogZW5hYmxlIElSUXMgKi8KKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlpZiAobmV3X3N0YXRlID09IHN0YXRlKSB7CisJCWRwcmludGsoImNoYW5nZSB0byAldSBNSHogc3VjY2VlZGVkIGFmdGVyICV1IHRyaWVzIHdpdGggcmVzdWx0ICV1XG4iLCAoc3BlZWRzdGVwX2ZyZXFzW25ld19zdGF0ZV0uZnJlcXVlbmN5IC8gMTAwMCksIHJldHJ5LCByZXN1bHQpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAiY3B1ZnJlcTogY2hhbmdlIGZhaWxlZCB3aXRoIG5ld19zdGF0ZSAldSBhbmQgcmVzdWx0ICV1XG4iLCBuZXdfc3RhdGUsIHJlc3VsdCk7CisJfQorCisJcmV0dXJuOworfQorCisKKy8qKgorICogc3BlZWRzdGVwX3RhcmdldCAtIHNldCBhIG5ldyBDUFVGcmVxIHBvbGljeQorICogQHBvbGljeTogbmV3IHBvbGljeQorICogQHRhcmdldF9mcmVxOiBuZXcgZnJlcQorICogQHJlbGF0aW9uOiAKKyAqCisgKiBTZXRzIGEgbmV3IENQVUZyZXEgcG9saWN5L2ZyZXEuCisgKi8KK3N0YXRpYyBpbnQgc3BlZWRzdGVwX3RhcmdldCAoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCisJCQl1bnNpZ25lZCBpbnQgdGFyZ2V0X2ZyZXEsIHVuc2lnbmVkIGludCByZWxhdGlvbikKK3sKKwl1bnNpZ25lZCBpbnQgbmV3c3RhdGUgPSAwOworCXN0cnVjdCBjcHVmcmVxX2ZyZXFzIGZyZXFzOworCisJaWYgKGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3RhcmdldChwb2xpY3ksICZzcGVlZHN0ZXBfZnJlcXNbMF0sIHRhcmdldF9mcmVxLCByZWxhdGlvbiwgJm5ld3N0YXRlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmcmVxcy5vbGQgPSBzcGVlZHN0ZXBfZnJlcXNbc3BlZWRzdGVwX2dldF9zdGF0ZSgpXS5mcmVxdWVuY3k7CisJZnJlcXMubmV3ID0gc3BlZWRzdGVwX2ZyZXFzW25ld3N0YXRlXS5mcmVxdWVuY3k7CisJZnJlcXMuY3B1ID0gMDsgLyogc3BlZWRzdGVwLmMgaXMgVVAgb25seSBkcml2ZXIgKi8KKworCWlmIChmcmVxcy5vbGQgPT0gZnJlcXMubmV3KQorCQlyZXR1cm4gMDsKKworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BSRUNIQU5HRSk7CisJc3BlZWRzdGVwX3NldF9zdGF0ZShuZXdzdGF0ZSk7CisJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIHNwZWVkc3RlcF92ZXJpZnkgLSB2ZXJpZmllcyBhIG5ldyBDUFVGcmVxIHBvbGljeQorICogQHBvbGljeTogbmV3IHBvbGljeQorICoKKyAqIExpbWl0IG11c3QgYmUgd2l0aGluIHNwZWVkc3RlcF9sb3dfZnJlcSBhbmQgc3BlZWRzdGVwX2hpZ2hfZnJlcSwgd2l0aAorICogYXQgbGVhc3Qgb25lIGJvcmRlciBpbmNsdWRlZC4KKyAqLworc3RhdGljIGludCBzcGVlZHN0ZXBfdmVyaWZ5IChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwlyZXR1cm4gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdmVyaWZ5KHBvbGljeSwgJnNwZWVkc3RlcF9mcmVxc1swXSk7Cit9CisKKworc3RhdGljIGludCBzcGVlZHN0ZXBfY3B1X2luaXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBpbnQgc3BlZWQsc3RhdGU7CisKKwkvKiBjYXBhYmlsaXR5IGNoZWNrICovCisJaWYgKHBvbGljeS0+Y3B1ICE9IDApCisJCXJldHVybiAtRU5PREVWOworCisJcmVzdWx0ID0gc3BlZWRzdGVwX3NtaV9vd25lcnNoaXAoKTsKKwlpZiAocmVzdWx0KSB7CisJCWRwcmludGsoImZhaWxzIGluIGFxdWlyaW5nIG93bmVyc2hpcCBvZiBhIFNNSSBpbnRlcmZhY2UuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogZGV0ZWN0IGxvdyBhbmQgaGlnaCBmcmVxdWVuY3kgKi8KKwlyZXN1bHQgPSBzcGVlZHN0ZXBfc21pX2dldF9mcmVxcygmc3BlZWRzdGVwX2ZyZXFzW1NQRUVEU1RFUF9MT1ddLmZyZXF1ZW5jeSwKKwkJCQkmc3BlZWRzdGVwX2ZyZXFzW1NQRUVEU1RFUF9ISUdIXS5mcmVxdWVuY3kpOworCWlmIChyZXN1bHQpIHsKKwkJLyogZmFsbCBiYWNrIHRvIHNwZWVkc3RlcF9saWIuYyBkZWN0aW9uIG1lY2hhbmlzbTogdHJ5IGJvdGggc3RhdGVzIG91dCAqLworCQlkcHJpbnRrKCJjb3VsZCBub3QgZGV0ZWN0IGxvdyBhbmQgaGlnaCBmcmVxdWVuY2llcyBieSBTTUkgY2FsbC5cbiIpOworCQlyZXN1bHQgPSBzcGVlZHN0ZXBfZ2V0X2ZyZXFzKHNwZWVkc3RlcF9wcm9jZXNzb3IsCisJCQkJJnNwZWVkc3RlcF9mcmVxc1tTUEVFRFNURVBfTE9XXS5mcmVxdWVuY3ksCisJCQkJJnNwZWVkc3RlcF9mcmVxc1tTUEVFRFNURVBfSElHSF0uZnJlcXVlbmN5LAorCQkJCSZzcGVlZHN0ZXBfc2V0X3N0YXRlKTsKKworCQlpZiAocmVzdWx0KSB7CisJCQlkcHJpbnRrKCJjb3VsZCBub3QgZGV0ZWN0IHR3byBkaWZmZXJlbnQgc3BlZWRzIC0tIGFib3J0aW5nLlxuIik7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9IGVsc2UKKwkJCWRwcmludGsoIndvcmthcm91bmQgd29ya2VkLlxuIik7CisJfQorCisJLyogZ2V0IGN1cnJlbnQgc3BlZWQgc2V0dGluZyAqLworCXN0YXRlID0gc3BlZWRzdGVwX2dldF9zdGF0ZSgpOworCXNwZWVkID0gc3BlZWRzdGVwX2ZyZXFzW3N0YXRlXS5mcmVxdWVuY3k7CisKKwlkcHJpbnRrKCJjdXJyZW50bHkgYXQgJXMgc3BlZWQgc2V0dGluZyAtICVpIE1IelxuIiwgCisJCShzcGVlZCA9PSBzcGVlZHN0ZXBfZnJlcXNbU1BFRURTVEVQX0xPV10uZnJlcXVlbmN5KSA/ICJsb3ciIDogImhpZ2giLAorCQkoc3BlZWQgLyAxMDAwKSk7CisKKwkvKiBjcHVpbmZvIGFuZCBkZWZhdWx0IHBvbGljeSB2YWx1ZXMgKi8KKwlwb2xpY3ktPmdvdmVybm9yID0gQ1BVRlJFUV9ERUZBVUxUX0dPVkVSTk9SOworCXBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kgPSBDUFVGUkVRX0VURVJOQUw7CisJcG9saWN5LT5jdXIgPSBzcGVlZDsKKworCXJlc3VsdCA9IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2NwdWluZm8ocG9saWN5LCBzcGVlZHN0ZXBfZnJlcXMpOworCWlmIChyZXN1bHQpCisJCXJldHVybiAocmVzdWx0KTsKKworICAgICAgICBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9nZXRfYXR0cihzcGVlZHN0ZXBfZnJlcXMsIHBvbGljeS0+Y3B1KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNwZWVkc3RlcF9jcHVfZXhpdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9wdXRfYXR0cihwb2xpY3ktPmNwdSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3BlZWRzdGVwX2dldCh1bnNpZ25lZCBpbnQgY3B1KQoreworCWlmIChjcHUpCisJCXJldHVybiAtRU5PREVWOworCXJldHVybiBzcGVlZHN0ZXBfZ2V0X3Byb2Nlc3Nvcl9mcmVxdWVuY3koc3BlZWRzdGVwX3Byb2Nlc3Nvcik7Cit9CisKKworc3RhdGljIGludCBzcGVlZHN0ZXBfcmVzdW1lKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCWludCByZXN1bHQgPSBzcGVlZHN0ZXBfc21pX293bmVyc2hpcCgpOworCisJaWYgKHJlc3VsdCkKKwkJZHByaW50aygiZmFpbHMgaW4gcmUtYXF1aXJpbmcgb3duZXJzaGlwIG9mIGEgU01JIGludGVyZmFjZS5cbiIpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHN0cnVjdCBmcmVxX2F0dHIqIHNwZWVkc3RlcF9hdHRyW10gPSB7CisJJmNwdWZyZXFfZnJlcV9hdHRyX3NjYWxpbmdfYXZhaWxhYmxlX2ZyZXFzLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZHJpdmVyIHNwZWVkc3RlcF9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInNwZWVkc3RlcC1zbWkiLAorCS52ZXJpZnkgCT0gc3BlZWRzdGVwX3ZlcmlmeSwKKwkudGFyZ2V0IAk9IHNwZWVkc3RlcF90YXJnZXQsCisJLmluaXQJCT0gc3BlZWRzdGVwX2NwdV9pbml0LAorCS5leGl0CQk9IHNwZWVkc3RlcF9jcHVfZXhpdCwKKwkuZ2V0CQk9IHNwZWVkc3RlcF9nZXQsCisJLnJlc3VtZQkJPSBzcGVlZHN0ZXBfcmVzdW1lLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuYXR0cgkJPSBzcGVlZHN0ZXBfYXR0ciwKK307CisKKy8qKgorICogc3BlZWRzdGVwX2luaXQgLSBpbml0aWFsaXplcyB0aGUgU3BlZWRTdGVwIENQVUZyZXEgZHJpdmVyCisgKgorICogICBJbml0aWFsaXplcyB0aGUgU3BlZWRTdGVwIHN1cHBvcnQuIFJldHVybnMgLUVOT0RFViBvbiB1bnN1cHBvcnRlZAorICogQklPUywgLUVJTlZBTCBvbiBwcm9ibGVtcyBkdXJpbmcgaW5pdGlhdGl6YXRpb24sIGFuZCB6ZXJvIG9uCisgKiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50IF9faW5pdCBzcGVlZHN0ZXBfaW5pdCh2b2lkKQoreworCXNwZWVkc3RlcF9wcm9jZXNzb3IgPSBzcGVlZHN0ZXBfZGV0ZWN0X3Byb2Nlc3NvcigpOworCisJc3dpdGNoIChzcGVlZHN0ZXBfcHJvY2Vzc29yKSB7CisJY2FzZSBTUEVFRFNURVBfUFJPQ0VTU09SX1BJSUlfVDoKKwljYXNlIFNQRUVEU1RFUF9QUk9DRVNTT1JfUElJSV9DOgorCWNhc2UgU1BFRURTVEVQX1BST0NFU1NPUl9QSUlJX0NfRUFSTFk6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNwZWVkc3RlcF9wcm9jZXNzb3IgPSAwOworCX0KKworCWlmICghc3BlZWRzdGVwX3Byb2Nlc3NvcikgeworCQlkcHJpbnRrICgiTm8gc3VwcG9ydGVkIEludGVsIENQVSBkZXRlY3RlZC5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlkcHJpbnRrKCJzaWduYXR1cmU6MHglLjhseCwgY29tbWFuZDoweCUuOGx4LCBldmVudDoweCUuOGx4LCBwZXJmX2xldmVsOjB4JS44bHguXG4iLCAKKwkJaXN0X2luZm8uc2lnbmF0dXJlLCBpc3RfaW5mby5jb21tYW5kLCBpc3RfaW5mby5ldmVudCwgaXN0X2luZm8ucGVyZl9sZXZlbCk7CisKKworCS8qIEVycm9yIGlmIG5vIElTVC1TTUkgQklPUyBvciBubyBQQVJNIAorCQkgc2lnPSAnSVNHRScgYWthICdJbnRlbCBTcGVlZHN0ZXAgR2F0ZSBFJyAqLworCWlmICgoaXN0X2luZm8uc2lnbmF0dXJlICE9ICAweDQ3NTM0OTQzKSAmJiAoIAorCSAgICAoc21pX3BvcnQgPT0gMCkgfHwgKHNtaV9jbWQgPT0gMCkpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChzbWlfc2lnID09IDEpCisJCXNtaV9zaWcgPSAweDQ3NTM0OTQzOworCWVsc2UKKwkJc21pX3NpZyA9IGlzdF9pbmZvLnNpZ25hdHVyZTsKKworCS8qIHNldHVwIHNtaV9wb3J0IGZyb20gTU9ETFVMRV9QQVJNIG9yIEJJT1MgKi8KKwlpZiAoKHNtaV9wb3J0ID4gMHhmZikgfHwgKHNtaV9wb3J0IDwgMCkpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIGlmIChzbWlfcG9ydCA9PSAwKSB7CisJCXNtaV9wb3J0ID0gaXN0X2luZm8uY29tbWFuZCAmIDB4ZmY7CisJfQorCisJaWYgKChzbWlfY21kID4gMHhmZikgfHwgKHNtaV9jbWQgPCAwKSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgaWYgKHNtaV9jbWQgPT0gMCkgeworCQlzbWlfY21kID0gKGlzdF9pbmZvLmNvbW1hbmQgPj4gMTYpICYgMHhmZjsKKwl9CisKKwlyZXR1cm4gY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJnNwZWVkc3RlcF9kcml2ZXIpOworfQorCisKKy8qKgorICogc3BlZWRzdGVwX2V4aXQgLSB1bnJlZ2lzdGVycyBTcGVlZFN0ZXAgc3VwcG9ydAorICoKKyAqICAgVW5yZWdpc3RlcnMgU3BlZWRTdGVwIHN1cHBvcnQuCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBzcGVlZHN0ZXBfZXhpdCh2b2lkKQoreworCWNwdWZyZXFfdW5yZWdpc3Rlcl9kcml2ZXIoJnNwZWVkc3RlcF9kcml2ZXIpOworfQorCittb2R1bGVfcGFyYW0oc21pX3BvcnQsICBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKHNtaV9jbWQsICAgaW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbShzbWlfc2lnLCAgdWludCwgMDQ0NCk7CisKK01PRFVMRV9QQVJNX0RFU0Moc21pX3BvcnQsICJPdmVycmlkZSB0aGUgQklPUy1naXZlbiBJU1QgcG9ydCB3aXRoIHRoaXMgdmFsdWUgLS0gSW50ZWwncyBkZWZhdWx0IHNldHRpbmcgaXMgMHhiMiIpOworTU9EVUxFX1BBUk1fREVTQyhzbWlfY21kLCAiT3ZlcnJpZGUgdGhlIEJJT1MtZ2l2ZW4gSVNUIGNvbW1hbmQgd2l0aCB0aGlzIHZhbHVlIC0tIEludGVsJ3MgZGVmYXVsdCBzZXR0aW5nIGlzIDB4ODIiKTsKK01PRFVMRV9QQVJNX0RFU0Moc21pX3NpZywgIlNldCB0byAxIHRvIGZha2UgdGhlIElTVCBzaWduYXR1cmUgd2hlbiB1c2luZyB0aGUgU01JIGludGVyZmFjZS4iKTsKKworTU9EVUxFX0FVVEhPUiAoIkhpcm9zaGkgTWl1cmEiKTsKK01PRFVMRV9ERVNDUklQVElPTiAoIlNwZWVkc3RlcCBkcml2ZXIgZm9yIElTVCBhcHBsZXQgU01JIGludGVyZmFjZS4iKTsKK01PRFVMRV9MSUNFTlNFICgiR1BMIik7CisKK21vZHVsZV9pbml0KHNwZWVkc3RlcF9pbml0KTsKK21vZHVsZV9leGl0KHNwZWVkc3RlcF9leGl0KTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2N5cml4LmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jeXJpeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNGIwMTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jeXJpeC5jCkBAIC0wLDAgKzEsNDM5IEBACisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vdGltZXIuaD4KKworI2luY2x1ZGUgImNwdS5oIgorCisvKgorICogUmVhZCBOU0MvQ3lyaXggREVWSUQgcmVnaXN0ZXJzIChESVIpIHRvIGdldCBtb3JlIGRldGFpbGVkIGluZm8uIGFib3V0IHRoZSBDUFUKKyAqLworc3RhdGljIHZvaWQgX19pbml0IGRvX2N5cml4X2RldmlkKHVuc2lnbmVkIGNoYXIgKmRpcjAsIHVuc2lnbmVkIGNoYXIgKmRpcjEpCit7CisJdW5zaWduZWQgY2hhciBjY3IyLCBjY3IzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJLyogd2UgdGVzdCBmb3IgREVWSUQgYnkgY2hlY2tpbmcgd2hldGhlciBDQ1IzIGlzIHdyaXRhYmxlICovCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWNjcjMgPSBnZXRDeDg2KENYODZfQ0NSMyk7CisJc2V0Q3g4NihDWDg2X0NDUjMsIGNjcjMgXiAweDgwKTsKKwlnZXRDeDg2KDB4YzApOyAgIC8qIGR1bW15IHRvIGNoYW5nZSBidXMgKi8KKworCWlmIChnZXRDeDg2KENYODZfQ0NSMykgPT0gY2NyMykgeyAgICAgICAvKiBubyBERVZJRCByZWdzLiAqLworCQljY3IyID0gZ2V0Q3g4NihDWDg2X0NDUjIpOworCQlzZXRDeDg2KENYODZfQ0NSMiwgY2NyMiBeIDB4MDQpOworCQlnZXRDeDg2KDB4YzApOyAgLyogZHVtbXkgKi8KKworCQlpZiAoZ2V0Q3g4NihDWDg2X0NDUjIpID09IGNjcjIpIC8qIG9sZCBDeDQ4NlNMQy9ETEMgKi8KKwkJCSpkaXIwID0gMHhmZDsKKwkJZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDeDQ4NlMgQSBzdGVwICovCisJCQlzZXRDeDg2KENYODZfQ0NSMiwgY2NyMik7CisJCQkqZGlyMCA9IDB4ZmU7CisJCX0KKwl9CisJZWxzZSB7CisJCXNldEN4ODYoQ1g4Nl9DQ1IzLCBjY3IzKTsgIC8qIHJlc3RvcmUgQ0NSMyAqLworCisJCS8qIHJlYWQgRElSMCBhbmQgRElSMSBDUFUgcmVnaXN0ZXJzICovCisJCSpkaXIwID0gZ2V0Q3g4NihDWDg2X0RJUjApOworCQkqZGlyMSA9IGdldEN4ODYoQ1g4Nl9ESVIxKTsKKwl9CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisvKgorICogQ3g4Nl9kaXIwX21zYiBpcyBhIEhBQ0sgbmVlZGVkIGJ5IGNoZWNrX2N4Njg2X2NwdWlkL3Nsb3AgaW4gYnVncy5oIGluCisgKiBvcmRlciB0byBpZGVudGlmeSB0aGUgQ3lyaXggQ1BVIG1vZGVsIGFmdGVyIHdlJ3JlIG91dCBvZiBzZXR1cC5jCisgKgorICogQWN0dWFsbHkgc2luY2UgYnVncy5oIGRvZXNuJ3QgZXZlbiByZWZlcmVuY2UgdGhpcyBwZXJoYXBzIHNvbWVvbmUgc2hvdWxkCisgKiBmaXggdGhlIGRvY3VtZW50YXRpb24gPz8/CisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIEN4ODZfZGlyMF9tc2IgX19pbml0ZGF0YSA9IDA7CisKK3N0YXRpYyBjaGFyIEN4ODZfbW9kZWxbXVs5XSBfX2luaXRkYXRhID0geworCSJDeDQ4NiIsICJDeDQ4NiIsICI1eDg2ICIsICI2eDg2IiwgIk1lZGlhR1ggIiwgIjZ4ODZNWCAiLAorCSJNIElJICIsICJVbmtub3duIgorfTsKK3N0YXRpYyBjaGFyIEN4NDg2X25hbWVbXVs1XSBfX2luaXRkYXRhID0geworCSJTTEMiLCAiRExDIiwgIlNMQzIiLCAiRExDMiIsICJTUngiLCAiRFJ4IiwKKwkiU1J4MiIsICJEUngyIgorfTsKK3N0YXRpYyBjaGFyIEN4NDg2U19uYW1lW11bNF0gX19pbml0ZGF0YSA9IHsKKwkiUyIsICJTMiIsICJTZSIsICJTMmUiCit9Oworc3RhdGljIGNoYXIgQ3g0ODZEX25hbWVbXVs0XSBfX2luaXRkYXRhID0geworCSJEWCIsICJEWDIiLCAiPyIsICI/IiwgIj8iLCAiRFg0IgorfTsKK3N0YXRpYyBjaGFyIEN4ODZfY2JbXSBfX2luaXRkYXRhID0gIj8uNXggQ29yZS9CdXMgQ2xvY2siOworc3RhdGljIGNoYXIgY3lyaXhfbW9kZWxfbXVsdDFbXSBfX2luaXRkYXRhID0gIjEyPz80MyI7CitzdGF0aWMgY2hhciBjeXJpeF9tb2RlbF9tdWx0MltdIF9faW5pdGRhdGEgPSAiMTIyMzM0NDUiOworCisvKgorICogUmVzZXQgdGhlIHNsb3ctbG9vcCAoU0xPUCkgYml0IG9uIHRoZSA2ODYoTCkgd2hpY2ggaXMgc2V0IGJ5IHNvbWUgb2xkCisgKiBCSU9TZXMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBET1MgZ2FtZXMuICBUaGlzIG1ha2VzIHRoZSB1ZGVsYXkgbG9vcAorICogd29yayBjb3JyZWN0bHksIGFuZCBpbXByb3ZlcyBwZXJmb3JtYW5jZS4KKyAqCisgKiBGSVhNRTogb3VyIG5ld2VyIHVkZWxheSB1c2VzIHRoZSB0c2MuIFdlIGRvbid0IG5lZWQgdG8gZnJvYiB3aXRoIFNMT1AKKyAqLworCitleHRlcm4gdm9pZCBjYWxpYnJhdGVfZGVsYXkodm9pZCkgX19pbml0OworCitzdGF0aWMgdm9pZCBfX2luaXQgY2hlY2tfY3g2ODZfc2xvcChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlpZiAoQ3g4Nl9kaXIwX21zYiA9PSAzKSB7CisJCXVuc2lnbmVkIGNoYXIgY2NyMywgY2NyNTsKKworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCWNjcjMgPSBnZXRDeDg2KENYODZfQ0NSMyk7CisJCXNldEN4ODYoQ1g4Nl9DQ1IzLCAoY2NyMyAmIDB4MGYpIHwgMHgxMCk7IC8qIGVuYWJsZSBNQVBFTiAgKi8KKwkJY2NyNSA9IGdldEN4ODYoQ1g4Nl9DQ1I1KTsKKwkJaWYgKGNjcjUgJiAyKQorCQkJc2V0Q3g4NihDWDg2X0NDUjUsIGNjcjUgJiAweGZkKTsgIC8qIHJlc2V0IFNMT1AgKi8KKwkJc2V0Q3g4NihDWDg2X0NDUjMsIGNjcjMpOyAgICAgICAgICAgICAgICAgLyogZGlzYWJsZSBNQVBFTiAqLworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwkJaWYgKGNjcjUgJiAyKSB7IC8qIHBvc3NpYmxlIHdyb25nIGNhbGlicmF0aW9uIGRvbmUgKi8KKwkJCXByaW50ayhLRVJOX0lORk8gIlJlY2FsaWJyYXRpbmcgZGVsYXkgbG9vcCB3aXRoIFNMT1AgYml0IHJlc2V0XG4iKTsKKwkJCWNhbGlicmF0ZV9kZWxheSgpOworCQkJYy0+bG9vcHNfcGVyX2ppZmZ5ID0gbG9vcHNfcGVyX2ppZmZ5OworCQl9CisJfQorfQorCisKK3N0YXRpYyB2b2lkIF9faW5pdCBzZXRfY3g4Nl9yZW9yZGVyKHZvaWQpCit7CisJdTggY2NyMzsKKworCXByaW50ayhLRVJOX0lORk8gIkVuYWJsZSBNZW1vcnkgYWNjZXNzIHJlb3JkZXIgb24gQ3lyaXgvTlNDIHByb2Nlc3Nvci5cbiIpOworCWNjcjMgPSBnZXRDeDg2KENYODZfQ0NSMyk7CisJc2V0Q3g4NihDWDg2X0NDUjMsIChjY3IzICYgMHgwZikgfCAweDEwKTsgLyogZW5hYmxlIE1BUEVOoCAqLworCisJLyogTG9hZC9TdG9yZSBTZXJpYWxpemUgdG8gbWVtIGFjY2VzcyBkaXNhYmxlICg9cmVvcmRlciBpdCmgICovCisJc2V0Q3g4NihDWDg2X1BDUjAsIGdldEN4ODYoQ1g4Nl9QQ1IwKSAmIH4weDgwKTsKKwkvKiBzZXQgbG9hZC9zdG9yZSBzZXJpYWxpemUgZnJvbSAxR0IgdG8gNEdCICovCisJY2NyMyB8PSAweGUwOworCXNldEN4ODYoQ1g4Nl9DQ1IzLCBjY3IzKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHNldF9jeDg2X21lbXdiKHZvaWQpCit7CisJdTMyIGNyMDsKKworCXByaW50ayhLRVJOX0lORk8gIkVuYWJsZSBNZW1vcnktV3JpdGUtYmFjayBtb2RlIG9uIEN5cml4L05TQyBwcm9jZXNzb3IuXG4iKTsKKworCS8qIENDUjIgYml0IDI6IHVubG9jayBOVyBiaXQgKi8KKwlzZXRDeDg2KENYODZfQ0NSMiwgZ2V0Q3g4NihDWDg2X0NDUjIpICYgfjB4MDQpOworCS8qIHNldCAnTm90IFdyaXRlLXRocm91Z2gnICovCisJY3IwID0gMHgyMDAwMDAwMDsKKwlfX2FzbV9fKCJtb3ZsICUlY3IwLCUlZWF4XG5cdCIKKwkJIm9ybCAlMCwlJWVheFxuXHQiCisJCSJtb3ZsICUlZWF4LCUlY3IwXG4iCisJCTogOiAiciIgKGNyMCkKKwkJOiJheCIpOworCS8qIENDUjIgYml0IDI6IGxvY2sgTlcgYml0IGFuZCBzZXQgV1QxICovCisJc2V0Q3g4NihDWDg2X0NDUjIsIGdldEN4ODYoQ1g4Nl9DQ1IyKSB8IDB4MTQgKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHNldF9jeDg2X2luYyh2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgY2NyMzsKKworCXByaW50ayhLRVJOX0lORk8gIkVuYWJsZSBJbmNyZW1lbnRvciBvbiBDeXJpeC9OU0MgcHJvY2Vzc29yLlxuIik7CisKKwljY3IzID0gZ2V0Q3g4NihDWDg2X0NDUjMpOworCXNldEN4ODYoQ1g4Nl9DQ1IzLCAoY2NyMyAmIDB4MGYpIHwgMHgxMCk7IC8qIGVuYWJsZSBNQVBFTqAgKi8KKwkvKiBQQ1IxIC0tIFBlcmZvcm1hbmNlIENvbnRyb2wgKi8KKwkvKiBJbmNyZW1lbnRvciBvbiwgd2hhdGV2ZXIgdGhhdCBpcyAqLworCXNldEN4ODYoQ1g4Nl9QQ1IxLCBnZXRDeDg2KENYODZfUENSMSkgfCAweDAyKTsKKwkvKiBQQ1IwIC0tIFBlcmZvcm1hbmNlIENvbnRyb2wgKi8KKwkvKiBJbmNyZW1lbnRvciBNYXJnaW4gMTAgKi8KKwlzZXRDeDg2KENYODZfUENSMCwgZ2V0Q3g4NihDWDg2X1BDUjApIHwgMHgwNCk7IAorCXNldEN4ODYoQ1g4Nl9DQ1IzLCBjY3IzKTsJLyogZGlzYWJsZSBNQVBFTiAqLworfQorCisvKgorICoJQ29uZmlndXJlIGxhdGVyIE1lZGlhR1ggYW5kL29yIEdlb2RlIHByb2Nlc3Nvci4KKyAqLworCitzdGF0aWMgdm9pZCBfX2luaXQgZ2VvZGVfY29uZmlndXJlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCBjY3IzLCBjY3I0OworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCS8qIFN1c3BlbmQgb24gaGFsdCBwb3dlciBzYXZpbmcgYW5kIGVuYWJsZSAjU1VTUCBwaW4gKi8KKwlzZXRDeDg2KENYODZfQ0NSMiwgZ2V0Q3g4NihDWDg2X0NDUjIpIHwgMHg4OCk7CisKKwljY3IzID0gZ2V0Q3g4NihDWDg2X0NDUjMpOworCXNldEN4ODYoQ1g4Nl9DQ1IzLCAoY2NyMyAmIDB4MGYpIHwgMHgxMCk7CS8qIEVuYWJsZSAqLworCQorCWNjcjQgPSBnZXRDeDg2KENYODZfQ0NSNCk7CisJY2NyNCB8PSAweDM4OwkJLyogRlBVIGZhc3QsIERURSBjYWNoZSwgTWVtIGJ5cGFzcyAqLworCQorCXNldEN4ODYoQ1g4Nl9DQ1IzLCBjY3IzKTsKKwkKKwlzZXRfY3g4Nl9tZW13YigpOworCXNldF9jeDg2X3Jlb3JkZXIoKTsJCisJc2V0X2N4ODZfaW5jKCk7CisJCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisKKyNpZmRlZiBDT05GSUdfUENJCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgY3lyaXhfNTV4MFtdID0geworCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0NZUklYLCBQQ0lfREVWSUNFX0lEX0NZUklYXzU1MTApIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQ1lSSVgsIFBDSV9ERVZJQ0VfSURfQ1lSSVhfNTUyMCkgfSwKKwl7IH0sCit9OworI2VuZGlmCisKK3N0YXRpYyB2b2lkIF9faW5pdCBpbml0X2N5cml4KHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKKwl1bnNpZ25lZCBjaGFyIGRpcjAsIGRpcjBfbXNuLCBkaXIwX2xzbiwgZGlyMSA9IDA7CisJY2hhciAqYnVmID0gYy0+eDg2X21vZGVsX2lkOworCWNvbnN0IGNoYXIgKnAgPSBOVUxMOworCisJLyogQml0IDMxIGluIG5vcm1hbCBDUFVJRCB1c2VkIGZvciBub25zdGFuZGFyZCAzRE5vdyBJRDsKKwkgICAzRE5vdyBpcyBJRGQgYnkgYml0IDMxIGluIGV4dGVuZGVkIENQVUlEICgxKjMyKzMxKSBhbnl3YXkgKi8KKwljbGVhcl9iaXQoMCozMiszMSwgYy0+eDg2X2NhcGFiaWxpdHkpOworCisJLyogQ3lyaXggdXNlZCBiaXQgMjQgaW4gZXh0ZW5kZWQgKEFNRCkgQ1BVSUQgZm9yIEN5cml4IE1NWCBleHRlbnNpb25zICovCisJaWYgKCB0ZXN0X2JpdCgxKjMyKzI0LCBjLT54ODZfY2FwYWJpbGl0eSkgKSB7CisJCWNsZWFyX2JpdCgxKjMyKzI0LCBjLT54ODZfY2FwYWJpbGl0eSk7CisJCXNldF9iaXQoWDg2X0ZFQVRVUkVfQ1hNTVgsIGMtPng4Nl9jYXBhYmlsaXR5KTsKKwl9CisKKwlkb19jeXJpeF9kZXZpZCgmZGlyMCwgJmRpcjEpOworCisJY2hlY2tfY3g2ODZfc2xvcChjKTsKKworCUN4ODZfZGlyMF9tc2IgPSBkaXIwX21zbiA9IGRpcjAgPj4gNDsgLyogaWRlbnRpZmllcyBDUFUgImZhbWlseSIgICAqLworCWRpcjBfbHNuID0gZGlyMCAmIDB4ZjsgICAgICAgICAgICAgICAgLyogbW9kZWwgb3IgY2xvY2sgbXVsdGlwbGllciAqLworCisJLyogY29tbW9uIGNhc2Ugc3RlcCBudW1iZXIvcmV2IC0tIGV4Y2VwdGlvbnMgaGFuZGxlZCBiZWxvdyAqLworCWMtPng4Nl9tb2RlbCA9IChkaXIxID4+IDQpICsgMTsKKwljLT54ODZfbWFzayA9IGRpcjEgJiAweGY7CisKKwkvKiBOb3cgY29vazsgdGhlIG9yaWdpbmFsIHJlY2lwZSBpcyBieSBDaGFubmluZyBDb3JuLCBmcm9tIEN5cml4LgorCSAqIFdlIGRvIHRoZSBzYW1lIHRoaW5nIGZvciBlYWNoIGdlbmVyYXRpb246IHdlIHdvcmsgb3V0CisJICogdGhlIG1vZGVsLCBtdWx0aXBsaWVyIGFuZCBzdGVwcGluZy4gIEJsYWNrIG1hZ2ljIGluY2x1ZGVkLAorCSAqIHRvIG1ha2UgdGhlIHNpbGljb24gc3RlcC9yZXYgbnVtYmVycyBtYXRjaCB0aGUgcHJpbnRlZCBvbmVzLgorCSAqLworCSAKKwlzd2l0Y2ggKGRpcjBfbXNuKSB7CisJCXVuc2lnbmVkIGNoYXIgdG1wOworCisJY2FzZSAwOiAvKiBDeDQ4NlNMQy9ETEMvU1J4L0RSeCAqLworCQlwID0gQ3g0ODZfbmFtZVtkaXIwX2xzbiAmIDddOworCQlicmVhazsKKworCWNhc2UgMTogLyogQ3g0ODZTL0RYL0RYMi9EWDQgKi8KKwkJcCA9IChkaXIwX2xzbiAmIDgpID8gQ3g0ODZEX25hbWVbZGlyMF9sc24gJiA1XQorCQkJOiBDeDQ4NlNfbmFtZVtkaXIwX2xzbiAmIDNdOworCQlicmVhazsKKworCWNhc2UgMjogLyogNXg4NiAqLworCQlDeDg2X2NiWzJdID0gY3lyaXhfbW9kZWxfbXVsdDFbZGlyMF9sc24gJiA1XTsKKwkJcCA9IEN4ODZfY2IrMjsKKwkJYnJlYWs7CisKKwljYXNlIDM6IC8qIDZ4ODYvNng4NkwgKi8KKwkJQ3g4Nl9jYlsxXSA9ICcgJzsKKwkJQ3g4Nl9jYlsyXSA9IGN5cml4X21vZGVsX211bHQxW2RpcjBfbHNuICYgNV07CisJCWlmIChkaXIxID4gMHgyMSkgeyAvKiA2ODZMICovCisJCQlDeDg2X2NiWzBdID0gJ0wnOworCQkJcCA9IEN4ODZfY2I7CisJCQkoYy0+eDg2X21vZGVsKSsrOworCQl9IGVsc2UgICAgICAgICAgICAgLyogNjg2ICovCisJCQlwID0gQ3g4Nl9jYisxOworCQkvKiBFbXVsYXRlIE1UUlJzIHVzaW5nIEN5cml4J3MgQVJScy4gKi8KKwkJc2V0X2JpdChYODZfRkVBVFVSRV9DWVJJWF9BUlIsIGMtPng4Nl9jYXBhYmlsaXR5KTsKKwkJLyogNng4NidzIGNvbnRhaW4gdGhpcyBidWcgKi8KKwkJYy0+Y29tYV9idWcgPSAxOworCQlicmVhazsKKworCWNhc2UgNDogLyogTWVkaWFHWC9HWG0gb3IgR2VvZGUgR1hNL0dYTFYvR1gxICovCisjaWZkZWYgQ09ORklHX1BDSQorCQkvKiBJdCBpc24ndCByZWFsbHkgYSBQQ0kgcXVpcmsgZGlyZWN0bHksIGJ1dCB0aGUgY3VyZSBpcyB0aGUKKwkJICAgc2FtZS4gVGhlIE1lZGlhR1ggaGFzIGRlZXAgbWFnaWMgU01NIHN0dWZmIHRoYXQgaGFuZGxlcyB0aGUKKwkJICAgU0IgZW11bGF0aW9uLiBJdCB0aG93cyBhd2F5IHRoZSBmaWZvIG9uIGRpc2FibGVfZG1hKCkgd2hpY2gKKwkJICAgaXMgd3JvbmcgYW5kIHJ1aW5zIHRoZSBhdWRpby4gCisKKwkJICAgQnVnMjogVlNBMSBoYXMgYSB3cmFwIGJ1ZyBzbyB0aGF0IHVzaW5nIG1heGltdW0gc2l6ZWQgRE1BIAorCQkgICBjYXVzZXMgYmFkIHRoaW5ncy4gQWNjb3JkaW5nIHRvIE5hdFNlbWkgVlNBMiBoYXMgYW5vdGhlcgorCQkgICBidWcgdG8gZG8gd2l0aCAnaGx0Jy4gSSd2ZSBub3Qgc2VlbiBhbnkgYm9hcmRzIHVzaW5nIFZTQTIKKwkJICAgYW5kIFggZG9lc24ndCBzZWVtIHRvIHN1cHBvcnQgaXQgZWl0aGVyIHNvIHdobyBjYXJlcyA4KS4KKwkJICAgVlNBMSB3ZSB3b3JrIGFyb3VuZCBob3dldmVyLgorCQkqLworCisJCXByaW50ayhLRVJOX0lORk8gIldvcmtpbmcgYXJvdW5kIEN5cml4IE1lZGlhR1ggdmlydHVhbCBETUEgYnVncy5cbiIpOworCQlpc2FfZG1hX2JyaWRnZV9idWdneSA9IDI7CisjZW5kaWYJCQorCQljLT54ODZfY2FjaGVfc2l6ZT0xNjsJLyogWWVwIDE2SyBpbnRlZ3JhdGVkIGNhY2hlIHRoYXRzIGl0ICovCisgCisJCS8qCisJCSAqICBUaGUgNTUxMC81NTIwIGNvbXBhbmlvbiBjaGlwcyBoYXZlIGEgZnVua3kgUElULgorCQkgKi8gIAorCQlpZiAocGNpX2Rldl9wcmVzZW50KGN5cml4XzU1eDApKQorCQkJcGl0X2xhdGNoX2J1Z2d5ID0gMTsKKworCQkvKiBHWG0gc3VwcG9ydHMgZXh0ZW5kZWQgY3B1aWQgbGV2ZWxzICdhbGEnIEFNRCAqLworCQlpZiAoYy0+Y3B1aWRfbGV2ZWwgPT0gMikgeworCQkJLyogRW5hYmxlIGN4TU1YIGV4dGVuc2lvbnMgKEdYMSBEYXRhc2hlZXQgNTQpICovCisJCQlzZXRDeDg2KENYODZfQ0NSNywgZ2V0Q3g4NihDWDg2X0NDUjcpfDEpOworCQkJCisJCQkvKiBHWGx2L0dYbS9HWDEgKi8KKwkJCWlmKChkaXIxID49IDB4NTAgJiYgZGlyMSA8PSAweDU0KSB8fCBkaXIxID49IDB4NjMpCisJCQkJZ2VvZGVfY29uZmlndXJlKCk7CisJCQlnZXRfbW9kZWxfbmFtZShjKTsgIC8qIGdldCBDUFUgbWFya2V0aW5nIG5hbWUgKi8KKwkJCXJldHVybjsKKwkJfQorCQllbHNlIHsgIC8qIE1lZGlhR1ggKi8KKwkJCUN4ODZfY2JbMl0gPSAoZGlyMF9sc24gJiAxKSA/ICczJyA6ICc0JzsKKwkJCXAgPSBDeDg2X2NiKzI7CisJCQljLT54ODZfbW9kZWwgPSAoZGlyMSAmIDB4MjApID8gMSA6IDI7CisJCX0KKwkJYnJlYWs7CisKKyAgICAgICAgY2FzZSA1OiAvKiA2eDg2TVgvTSBJSSAqLworCQlpZiAoZGlyMSA+IDcpCisJCXsKKwkJCWRpcjBfbXNuKys7ICAvKiBNIElJICovCisJCQkvKiBFbmFibGUgTU1YIGV4dGVuc2lvbnMgKEFwcCBub3RlIDEwOCkgKi8KKwkJCXNldEN4ODYoQ1g4Nl9DQ1I3LCBnZXRDeDg2KENYODZfQ0NSNyl8MSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQljLT5jb21hX2J1ZyA9IDE7ICAgICAgLyogNng4Nk1YLCBpdCBoYXMgdGhlIGJ1Zy4gKi8KKwkJfQorCQl0bXAgPSAoIShkaXIwX2xzbiAmIDcpIHx8IGRpcjBfbHNuICYgMSkgPyAyIDogMDsKKwkJQ3g4Nl9jYlt0bXBdID0gY3lyaXhfbW9kZWxfbXVsdDJbZGlyMF9sc24gJiA3XTsKKwkJcCA9IEN4ODZfY2IrdG1wOworICAgICAgICAJaWYgKCgoZGlyMSAmIDB4MGYpID4gNCkgfHwgKChkaXIxICYgMHhmMCkgPT0gMHgyMCkpCisJCQkoYy0+eDg2X21vZGVsKSsrOworCQkvKiBFbXVsYXRlIE1UUlJzIHVzaW5nIEN5cml4J3MgQVJScy4gKi8KKwkJc2V0X2JpdChYODZfRkVBVFVSRV9DWVJJWF9BUlIsIGMtPng4Nl9jYXBhYmlsaXR5KTsKKwkJYnJlYWs7CisKKwljYXNlIDB4ZjogIC8qIEN5cml4IDQ4NiB3aXRob3V0IERFVklEIHJlZ2lzdGVycyAqLworCQlzd2l0Y2ggKGRpcjBfbHNuKSB7CisJCWNhc2UgMHhkOiAgLyogZWl0aGVyIGEgNDg2U0xDIG9yIERMQyB3L28gREVWSUQgKi8KKwkJCWRpcjBfbXNuID0gMDsKKwkJCXAgPSBDeDQ4Nl9uYW1lWyhjLT5oYXJkX21hdGgpID8gMSA6IDBdOworCQkJYnJlYWs7CisKKwkJY2FzZSAweGU6ICAvKiBhIDQ4NlMgQSBzdGVwICovCisJCQlkaXIwX21zbiA9IDA7CisJCQlwID0gQ3g0ODZTX25hbWVbMF07CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6ICAvKiB1bmtub3duIChzaG91bGRuJ3QgaGFwcGVuLCB3ZSBrbm93IGV2ZXJ5b25lIDstKSAqLworCQlkaXIwX21zbiA9IDc7CisJCWJyZWFrOworCX0KKwlzdHJjcHkoYnVmLCBDeDg2X21vZGVsW2RpcjBfbXNuICYgN10pOworCWlmIChwKSBzdHJjYXQoYnVmLCBwKTsKKwlyZXR1cm47Cit9CisKKy8qCisgKiBDeXJpeCBDUFVzIHdpdGhvdXQgY3B1aWQgb3Igd2l0aCBjcHVpZCBub3QgeWV0IGVuYWJsZWQgY2FuIGJlIGRldGVjdGVkCisgKiBieSB0aGUgZmFjdCB0aGF0IHRoZXkgcHJlc2VydmUgdGhlIGZsYWdzIGFjcm9zcyB0aGUgZGl2aXNpb24gb2YgNS8yLgorICogUElJIGFuZCBQUHJvIGV4aGliaXQgdGhpcyBiZWhhdmlvciB0b28sIGJ1dCB0aGV5IGhhdmUgY3B1aWQgYXZhaWxhYmxlLgorICovCisgCisvKgorICogUGVyZm9ybSB0aGUgQ3lyaXggNS8yIHRlc3QuIEEgQ3lyaXggd29uJ3QgY2hhbmdlCisgKiB0aGUgZmxhZ3MsIHdoaWxlIG90aGVyIDQ4NiBjaGlwcyB3aWxsLgorICovCitzdGF0aWMgaW5saW5lIGludCB0ZXN0X2N5cml4XzUyZGl2KHZvaWQpCit7CisJdW5zaWduZWQgaW50IHRlc3Q7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkgICAgICJzYWhmXG5cdCIJCS8qIGNsZWFyIGZsYWdzICglZWF4ID0gMHgwMDA1KSAqLworCSAgICAgImRpdiAlYjJcblx0IgkvKiBkaXZpZGUgNSBieSAyICovCisJICAgICAibGFoZiIJCS8qIHN0b3JlIGZsYWdzIGludG8gJWFoICovCisJICAgICA6ICI9YSIgKHRlc3QpCisJICAgICA6ICIwIiAoNSksICJxIiAoMikKKwkgICAgIDogImNjIik7CisKKwkvKiBBSCBpcyAweDAyIG9uIEN5cml4IGFmdGVyIHRoZSBkaXZpZGUuLiAqLworCXJldHVybiAodW5zaWduZWQgY2hhcikgKHRlc3QgPj4gOCkgPT0gMHgwMjsKK30KKworc3RhdGljIHZvaWQgY3lyaXhfaWRlbnRpZnkoc3RydWN0IGNwdWluZm9feDg2ICogYykKK3sKKwkvKiBEZXRlY3QgQ3lyaXggd2l0aCBkaXNhYmxlZCBDUFVJRCAqLworCWlmICggYy0+eDg2ID09IDQgJiYgdGVzdF9jeXJpeF81MmRpdigpICkgeworCQl1bnNpZ25lZCBjaGFyIGRpcjAsIGRpcjE7CisJCQorCQlzdHJjcHkoYy0+eDg2X3ZlbmRvcl9pZCwgIkN5cml4SW5zdGVhZCIpOworCSAgICAgICAgYy0+eDg2X3ZlbmRvciA9IFg4Nl9WRU5ET1JfQ1lSSVg7CisJICAgICAgICAKKwkgICAgICAgIC8qIEFjdHVhbGx5IGVuYWJsZSBjcHVpZCBvbiB0aGUgb2xkZXIgY3lyaXggKi8KKwkgICAgCisJICAgIAkvKiBSZXRyaWV2ZSBDUFUgcmV2aXNpb25zICovCisJICAgIAkKKwkJZG9fY3lyaXhfZGV2aWQoJmRpcjAsICZkaXIxKTsKKworCQlkaXIwPj49NDsJCQorCQkKKwkJLyogQ2hlY2sgaXQgaXMgYW4gYWZmZWN0ZWQgbW9kZWwgKi8KKwkJCisgICAJICAgICAgICBpZiAoZGlyMCA9PSA1IHx8IGRpcjAgPT0gMykKKyAgIAkgICAgICAgIHsKKwkJCXVuc2lnbmVkIGNoYXIgY2NyMywgY2NyNDsKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQlwcmludGsoS0VSTl9JTkZPICJFbmFibGluZyBDUFVJRCBvbiBDeXJpeCBwcm9jZXNzb3IuXG4iKTsKKwkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJCWNjcjMgPSBnZXRDeDg2KENYODZfQ0NSMyk7CisJCQlzZXRDeDg2KENYODZfQ0NSMywgKGNjcjMgJiAweDBmKSB8IDB4MTApOyAvKiBlbmFibGUgTUFQRU4gICovCisJCQljY3I0ID0gZ2V0Q3g4NihDWDg2X0NDUjQpOworCQkJc2V0Q3g4NihDWDg2X0NDUjQsIGNjcjQgfCAweDgwKTsgICAgICAgICAgLyogZW5hYmxlIGNwdWlkICAqLworCQkJc2V0Q3g4NihDWDg2X0NDUjMsIGNjcjMpOyAgICAgICAgICAgICAgICAgLyogZGlzYWJsZSBNQVBFTiAqLworCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQl9CisJfQorCWdlbmVyaWNfaWRlbnRpZnkoYyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3B1X2RldiBjeXJpeF9jcHVfZGV2IF9faW5pdGRhdGEgPSB7CisJLmNfdmVuZG9yCT0gIkN5cml4IiwKKwkuY19pZGVudCAJPSB7ICJDeXJpeEluc3RlYWQiIH0sCisJLmNfaW5pdAkJPSBpbml0X2N5cml4LAorCS5jX2lkZW50aWZ5CT0gY3lyaXhfaWRlbnRpZnksCit9OworCitpbnQgX19pbml0IGN5cml4X2luaXRfY3B1KHZvaWQpCit7CisJY3B1X2RldnNbWDg2X1ZFTkRPUl9DWVJJWF0gPSAmY3lyaXhfY3B1X2RldjsKKwlyZXR1cm4gMDsKK30KKworLy9lYXJseV9hcmNoX2luaXRjYWxsKGN5cml4X2luaXRfY3B1KTsKKworc3RhdGljIHN0cnVjdCBjcHVfZGV2IG5zY19jcHVfZGV2IF9faW5pdGRhdGEgPSB7CisJLmNfdmVuZG9yCT0gIk5TQyIsCisJLmNfaWRlbnQgCT0geyAiR2VvZGUgYnkgTlNDIiB9LAorCS5jX2luaXQJCT0gaW5pdF9jeXJpeCwKKwkuY19pZGVudGlmeQk9IGdlbmVyaWNfaWRlbnRpZnksCit9OworCitpbnQgX19pbml0IG5zY19pbml0X2NwdSh2b2lkKQoreworCWNwdV9kZXZzW1g4Nl9WRU5ET1JfTlNDXSA9ICZuc2NfY3B1X2RldjsKKwlyZXR1cm4gMDsKK30KKworLy9lYXJseV9hcmNoX2luaXRjYWxsKG5zY19pbml0X2NwdSk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9pbnRlbC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvaW50ZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGQ4NDdiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvaW50ZWwuYwpAQCAtMCwwICsxLDI0OCBAQAorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJjcHUuaCIKKworI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQworI2luY2x1ZGUgPGFzbS9tcHNwZWMuaD4KKyNpbmNsdWRlIDxhc20vYXBpYy5oPgorI2luY2x1ZGUgPG1hY2hfYXBpYy5oPgorI2VuZGlmCisKK2V4dGVybiBpbnQgdHJhcF9pbml0X2YwMGZfYnVnKHZvaWQpOworCisjaWZkZWYgQ09ORklHX1g4Nl9JTlRFTF9VU0VSQ09QWQorLyoKKyAqIEFsaWdubWVudCBhdCB3aGljaCBtb3ZzbCBpcyBwcmVmZXJyZWQgZm9yIGJ1bGsgbWVtb3J5IGNvcGllcy4KKyAqLworc3RydWN0IG1vdnNsX21hc2sgbW92c2xfbWFzazsKKyNlbmRpZgorCit2b2lkIF9faW5pdCBlYXJseV9pbnRlbF93b3JrYXJvdW5kKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKKwlpZiAoYy0+eDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0lOVEVMKQorCQlyZXR1cm47CisJLyogTmV0YnVyc3QgcmVwb3J0cyA2NCBieXRlcyBjbGZsdXNoIHNpemUsIGJ1dCBkb2VzIElPIGluIDEyOCBieXRlcyAqLworCWlmIChjLT54ODYgPT0gMTUgJiYgYy0+eDg2X2NhY2hlX2FsaWdubWVudCA9PSA2NCkKKwkJYy0+eDg2X2NhY2hlX2FsaWdubWVudCA9IDEyODsKK30KKworLyoKKyAqCUVhcmx5IHByb2JlIHN1cHBvcnQgbG9naWMgZm9yIHBwcm8gbWVtb3J5IGVycmF0dW0gIzUwCisgKgorICoJVGhpcyBpcyBjYWxsZWQgYmVmb3JlIHdlIGRvIGNwdSBpZGVudCB3b3JrCisgKi8KKyAKK2ludCBfX2luaXQgcHByb193aXRoX3JhbV9idWcodm9pZCkKK3sKKwkvKiBVc2VzIGRhdGEgZnJvbSBlYXJseV9jcHVfZGV0ZWN0IG5vdyAqLworCWlmIChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9JTlRFTCAmJgorCSAgICBib290X2NwdV9kYXRhLng4NiA9PSA2ICYmCisJICAgIGJvb3RfY3B1X2RhdGEueDg2X21vZGVsID09IDEgJiYKKwkgICAgYm9vdF9jcHVfZGF0YS54ODZfbWFzayA8IDgpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUGVudGl1bSBQcm8gd2l0aCBFcnJhdGEjNTAgZGV0ZWN0ZWQuIFRha2luZyBldmFzaXZlIGFjdGlvbi5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisJCisKKy8qCisgKiBQNCBYZW9uIGVycmF0YSAwMzcgd29ya2Fyb3VuZC4KKyAqIEhhcmR3YXJlIHByZWZldGNoZXIgbWF5IGNhdXNlIHN0YWxlIGRhdGEgdG8gYmUgbG9hZGVkIGludG8gdGhlIGNhY2hlLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgSW50ZWxfZXJyYXRhX3dvcmthcm91bmRzKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKKwl1bnNpZ25lZCBsb25nIGxvLCBoaTsKKworCWlmICgoYy0+eDg2ID09IDE1KSAmJiAoYy0+eDg2X21vZGVsID09IDEpICYmIChjLT54ODZfbWFzayA9PSAxKSkgeworCQlyZG1zciAoTVNSX0lBMzJfTUlTQ19FTkFCTEUsIGxvLCBoaSk7CisJCWlmICgobG8gJiAoMTw8OSkpID09IDApIHsKKwkJCXByaW50ayAoS0VSTl9JTkZPICJDUFU6IEMwIHN0ZXBwaW5nIFA0IFhlb24gZGV0ZWN0ZWQuXG4iKTsKKwkJCXByaW50ayAoS0VSTl9JTkZPICJDUFU6IERpc2FibGluZyBoYXJkd2FyZSBwcmVmZXRjaGluZyAoRXJyYXRhIDAzNylcbiIpOworCQkJbG8gfD0gKDE8PDkpOwkvKiBEaXNhYmxlIGh3IHByZWZldGNoaW5nICovCisJCQl3cm1zciAoTVNSX0lBMzJfTUlTQ19FTkFCTEUsIGxvLCBoaSk7CisJCX0KKwl9Cit9CisKKworc3RhdGljIHZvaWQgX19pbml0IGluaXRfaW50ZWwoc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworCXVuc2lnbmVkIGludCBsMiA9IDA7CisJY2hhciAqcCA9IE5VTEw7CisKKyNpZmRlZiBDT05GSUdfWDg2X0YwMEZfQlVHCisJLyoKKwkgKiBBbGwgY3VycmVudCBtb2RlbHMgb2YgUGVudGl1bSBhbmQgUGVudGl1bSB3aXRoIE1NWCB0ZWNobm9sb2d5IENQVXMKKwkgKiBoYXZlIHRoZSBGMCAwRiBidWcsIHdoaWNoIGxldHMgbm9ucHJpdmlsZWdlZCB1c2VycyBsb2NrIHVwIHRoZSBzeXN0ZW0uCisJICogTm90ZSB0aGF0IHRoZSB3b3JrYXJvdW5kIG9ubHkgc2hvdWxkIGJlIGluaXRpYWxpemVkIG9uY2UuLi4KKwkgKi8KKwljLT5mMDBmX2J1ZyA9IDA7CisJaWYgKCBjLT54ODYgPT0gNSApIHsKKwkJc3RhdGljIGludCBmMDBmX3dvcmthcm91bmRfZW5hYmxlZCA9IDA7CisKKwkJYy0+ZjAwZl9idWcgPSAxOworCQlpZiAoICFmMDBmX3dvcmthcm91bmRfZW5hYmxlZCApIHsKKwkJCXRyYXBfaW5pdF9mMDBmX2J1ZygpOworCQkJcHJpbnRrKEtFUk5fTk9USUNFICJJbnRlbCBQZW50aXVtIHdpdGggRjAgMEYgYnVnIC0gd29ya2Fyb3VuZCBlbmFibGVkLlxuIik7CisJCQlmMDBmX3dvcmthcm91bmRfZW5hYmxlZCA9IDE7CisJCX0KKwl9CisjZW5kaWYKKworCXNlbGVjdF9pZGxlX3JvdXRpbmUoYyk7CisJbDIgPSBpbml0X2ludGVsX2NhY2hlaW5mbyhjKTsKKworCS8qIFNFUCBDUFVJRCBidWc6IFBlbnRpdW0gUHJvIHJlcG9ydHMgU0VQIGJ1dCBkb2Vzbid0IGhhdmUgaXQgdW50aWwgbW9kZWwgMyBtYXNrIDMgKi8KKwlpZiAoKGMtPng4Njw8OCB8IGMtPng4Nl9tb2RlbDw8NCB8IGMtPng4Nl9tYXNrKSA8IDB4NjMzKQorCQljbGVhcl9iaXQoWDg2X0ZFQVRVUkVfU0VQLCBjLT54ODZfY2FwYWJpbGl0eSk7CisKKwkvKiBOYW1lcyBmb3IgdGhlIFBlbnRpdW0gSUkvQ2VsZXJvbiBwcm9jZXNzb3JzIAorCSAgIGRldGVjdGFibGUgb25seSBieSBhbHNvIGNoZWNraW5nIHRoZSBjYWNoZSBzaXplLgorCSAgIERpeG9uIGlzIE5PVCBhIENlbGVyb24uICovCisJaWYgKGMtPng4NiA9PSA2KSB7CisJCXN3aXRjaCAoYy0+eDg2X21vZGVsKSB7CisJCWNhc2UgNToKKwkJCWlmIChjLT54ODZfbWFzayA9PSAwKSB7CisJCQkJaWYgKGwyID09IDApCisJCQkJCXAgPSAiQ2VsZXJvbiAoQ292aW5ndG9uKSI7CisJCQkJZWxzZSBpZiAobDIgPT0gMjU2KQorCQkJCQlwID0gIk1vYmlsZSBQZW50aXVtIElJIChEaXhvbikiOworCQkJfQorCQkJYnJlYWs7CisJCQkKKwkJY2FzZSA2OgorCQkJaWYgKGwyID09IDEyOCkKKwkJCQlwID0gIkNlbGVyb24gKE1lbmRvY2lubykiOworCQkJZWxzZSBpZiAoYy0+eDg2X21hc2sgPT0gMCB8fCBjLT54ODZfbWFzayA9PSA1KQorCQkJCXAgPSAiQ2VsZXJvbi1BIjsKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgODoKKwkJCWlmIChsMiA9PSAxMjgpCisJCQkJcCA9ICJDZWxlcm9uIChDb3BwZXJtaW5lKSI7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICggcCApCisJCXN0cmNweShjLT54ODZfbW9kZWxfaWQsIHApOworCQorCWRldGVjdF9odChjKTsKKworCS8qIFdvcmsgYXJvdW5kIGVycmF0YSAqLworCUludGVsX2VycmF0YV93b3JrYXJvdW5kcyhjKTsKKworI2lmZGVmIENPTkZJR19YODZfSU5URUxfVVNFUkNPUFkKKwkvKgorCSAqIFNldCB1cCB0aGUgcHJlZmVycmVkIGFsaWdubWVudCBmb3IgbW92c2wgYnVsayBtZW1vcnkgbW92ZXMKKwkgKi8KKwlzd2l0Y2ggKGMtPng4NikgeworCWNhc2UgNDoJCS8qIDQ4NjogdW50ZXN0ZWQgKi8KKwkJYnJlYWs7CisJY2FzZSA1OgkJLyogT2xkIFBlbnRpYTogdW50ZXN0ZWQgKi8KKwkJYnJlYWs7CisJY2FzZSA2OgkJLyogUElJL1BJSUkgb25seSBsaWtlIG1vdnNsIHdpdGggOC1ieXRlIGFsaWdubWVudCAqLworCQltb3ZzbF9tYXNrLm1hc2sgPSA3OworCQlicmVhazsKKwljYXNlIDE1OgkvKiBQNCBpcyBPSyBkb3duIHRvIDgtYnl0ZSBhbGlnbm1lbnQgKi8KKwkJbW92c2xfbWFzay5tYXNrID0gNzsKKwkJYnJlYWs7CisJfQorI2VuZGlmCisKKwlpZiAoYy0+eDg2ID09IDE1KSAKKwkJc2V0X2JpdChYODZfRkVBVFVSRV9QNCwgYy0+eDg2X2NhcGFiaWxpdHkpOworCWlmIChjLT54ODYgPT0gNikgCisJCXNldF9iaXQoWDg2X0ZFQVRVUkVfUDMsIGMtPng4Nl9jYXBhYmlsaXR5KTsKK30KKworCitzdGF0aWMgdW5zaWduZWQgaW50IGludGVsX3NpemVfY2FjaGUoc3RydWN0IGNwdWluZm9feDg2ICogYywgdW5zaWduZWQgaW50IHNpemUpCit7CisJLyogSW50ZWwgUElJSSBUdWFsYXRpbi4gVGhpcyBjb21lcyBpbiB0d28gZmxhdm91cnMuCisJICogT25lIGhhcyAyNTZrYiBvZiBjYWNoZSwgdGhlIG90aGVyIDUxMi4gV2UgaGF2ZSBubyB3YXkKKwkgKiB0byBkZXRlcm1pbmUgd2hpY2gsIHNvIHdlIHVzZSBhIGJvb3R0aW1lIG92ZXJyaWRlCisJICogZm9yIHRoZSA1MTJrYiBtb2RlbCwgYW5kIGFzc3VtZSAyNTYgb3RoZXJ3aXNlLgorCSAqLworCWlmICgoYy0+eDg2ID09IDYpICYmIChjLT54ODZfbW9kZWwgPT0gMTEpICYmIChzaXplID09IDApKQorCQlzaXplID0gMjU2OworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3RydWN0IGNwdV9kZXYgaW50ZWxfY3B1X2RldiBfX2luaXRkYXRhID0geworCS5jX3ZlbmRvcgk9ICJJbnRlbCIsCisJLmNfaWRlbnQgCT0geyAiR2VudWluZUludGVsIiB9LAorCS5jX21vZGVscyA9IHsKKwkJeyAudmVuZG9yID0gWDg2X1ZFTkRPUl9JTlRFTCwgLmZhbWlseSA9IDQsIC5tb2RlbF9uYW1lcyA9IAorCQkgIHsgCisJCQkgIFswXSA9ICI0ODYgRFgtMjUvMzMiLCAKKwkJCSAgWzFdID0gIjQ4NiBEWC01MCIsIAorCQkJICBbMl0gPSAiNDg2IFNYIiwgCisJCQkgIFszXSA9ICI0ODYgRFgvMiIsIAorCQkJICBbNF0gPSAiNDg2IFNMIiwgCisJCQkgIFs1XSA9ICI0ODYgU1gvMiIsIAorCQkJICBbN10gPSAiNDg2IERYLzItV0IiLCAKKwkJCSAgWzhdID0gIjQ4NiBEWC80IiwgCisJCQkgIFs5XSA9ICI0ODYgRFgvNC1XQiIKKwkJICB9CisJCX0sCisJCXsgLnZlbmRvciA9IFg4Nl9WRU5ET1JfSU5URUwsIC5mYW1pbHkgPSA1LCAubW9kZWxfbmFtZXMgPQorCQkgIHsgCisJCQkgIFswXSA9ICJQZW50aXVtIDYwLzY2IEEtc3RlcCIsIAorCQkJICBbMV0gPSAiUGVudGl1bSA2MC82NiIsIAorCQkJICBbMl0gPSAiUGVudGl1bSA3NSAtIDIwMCIsCisJCQkgIFszXSA9ICJPdmVyRHJpdmUgUE9EUDVWODMiLCAKKwkJCSAgWzRdID0gIlBlbnRpdW0gTU1YIiwKKwkJCSAgWzddID0gIk1vYmlsZSBQZW50aXVtIDc1IC0gMjAwIiwgCisJCQkgIFs4XSA9ICJNb2JpbGUgUGVudGl1bSBNTVgiCisJCSAgfQorCQl9LAorCQl7IC52ZW5kb3IgPSBYODZfVkVORE9SX0lOVEVMLCAuZmFtaWx5ID0gNiwgLm1vZGVsX25hbWVzID0KKwkJICB7IAorCQkJICBbMF0gPSAiUGVudGl1bSBQcm8gQS1zdGVwIiwKKwkJCSAgWzFdID0gIlBlbnRpdW0gUHJvIiwgCisJCQkgIFszXSA9ICJQZW50aXVtIElJIChLbGFtYXRoKSIsIAorCQkJICBbNF0gPSAiUGVudGl1bSBJSSAoRGVzY2h1dGVzKSIsIAorCQkJICBbNV0gPSAiUGVudGl1bSBJSSAoRGVzY2h1dGVzKSIsIAorCQkJICBbNl0gPSAiTW9iaWxlIFBlbnRpdW0gSUkiLAorCQkJICBbN10gPSAiUGVudGl1bSBJSUkgKEthdG1haSkiLCAKKwkJCSAgWzhdID0gIlBlbnRpdW0gSUlJIChDb3BwZXJtaW5lKSIsIAorCQkJICBbMTBdID0gIlBlbnRpdW0gSUlJIChDYXNjYWRlcykiLAorCQkJICBbMTFdID0gIlBlbnRpdW0gSUlJIChUdWFsYXRpbikiLAorCQkgIH0KKwkJfSwKKwkJeyAudmVuZG9yID0gWDg2X1ZFTkRPUl9JTlRFTCwgLmZhbWlseSA9IDE1LCAubW9kZWxfbmFtZXMgPQorCQkgIHsKKwkJCSAgWzBdID0gIlBlbnRpdW0gNCAoVW5rbm93bikiLAorCQkJICBbMV0gPSAiUGVudGl1bSA0IChXaWxsYW1ldHRlKSIsCisJCQkgIFsyXSA9ICJQZW50aXVtIDQgKE5vcnRod29vZCkiLAorCQkJICBbNF0gPSAiUGVudGl1bSA0IChGb3N0ZXIpIiwKKwkJCSAgWzVdID0gIlBlbnRpdW0gNCAoRm9zdGVyKSIsCisJCSAgfQorCQl9LAorCX0sCisJLmNfaW5pdAkJPSBpbml0X2ludGVsLAorCS5jX2lkZW50aWZ5CT0gZ2VuZXJpY19pZGVudGlmeSwKKwkuY19zaXplX2NhY2hlCT0gaW50ZWxfc2l6ZV9jYWNoZSwKK307CisKK19faW5pdCBpbnQgaW50ZWxfY3B1X2luaXQodm9pZCkKK3sKKwljcHVfZGV2c1tYODZfVkVORE9SX0lOVEVMXSA9ICZpbnRlbF9jcHVfZGV2OworCXJldHVybiAwOworfQorCisvLyBhcmNoX2luaXRjYWxsKGludGVsX2NwdV9pbml0KTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvaW50ZWxfY2FjaGVpbmZvLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9pbnRlbF9jYWNoZWluZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWI1YjRlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvaW50ZWxfY2FjaGVpbmZvLmMKQEAgLTAsMCArMSw1OTggQEAKKy8qCisgKiAgICAgIFJvdXRpbmVzIHRvIGluZGVudGlmeSBjYWNoZXMgb24gSW50ZWwgQ1BVLgorICoKKyAqICAgICAgQ2hhbmdlczoKKyAqICAgICAgVmVua2F0ZXNoIFBhbGxpcGFkaQk6IEFkZGluZyBjYWNoZSBpZGVudGlmaWNhdGlvbiB0aHJvdWdoIGNwdWlkKDQpCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vc21wLmg+CisKKyNkZWZpbmUgTFZMXzFfSU5TVAkxCisjZGVmaW5lIExWTF8xX0RBVEEJMgorI2RlZmluZSBMVkxfMgkJMworI2RlZmluZSBMVkxfMwkJNAorI2RlZmluZSBMVkxfVFJBQ0UJNQorCitzdHJ1Y3QgX2NhY2hlX3RhYmxlCit7CisJdW5zaWduZWQgY2hhciBkZXNjcmlwdG9yOworCWNoYXIgY2FjaGVfdHlwZTsKKwlzaG9ydCBzaXplOworfTsKKworLyogYWxsIHRoZSBjYWNoZSBkZXNjcmlwdG9yIHR5cGVzIHdlIGNhcmUgYWJvdXQgKG5vIFRMQiBvciB0cmFjZSBjYWNoZSBlbnRyaWVzKSAqLworc3RhdGljIHN0cnVjdCBfY2FjaGVfdGFibGUgY2FjaGVfdGFibGVbXSBfX2luaXRkYXRhID0KK3sKKwl7IDB4MDYsIExWTF8xX0lOU1QsIDggfSwJLyogNC13YXkgc2V0IGFzc29jLCAzMiBieXRlIGxpbmUgc2l6ZSAqLworCXsgMHgwOCwgTFZMXzFfSU5TVCwgMTYgfSwJLyogNC13YXkgc2V0IGFzc29jLCAzMiBieXRlIGxpbmUgc2l6ZSAqLworCXsgMHgwYSwgTFZMXzFfREFUQSwgOCB9LAkvKiAyIHdheSBzZXQgYXNzb2MsIDMyIGJ5dGUgbGluZSBzaXplICovCisJeyAweDBjLCBMVkxfMV9EQVRBLCAxNiB9LAkvKiA0LXdheSBzZXQgYXNzb2MsIDMyIGJ5dGUgbGluZSBzaXplICovCisJeyAweDIyLCBMVkxfMywgICAgICA1MTIgfSwJLyogNC13YXkgc2V0IGFzc29jLCBzZWN0b3JlZCBjYWNoZSwgNjQgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4MjMsIExWTF8zLCAgICAgIDEwMjQgfSwJLyogOC13YXkgc2V0IGFzc29jLCBzZWN0b3JlZCBjYWNoZSwgNjQgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4MjUsIExWTF8zLCAgICAgIDIwNDggfSwJLyogOC13YXkgc2V0IGFzc29jLCBzZWN0b3JlZCBjYWNoZSwgNjQgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4MjksIExWTF8zLCAgICAgIDQwOTYgfSwJLyogOC13YXkgc2V0IGFzc29jLCBzZWN0b3JlZCBjYWNoZSwgNjQgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4MmMsIExWTF8xX0RBVEEsIDMyIH0sCS8qIDgtd2F5IHNldCBhc3NvYywgNjQgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4MzAsIExWTF8xX0lOU1QsIDMyIH0sCS8qIDgtd2F5IHNldCBhc3NvYywgNjQgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4MzksIExWTF8yLCAgICAgIDEyOCB9LAkvKiA0LXdheSBzZXQgYXNzb2MsIHNlY3RvcmVkIGNhY2hlLCA2NCBieXRlIGxpbmUgc2l6ZSAqLworCXsgMHgzYiwgTFZMXzIsICAgICAgMTI4IH0sCS8qIDItd2F5IHNldCBhc3NvYywgc2VjdG9yZWQgY2FjaGUsIDY0IGJ5dGUgbGluZSBzaXplICovCisJeyAweDNjLCBMVkxfMiwgICAgICAyNTYgfSwJLyogNC13YXkgc2V0IGFzc29jLCBzZWN0b3JlZCBjYWNoZSwgNjQgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4NDEsIExWTF8yLCAgICAgIDEyOCB9LAkvKiA0LXdheSBzZXQgYXNzb2MsIDMyIGJ5dGUgbGluZSBzaXplICovCisJeyAweDQyLCBMVkxfMiwgICAgICAyNTYgfSwJLyogNC13YXkgc2V0IGFzc29jLCAzMiBieXRlIGxpbmUgc2l6ZSAqLworCXsgMHg0MywgTFZMXzIsICAgICAgNTEyIH0sCS8qIDQtd2F5IHNldCBhc3NvYywgMzIgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4NDQsIExWTF8yLCAgICAgIDEwMjQgfSwJLyogNC13YXkgc2V0IGFzc29jLCAzMiBieXRlIGxpbmUgc2l6ZSAqLworCXsgMHg0NSwgTFZMXzIsICAgICAgMjA0OCB9LAkvKiA0LXdheSBzZXQgYXNzb2MsIDMyIGJ5dGUgbGluZSBzaXplICovCisJeyAweDYwLCBMVkxfMV9EQVRBLCAxNiB9LAkvKiA4LXdheSBzZXQgYXNzb2MsIHNlY3RvcmVkIGNhY2hlLCA2NCBieXRlIGxpbmUgc2l6ZSAqLworCXsgMHg2NiwgTFZMXzFfREFUQSwgOCB9LAkvKiA0LXdheSBzZXQgYXNzb2MsIHNlY3RvcmVkIGNhY2hlLCA2NCBieXRlIGxpbmUgc2l6ZSAqLworCXsgMHg2NywgTFZMXzFfREFUQSwgMTYgfSwJLyogNC13YXkgc2V0IGFzc29jLCBzZWN0b3JlZCBjYWNoZSwgNjQgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4NjgsIExWTF8xX0RBVEEsIDMyIH0sCS8qIDQtd2F5IHNldCBhc3NvYywgc2VjdG9yZWQgY2FjaGUsIDY0IGJ5dGUgbGluZSBzaXplICovCisJeyAweDcwLCBMVkxfVFJBQ0UsICAxMiB9LAkvKiA4LXdheSBzZXQgYXNzb2MgKi8KKwl7IDB4NzEsIExWTF9UUkFDRSwgIDE2IH0sCS8qIDgtd2F5IHNldCBhc3NvYyAqLworCXsgMHg3MiwgTFZMX1RSQUNFLCAgMzIgfSwJLyogOC13YXkgc2V0IGFzc29jICovCisJeyAweDc4LCBMVkxfMiwgICAgMTAyNCB9LAkvKiA0LXdheSBzZXQgYXNzb2MsIDY0IGJ5dGUgbGluZSBzaXplICovCisJeyAweDc5LCBMVkxfMiwgICAgIDEyOCB9LAkvKiA4LXdheSBzZXQgYXNzb2MsIHNlY3RvcmVkIGNhY2hlLCA2NCBieXRlIGxpbmUgc2l6ZSAqLworCXsgMHg3YSwgTFZMXzIsICAgICAyNTYgfSwJLyogOC13YXkgc2V0IGFzc29jLCBzZWN0b3JlZCBjYWNoZSwgNjQgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4N2IsIExWTF8yLCAgICAgNTEyIH0sCS8qIDgtd2F5IHNldCBhc3NvYywgc2VjdG9yZWQgY2FjaGUsIDY0IGJ5dGUgbGluZSBzaXplICovCisJeyAweDdjLCBMVkxfMiwgICAgMTAyNCB9LAkvKiA4LXdheSBzZXQgYXNzb2MsIHNlY3RvcmVkIGNhY2hlLCA2NCBieXRlIGxpbmUgc2l6ZSAqLworCXsgMHg3ZCwgTFZMXzIsICAgIDIwNDggfSwJLyogOC13YXkgc2V0IGFzc29jLCA2NCBieXRlIGxpbmUgc2l6ZSAqLworCXsgMHg3ZiwgTFZMXzIsICAgICA1MTIgfSwJLyogMi13YXkgc2V0IGFzc29jLCA2NCBieXRlIGxpbmUgc2l6ZSAqLworCXsgMHg4MiwgTFZMXzIsICAgICAyNTYgfSwJLyogOC13YXkgc2V0IGFzc29jLCAzMiBieXRlIGxpbmUgc2l6ZSAqLworCXsgMHg4MywgTFZMXzIsICAgICA1MTIgfSwJLyogOC13YXkgc2V0IGFzc29jLCAzMiBieXRlIGxpbmUgc2l6ZSAqLworCXsgMHg4NCwgTFZMXzIsICAgIDEwMjQgfSwJLyogOC13YXkgc2V0IGFzc29jLCAzMiBieXRlIGxpbmUgc2l6ZSAqLworCXsgMHg4NSwgTFZMXzIsICAgIDIwNDggfSwJLyogOC13YXkgc2V0IGFzc29jLCAzMiBieXRlIGxpbmUgc2l6ZSAqLworCXsgMHg4NiwgTFZMXzIsICAgICA1MTIgfSwJLyogNC13YXkgc2V0IGFzc29jLCA2NCBieXRlIGxpbmUgc2l6ZSAqLworCXsgMHg4NywgTFZMXzIsICAgIDEwMjQgfSwJLyogOC13YXkgc2V0IGFzc29jLCA2NCBieXRlIGxpbmUgc2l6ZSAqLworCXsgMHgwMCwgMCwgMH0KK307CisKKworZW51bSBfY2FjaGVfdHlwZQoreworCUNBQ0hFX1RZUEVfTlVMTAk9IDAsCisJQ0FDSEVfVFlQRV9EQVRBID0gMSwKKwlDQUNIRV9UWVBFX0lOU1QgPSAyLAorCUNBQ0hFX1RZUEVfVU5JRklFRCA9IDMKK307CisKK3VuaW9uIF9jcHVpZDRfbGVhZl9lYXggeworCXN0cnVjdCB7CisJCWVudW0gX2NhY2hlX3R5cGUJdHlwZTo1OworCQl1bnNpZ25lZCBpbnQJCWxldmVsOjM7CisJCXVuc2lnbmVkIGludAkJaXNfc2VsZl9pbml0aWFsaXppbmc6MTsKKwkJdW5zaWduZWQgaW50CQlpc19mdWxseV9hc3NvY2lhdGl2ZToxOworCQl1bnNpZ25lZCBpbnQJCXJlc2VydmVkOjQ7CisJCXVuc2lnbmVkIGludAkJbnVtX3RocmVhZHNfc2hhcmluZzoxMjsKKwkJdW5zaWduZWQgaW50CQludW1fY29yZXNfb25fZGllOjY7CisJfSBzcGxpdDsKKwl1MzIgZnVsbDsKK307CisKK3VuaW9uIF9jcHVpZDRfbGVhZl9lYnggeworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGludAkJY29oZXJlbmN5X2xpbmVfc2l6ZToxMjsKKwkJdW5zaWduZWQgaW50CQlwaHlzaWNhbF9saW5lX3BhcnRpdGlvbjoxMDsKKwkJdW5zaWduZWQgaW50CQl3YXlzX29mX2Fzc29jaWF0aXZpdHk6MTA7CisJfSBzcGxpdDsKKwl1MzIgZnVsbDsKK307CisKK3VuaW9uIF9jcHVpZDRfbGVhZl9lY3ggeworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGludAkJbnVtYmVyX29mX3NldHM6MzI7CisJfSBzcGxpdDsKKwl1MzIgZnVsbDsKK307CisKK3N0cnVjdCBfY3B1aWQ0X2luZm8geworCXVuaW9uIF9jcHVpZDRfbGVhZl9lYXggZWF4OworCXVuaW9uIF9jcHVpZDRfbGVhZl9lYnggZWJ4OworCXVuaW9uIF9jcHVpZDRfbGVhZl9lY3ggZWN4OworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwljcHVtYXNrX3Qgc2hhcmVkX2NwdV9tYXA7Cit9OworCisjZGVmaW5lIE1BWF9DQUNIRV9MRUFWRVMJCTQKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBfX2RldmluaXRkYXRhCW51bV9jYWNoZV9sZWF2ZXM7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGNwdWlkNF9jYWNoZV9sb29rdXAoaW50IGluZGV4LCBzdHJ1Y3QgX2NwdWlkNF9pbmZvICp0aGlzX2xlYWYpCit7CisJdW5zaWduZWQgaW50CQllYXgsIGVieCwgZWN4LCBlZHg7CisJdW5pb24gX2NwdWlkNF9sZWFmX2VheAljYWNoZV9lYXg7CisKKwljcHVpZF9jb3VudCg0LCBpbmRleCwgJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7CisJY2FjaGVfZWF4LmZ1bGwgPSBlYXg7CisJaWYgKGNhY2hlX2VheC5zcGxpdC50eXBlID09IENBQ0hFX1RZUEVfTlVMTCkKKwkJcmV0dXJuIC0xOworCisJdGhpc19sZWFmLT5lYXguZnVsbCA9IGVheDsKKwl0aGlzX2xlYWYtPmVieC5mdWxsID0gZWJ4OworCXRoaXNfbGVhZi0+ZWN4LmZ1bGwgPSBlY3g7CisJdGhpc19sZWFmLT5zaXplID0gKHRoaXNfbGVhZi0+ZWN4LnNwbGl0Lm51bWJlcl9vZl9zZXRzICsgMSkgKgorCQkodGhpc19sZWFmLT5lYnguc3BsaXQuY29oZXJlbmN5X2xpbmVfc2l6ZSArIDEpICoKKwkJKHRoaXNfbGVhZi0+ZWJ4LnNwbGl0LnBoeXNpY2FsX2xpbmVfcGFydGl0aW9uICsgMSkgKgorCQkodGhpc19sZWFmLT5lYnguc3BsaXQud2F5c19vZl9hc3NvY2lhdGl2aXR5ICsgMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGZpbmRfbnVtX2NhY2hlX2xlYXZlcyh2b2lkKQoreworCXVuc2lnbmVkIGludAkJZWF4LCBlYngsIGVjeCwgZWR4OworCXVuaW9uIF9jcHVpZDRfbGVhZl9lYXgJY2FjaGVfZWF4OworCWludCAJCQlpOworCWludCAJCQlyZXR2YWw7CisKKwlyZXR2YWwgPSBNQVhfQ0FDSEVfTEVBVkVTOworCS8qIERvIGNwdWlkKDQpIGxvb3AgdG8gZmluZCBvdXQgbnVtX2NhY2hlX2xlYXZlcyAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ0FDSEVfTEVBVkVTOyBpKyspIHsKKwkJY3B1aWRfY291bnQoNCwgaSwgJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7CisJCWNhY2hlX2VheC5mdWxsID0gZWF4OworCQlpZiAoY2FjaGVfZWF4LnNwbGl0LnR5cGUgPT0gQ0FDSEVfVFlQRV9OVUxMKSB7CisJCQlyZXR2YWwgPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKwordW5zaWduZWQgaW50IF9faW5pdCBpbml0X2ludGVsX2NhY2hlaW5mbyhzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJdW5zaWduZWQgaW50IHRyYWNlID0gMCwgbDFpID0gMCwgbDFkID0gMCwgbDIgPSAwLCBsMyA9IDA7IC8qIENhY2hlIHNpemVzICovCisJdW5zaWduZWQgaW50IG5ld19sMWQgPSAwLCBuZXdfbDFpID0gMDsgLyogQ2FjaGUgc2l6ZXMgZnJvbSBjcHVpZCg0KSAqLworCXVuc2lnbmVkIGludCBuZXdfbDIgPSAwLCBuZXdfbDMgPSAwLCBpOyAvKiBDYWNoZSBzaXplcyBmcm9tIGNwdWlkKDQpICovCisKKwlpZiAoYy0+Y3B1aWRfbGV2ZWwgPiA0KSB7CisJCXN0YXRpYyBpbnQgaXNfaW5pdGlhbGl6ZWQ7CisKKwkJaWYgKGlzX2luaXRpYWxpemVkID09IDApIHsKKwkJCS8qIEluaXQgbnVtX2NhY2hlX2xlYXZlcyBmcm9tIGJvb3QgQ1BVICovCisJCQludW1fY2FjaGVfbGVhdmVzID0gZmluZF9udW1fY2FjaGVfbGVhdmVzKCk7CisJCQlpc19pbml0aWFsaXplZCsrOworCQl9CisKKwkJLyoKKwkJICogV2hlbmV2ZXIgcG9zc2libGUgdXNlIGNwdWlkKDQpLCBkZXRlcm1pbmlzdGljIGNhY2hlCisJCSAqIHBhcmFtZXRlcnMgY3B1aWQgbGVhZiB0byBmaW5kIHRoZSBjYWNoZSBkZXRhaWxzCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2NhY2hlX2xlYXZlczsgaSsrKSB7CisJCQlzdHJ1Y3QgX2NwdWlkNF9pbmZvIHRoaXNfbGVhZjsKKworCQkJaW50IHJldHZhbDsKKworCQkJcmV0dmFsID0gY3B1aWQ0X2NhY2hlX2xvb2t1cChpLCAmdGhpc19sZWFmKTsKKwkJCWlmIChyZXR2YWwgPj0gMCkgeworCQkJCXN3aXRjaCh0aGlzX2xlYWYuZWF4LnNwbGl0LmxldmVsKSB7CisJCQkJICAgIGNhc2UgMToKKwkJCQkJaWYgKHRoaXNfbGVhZi5lYXguc3BsaXQudHlwZSA9PQorCQkJCQkJCUNBQ0hFX1RZUEVfREFUQSkKKwkJCQkJCW5ld19sMWQgPSB0aGlzX2xlYWYuc2l6ZS8xMDI0OworCQkJCQllbHNlIGlmICh0aGlzX2xlYWYuZWF4LnNwbGl0LnR5cGUgPT0KKwkJCQkJCQlDQUNIRV9UWVBFX0lOU1QpCisJCQkJCQluZXdfbDFpID0gdGhpc19sZWFmLnNpemUvMTAyNDsKKwkJCQkJYnJlYWs7CisJCQkJICAgIGNhc2UgMjoKKwkJCQkJbmV3X2wyID0gdGhpc19sZWFmLnNpemUvMTAyNDsKKwkJCQkJYnJlYWs7CisJCQkJICAgIGNhc2UgMzoKKwkJCQkJbmV3X2wzID0gdGhpc19sZWFmLnNpemUvMTAyNDsKKwkJCQkJYnJlYWs7CisJCQkJICAgIGRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZiAoYy0+Y3B1aWRfbGV2ZWwgPiAxKSB7CisJCS8qIHN1cHBvcnRzIGVheD0yICBjYWxsICovCisJCWludCBpLCBqLCBuOworCQlpbnQgcmVnc1s0XTsKKwkJdW5zaWduZWQgY2hhciAqZHAgPSAodW5zaWduZWQgY2hhciAqKXJlZ3M7CisKKwkJLyogTnVtYmVyIG9mIHRpbWVzIHRvIGl0ZXJhdGUgKi8KKwkJbiA9IGNwdWlkX2VheCgyKSAmIDB4RkY7CisKKwkJZm9yICggaSA9IDAgOyBpIDwgbiA7IGkrKyApIHsKKwkJCWNwdWlkKDIsICZyZWdzWzBdLCAmcmVnc1sxXSwgJnJlZ3NbMl0sICZyZWdzWzNdKTsKKworCQkJLyogSWYgYml0IDMxIGlzIHNldCwgdGhpcyBpcyBhbiB1bmtub3duIGZvcm1hdCAqLworCQkJZm9yICggaiA9IDAgOyBqIDwgMyA7IGorKyApIHsKKwkJCQlpZiAoIHJlZ3Nbal0gPCAwICkgcmVnc1tqXSA9IDA7CisJCQl9CisKKwkJCS8qIEJ5dGUgMCBpcyBsZXZlbCBjb3VudCwgbm90IGEgZGVzY3JpcHRvciAqLworCQkJZm9yICggaiA9IDEgOyBqIDwgMTYgOyBqKysgKSB7CisJCQkJdW5zaWduZWQgY2hhciBkZXMgPSBkcFtqXTsKKwkJCQl1bnNpZ25lZCBjaGFyIGsgPSAwOworCisJCQkJLyogbG9vayB1cCB0aGlzIGRlc2NyaXB0b3IgaW4gdGhlIHRhYmxlICovCisJCQkJd2hpbGUgKGNhY2hlX3RhYmxlW2tdLmRlc2NyaXB0b3IgIT0gMCkKKwkJCQl7CisJCQkJCWlmIChjYWNoZV90YWJsZVtrXS5kZXNjcmlwdG9yID09IGRlcykgeworCQkJCQkJc3dpdGNoIChjYWNoZV90YWJsZVtrXS5jYWNoZV90eXBlKSB7CisJCQkJCQljYXNlIExWTF8xX0lOU1Q6CisJCQkJCQkJbDFpICs9IGNhY2hlX3RhYmxlW2tdLnNpemU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIExWTF8xX0RBVEE6CisJCQkJCQkJbDFkICs9IGNhY2hlX3RhYmxlW2tdLnNpemU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIExWTF8yOgorCQkJCQkJCWwyICs9IGNhY2hlX3RhYmxlW2tdLnNpemU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIExWTF8zOgorCQkJCQkJCWwzICs9IGNhY2hlX3RhYmxlW2tdLnNpemU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIExWTF9UUkFDRToKKwkJCQkJCQl0cmFjZSArPSBjYWNoZV90YWJsZVtrXS5zaXplOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCWsrKzsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAobmV3X2wxZCkKKwkJCWwxZCA9IG5ld19sMWQ7CisKKwkJaWYgKG5ld19sMWkpCisJCQlsMWkgPSBuZXdfbDFpOworCisJCWlmIChuZXdfbDIpCisJCQlsMiA9IG5ld19sMjsKKworCQlpZiAobmV3X2wzKQorCQkJbDMgPSBuZXdfbDM7CisKKwkJaWYgKCB0cmFjZSApCisJCQlwcmludGsgKEtFUk5fSU5GTyAiQ1BVOiBUcmFjZSBjYWNoZTogJWRLIHVvcHMiLCB0cmFjZSk7CisJCWVsc2UgaWYgKCBsMWkgKQorCQkJcHJpbnRrIChLRVJOX0lORk8gIkNQVTogTDEgSSBjYWNoZTogJWRLIiwgbDFpKTsKKwkJaWYgKCBsMWQgKQorCQkJcHJpbnRrKCIsIEwxIEQgY2FjaGU6ICVkS1xuIiwgbDFkKTsKKwkJZWxzZQorCQkJcHJpbnRrKCJcbiIpOworCQlpZiAoIGwyICkKKwkJCXByaW50ayhLRVJOX0lORk8gIkNQVTogTDIgY2FjaGU6ICVkS1xuIiwgbDIpOworCQlpZiAoIGwzICkKKwkJCXByaW50ayhLRVJOX0lORk8gIkNQVTogTDMgY2FjaGU6ICVkS1xuIiwgbDMpOworCisJCS8qCisJCSAqIFRoaXMgYXNzdW1lcyB0aGUgTDMgY2FjaGUgaXMgc2hhcmVkOyBpdCB0eXBpY2FsbHkgbGl2ZXMgaW4KKwkJICogdGhlIG5vcnRoYnJpZGdlLiAgVGhlIEwxIGNhY2hlcyBhcmUgaW5jbHVkZWQgYnkgdGhlIEwyCisJCSAqIGNhY2hlLCBhbmQgc28gc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBmb3IgdGhlIHB1cnBvc2Ugb2YKKwkJICogU01QIHN3aXRjaGluZyB3ZWlnaHRzLgorCQkgKi8KKwkJYy0+eDg2X2NhY2hlX3NpemUgPSBsMiA/IGwyIDogKGwxaStsMWQpOworCX0KKworCXJldHVybiBsMjsKK30KKworLyogcG9pbnRlciB0byBfY3B1aWQ0X2luZm8gYXJyYXkgKGZvciBlYWNoIGNhY2hlIGxlYWYpICovCitzdGF0aWMgc3RydWN0IF9jcHVpZDRfaW5mbyAqY3B1aWQ0X2luZm9bTlJfQ1BVU107CisjZGVmaW5lIENQVUlENF9JTkZPX0lEWCh4LHkpICAgICgmKChjcHVpZDRfaW5mb1t4XSlbeV0pKQorCisjaWZkZWYgQ09ORklHX1NNUAorc3RhdGljIHZvaWQgX19kZXZpbml0IGNhY2hlX3NoYXJlZF9jcHVfbWFwX3NldHVwKHVuc2lnbmVkIGludCBjcHUsIGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgX2NwdWlkNF9pbmZvCSp0aGlzX2xlYWY7CisJdW5zaWduZWQgbG9uZyBudW1fdGhyZWFkc19zaGFyaW5nOworCisJdGhpc19sZWFmID0gQ1BVSUQ0X0lORk9fSURYKGNwdSwgaW5kZXgpOworCW51bV90aHJlYWRzX3NoYXJpbmcgPSAxICsgdGhpc19sZWFmLT5lYXguc3BsaXQubnVtX3RocmVhZHNfc2hhcmluZzsKKworCWlmIChudW1fdGhyZWFkc19zaGFyaW5nID09IDEpCisJCWNwdV9zZXQoY3B1LCB0aGlzX2xlYWYtPnNoYXJlZF9jcHVfbWFwKTsKKyNpZmRlZiBDT05GSUdfWDg2X0hUCisJZWxzZSBpZiAobnVtX3RocmVhZHNfc2hhcmluZyA9PSBzbXBfbnVtX3NpYmxpbmdzKQorCQl0aGlzX2xlYWYtPnNoYXJlZF9jcHVfbWFwID0gY3B1X3NpYmxpbmdfbWFwW2NwdV07CisjZW5kaWYKKwllbHNlCisJCXByaW50ayhLRVJOX0lORk8gIk51bWJlciBvZiBDUFVzIHNoYXJpbmcgY2FjaGUgZGlkbid0IG1hdGNoICIKKwkJCQkiYW55IGtub3duIHNldCBvZiBDUFVzXG4iKTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCBfX2luaXQgY2FjaGVfc2hhcmVkX2NwdV9tYXBfc2V0dXAodW5zaWduZWQgaW50IGNwdSwgaW50IGluZGV4KSB7fQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGZyZWVfY2FjaGVfYXR0cmlidXRlcyh1bnNpZ25lZCBpbnQgY3B1KQoreworCWtmcmVlKGNwdWlkNF9pbmZvW2NwdV0pOworCWNwdWlkNF9pbmZvW2NwdV0gPSBOVUxMOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkZXRlY3RfY2FjaGVfYXR0cmlidXRlcyh1bnNpZ25lZCBpbnQgY3B1KQoreworCXN0cnVjdCBfY3B1aWQ0X2luZm8JKnRoaXNfbGVhZjsKKwl1bnNpZ25lZCBsb25nIAkJajsKKwlpbnQgCQkJcmV0dmFsOworCisJaWYgKG51bV9jYWNoZV9sZWF2ZXMgPT0gMCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwljcHVpZDRfaW5mb1tjcHVdID0ga21hbGxvYygKKwkgICAgc2l6ZW9mKHN0cnVjdCBfY3B1aWQ0X2luZm8pICogbnVtX2NhY2hlX2xlYXZlcywgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KGNwdWlkNF9pbmZvW2NwdV0gPT0gTlVMTCkpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChjcHVpZDRfaW5mb1tjcHVdLCAwLAorCSAgICBzaXplb2Yoc3RydWN0IF9jcHVpZDRfaW5mbykgKiBudW1fY2FjaGVfbGVhdmVzKTsKKworCS8qIERvIGNwdWlkIGFuZCBzdG9yZSB0aGUgcmVzdWx0cyAqLworCWZvciAoaiA9IDA7IGogPCBudW1fY2FjaGVfbGVhdmVzOyBqKyspIHsKKwkJdGhpc19sZWFmID0gQ1BVSUQ0X0lORk9fSURYKGNwdSwgaik7CisJCXJldHZhbCA9IGNwdWlkNF9jYWNoZV9sb29rdXAoaiwgdGhpc19sZWFmKTsKKwkJaWYgKHVubGlrZWx5KHJldHZhbCA8IDApKQorCQkJZ290byBlcnJfb3V0OworCQljYWNoZV9zaGFyZWRfY3B1X21hcF9zZXR1cChjcHUsIGopOworCX0KKwlyZXR1cm4gMDsKKworZXJyX291dDoKKwlmcmVlX2NhY2hlX2F0dHJpYnV0ZXMoY3B1KTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworI2lmZGVmIENPTkZJR19TWVNGUworCisjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisKK2V4dGVybiBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIGNwdV9zeXNkZXZfY2xhc3M7IC8qIGZyb20gZHJpdmVycy9iYXNlL2NwdS5jICovCisKKy8qIHBvaW50ZXIgdG8ga29iamVjdCBmb3IgY3B1WC9jYWNoZSAqLworc3RhdGljIHN0cnVjdCBrb2JqZWN0ICogY2FjaGVfa29iamVjdFtOUl9DUFVTXTsKKworc3RydWN0IF9pbmRleF9rb2JqZWN0IHsKKwlzdHJ1Y3Qga29iamVjdCBrb2JqOworCXVuc2lnbmVkIGludCBjcHU7CisJdW5zaWduZWQgc2hvcnQgaW5kZXg7Cit9OworCisvKiBwb2ludGVyIHRvIGFycmF5IG9mIGtvYmplY3RzIGZvciBjcHVYL2NhY2hlL2luZGV4WSAqLworc3RhdGljIHN0cnVjdCBfaW5kZXhfa29iamVjdCAqaW5kZXhfa29iamVjdFtOUl9DUFVTXTsKKyNkZWZpbmUgSU5ERVhfS09CSkVDVF9QVFIoeCx5KSAgICAoJigoaW5kZXhfa29iamVjdFt4XSlbeV0pKQorCisjZGVmaW5lIHNob3dfb25lX3BsdXMoZmlsZV9uYW1lLCBvYmplY3QsIHZhbCkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI2ZpbGVfbmFtZQkJCQkJCVwKKwkJCShzdHJ1Y3QgX2NwdWlkNF9pbmZvICp0aGlzX2xlYWYsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc3ByaW50ZiAoYnVmLCAiJWx1XG4iLCAodW5zaWduZWQgbG9uZyl0aGlzX2xlYWYtPm9iamVjdCArIHZhbCk7IFwKK30KKworc2hvd19vbmVfcGx1cyhsZXZlbCwgZWF4LnNwbGl0LmxldmVsLCAwKTsKK3Nob3dfb25lX3BsdXMoY29oZXJlbmN5X2xpbmVfc2l6ZSwgZWJ4LnNwbGl0LmNvaGVyZW5jeV9saW5lX3NpemUsIDEpOworc2hvd19vbmVfcGx1cyhwaHlzaWNhbF9saW5lX3BhcnRpdGlvbiwgZWJ4LnNwbGl0LnBoeXNpY2FsX2xpbmVfcGFydGl0aW9uLCAxKTsKK3Nob3dfb25lX3BsdXMod2F5c19vZl9hc3NvY2lhdGl2aXR5LCBlYnguc3BsaXQud2F5c19vZl9hc3NvY2lhdGl2aXR5LCAxKTsKK3Nob3dfb25lX3BsdXMobnVtYmVyX29mX3NldHMsIGVjeC5zcGxpdC5udW1iZXJfb2Zfc2V0cywgMSk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfc2l6ZShzdHJ1Y3QgX2NwdWlkNF9pbmZvICp0aGlzX2xlYWYsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZiAoYnVmLCAiJWx1S1xuIiwgdGhpc19sZWFmLT5zaXplIC8gMTAyNCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfc2hhcmVkX2NwdV9tYXAoc3RydWN0IF9jcHVpZDRfaW5mbyAqdGhpc19sZWFmLCBjaGFyICpidWYpCit7CisJY2hhciBtYXNrX3N0cltOUl9DUFVTXTsKKwljcHVtYXNrX3NjbnByaW50ZihtYXNrX3N0ciwgTlJfQ1BVUywgdGhpc19sZWFmLT5zaGFyZWRfY3B1X21hcCk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIG1hc2tfc3RyKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd190eXBlKHN0cnVjdCBfY3B1aWQ0X2luZm8gKnRoaXNfbGVhZiwgY2hhciAqYnVmKSB7CisJc3dpdGNoKHRoaXNfbGVhZi0+ZWF4LnNwbGl0LnR5cGUpIHsKKwkgICAgY2FzZSBDQUNIRV9UWVBFX0RBVEE6CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIkRhdGFcbiIpOworCQlicmVhazsKKwkgICAgY2FzZSBDQUNIRV9UWVBFX0lOU1Q6CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIkluc3RydWN0aW9uXG4iKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgQ0FDSEVfVFlQRV9VTklGSUVEOgorCQlyZXR1cm4gc3ByaW50ZihidWYsICJVbmlmaWVkXG4iKTsKKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIlVua25vd25cbiIpOworCQlicmVhazsKKwl9Cit9CisKK3N0cnVjdCBfY2FjaGVfYXR0ciB7CisJc3RydWN0IGF0dHJpYnV0ZSBhdHRyOworCXNzaXplX3QgKCpzaG93KShzdHJ1Y3QgX2NwdWlkNF9pbmZvICosIGNoYXIgKik7CisJc3NpemVfdCAoKnN0b3JlKShzdHJ1Y3QgX2NwdWlkNF9pbmZvICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90IGNvdW50KTsKK307CisKKyNkZWZpbmUgZGVmaW5lX29uZV9ybyhfbmFtZSkgXAorc3RhdGljIHN0cnVjdCBfY2FjaGVfYXR0ciBfbmFtZSA9IFwKKwlfX0FUVFIoX25hbWUsIDA0NDQsIHNob3dfIyNfbmFtZSwgTlVMTCkKKworZGVmaW5lX29uZV9ybyhsZXZlbCk7CitkZWZpbmVfb25lX3JvKHR5cGUpOworZGVmaW5lX29uZV9ybyhjb2hlcmVuY3lfbGluZV9zaXplKTsKK2RlZmluZV9vbmVfcm8ocGh5c2ljYWxfbGluZV9wYXJ0aXRpb24pOworZGVmaW5lX29uZV9ybyh3YXlzX29mX2Fzc29jaWF0aXZpdHkpOworZGVmaW5lX29uZV9ybyhudW1iZXJfb2Zfc2V0cyk7CitkZWZpbmVfb25lX3JvKHNpemUpOworZGVmaW5lX29uZV9ybyhzaGFyZWRfY3B1X21hcCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICogZGVmYXVsdF9hdHRyc1tdID0geworCSZ0eXBlLmF0dHIsCisJJmxldmVsLmF0dHIsCisJJmNvaGVyZW5jeV9saW5lX3NpemUuYXR0ciwKKwkmcGh5c2ljYWxfbGluZV9wYXJ0aXRpb24uYXR0ciwKKwkmd2F5c19vZl9hc3NvY2lhdGl2aXR5LmF0dHIsCisJJm51bWJlcl9vZl9zZXRzLmF0dHIsCisJJnNpemUuYXR0ciwKKwkmc2hhcmVkX2NwdV9tYXAuYXR0ciwKKwlOVUxMCit9OworCisjZGVmaW5lIHRvX29iamVjdChrKSBjb250YWluZXJfb2Yoaywgc3RydWN0IF9pbmRleF9rb2JqZWN0LCBrb2JqKQorI2RlZmluZSB0b19hdHRyKGEpIGNvbnRhaW5lcl9vZihhLCBzdHJ1Y3QgX2NhY2hlX2F0dHIsIGF0dHIpCisKK3N0YXRpYyBzc2l6ZV90IHNob3coc3RydWN0IGtvYmplY3QgKiBrb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICogYXR0ciwgY2hhciAqIGJ1ZikKK3sKKwlzdHJ1Y3QgX2NhY2hlX2F0dHIgKmZhdHRyID0gdG9fYXR0cihhdHRyKTsKKwlzdHJ1Y3QgX2luZGV4X2tvYmplY3QgKnRoaXNfbGVhZiA9IHRvX29iamVjdChrb2JqKTsKKwlzc2l6ZV90IHJldDsKKworCXJldCA9IGZhdHRyLT5zaG93ID8KKwkJZmF0dHItPnNob3coQ1BVSUQ0X0lORk9fSURYKHRoaXNfbGVhZi0+Y3B1LCB0aGlzX2xlYWYtPmluZGV4KSwKKwkJCWJ1ZikgOgorCSAgICAgICAJMDsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZShzdHJ1Y3Qga29iamVjdCAqIGtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKiBhdHRyLAorCQkgICAgIGNvbnN0IGNoYXIgKiBidWYsIHNpemVfdCBjb3VudCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzeXNmc19vcHMgc3lzZnNfb3BzID0geworCS5zaG93ICAgPSBzaG93LAorCS5zdG9yZSAgPSBzdG9yZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qga29ial90eXBlIGt0eXBlX2NhY2hlID0geworCS5zeXNmc19vcHMJPSAmc3lzZnNfb3BzLAorCS5kZWZhdWx0X2F0dHJzCT0gZGVmYXVsdF9hdHRycywKK307CisKK3N0YXRpYyBzdHJ1Y3Qga29ial90eXBlIGt0eXBlX3BlcmNwdV9lbnRyeSA9IHsKKwkuc3lzZnNfb3BzCT0gJnN5c2ZzX29wcywKK307CisKK3N0YXRpYyB2b2lkIGNwdWlkNF9jYWNoZV9zeXNmc19leGl0KHVuc2lnbmVkIGludCBjcHUpCit7CisJa2ZyZWUoY2FjaGVfa29iamVjdFtjcHVdKTsKKwlrZnJlZShpbmRleF9rb2JqZWN0W2NwdV0pOworCWNhY2hlX2tvYmplY3RbY3B1XSA9IE5VTEw7CisJaW5kZXhfa29iamVjdFtjcHVdID0gTlVMTDsKKwlmcmVlX2NhY2hlX2F0dHJpYnV0ZXMoY3B1KTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgY3B1aWQ0X2NhY2hlX3N5c2ZzX2luaXQodW5zaWduZWQgaW50IGNwdSkKK3sKKworCWlmIChudW1fY2FjaGVfbGVhdmVzID09IDApCisJCXJldHVybiAtRU5PRU5UOworCisJZGV0ZWN0X2NhY2hlX2F0dHJpYnV0ZXMoY3B1KTsKKwlpZiAoY3B1aWQ0X2luZm9bY3B1XSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCS8qIEFsbG9jYXRlIGFsbCByZXF1aXJlZCBtZW1vcnkgKi8KKwljYWNoZV9rb2JqZWN0W2NwdV0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qga29iamVjdCksIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseShjYWNoZV9rb2JqZWN0W2NwdV0gPT0gTlVMTCkpCisJCWdvdG8gZXJyX291dDsKKwltZW1zZXQoY2FjaGVfa29iamVjdFtjcHVdLCAwLCBzaXplb2Yoc3RydWN0IGtvYmplY3QpKTsKKworCWluZGV4X2tvYmplY3RbY3B1XSA9IGttYWxsb2MoCisJICAgIHNpemVvZihzdHJ1Y3QgX2luZGV4X2tvYmplY3QgKSAqIG51bV9jYWNoZV9sZWF2ZXMsIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseShpbmRleF9rb2JqZWN0W2NwdV0gPT0gTlVMTCkpCisJCWdvdG8gZXJyX291dDsKKwltZW1zZXQoaW5kZXhfa29iamVjdFtjcHVdLCAwLAorCSAgICBzaXplb2Yoc3RydWN0IF9pbmRleF9rb2JqZWN0KSAqIG51bV9jYWNoZV9sZWF2ZXMpOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXQ6CisJY3B1aWQ0X2NhY2hlX3N5c2ZzX2V4aXQoY3B1KTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyogQWRkL1JlbW92ZSBjYWNoZSBpbnRlcmZhY2UgZm9yIENQVSBkZXZpY2UgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGNhY2hlX2FkZF9kZXYoc3RydWN0IHN5c19kZXZpY2UgKiBzeXNfZGV2KQoreworCXVuc2lnbmVkIGludCBjcHUgPSBzeXNfZGV2LT5pZDsKKwl1bnNpZ25lZCBsb25nIGksIGo7CisJc3RydWN0IF9pbmRleF9rb2JqZWN0ICp0aGlzX29iamVjdDsKKwlpbnQgcmV0dmFsID0gMDsKKworCXJldHZhbCA9IGNwdWlkNF9jYWNoZV9zeXNmc19pbml0KGNwdSk7CisJaWYgKHVubGlrZWx5KHJldHZhbCA8IDApKQorCQlyZXR1cm4gcmV0dmFsOworCisJY2FjaGVfa29iamVjdFtjcHVdLT5wYXJlbnQgPSAmc3lzX2Rldi0+a29iajsKKwlrb2JqZWN0X3NldF9uYW1lKGNhY2hlX2tvYmplY3RbY3B1XSwgIiVzIiwgImNhY2hlIik7CisJY2FjaGVfa29iamVjdFtjcHVdLT5rdHlwZSA9ICZrdHlwZV9wZXJjcHVfZW50cnk7CisJcmV0dmFsID0ga29iamVjdF9yZWdpc3RlcihjYWNoZV9rb2JqZWN0W2NwdV0pOworCisJZm9yIChpID0gMDsgaSA8IG51bV9jYWNoZV9sZWF2ZXM7IGkrKykgeworCQl0aGlzX29iamVjdCA9IElOREVYX0tPQkpFQ1RfUFRSKGNwdSxpKTsKKwkJdGhpc19vYmplY3QtPmNwdSA9IGNwdTsKKwkJdGhpc19vYmplY3QtPmluZGV4ID0gaTsKKwkJdGhpc19vYmplY3QtPmtvYmoucGFyZW50ID0gY2FjaGVfa29iamVjdFtjcHVdOworCQlrb2JqZWN0X3NldF9uYW1lKCYodGhpc19vYmplY3QtPmtvYmopLCAiaW5kZXglMWx1IiwgaSk7CisJCXRoaXNfb2JqZWN0LT5rb2JqLmt0eXBlID0gJmt0eXBlX2NhY2hlOworCQlyZXR2YWwgPSBrb2JqZWN0X3JlZ2lzdGVyKCYodGhpc19vYmplY3QtPmtvYmopKTsKKwkJaWYgKHVubGlrZWx5KHJldHZhbCkpIHsKKwkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKKwkJCQlrb2JqZWN0X3VucmVnaXN0ZXIoCisJCQkJCSYoSU5ERVhfS09CSkVDVF9QVFIoY3B1LGopLT5rb2JqKSk7CisJCQl9CisJCQlrb2JqZWN0X3VucmVnaXN0ZXIoY2FjaGVfa29iamVjdFtjcHVdKTsKKwkJCWNwdWlkNF9jYWNoZV9zeXNmc19leGl0KGNwdSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBjYWNoZV9yZW1vdmVfZGV2KHN0cnVjdCBzeXNfZGV2aWNlICogc3lzX2RldikKK3sKKwl1bnNpZ25lZCBpbnQgY3B1ID0gc3lzX2Rldi0+aWQ7CisJdW5zaWduZWQgbG9uZyBpOworCisJZm9yIChpID0gMDsgaSA8IG51bV9jYWNoZV9sZWF2ZXM7IGkrKykKKwkJa29iamVjdF91bnJlZ2lzdGVyKCYoSU5ERVhfS09CSkVDVF9QVFIoY3B1LGkpLT5rb2JqKSk7CisJa29iamVjdF91bnJlZ2lzdGVyKGNhY2hlX2tvYmplY3RbY3B1XSk7CisJY3B1aWQ0X2NhY2hlX3N5c2ZzX2V4aXQoY3B1KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzeXNkZXZfZHJpdmVyIGNhY2hlX3N5c2Rldl9kcml2ZXIgPSB7CisJLmFkZCA9IGNhY2hlX2FkZF9kZXYsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGNhY2hlX3JlbW92ZV9kZXYpLAorfTsKKworLyogUmVnaXN0ZXIvVW5yZWdpc3RlciB0aGUgY3B1X2NhY2hlIGRyaXZlciAqLworc3RhdGljIGludCBfX2RldmluaXQgY2FjaGVfcmVnaXN0ZXJfZHJpdmVyKHZvaWQpCit7CisJaWYgKG51bV9jYWNoZV9sZWF2ZXMgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gc3lzZGV2X2RyaXZlcl9yZWdpc3RlcigmY3B1X3N5c2Rldl9jbGFzcywmY2FjaGVfc3lzZGV2X2RyaXZlcik7Cit9CisKK2RldmljZV9pbml0Y2FsbChjYWNoZV9yZWdpc3Rlcl9kcml2ZXIpOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbWNoZWNrL01ha2VmaWxlIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbWNoZWNrL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwODA4ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svTWFrZWZpbGUKQEAgLTAsMCArMSwyIEBACitvYmoteQk9CW1jZS5vIGs3Lm8gcDQubyBwNS5vIHA2Lm8gd2luY2hpcC5vCitvYmotJChDT05GSUdfWDg2X01DRV9OT05GQVRBTCkJKz0Jbm9uLWZhdGFsLm8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9rNy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbWNoZWNrL2s3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRmNTJlOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9rNy5jCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBBdGhsb24vSGFtbWVyIHNwZWNpZmljIE1hY2hpbmUgQ2hlY2sgRXhjZXB0aW9uIFJlcG9ydGluZworICogKEMpIENvcHlyaWdodCAyMDAyIERhdmUgSm9uZXMgPGRhdmVqQGNvZGVtb25rZXkub3JnLnVrPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4gCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9tc3IuaD4KKworI2luY2x1ZGUgIm1jZS5oIgorCisvKiBNYWNoaW5lIENoZWNrIEhhbmRsZXIgRm9yIEFNRCBBdGhsb24vRHVyb24gKi8KK3N0YXRpYyBmYXN0Y2FsbCB2b2lkIGs3X21hY2hpbmVfY2hlY2soc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUpCit7CisJaW50IHJlY292ZXI9MTsKKwl1MzIgYWxvdywgYWhpZ2gsIGhpZ2gsIGxvdzsKKwl1MzIgbWNnc3RsLCBtY2dzdGg7CisJaW50IGk7CisKKwlyZG1zciAoTVNSX0lBMzJfTUNHX1NUQVRVUywgbWNnc3RsLCBtY2dzdGgpOworCWlmIChtY2dzdGwgJiAoMTw8MCkpCS8qIFJlY292ZXJhYmxlID8gKi8KKwkJcmVjb3Zlcj0wOworCisJcHJpbnRrIChLRVJOX0VNRVJHICJDUFUgJWQ6IE1hY2hpbmUgQ2hlY2sgRXhjZXB0aW9uOiAlMDh4JTA4eFxuIiwKKwkJc21wX3Byb2Nlc3Nvcl9pZCgpLCBtY2dzdGgsIG1jZ3N0bCk7CisKKwlmb3IgKGk9MTsgaTxucl9tY2VfYmFua3M7IGkrKykgeworCQlyZG1zciAoTVNSX0lBMzJfTUMwX1NUQVRVUytpKjQsbG93LCBoaWdoKTsKKwkJaWYgKGhpZ2gmKDE8PDMxKSkgeworCQkJaWYgKGhpZ2ggJiAoMTw8MjkpKQorCQkJCXJlY292ZXIgfD0gMTsKKwkJCWlmIChoaWdoICYgKDE8PDI1KSkKKwkJCQlyZWNvdmVyIHw9IDI7CisJCQlwcmludGsgKEtFUk5fRU1FUkcgIkJhbmsgJWQ6ICUwOHglMDh4IiwgaSwgaGlnaCwgbG93KTsKKwkJCWhpZ2ggJj0gfigxPDwzMSk7CisJCQlpZiAoaGlnaCAmICgxPDwyNykpIHsKKwkJCQlyZG1zciAoTVNSX0lBMzJfTUMwX01JU0MraSo0LCBhbG93LCBhaGlnaCk7CisJCQkJcHJpbnRrICgiWyUwOHglMDh4XSIsIGFoaWdoLCBhbG93KTsKKwkJCX0KKwkJCWlmIChoaWdoICYgKDE8PDI2KSkgeworCQkJCXJkbXNyIChNU1JfSUEzMl9NQzBfQUREUitpKjQsIGFsb3csIGFoaWdoKTsKKwkJCQlwcmludGsgKCIgYXQgJTA4eCUwOHgiLCBhaGlnaCwgYWxvdyk7CisJCQl9CisJCQlwcmludGsgKCJcbiIpOworCQkJLyogQ2xlYXIgaXQgKi8KKwkJCXdybXNyIChNU1JfSUEzMl9NQzBfU1RBVFVTK2kqNCwgMFVMLCAwVUwpOworCQkJLyogU2VyaWFsaXplICovCisJCQl3bWIoKTsKKwkJCWFkZF90YWludChUQUlOVF9NQUNISU5FX0NIRUNLKTsKKwkJfQorCX0KKworCWlmIChyZWNvdmVyJjIpCisJCXBhbmljICgiQ1BVIGNvbnRleHQgY29ycnVwdCIpOworCWlmIChyZWNvdmVyJjEpCisJCXBhbmljICgiVW5hYmxlIHRvIGNvbnRpbnVlIik7CisJcHJpbnRrIChLRVJOX0VNRVJHICJBdHRlbXB0aW5nIHRvIGNvbnRpbnVlLlxuIik7CisJbWNnc3RsICY9IH4oMTw8Mik7CisJd3Jtc3IgKE1TUl9JQTMyX01DR19TVEFUVVMsbWNnc3RsLCBtY2dzdGgpOworfQorCisKKy8qIEFNRCBLNyBtYWNoaW5lIGNoZWNrIGlzIEludGVsIGxpa2UgKi8KK3ZvaWQgX19pbml0IGFtZF9tY2hlY2tfaW5pdChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJdTMyIGwsIGg7CisJaW50IGk7CisKKwltYWNoaW5lX2NoZWNrX3ZlY3RvciA9IGs3X21hY2hpbmVfY2hlY2s7CisJd21iKCk7CisKKwlwcmludGsgKEtFUk5fSU5GTyAiSW50ZWwgbWFjaGluZSBjaGVjayBhcmNoaXRlY3R1cmUgc3VwcG9ydGVkLlxuIik7CisJcmRtc3IgKE1TUl9JQTMyX01DR19DQVAsIGwsIGgpOworCWlmIChsICYgKDE8PDgpKQkvKiBDb250cm9sIHJlZ2lzdGVyIHByZXNlbnQgPyAqLworCQl3cm1zciAoTVNSX0lBMzJfTUNHX0NUTCwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZik7CisJbnJfbWNlX2JhbmtzID0gbCAmIDB4ZmY7CisKKwkvKiBDbGVhciBzdGF0dXMgZm9yIE1DIGluZGV4IDAgc2VwYXJhdGVseSwgd2UgZG9uJ3QgdG91Y2ggQ1RMLAorCSAqIGFzIHNvbWUgQXRobG9ucyBjYXVzZSBzcHVyaW91cyBNQ0VzIHdoZW4gaXRzIGVuYWJsZWQuICovCisJd3Jtc3IgKE1TUl9JQTMyX01DMF9TVEFUVVMsIDB4MCwgMHgwKTsKKwlmb3IgKGk9MTsgaTxucl9tY2VfYmFua3M7IGkrKykgeworCQl3cm1zciAoTVNSX0lBMzJfTUMwX0NUTCs0KmksIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYpOworCQl3cm1zciAoTVNSX0lBMzJfTUMwX1NUQVRVUys0KmksIDB4MCwgMHgwKTsKKwl9CisKKwlzZXRfaW5fY3I0IChYODZfQ1I0X01DRSk7CisJcHJpbnRrIChLRVJOX0lORk8gIkludGVsIG1hY2hpbmUgY2hlY2sgcmVwb3J0aW5nIGVuYWJsZWQgb24gQ1BVIyVkLlxuIiwKKwkJc21wX3Byb2Nlc3Nvcl9pZCgpKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2UuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjZkMWFlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS5jCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBtY2UuYyAtIHg4NiBNYWNoaW5lIENoZWNrIEV4Y2VwdGlvbiBSZXBvcnRpbmcKKyAqIChjKSAyMDAyIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+LCBEYXZlIEpvbmVzIDxkYXZlakBjb2RlbW9ua2V5Lm9yZy51az4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvdGhyZWFkX2luZm8uaD4KKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4gCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSAibWNlLmgiCisKK2ludCBtY2VfZGlzYWJsZWQgX19pbml0ZGF0YSA9IDA7CitpbnQgbnJfbWNlX2JhbmtzOworCitFWFBPUlRfU1lNQk9MX0dQTChucl9tY2VfYmFua3MpOwkvKiBub24tZmF0YWwubyAqLworCisvKiBIYW5kbGUgdW5jb25maWd1cmVkIGludDE4IChzaG91bGQgbmV2ZXIgaGFwcGVuKSAqLworc3RhdGljIGZhc3RjYWxsIHZvaWQgdW5leHBlY3RlZF9tYWNoaW5lX2NoZWNrKHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnJvcl9jb2RlKQorewkKKwlwcmludGsoS0VSTl9FUlIgIkNQVSMlZDogVW5leHBlY3RlZCBpbnQxOCAoTWFjaGluZSBDaGVjaykuXG4iLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworfQorCisvKiBDYWxsIHRoZSBpbnN0YWxsZWQgbWFjaGluZSBjaGVjayBoYW5kbGVyIGZvciB0aGlzIENQVSBzZXR1cC4gKi8KK3ZvaWQgZmFzdGNhbGwgKCptYWNoaW5lX2NoZWNrX3ZlY3Rvcikoc3RydWN0IHB0X3JlZ3MgKiwgbG9uZyBlcnJvcl9jb2RlKSA9IHVuZXhwZWN0ZWRfbWFjaGluZV9jaGVjazsKKworLyogVGhpcyBoYXMgdG8gYmUgcnVuIGZvciBlYWNoIHByb2Nlc3NvciAqLwordm9pZCBfX2luaXQgbWNoZWNrX2luaXQoc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworCWlmIChtY2VfZGlzYWJsZWQ9PTEpCisJCXJldHVybjsKKworCXN3aXRjaCAoYy0+eDg2X3ZlbmRvcikgeworCQljYXNlIFg4Nl9WRU5ET1JfQU1EOgorCQkJaWYgKGMtPng4Nj09NiB8fCBjLT54ODY9PTE1KQorCQkJCWFtZF9tY2hlY2tfaW5pdChjKTsKKwkJCWJyZWFrOworCisJCWNhc2UgWDg2X1ZFTkRPUl9JTlRFTDoKKwkJCWlmIChjLT54ODY9PTUpCisJCQkJaW50ZWxfcDVfbWNoZWNrX2luaXQoYyk7CisJCQlpZiAoYy0+eDg2PT02KQorCQkJCWludGVsX3A2X21jaGVja19pbml0KGMpOworCQkJaWYgKGMtPng4Nj09MTUpCisJCQkJaW50ZWxfcDRfbWNoZWNrX2luaXQoYyk7CisJCQlicmVhazsKKworCQljYXNlIFg4Nl9WRU5ET1JfQ0VOVEFVUjoKKwkJCWlmIChjLT54ODY9PTUpCisJCQkJd2luY2hpcF9tY2hlY2tfaW5pdChjKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG1jaGVja19kaXNhYmxlKGNoYXIgKnN0cikKK3sKKwltY2VfZGlzYWJsZWQgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBtY2hlY2tfZW5hYmxlKGNoYXIgKnN0cikKK3sKKwltY2VfZGlzYWJsZWQgPSAtMTsKKwlyZXR1cm4gMDsKK30KKworX19zZXR1cCgibm9tY2UiLCBtY2hlY2tfZGlzYWJsZSk7CitfX3NldHVwKCJtY2UiLCBtY2hlY2tfZW5hYmxlKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2UuaCBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzI0MTZkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS5oCkBAIC0wLDAgKzEsMTQgQEAKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKK3ZvaWQgYW1kX21jaGVja19pbml0KHN0cnVjdCBjcHVpbmZvX3g4NiAqYyk7Cit2b2lkIGludGVsX3A0X21jaGVja19pbml0KHN0cnVjdCBjcHVpbmZvX3g4NiAqYyk7Cit2b2lkIGludGVsX3A1X21jaGVja19pbml0KHN0cnVjdCBjcHVpbmZvX3g4NiAqYyk7Cit2b2lkIGludGVsX3A2X21jaGVja19pbml0KHN0cnVjdCBjcHVpbmZvX3g4NiAqYyk7Cit2b2lkIHdpbmNoaXBfbWNoZWNrX2luaXQoc3RydWN0IGNwdWluZm9feDg2ICpjKTsKKworLyogQ2FsbCB0aGUgaW5zdGFsbGVkIG1hY2hpbmUgY2hlY2sgaGFuZGxlciBmb3IgdGhpcyBDUFUgc2V0dXAuICovCitleHRlcm4gZmFzdGNhbGwgdm9pZCAoKm1hY2hpbmVfY2hlY2tfdmVjdG9yKShzdHJ1Y3QgcHRfcmVncyAqLCBsb25nIGVycm9yX2NvZGUpOworCitleHRlcm4gaW50IG1jZV9kaXNhYmxlZCBfX2luaXRkYXRhOworZXh0ZXJuIGludCBucl9tY2VfYmFua3M7CisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9ub24tZmF0YWwuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9ub24tZmF0YWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODY0ZGRmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbWNoZWNrL25vbi1mYXRhbC5jCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBOb24gRmF0YWwgTWFjaGluZSBDaGVjayBFeGNlcHRpb24gUmVwb3J0aW5nCisgKgorICogKEMpIENvcHlyaWdodCAyMDAyIERhdmUgSm9uZXMuIDxkYXZlakBjb2RlbW9ua2V5Lm9yZy51az4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdG8gY2hlY2sgZm9yIG5vbi1mYXRhbCBNQ0VzIGV2ZXJ5IDE1cworICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPiAKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL21zci5oPgorCisjaW5jbHVkZSAibWNlLmgiCisKK3N0YXRpYyBpbnQgZmlyc3RiYW5rOworCisjZGVmaW5lIE1DRV9SQVRFCTE1KkhaCS8qIHRpbWVyIHJhdGUgaXMgMTVzICovCisKK3N0YXRpYyB2b2lkIG1jZV9jaGVja3JlZ3MgKHZvaWQgKmluZm8pCit7CisJdTMyIGxvdywgaGlnaDsKKwlpbnQgaTsKKworCWZvciAoaT1maXJzdGJhbms7IGk8bnJfbWNlX2JhbmtzOyBpKyspIHsKKwkJcmRtc3IgKE1TUl9JQTMyX01DMF9TVEFUVVMraSo0LCBsb3csIGhpZ2gpOworCisJCWlmIChoaWdoICYgKDE8PDMxKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiTUNFOiBUaGUgaGFyZHdhcmUgcmVwb3J0cyBhIG5vbiAiCisJCQkJImZhdGFsLCBjb3JyZWN0YWJsZSBpbmNpZGVudCBvY2N1cnJlZCBvbiAiCisJCQkJIkNQVSAlZC5cbiIsCisJCQkJc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwkJCXByaW50ayAoS0VSTl9JTkZPICJCYW5rICVkOiAlMDh4JTA4eFxuIiwgaSwgaGlnaCwgbG93KTsKKworCQkJLyogU2NydWIgdGhlIGVycm9yIHNvIHdlIGRvbid0IHBpY2sgaXQgdXAgaW4gTUNFX1JBVEUgc2Vjb25kcyB0aW1lLiAqLworCQkJd3Jtc3IgKE1TUl9JQTMyX01DMF9TVEFUVVMraSo0LCAwVUwsIDBVTCk7CisKKwkJCS8qIFNlcmlhbGl6ZSAqLworCQkJd21iKCk7CisJCQlhZGRfdGFpbnQoVEFJTlRfTUFDSElORV9DSEVDSyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1jZV93b3JrX2ZuKHZvaWQgKmRhdGEpOworc3RhdGljIERFQ0xBUkVfV09SSyhtY2Vfd29yaywgbWNlX3dvcmtfZm4sIE5VTEwpOworCitzdGF0aWMgdm9pZCBtY2Vfd29ya19mbih2b2lkICpkYXRhKQoreyAKKwlvbl9lYWNoX2NwdShtY2VfY2hlY2tyZWdzLCBOVUxMLCAxLCAxKTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJm1jZV93b3JrLCBNQ0VfUkFURSk7Cit9IAorCitzdGF0aWMgaW50IF9faW5pdCBpbml0X25vbmZhdGFsX21jZV9jaGVja2VyKHZvaWQpCit7CisJc3RydWN0IGNwdWluZm9feDg2ICpjID0gJmJvb3RfY3B1X2RhdGE7CisKKwkvKiBDaGVjayBmb3IgTUNFIHN1cHBvcnQgKi8KKwlpZiAoIWNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfTUNFKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBDaGVjayBmb3IgUFBybyBzdHlsZSBNQ0EgKi8KKwlpZiAoIWNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfTUNBKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBTb21lIEF0aGxvbnMgbWlzYmVoYXZlIHdoZW4gd2UgZnJvYiBiYW5rIDAgKi8KKwlpZiAoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfQU1EICYmCisJCWJvb3RfY3B1X2RhdGEueDg2ID09IDYpCisJCQlmaXJzdGJhbmsgPSAxOworCWVsc2UKKwkJCWZpcnN0YmFuayA9IDA7CisKKwkvKgorCSAqIENoZWNrIGZvciBub24tZmF0YWwgZXJyb3JzIGV2ZXJ5IE1DRV9SQVRFIHMKKwkgKi8KKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJm1jZV93b3JrLCBNQ0VfUkFURSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiTWFjaGluZSBjaGVjayBleGNlcHRpb24gcG9sbGluZyB0aW1lciBzdGFydGVkLlxuIik7CisJcmV0dXJuIDA7Cit9Cittb2R1bGVfaW5pdChpbml0X25vbmZhdGFsX21jZV9jaGVja2VyKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbWNoZWNrL3A0LmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svcDQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjE2Y2ViCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbWNoZWNrL3A0LmMKQEAgLTAsMCArMSwyNzEgQEAKKy8qCisgKiBQNCBzcGVjaWZpYyBNYWNoaW5lIENoZWNrIEV4Y2VwdGlvbiBSZXBvcnRpbmcKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+IAorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKworI2luY2x1ZGUgIm1jZS5oIgorCisvKiBhcyBzdXBwb3J0ZWQgYnkgdGhlIFA0L1hlb24gZmFtaWx5ICovCitzdHJ1Y3QgaW50ZWxfbWNlX2V4dGVuZGVkX21zcnMgeworCXUzMiBlYXg7CisJdTMyIGVieDsKKwl1MzIgZWN4OworCXUzMiBlZHg7CisJdTMyIGVzaTsKKwl1MzIgZWRpOworCXUzMiBlYnA7CisJdTMyIGVzcDsKKwl1MzIgZWZsYWdzOworCXUzMiBlaXA7CisJLyogdTMyICpyZXNlcnZlZFtdOyAqLworfTsKKworc3RhdGljIGludCBtY2VfbnVtX2V4dGVuZGVkX21zcnMgPSAwOworCisKKyNpZmRlZiBDT05GSUdfWDg2X01DRV9QNFRIRVJNQUwKK3N0YXRpYyB2b2lkIHVuZXhwZWN0ZWRfdGhlcm1hbF9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CQorCXByaW50ayhLRVJOX0VSUiAiQ1BVJWQ6IFVuZXhwZWN0ZWQgTFZUIFRNUiBpbnRlcnJ1cHQhXG4iLAorCQkJc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwlhZGRfdGFpbnQoVEFJTlRfTUFDSElORV9DSEVDSyk7Cit9CisKKy8qIFA0L1hlb24gVGhlcm1hbCB0cmFuc2l0aW9uIGludGVycnVwdCBoYW5kbGVyICovCitzdGF0aWMgdm9pZCBpbnRlbF90aGVybWFsX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1MzIgbCwgaDsKKwl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXN0YXRpYyB1bnNpZ25lZCBsb25nIG5leHRbTlJfQ1BVU107CisKKwlhY2tfQVBJQ19pcnEoKTsKKworCWlmICh0aW1lX2FmdGVyKG5leHRbY3B1XSwgamlmZmllcykpCisJCXJldHVybjsKKworCW5leHRbY3B1XSA9IGppZmZpZXMgKyBIWio1OworCXJkbXNyKE1TUl9JQTMyX1RIRVJNX1NUQVRVUywgbCwgaCk7CisJaWYgKGwgJiAweDEpIHsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgIkNQVSVkOiBUZW1wZXJhdHVyZSBhYm92ZSB0aHJlc2hvbGRcbiIsIGNwdSk7CisJCXByaW50ayhLRVJOX0VNRVJHICJDUFUlZDogUnVubmluZyBpbiBtb2R1bGF0ZWQgY2xvY2sgbW9kZVxuIiwKKwkJCQljcHUpOworCQlhZGRfdGFpbnQoVEFJTlRfTUFDSElORV9DSEVDSyk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQ1BVJWQ6IFRlbXBlcmF0dXJlL3NwZWVkIG5vcm1hbFxuIiwgY3B1KTsKKwl9Cit9CisKKy8qIFRoZXJtYWwgaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoaXMgQ1BVIHNldHVwICovCitzdGF0aWMgdm9pZCAoKnZlbmRvcl90aGVybWFsX2ludGVycnVwdCkoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpID0gdW5leHBlY3RlZF90aGVybWFsX2ludGVycnVwdDsKKworZmFzdGNhbGwgdm9pZCBzbXBfdGhlcm1hbF9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaXJxX2VudGVyKCk7CisJdmVuZG9yX3RoZXJtYWxfaW50ZXJydXB0KHJlZ3MpOworCWlycV9leGl0KCk7Cit9CisKKy8qIFA0L1hlb24gVGhlcm1hbCByZWd1bGF0aW9uIGRldGVjdCBhbmQgaW5pdCAqLworc3RhdGljIHZvaWQgX19pbml0IGludGVsX2luaXRfdGhlcm1hbChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJdTMyIGwsIGg7CisJdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCS8qIFRoZXJtYWwgbW9uaXRvcmluZyAqLworCWlmICghY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9BQ1BJKSkKKwkJcmV0dXJuOwkvKiAtRU5PREVWICovCisKKwkvKiBDbG9jayBtb2R1bGF0aW9uICovCisJaWYgKCFjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX0FDQykpCisJCXJldHVybjsJLyogLUVOT0RFViAqLworCisJLyogZmlyc3QgY2hlY2sgaWYgaXRzIGVuYWJsZWQgYWxyZWFkeSwgaW4gd2hpY2ggY2FzZSB0aGVyZSBtaWdodAorCSAqIGJlIHNvbWUgU01NIGdvbyB3aGljaCBoYW5kbGVzIGl0LCBzbyB3ZSBjYW4ndCBldmVuIHB1dCBhIGhhbmRsZXIKKwkgKiBzaW5jZSBpdCBtaWdodCBiZSBkZWxpdmVyZWQgdmlhIFNNSSBhbHJlYWR5IC16d2FuZW0uCisJICovCisJcmRtc3IgKE1TUl9JQTMyX01JU0NfRU5BQkxFLCBsLCBoKTsKKwloID0gYXBpY19yZWFkKEFQSUNfTFZUVEhNUik7CisJaWYgKChsICYgKDE8PDMpKSAmJiAoaCAmIEFQSUNfRE1fU01JKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiQ1BVJWQ6IFRoZXJtYWwgbW9uaXRvcmluZyBoYW5kbGVkIGJ5IFNNSVxuIiwKKwkJCQljcHUpOworCQlyZXR1cm47IC8qIC1FQlVTWSAqLworCX0KKworCS8qIGNoZWNrIHdoZXRoZXIgYSB2ZWN0b3IgYWxyZWFkeSBleGlzdHMsIHRlbXBvcmFyaWx5IG1hc2tlZD8gKi8JCisJaWYgKGggJiBBUElDX1ZFQ1RPUl9NQVNLKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJDUFUlZDogVGhlcm1hbCBMVlQgdmVjdG9yICglI3gpIGFscmVhZHkgIgorCQkJCSJpbnN0YWxsZWRcbiIsCisJCQljcHUsIChoICYgQVBJQ19WRUNUT1JfTUFTSykpOworCQlyZXR1cm47IC8qIC1FQlVTWSAqLworCX0KKworCS8qIFRoZSB0ZW1wZXJhdHVyZSB0cmFuc2l0aW9uIGludGVycnVwdCBoYW5kbGVyIHNldHVwICovCisJaCA9IFRIRVJNQUxfQVBJQ19WRUNUT1I7CQkvKiBvdXIgZGVsaXZlcnkgdmVjdG9yICovCisJaCB8PSAoQVBJQ19ETV9GSVhFRCB8IEFQSUNfTFZUX01BU0tFRCk7CS8qIHdlJ2xsIG1hc2sgdGlsbCB3ZSdyZSByZWFkeSAqLworCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUVEhNUiwgaCk7CisKKwlyZG1zciAoTVNSX0lBMzJfVEhFUk1fSU5URVJSVVBULCBsLCBoKTsKKwl3cm1zciAoTVNSX0lBMzJfVEhFUk1fSU5URVJSVVBULCBsIHwgMHgwMyAsIGgpOworCisJLyogb2sgd2UncmUgZ29vZCB0byBnby4uLiAqLworCXZlbmRvcl90aGVybWFsX2ludGVycnVwdCA9IGludGVsX3RoZXJtYWxfaW50ZXJydXB0OworCQorCXJkbXNyIChNU1JfSUEzMl9NSVNDX0VOQUJMRSwgbCwgaCk7CisJd3Jtc3IgKE1TUl9JQTMyX01JU0NfRU5BQkxFLCBsIHwgKDE8PDMpLCBoKTsKKwkKKwlsID0gYXBpY19yZWFkIChBUElDX0xWVFRITVIpOworCWFwaWNfd3JpdGVfYXJvdW5kIChBUElDX0xWVFRITVIsIGwgJiB+QVBJQ19MVlRfTUFTS0VEKTsKKwlwcmludGsgKEtFUk5fSU5GTyAiQ1BVJWQ6IFRoZXJtYWwgbW9uaXRvcmluZyBlbmFibGVkXG4iLCBjcHUpOworCXJldHVybjsKK30KKyNlbmRpZiAvKiBDT05GSUdfWDg2X01DRV9QNFRIRVJNQUwgKi8KKworCisvKiBQNC9YZW9uIEV4dGVuZGVkIE1DRSBNU1IgcmV0cmlldmFsLCByZXR1cm4gMCBpZiB1bnN1cHBvcnRlZCAqLworc3RhdGljIGlubGluZSBpbnQgaW50ZWxfZ2V0X2V4dGVuZGVkX21zcnMoc3RydWN0IGludGVsX21jZV9leHRlbmRlZF9tc3JzICpyKQoreworCXUzMiBoOworCisJaWYgKG1jZV9udW1fZXh0ZW5kZWRfbXNycyA9PSAwKQorCQlnb3RvIGRvbmU7CisKKwlyZG1zciAoTVNSX0lBMzJfTUNHX0VBWCwgci0+ZWF4LCBoKTsKKwlyZG1zciAoTVNSX0lBMzJfTUNHX0VCWCwgci0+ZWJ4LCBoKTsKKwlyZG1zciAoTVNSX0lBMzJfTUNHX0VDWCwgci0+ZWN4LCBoKTsKKwlyZG1zciAoTVNSX0lBMzJfTUNHX0VEWCwgci0+ZWR4LCBoKTsKKwlyZG1zciAoTVNSX0lBMzJfTUNHX0VTSSwgci0+ZXNpLCBoKTsKKwlyZG1zciAoTVNSX0lBMzJfTUNHX0VESSwgci0+ZWRpLCBoKTsKKwlyZG1zciAoTVNSX0lBMzJfTUNHX0VCUCwgci0+ZWJwLCBoKTsKKwlyZG1zciAoTVNSX0lBMzJfTUNHX0VTUCwgci0+ZXNwLCBoKTsKKwlyZG1zciAoTVNSX0lBMzJfTUNHX0VGTEFHUywgci0+ZWZsYWdzLCBoKTsKKwlyZG1zciAoTVNSX0lBMzJfTUNHX0VJUCwgci0+ZWlwLCBoKTsKKworCS8qIGNhbiB3ZSByZWx5IG9uIGttYWxsb2MgdG8gZG8gYSBkeW5hbWljCisJICogYWxsb2NhdGlvbiBmb3IgdGhlIHJlc2VydmVkIHJlZ2lzdGVycz8KKwkgKi8KK2RvbmU6CisJcmV0dXJuIG1jZV9udW1fZXh0ZW5kZWRfbXNyczsKK30KKworc3RhdGljIGZhc3RjYWxsIHZvaWQgaW50ZWxfbWFjaGluZV9jaGVjayhzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKK3sKKwlpbnQgcmVjb3Zlcj0xOworCXUzMiBhbG93LCBhaGlnaCwgaGlnaCwgbG93OworCXUzMiBtY2dzdGwsIG1jZ3N0aDsKKwlpbnQgaTsKKwlzdHJ1Y3QgaW50ZWxfbWNlX2V4dGVuZGVkX21zcnMgZGJnOworCisJcmRtc3IgKE1TUl9JQTMyX01DR19TVEFUVVMsIG1jZ3N0bCwgbWNnc3RoKTsKKwlpZiAobWNnc3RsICYgKDE8PDApKQkvKiBSZWNvdmVyYWJsZSA/ICovCisJCXJlY292ZXI9MDsKKworCXByaW50ayAoS0VSTl9FTUVSRyAiQ1BVICVkOiBNYWNoaW5lIENoZWNrIEV4Y2VwdGlvbjogJTA4eCUwOHhcbiIsCisJCXNtcF9wcm9jZXNzb3JfaWQoKSwgbWNnc3RoLCBtY2dzdGwpOworCisJaWYgKGludGVsX2dldF9leHRlbmRlZF9tc3JzKCZkYmcpKSB7CisJCXByaW50ayAoS0VSTl9ERUJVRyAiQ1BVICVkOiBFSVA6ICUwOHggRUZMQUdTOiAlMDh4XG4iLAorCQkJc21wX3Byb2Nlc3Nvcl9pZCgpLCBkYmcuZWlwLCBkYmcuZWZsYWdzKTsKKwkJcHJpbnRrIChLRVJOX0RFQlVHICJcdGVheDogJTA4eCBlYng6ICUwOHggZWN4OiAlMDh4IGVkeDogJTA4eFxuIiwKKwkJCWRiZy5lYXgsIGRiZy5lYngsIGRiZy5lY3gsIGRiZy5lZHgpOworCQlwcmludGsgKEtFUk5fREVCVUcgIlx0ZXNpOiAlMDh4IGVkaTogJTA4eCBlYnA6ICUwOHggZXNwOiAlMDh4XG4iLAorCQkJZGJnLmVzaSwgZGJnLmVkaSwgZGJnLmVicCwgZGJnLmVzcCk7CisJfQorCisJZm9yIChpPTA7IGk8bnJfbWNlX2JhbmtzOyBpKyspIHsKKwkJcmRtc3IgKE1TUl9JQTMyX01DMF9TVEFUVVMraSo0LGxvdywgaGlnaCk7CisJCWlmIChoaWdoICYgKDE8PDMxKSkgeworCQkJaWYgKGhpZ2ggJiAoMTw8MjkpKQorCQkJCXJlY292ZXIgfD0gMTsKKwkJCWlmIChoaWdoICYgKDE8PDI1KSkKKwkJCQlyZWNvdmVyIHw9IDI7CisJCQlwcmludGsgKEtFUk5fRU1FUkcgIkJhbmsgJWQ6ICUwOHglMDh4IiwgaSwgaGlnaCwgbG93KTsKKwkJCWhpZ2ggJj0gfigxPDwzMSk7CisJCQlpZiAoaGlnaCAmICgxPDwyNykpIHsKKwkJCQlyZG1zciAoTVNSX0lBMzJfTUMwX01JU0MraSo0LCBhbG93LCBhaGlnaCk7CisJCQkJcHJpbnRrICgiWyUwOHglMDh4XSIsIGFoaWdoLCBhbG93KTsKKwkJCX0KKwkJCWlmIChoaWdoICYgKDE8PDI2KSkgeworCQkJCXJkbXNyIChNU1JfSUEzMl9NQzBfQUREUitpKjQsIGFsb3csIGFoaWdoKTsKKwkJCQlwcmludGsgKCIgYXQgJTA4eCUwOHgiLCBhaGlnaCwgYWxvdyk7CisJCQl9CisJCQlwcmludGsgKCJcbiIpOworCQl9CisJfQorCisJaWYgKHJlY292ZXIgJiAyKQorCQlwYW5pYyAoIkNQVSBjb250ZXh0IGNvcnJ1cHQiKTsKKwlpZiAocmVjb3ZlciAmIDEpCisJCXBhbmljICgiVW5hYmxlIHRvIGNvbnRpbnVlIik7CisKKwlwcmludGsoS0VSTl9FTUVSRyAiQXR0ZW1wdGluZyB0byBjb250aW51ZS5cbiIpOworCS8qIAorCSAqIERvIG5vdCBjbGVhciB0aGUgTVNSX0lBMzJfTUNpX1NUQVRVUyBpZiB0aGUgZXJyb3IgaXMgbm90IAorCSAqIHJlY292ZXJhYmxlL2NvbnRpbnVhYmxlLlRoaXMgd2lsbCBhbGxvdyBCSU9TIHRvIGxvb2sgYXQgdGhlIE1TUnMKKwkgKiBmb3IgZXJyb3JzIGlmIHRoZSBPUyBjb3VsZCBub3QgbG9nIHRoZSBlcnJvci4KKwkgKi8KKwlmb3IgKGk9MDsgaTxucl9tY2VfYmFua3M7IGkrKykgeworCQl1MzIgbXNyOworCQltc3IgPSBNU1JfSUEzMl9NQzBfU1RBVFVTK2kqNDsKKwkJcmRtc3IgKG1zciwgbG93LCBoaWdoKTsKKwkJaWYgKGhpZ2gmKDE8PDMxKSkgeworCQkJLyogQ2xlYXIgaXQgKi8KKwkJCXdybXNyKG1zciwgMFVMLCAwVUwpOworCQkJLyogU2VyaWFsaXplICovCisJCQl3bWIoKTsKKwkJCWFkZF90YWludChUQUlOVF9NQUNISU5FX0NIRUNLKTsKKwkJfQorCX0KKwltY2dzdGwgJj0gfigxPDwyKTsKKwl3cm1zciAoTVNSX0lBMzJfTUNHX1NUQVRVUyxtY2dzdGwsIG1jZ3N0aCk7Cit9CisKKwordm9pZCBfX2luaXQgaW50ZWxfcDRfbWNoZWNrX2luaXQoc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworCXUzMiBsLCBoOworCWludCBpOworCQorCW1hY2hpbmVfY2hlY2tfdmVjdG9yID0gaW50ZWxfbWFjaGluZV9jaGVjazsKKwl3bWIoKTsKKworCXByaW50ayAoS0VSTl9JTkZPICJJbnRlbCBtYWNoaW5lIGNoZWNrIGFyY2hpdGVjdHVyZSBzdXBwb3J0ZWQuXG4iKTsKKwlyZG1zciAoTVNSX0lBMzJfTUNHX0NBUCwgbCwgaCk7CisJaWYgKGwgJiAoMTw8OCkpCS8qIENvbnRyb2wgcmVnaXN0ZXIgcHJlc2VudCA/ICovCisJCXdybXNyIChNU1JfSUEzMl9NQ0dfQ1RMLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmKTsKKwlucl9tY2VfYmFua3MgPSBsICYgMHhmZjsKKworCWZvciAoaT0wOyBpPG5yX21jZV9iYW5rczsgaSsrKSB7CisJCXdybXNyIChNU1JfSUEzMl9NQzBfQ1RMKzQqaSwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZik7CisJCXdybXNyIChNU1JfSUEzMl9NQzBfU1RBVFVTKzQqaSwgMHgwLCAweDApOworCX0KKworCXNldF9pbl9jcjQgKFg4Nl9DUjRfTUNFKTsKKwlwcmludGsgKEtFUk5fSU5GTyAiSW50ZWwgbWFjaGluZSBjaGVjayByZXBvcnRpbmcgZW5hYmxlZCBvbiBDUFUjJWQuXG4iLAorCQlzbXBfcHJvY2Vzc29yX2lkKCkpOworCisJLyogQ2hlY2sgZm9yIFA0L1hlb24gZXh0ZW5kZWQgTUNFIE1TUnMgKi8KKwlyZG1zciAoTVNSX0lBMzJfTUNHX0NBUCwgbCwgaCk7CisJaWYgKGwgJiAoMTw8OSkpCXsvKiBNQ0dfRVhUX1AgKi8KKwkJbWNlX251bV9leHRlbmRlZF9tc3JzID0gKGwgPj4gMTYpICYgMHhmZjsKKwkJcHJpbnRrIChLRVJOX0lORk8gIkNQVSVkOiBJbnRlbCBQNC9YZW9uIEV4dGVuZGVkIE1DRSBNU1JzICglZCkiCisJCQkJIiBhdmFpbGFibGVcbiIsCisJCQlzbXBfcHJvY2Vzc29yX2lkKCksIG1jZV9udW1fZXh0ZW5kZWRfbXNycyk7CisKKyNpZmRlZiBDT05GSUdfWDg2X01DRV9QNFRIRVJNQUwKKwkJLyogQ2hlY2sgZm9yIFA0L1hlb24gVGhlcm1hbCBtb25pdG9yICovCisJCWludGVsX2luaXRfdGhlcm1hbChjKTsKKyNlbmRpZgorCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9wNS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbWNoZWNrL3A1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ1YTFiNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9wNS5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBQNSBzcGVjaWZpYyBNYWNoaW5lIENoZWNrIEV4Y2VwdGlvbiBSZXBvcnRpbmcKKyAqIChDKSBDb3B5cmlnaHQgMjAwMiBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4gCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9tc3IuaD4KKworI2luY2x1ZGUgIm1jZS5oIgorCisvKiBNYWNoaW5lIGNoZWNrIGhhbmRsZXIgZm9yIFBlbnRpdW0gY2xhc3MgSW50ZWwgKi8KK3N0YXRpYyBmYXN0Y2FsbCB2b2lkIHBlbnRpdW1fbWFjaGluZV9jaGVjayhzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKK3sKKwl1MzIgbG9hZGRyLCBoaSwgbG90eXBlOworCXJkbXNyKE1TUl9JQTMyX1A1X01DX0FERFIsIGxvYWRkciwgaGkpOworCXJkbXNyKE1TUl9JQTMyX1A1X01DX1RZUEUsIGxvdHlwZSwgaGkpOworCXByaW50ayhLRVJOX0VNRVJHICJDUFUjJWQ6IE1hY2hpbmUgQ2hlY2sgRXhjZXB0aW9uOiAgMHglOFggKHR5cGUgMHglOFgpLlxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpLCBsb2FkZHIsIGxvdHlwZSk7CisJaWYobG90eXBlJigxPDw1KSkKKwkJcHJpbnRrKEtFUk5fRU1FUkcgIkNQVSMlZDogUG9zc2libGUgdGhlcm1hbCBmYWlsdXJlIChDUFUgb24gZmlyZSA/KS5cbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJYWRkX3RhaW50KFRBSU5UX01BQ0hJTkVfQ0hFQ0spOworfQorCisvKiBTZXQgdXAgbWFjaGluZSBjaGVjayByZXBvcnRpbmcgZm9yIHByb2Nlc3NvcnMgd2l0aCBJbnRlbCBzdHlsZSBNQ0UgKi8KK3ZvaWQgX19pbml0IGludGVsX3A1X21jaGVja19pbml0KHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKKwl1MzIgbCwgaDsKKwkKKwkvKkNoZWNrIGZvciBNQ0Ugc3VwcG9ydCAqLworCWlmKCAhY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9NQ0UpICkKKwkJcmV0dXJuOwkKKworCS8qIERlZmF1bHQgUDUgdG8gb2ZmIGFzIGl0cyBvZnRlbiBtaXNjb25uZWN0ZWQgKi8KKwlpZihtY2VfZGlzYWJsZWQgIT0gLTEpCisJCXJldHVybjsKKwltYWNoaW5lX2NoZWNrX3ZlY3RvciA9IHBlbnRpdW1fbWFjaGluZV9jaGVjazsKKwl3bWIoKTsKKworCS8qIFJlYWQgcmVnaXN0ZXJzIGJlZm9yZSBlbmFibGluZyAqLworCXJkbXNyKE1TUl9JQTMyX1A1X01DX0FERFIsIGwsIGgpOworCXJkbXNyKE1TUl9JQTMyX1A1X01DX1RZUEUsIGwsIGgpOworCXByaW50ayhLRVJOX0lORk8gIkludGVsIG9sZCBzdHlsZSBtYWNoaW5lIGNoZWNrIGFyY2hpdGVjdHVyZSBzdXBwb3J0ZWQuXG4iKTsKKworIAkvKiBFbmFibGUgTUNFICovCisJc2V0X2luX2NyNChYODZfQ1I0X01DRSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiSW50ZWwgb2xkIHN0eWxlIG1hY2hpbmUgY2hlY2sgcmVwb3J0aW5nIGVuYWJsZWQgb24gQ1BVIyVkLlxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9wNi5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbWNoZWNrL3A2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY2NDBmOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9wNi5jCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogUDYgc3BlY2lmaWMgTWFjaGluZSBDaGVjayBFeGNlcHRpb24gUmVwb3J0aW5nCisgKiAoQykgQ29weXJpZ2h0IDIwMDIgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+IAorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vbXNyLmg+CisKKyNpbmNsdWRlICJtY2UuaCIKKworLyogTWFjaGluZSBDaGVjayBIYW5kbGVyIEZvciBQSUkvUElJSSAqLworc3RhdGljIGZhc3RjYWxsIHZvaWQgaW50ZWxfbWFjaGluZV9jaGVjayhzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKK3sKKwlpbnQgcmVjb3Zlcj0xOworCXUzMiBhbG93LCBhaGlnaCwgaGlnaCwgbG93OworCXUzMiBtY2dzdGwsIG1jZ3N0aDsKKwlpbnQgaTsKKworCXJkbXNyIChNU1JfSUEzMl9NQ0dfU1RBVFVTLCBtY2dzdGwsIG1jZ3N0aCk7CisJaWYgKG1jZ3N0bCAmICgxPDwwKSkJLyogUmVjb3ZlcmFibGUgPyAqLworCQlyZWNvdmVyPTA7CisKKwlwcmludGsgKEtFUk5fRU1FUkcgIkNQVSAlZDogTWFjaGluZSBDaGVjayBFeGNlcHRpb246ICUwOHglMDh4XG4iLAorCQlzbXBfcHJvY2Vzc29yX2lkKCksIG1jZ3N0aCwgbWNnc3RsKTsKKworCWZvciAoaT0wOyBpPG5yX21jZV9iYW5rczsgaSsrKSB7CisJCXJkbXNyIChNU1JfSUEzMl9NQzBfU1RBVFVTK2kqNCxsb3csIGhpZ2gpOworCQlpZiAoaGlnaCAmICgxPDwzMSkpIHsKKwkJCWlmIChoaWdoICYgKDE8PDI5KSkKKwkJCQlyZWNvdmVyIHw9IDE7CisJCQlpZiAoaGlnaCAmICgxPDwyNSkpCisJCQkJcmVjb3ZlciB8PSAyOworCQkJcHJpbnRrIChLRVJOX0VNRVJHICJCYW5rICVkOiAlMDh4JTA4eCIsIGksIGhpZ2gsIGxvdyk7CisJCQloaWdoICY9IH4oMTw8MzEpOworCQkJaWYgKGhpZ2ggJiAoMTw8MjcpKSB7CisJCQkJcmRtc3IgKE1TUl9JQTMyX01DMF9NSVNDK2kqNCwgYWxvdywgYWhpZ2gpOworCQkJCXByaW50ayAoIlslMDh4JTA4eF0iLCBhaGlnaCwgYWxvdyk7CisJCQl9CisJCQlpZiAoaGlnaCAmICgxPDwyNikpIHsKKwkJCQlyZG1zciAoTVNSX0lBMzJfTUMwX0FERFIraSo0LCBhbG93LCBhaGlnaCk7CisJCQkJcHJpbnRrICgiIGF0ICUwOHglMDh4IiwgYWhpZ2gsIGFsb3cpOworCQkJfQorCQkJcHJpbnRrICgiXG4iKTsKKwkJfQorCX0KKworCWlmIChyZWNvdmVyICYgMikKKwkJcGFuaWMgKCJDUFUgY29udGV4dCBjb3JydXB0Iik7CisJaWYgKHJlY292ZXIgJiAxKQorCQlwYW5pYyAoIlVuYWJsZSB0byBjb250aW51ZSIpOworCisJcHJpbnRrIChLRVJOX0VNRVJHICJBdHRlbXB0aW5nIHRvIGNvbnRpbnVlLlxuIik7CisJLyogCisJICogRG8gbm90IGNsZWFyIHRoZSBNU1JfSUEzMl9NQ2lfU1RBVFVTIGlmIHRoZSBlcnJvciBpcyBub3QgCisJICogcmVjb3ZlcmFibGUvY29udGludWFibGUuVGhpcyB3aWxsIGFsbG93IEJJT1MgdG8gbG9vayBhdCB0aGUgTVNScworCSAqIGZvciBlcnJvcnMgaWYgdGhlIE9TIGNvdWxkIG5vdCBsb2cgdGhlIGVycm9yLgorCSAqLworCWZvciAoaT0wOyBpPG5yX21jZV9iYW5rczsgaSsrKSB7CisJCXVuc2lnbmVkIGludCBtc3I7CisJCW1zciA9IE1TUl9JQTMyX01DMF9TVEFUVVMraSo0OworCQlyZG1zciAobXNyLGxvdywgaGlnaCk7CisJCWlmIChoaWdoICYgKDE8PDMxKSkgeworCQkJLyogQ2xlYXIgaXQgKi8KKwkJCXdybXNyIChtc3IsIDBVTCwgMFVMKTsKKwkJCS8qIFNlcmlhbGl6ZSAqLworCQkJd21iKCk7CisJCQlhZGRfdGFpbnQoVEFJTlRfTUFDSElORV9DSEVDSyk7CisJCX0KKwl9CisJbWNnc3RsICY9IH4oMTw8Mik7CisJd3Jtc3IgKE1TUl9JQTMyX01DR19TVEFUVVMsbWNnc3RsLCBtY2dzdGgpOworfQorCisvKiBTZXQgdXAgbWFjaGluZSBjaGVjayByZXBvcnRpbmcgZm9yIHByb2Nlc3NvcnMgd2l0aCBJbnRlbCBzdHlsZSBNQ0UgKi8KK3ZvaWQgX19pbml0IGludGVsX3A2X21jaGVja19pbml0KHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKKwl1MzIgbCwgaDsKKwlpbnQgaTsKKwkKKwkvKiBDaGVjayBmb3IgTUNFIHN1cHBvcnQgKi8KKwlpZiAoIWNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfTUNFKSkKKwkJcmV0dXJuOworCisJLyogQ2hlY2sgZm9yIFBQcm8gc3R5bGUgTUNBICovCisgCWlmICghY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9NQ0EpKQorCQlyZXR1cm47CisKKwkvKiBPayBtYWNoaW5lIGNoZWNrIGlzIGF2YWlsYWJsZSAqLworCW1hY2hpbmVfY2hlY2tfdmVjdG9yID0gaW50ZWxfbWFjaGluZV9jaGVjazsKKwl3bWIoKTsKKworCXByaW50ayAoS0VSTl9JTkZPICJJbnRlbCBtYWNoaW5lIGNoZWNrIGFyY2hpdGVjdHVyZSBzdXBwb3J0ZWQuXG4iKTsKKwlyZG1zciAoTVNSX0lBMzJfTUNHX0NBUCwgbCwgaCk7CisJaWYgKGwgJiAoMTw8OCkpCS8qIENvbnRyb2wgcmVnaXN0ZXIgcHJlc2VudCA/ICovCisJCXdybXNyKE1TUl9JQTMyX01DR19DVEwsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYpOworCW5yX21jZV9iYW5rcyA9IGwgJiAweGZmOworCisJLyogRG9uJ3QgZW5hYmxlIGJhbmsgMCBvbiBpbnRlbCBQNiBjb3JlcywgaXQgZ29lcyBiYW5nIHF1aWNrbHkuICovCisJZm9yIChpPTE7IGk8bnJfbWNlX2JhbmtzOyBpKyspIHsKKwkJd3Jtc3IgKE1TUl9JQTMyX01DMF9DVEwrNCppLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmKTsKKwkJd3Jtc3IgKE1TUl9JQTMyX01DMF9TVEFUVVMrNCppLCAweDAsIDB4MCk7CisJfQorCisJc2V0X2luX2NyNCAoWDg2X0NSNF9NQ0UpOworCXByaW50ayAoS0VSTl9JTkZPICJJbnRlbCBtYWNoaW5lIGNoZWNrIHJlcG9ydGluZyBlbmFibGVkIG9uIENQVSMlZC5cbiIsCisJCXNtcF9wcm9jZXNzb3JfaWQoKSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svd2luY2hpcC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbWNoZWNrL3dpbmNoaXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTNmYTdhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbWNoZWNrL3dpbmNoaXAuYwpAQCAtMCwwICsxLDM3IEBACisvKgorICogSURUIFdpbmNoaXAgc3BlY2lmaWMgTWFjaGluZSBDaGVjayBFeGNlcHRpb24gUmVwb3J0aW5nCisgKiAoQykgQ29weXJpZ2h0IDIwMDIgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+IAorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vbXNyLmg+CisKKyNpbmNsdWRlICJtY2UuaCIKKworLyogTWFjaGluZSBjaGVjayBoYW5kbGVyIGZvciBXaW5DaGlwIEM2ICovCitzdGF0aWMgZmFzdGNhbGwgdm9pZCB3aW5jaGlwX21hY2hpbmVfY2hlY2soc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUpCit7CisJcHJpbnRrKEtFUk5fRU1FUkcgIkNQVTA6IE1hY2hpbmUgQ2hlY2sgRXhjZXB0aW9uLlxuIik7CisJYWRkX3RhaW50KFRBSU5UX01BQ0hJTkVfQ0hFQ0spOworfQorCisvKiBTZXQgdXAgbWFjaGluZSBjaGVjayByZXBvcnRpbmcgb24gdGhlIFdpbmNoaXAgQzYgc2VyaWVzICovCit2b2lkIF9faW5pdCB3aW5jaGlwX21jaGVja19pbml0KHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKKwl1MzIgbG8sIGhpOworCW1hY2hpbmVfY2hlY2tfdmVjdG9yID0gd2luY2hpcF9tYWNoaW5lX2NoZWNrOworCXdtYigpOworCXJkbXNyKE1TUl9JRFRfRkNSMSwgbG8sIGhpKTsKKwlsb3w9ICgxPDwyKTsJLyogRW5hYmxlIEVJRVJSSU5UIChpbnQgMTggTUNFKSAqLworCWxvJj0gfigxPDw0KTsJLyogRW5hYmxlIE1DRSAqLworCXdybXNyKE1TUl9JRFRfRkNSMSwgbG8sIGhpKTsKKwlzZXRfaW5fY3I0KFg4Nl9DUjRfTUNFKTsKKwlwcmludGsoS0VSTl9JTkZPICJXaW5jaGlwIG1hY2hpbmUgY2hlY2sgcmVwb3J0aW5nIGVuYWJsZWQgb24gQ1BVIzAuXG4iKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvTWFrZWZpbGUgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNWI3MDEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL01ha2VmaWxlCkBAIC0wLDAgKzEsNSBAQAorb2JqLXkJCTo9IG1haW4ubyBpZi5vIGdlbmVyaWMubyBzdGF0ZS5vCitvYmoteQkJKz0gYW1kLm8KK29iai15CQkrPSBjeXJpeC5vCitvYmoteQkJKz0gY2VudGF1ci5vCisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvYW1kLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL2FtZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMWUwNGIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL2FtZC5jCkBAIC0wLDAgKzEsMTIxIEBACisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8YXNtL210cnIuaD4KKyNpbmNsdWRlIDxhc20vbXNyLmg+CisKKyNpbmNsdWRlICJtdHJyLmgiCisKK3N0YXRpYyB2b2lkCithbWRfZ2V0X210cnIodW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgbG9uZyAqYmFzZSwKKwkgICAgIHVuc2lnbmVkIGludCAqc2l6ZSwgbXRycl90eXBlICogdHlwZSkKK3sKKwl1bnNpZ25lZCBsb25nIGxvdywgaGlnaDsKKworCXJkbXNyKE1TUl9LNl9VV0NDUiwgbG93LCBoaWdoKTsKKwkvKiAgVXBwZXIgZHdvcmQgaXMgcmVnaW9uIDEsIGxvd2VyIGlzIHJlZ2lvbiAwICAqLworCWlmIChyZWcgPT0gMSkKKwkJbG93ID0gaGlnaDsKKwkvKiAgVGhlIGJhc2UgbWFza3Mgb2ZmIG9uIHRoZSByaWdodCBhbGlnbm1lbnQgICovCisJKmJhc2UgPSAobG93ICYgMHhGRkZFMDAwMCkgPj4gUEFHRV9TSElGVDsKKwkqdHlwZSA9IDA7CisJaWYgKGxvdyAmIDEpCisJCSp0eXBlID0gTVRSUl9UWVBFX1VOQ0FDSEFCTEU7CisJaWYgKGxvdyAmIDIpCisJCSp0eXBlID0gTVRSUl9UWVBFX1dSQ09NQjsKKwlpZiAoIShsb3cgJiAzKSkgeworCQkqc2l6ZSA9IDA7CisJCXJldHVybjsKKwl9CisJLyoKKwkgKiAgVGhpcyBuZWVkcyBhIGxpdHRsZSBleHBsYWluaW5nLiBUaGUgc2l6ZSBpcyBzdG9yZWQgYXMgYW4KKwkgKiAgaW52ZXJ0ZWQgbWFzayBvZiBiaXRzIG9mIDEyOEsgZ3JhbnVsYXJpdHkgMTUgYml0cyBsb25nIG9mZnNldAorCSAqICAyIGJpdHMKKwkgKgorCSAqICBTbyB0byBnZXQgYSBzaXplIHdlIGRvIGludmVydCB0aGUgbWFzayBhbmQgYWRkIDEgdG8gdGhlIGxvd2VzdAorCSAqICBtYXNrIGJpdCAoNCBhcyBpdHMgMiBiaXRzIGluKS4gVGhpcyBnaXZlcyB1cyBhIHNpemUgd2UgdGhlbiBzaGlmdAorCSAqICB0byB0dXJuIGludG8gMTI4SyBibG9ja3MKKwkgKgorCSAqICBlZyAgICAgICAgICAgICAgMTExIDExMTEgMTExMSAxMTAwICAgICAgaXMgNTEySworCSAqCisJICogIGludmVydCAgICAgICAgICAwMDAgMDAwMCAwMDAwIDAwMTEKKwkgKiAgKzEgICAgICAgICAgICAgIDAwMCAwMDAwIDAwMDAgMDEwMAorCSAqICAqMTI4SyAgIC4uLgorCSAqLworCWxvdyA9ICh+bG93KSAmIDB4MUZGRkM7CisJKnNpemUgPSAobG93ICsgNCkgPDwgKDE1IC0gUEFHRV9TSElGVCk7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBhbWRfc2V0X210cnIodW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgbG9uZyBiYXNlLAorCQkJIHVuc2lnbmVkIGxvbmcgc2l6ZSwgbXRycl90eXBlIHR5cGUpCisvKiAgW1NVTU1BUlldIFNldCB2YXJpYWJsZSBNVFJSIHJlZ2lzdGVyIG9uIHRoZSBsb2NhbCBDUFUuCisgICAgPHJlZz4gVGhlIHJlZ2lzdGVyIHRvIHNldC4KKyAgICA8YmFzZT4gVGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgcmVnaW9uLgorICAgIDxzaXplPiBUaGUgc2l6ZSBvZiB0aGUgcmVnaW9uLiBJZiB0aGlzIGlzIDAgdGhlIHJlZ2lvbiBpcyBkaXNhYmxlZC4KKyAgICA8dHlwZT4gVGhlIHR5cGUgb2YgdGhlIHJlZ2lvbi4KKyAgICA8ZG9fc2FmZT4gSWYgVFJVRSwgZG8gdGhlIGNoYW5nZSBzYWZlbHkuIElmIEZBTFNFLCBzYWZldHkgbWVhc3VyZXMgc2hvdWxkCisgICAgYmUgZG9uZSBleHRlcm5hbGx5LgorICAgIFtSRVRVUk5TXSBOb3RoaW5nLgorKi8KK3sKKwl1MzIgcmVnc1syXTsKKworCS8qCisJICogIExvdyBpcyBNVFJSMCAsIEhpZ2ggTVRSUiAxCisJICovCisJcmRtc3IoTVNSX0s2X1VXQ0NSLCByZWdzWzBdLCByZWdzWzFdKTsKKwkvKgorCSAqICBCbGFuayB0byBkaXNhYmxlCisJICovCisJaWYgKHNpemUgPT0gMCkKKwkJcmVnc1tyZWddID0gMDsKKwllbHNlCisJCS8qIFNldCB0aGUgcmVnaXN0ZXIgdG8gdGhlIGJhc2UsIHRoZSB0eXBlIChvZmYgYnkgb25lKSBhbmQgYW4KKwkJICAgaW52ZXJ0ZWQgYml0bWFzayBvZiB0aGUgc2l6ZSBUaGUgc2l6ZSBpcyB0aGUgb25seSBvZGQKKwkJICAgYml0LiBXZSBhcmUgZmVkIHNheSA1MTJLIFdlIGludmVydCB0aGlzIGFuZCB3ZSBnZXQgMTExIDExMTEKKwkJICAgMTExMSAxMDExIGJ1dCBpZiB5b3Ugc3VidHJhY3Qgb25lIGFuZCBpbnZlcnQgeW91IGdldCB0aGUgICAKKwkJICAgZGVzaXJlZCAxMTEgMTExMSAxMTExIDExMDAgbWFzaworCisJCSAgIEJ1dCB+KHggLSAxKSA9PSB+eCArIDEgPT0gLXguIFR3bydzIGNvbXBsZW1lbnQgcm9ja3MhICAqLworCQlyZWdzW3JlZ10gPSAoLXNpemUgPj4gKDE1IC0gUEFHRV9TSElGVCkgJiAweDAwMDFGRkZDKQorCQkgICAgfCAoYmFzZSA8PCBQQUdFX1NISUZUKSB8ICh0eXBlICsgMSk7CisKKwkvKgorCSAqICBUaGUgd3JpdGViYWNrIHJ1bGUgaXMgcXVpdGUgc3BlY2lmaWMuIFNlZSB0aGUgbWFudWFsLiBJdHMKKwkgKiAgZGlzYWJsZSBsb2NhbCBpbnRlcnJ1cHRzLCB3cml0ZSBiYWNrIHRoZSBjYWNoZSwgc2V0IHRoZSBtdHJyCisJICovCisJd2JpbnZkKCk7CisJd3Jtc3IoTVNSX0s2X1VXQ0NSLCByZWdzWzBdLCByZWdzWzFdKTsKK30KKworc3RhdGljIGludCBhbWRfdmFsaWRhdGVfYWRkX3BhZ2UodW5zaWduZWQgbG9uZyBiYXNlLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGludCB0eXBlKQoreworCS8qIEFwcGx5IHRoZSBLNiBibG9jayBhbGlnbm1lbnQgYW5kIHNpemUgcnVsZXMKKwkgICBJbiBvcmRlcgorCSAgIG8gVW5jYWNoZWQgb3IgZ2F0aGVyaW5nIG9ubHkKKwkgICBvIDEyOEsgb3IgYmlnZ2VyIGJsb2NrCisJICAgbyBQb3dlciBvZiAyIGJsb2NrCisJICAgbyBiYXNlIHN1aXRhYmx5IGFsaWduZWQgdG8gdGhlIHBvd2VyCisJKi8KKwlpZiAodHlwZSA+IE1UUlJfVFlQRV9XUkNPTUIgfHwgc2l6ZSA8ICgxIDw8ICgxNyAtIFBBR0VfU0hJRlQpKQorCSAgICB8fCAoc2l6ZSAmIH4oc2l6ZSAtIDEpKSAtIHNpemUgfHwgKGJhc2UgJiAoc2l6ZSAtIDEpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXRycl9vcHMgYW1kX210cnJfb3BzID0geworCS52ZW5kb3IgICAgICAgICAgICA9IFg4Nl9WRU5ET1JfQU1ELAorCS5zZXQgICAgICAgICAgICAgICA9IGFtZF9zZXRfbXRyciwKKwkuZ2V0ICAgICAgICAgICAgICAgPSBhbWRfZ2V0X210cnIsCisJLmdldF9mcmVlX3JlZ2lvbiAgID0gZ2VuZXJpY19nZXRfZnJlZV9yZWdpb24sCisJLnZhbGlkYXRlX2FkZF9wYWdlID0gYW1kX3ZhbGlkYXRlX2FkZF9wYWdlLAorCS5oYXZlX3dyY29tYiAgICAgICA9IHBvc2l0aXZlX2hhdmVfd3Jjb21iLAorfTsKKworaW50IF9faW5pdCBhbWRfaW5pdF9tdHJyKHZvaWQpCit7CisJc2V0X210cnJfb3BzKCZhbWRfbXRycl9vcHMpOworCXJldHVybiAwOworfQorCisvL2FyY2hfaW5pdGNhbGwoYW1kX210cnJfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL2NlbnRhdXIuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvY2VudGF1ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZjAwYWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL2NlbnRhdXIuYwpAQCAtMCwwICsxLDIyMyBAQAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGFzbS9tdHJyLmg+CisjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgIm10cnIuaCIKKworc3RhdGljIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBoaWdoOworCXVuc2lnbmVkIGxvbmcgbG93OworfSBjZW50YXVyX21jcls4XTsKKworc3RhdGljIHU4IGNlbnRhdXJfbWNyX3Jlc2VydmVkOworc3RhdGljIHU4IGNlbnRhdXJfbWNyX3R5cGU7CS8qIDAgZm9yIHdpbmNoaXAsIDEgZm9yIHdpbmNoaXAyICovCisKKy8qCisgKglSZXBvcnQgYm9vdCB0aW1lIE1DUiBzZXR1cHMgCisgKi8KKworc3RhdGljIGludAorY2VudGF1cl9nZXRfZnJlZV9yZWdpb24odW5zaWduZWQgbG9uZyBiYXNlLCB1bnNpZ25lZCBsb25nIHNpemUpCisvKiAgW1NVTU1BUlldIEdldCBhIGZyZWUgTVRSUi4KKyAgICA8YmFzZT4gVGhlIHN0YXJ0aW5nIChiYXNlKSBhZGRyZXNzIG9mIHRoZSByZWdpb24uCisgICAgPHNpemU+IFRoZSBzaXplIChpbiBieXRlcykgb2YgdGhlIHJlZ2lvbi4KKyAgICBbUkVUVVJOU10gVGhlIGluZGV4IG9mIHRoZSByZWdpb24gb24gc3VjY2VzcywgZWxzZSAtMSBvbiBlcnJvci4KKyovCit7CisJaW50IGksIG1heDsKKwltdHJyX3R5cGUgbHR5cGU7CisJdW5zaWduZWQgbG9uZyBsYmFzZTsKKwl1bnNpZ25lZCBpbnQgbHNpemU7CisKKwltYXggPSBudW1fdmFyX3JhbmdlczsKKwlmb3IgKGkgPSAwOyBpIDwgbWF4OyArK2kpIHsKKwkJaWYgKGNlbnRhdXJfbWNyX3Jlc2VydmVkICYgKDEgPDwgaSkpCisJCQljb250aW51ZTsKKwkJbXRycl9pZi0+Z2V0KGksICZsYmFzZSwgJmxzaXplLCAmbHR5cGUpOworCQlpZiAobHNpemUgPT0gMCkKKwkJCXJldHVybiBpOworCX0KKwlyZXR1cm4gLUVOT1NQQzsKK30KKwordm9pZAorbXRycl9jZW50YXVyX3JlcG9ydF9tY3IoaW50IG1jciwgdTMyIGxvLCB1MzIgaGkpCit7CisJY2VudGF1cl9tY3JbbWNyXS5sb3cgPSBsbzsKKwljZW50YXVyX21jclttY3JdLmhpZ2ggPSBoaTsKK30KKworc3RhdGljIHZvaWQKK2NlbnRhdXJfZ2V0X21jcih1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBsb25nICpiYXNlLAorCQl1bnNpZ25lZCBpbnQgKnNpemUsIG10cnJfdHlwZSAqIHR5cGUpCit7CisJKmJhc2UgPSBjZW50YXVyX21jcltyZWddLmhpZ2ggPj4gUEFHRV9TSElGVDsKKwkqc2l6ZSA9IC0oY2VudGF1cl9tY3JbcmVnXS5sb3cgJiAweGZmZmZmMDAwKSA+PiBQQUdFX1NISUZUOworCSp0eXBlID0gTVRSUl9UWVBFX1dSQ09NQjsJLyogIElmIGl0IGlzIHRoZXJlLCBpdCBpcyB3cml0ZS1jb21iaW5pbmcgICovCisJaWYgKGNlbnRhdXJfbWNyX3R5cGUgPT0gMSAmJiAoKGNlbnRhdXJfbWNyW3JlZ10ubG93ICYgMzEpICYgMikpCisJCSp0eXBlID0gTVRSUl9UWVBFX1VOQ0FDSEFCTEU7CisJaWYgKGNlbnRhdXJfbWNyX3R5cGUgPT0gMSAmJiAoY2VudGF1cl9tY3JbcmVnXS5sb3cgJiAzMSkgPT0gMjUpCisJCSp0eXBlID0gTVRSUl9UWVBFX1dSQkFDSzsKKwlpZiAoY2VudGF1cl9tY3JfdHlwZSA9PSAwICYmIChjZW50YXVyX21jcltyZWddLmxvdyAmIDMxKSA9PSAzMSkKKwkJKnR5cGUgPSBNVFJSX1RZUEVfV1JCQUNLOworCit9CisKK3N0YXRpYyB2b2lkIGNlbnRhdXJfc2V0X21jcih1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBsb25nIGJhc2UsCisJCQkgICAgdW5zaWduZWQgbG9uZyBzaXplLCBtdHJyX3R5cGUgdHlwZSkKK3sKKwl1bnNpZ25lZCBsb25nIGxvdywgaGlnaDsKKworCWlmIChzaXplID09IDApIHsKKwkJLyogIERpc2FibGUgICovCisJCWhpZ2ggPSBsb3cgPSAwOworCX0gZWxzZSB7CisJCWhpZ2ggPSBiYXNlIDw8IFBBR0VfU0hJRlQ7CisJCWlmIChjZW50YXVyX21jcl90eXBlID09IDApCisJCQlsb3cgPSAtc2l6ZSA8PCBQQUdFX1NISUZUIHwgMHgxZjsJLyogb25seSBzdXBwb3J0IHdyaXRlLWNvbWJpbmluZy4uLiAqLworCQllbHNlIHsKKwkJCWlmICh0eXBlID09IE1UUlJfVFlQRV9VTkNBQ0hBQkxFKQorCQkJCWxvdyA9IC1zaXplIDw8IFBBR0VfU0hJRlQgfCAweDAyOwkvKiBOQyAqLworCQkJZWxzZQorCQkJCWxvdyA9IC1zaXplIDw8IFBBR0VfU0hJRlQgfCAweDA5OwkvKiBXV08sV0MgKi8KKwkJfQorCX0KKwljZW50YXVyX21jcltyZWddLmhpZ2ggPSBoaWdoOworCWNlbnRhdXJfbWNyW3JlZ10ubG93ID0gbG93OworCXdybXNyKE1TUl9JRFRfTUNSMCArIHJlZywgbG93LCBoaWdoKTsKK30KKworI2lmIDAKKy8qCisgKglJbml0aWFsaXNlIHRoZSBsYXRlciAoc2FuZXIpIFdpbmNoaXAgTUNSIHZhcmlhbnQuIEluIHRoaXMgdmVyc2lvbgorICoJdGhlIEJJT1MgY2FuIHBhc3MgdXMgdGhlIHJlZ2lzdGVycyBpdCBoYXMgdXNlZCAoYnV0IG5vdCB0aGVpciB2YWx1ZXMpCisgKglhbmQgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgaXMgcmVhZC93cml0ZQorICovCisKK3N0YXRpYyB2b2lkIF9faW5pdAorY2VudGF1cl9tY3IxX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBpOworCXUzMiBsbywgaGk7CisKKwkvKiBVbmZvcnR1bmF0ZWx5LCBNQ1IncyBhcmUgcmVhZC1vbmx5LCBzbyB0aGVyZSBpcyBubyB3YXkgdG8KKwkgKiBmaW5kIG91dCB3aGF0IHRoZSBiaW9zIG1pZ2h0IGhhdmUgZG9uZS4KKwkgKi8KKworCXJkbXNyKE1TUl9JRFRfTUNSX0NUUkwsIGxvLCBoaSk7CisJaWYgKCgobG8gPj4gMTcpICYgNykgPT0gMSkgewkvKiBUeXBlIDEgV2luY2hpcDIgTUNSICovCisJCWxvICY9IH4weDFDMDsJLyogY2xlYXIga2V5ICovCisJCWxvIHw9IDB4MDQwOwkvKiBzZXQga2V5IHRvIDEgKi8KKwkJd3Jtc3IoTVNSX0lEVF9NQ1JfQ1RSTCwgbG8sIGhpKTsJLyogdW5sb2NrIE1DUiAqLworCX0KKworCWNlbnRhdXJfbWNyX3R5cGUgPSAxOworCisJLyoKKwkgKiAgQ2xlYXIgYW55IHVuY29uZmlndXJlZCBNQ1Incy4KKwkgKi8KKworCWZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHsKKwkJaWYgKGNlbnRhdXJfbWNyW2ldLmhpZ2ggPT0gMCAmJiBjZW50YXVyX21jcltpXS5sb3cgPT0gMCkgeworCQkJaWYgKCEobG8gJiAoMSA8PCAoOSArIGkpKSkpCisJCQkJd3Jtc3IoTVNSX0lEVF9NQ1IwICsgaSwgMCwgMCk7CisJCQllbHNlCisJCQkJLyoKKwkJCQkgKiAgICAgIElmIHRoZSBCSU9TIHNldCB1cCBhbiBNQ1Igd2UgY2Fubm90IHNlZSBpdAorCQkJCSAqICAgICAgYnV0IHdlIGRvbid0IHdpc2ggdG8gb2JsaXRlcmF0ZSBpdAorCQkJCSAqLworCQkJCWNlbnRhdXJfbWNyX3Jlc2VydmVkIHw9ICgxIDw8IGkpOworCQl9CisJfQorCS8qICAKKwkgKiAgVGhyb3cgdGhlIG1haW4gd3JpdGUtY29tYmluaW5nIHN3aXRjaC4uLiAKKwkgKiAgSG93ZXZlciBpZiBPT1NUT1JFIGlzIGVuYWJsZWQgdGhlbiBwZW9wbGUgaGF2ZSBhbHJlYWR5IGRvbmUgZmFyCisJICogIGNsZXZlcmVyIHRoaW5ncyBhbmQgd2Ugc2hvdWxkIGJlaGF2ZS4gCisJICovCisKKwlsbyB8PSAxNTsJCS8qIFdyaXRlIGNvbWJpbmUgZW5hYmxlcyAqLworCXdybXNyKE1TUl9JRFRfTUNSX0NUUkwsIGxvLCBoaSk7Cit9CisKKy8qCisgKglJbml0aWFsaXNlIHRoZSBvcmlnaW5hbCB3aW5jaGlwIHdpdGggcmVhZCBvbmx5IE1DUiByZWdpc3RlcnMKKyAqCW5vIHVzZWQgYml0bWFzayBmb3IgdGhlIEJJT1MgdG8gcGFzcyBvbiBhbmQgd3JpdGUgb25seSBjb250cm9sCisgKi8KKworc3RhdGljIHZvaWQgX19pbml0CitjZW50YXVyX21jcjBfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGk7CisKKwkvKiBVbmZvcnR1bmF0ZWx5LCBNQ1IncyBhcmUgcmVhZC1vbmx5LCBzbyB0aGVyZSBpcyBubyB3YXkgdG8KKwkgKiBmaW5kIG91dCB3aGF0IHRoZSBiaW9zIG1pZ2h0IGhhdmUgZG9uZS4KKwkgKi8KKworCS8qIENsZWFyIGFueSB1bmNvbmZpZ3VyZWQgTUNSJ3MuCisJICogVGhpcyB3YXkgd2UgYXJlIHN1cmUgdGhhdCB0aGUgY2VudGF1cl9tY3IgYXJyYXkgY29udGFpbnMgdGhlIGFjdHVhbAorCSAqIHZhbHVlcy4gVGhlIGRpc2FkdmFudGFnZSBpcyB0aGF0IGFueSBCSU9TIHR3ZWFrcyBhcmUgdGh1cyB1bmRvbmUuCisJICoKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgODsgKytpKSB7CisJCWlmIChjZW50YXVyX21jcltpXS5oaWdoID09IDAgJiYgY2VudGF1cl9tY3JbaV0ubG93ID09IDApCisJCQl3cm1zcihNU1JfSURUX01DUjAgKyBpLCAwLCAwKTsKKwl9CisKKwl3cm1zcihNU1JfSURUX01DUl9DVFJMLCAweDAxRjAwMDFGLCAwKTsJLyogV3JpdGUgb25seSAqLworfQorCisvKgorICoJSW5pdGlhbGlzZSBXaW5jaGlwIHNlcmllcyBNQ1IgcmVnaXN0ZXJzCisgKi8KKworc3RhdGljIHZvaWQgX19pbml0CitjZW50YXVyX21jcl9pbml0KHZvaWQpCit7CisJc3RydWN0IHNldF9tdHJyX2NvbnRleHQgY3R4dDsKKworCXNldF9tdHJyX3ByZXBhcmVfc2F2ZSgmY3R4dCk7CisJc2V0X210cnJfY2FjaGVfZGlzYWJsZSgmY3R4dCk7CisKKwlpZiAoYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPT0gNCkKKwkJY2VudGF1cl9tY3IwX2luaXQoKTsKKwllbHNlIGlmIChib290X2NwdV9kYXRhLng4Nl9tb2RlbCA9PSA4IHx8IGJvb3RfY3B1X2RhdGEueDg2X21vZGVsID09IDkpCisJCWNlbnRhdXJfbWNyMV9pbml0KCk7CisKKwlzZXRfbXRycl9kb25lKCZjdHh0KTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGNlbnRhdXJfdmFsaWRhdGVfYWRkX3BhZ2UodW5zaWduZWQgbG9uZyBiYXNlLCAKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgaW50IHR5cGUpCit7CisJLyoKKwkgKiAgRklYTUU6IFdpbmNoaXAyIHN1cHBvcnRzIHVuY2FjaGVkCisJICovCisJaWYgKHR5cGUgIT0gTVRSUl9UWVBFX1dSQ09NQiAmJiAKKwkgICAgKGNlbnRhdXJfbWNyX3R5cGUgPT0gMCB8fCB0eXBlICE9IE1UUlJfVFlQRV9VTkNBQ0hBQkxFKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAibXRycjogb25seSB3cml0ZS1jb21iaW5pbmclcyBzdXBwb3J0ZWRcbiIsCisJCSAgICAgICBjZW50YXVyX21jcl90eXBlID8gIiBhbmQgdW5jYWNoZWFibGUgYXJlIgorCQkgICAgICAgOiAiIGlzIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBtdHJyX29wcyBjZW50YXVyX210cnJfb3BzID0geworCS52ZW5kb3IgICAgICAgICAgICA9IFg4Nl9WRU5ET1JfQ0VOVEFVUiwKKy8vCS5pbml0ICAgICAgICAgICAgICA9IGNlbnRhdXJfbWNyX2luaXQsCisJLnNldCAgICAgICAgICAgICAgID0gY2VudGF1cl9zZXRfbWNyLAorCS5nZXQgICAgICAgICAgICAgICA9IGNlbnRhdXJfZ2V0X21jciwKKwkuZ2V0X2ZyZWVfcmVnaW9uICAgPSBjZW50YXVyX2dldF9mcmVlX3JlZ2lvbiwKKwkudmFsaWRhdGVfYWRkX3BhZ2UgPSBjZW50YXVyX3ZhbGlkYXRlX2FkZF9wYWdlLAorCS5oYXZlX3dyY29tYiAgICAgICA9IHBvc2l0aXZlX2hhdmVfd3Jjb21iLAorfTsKKworaW50IF9faW5pdCBjZW50YXVyX2luaXRfbXRycih2b2lkKQoreworCXNldF9tdHJyX29wcygmY2VudGF1cl9tdHJyX29wcyk7CisJcmV0dXJuIDA7Cit9CisKKy8vYXJjaF9pbml0Y2FsbChjZW50YXVyX2luaXRfbXRycik7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL2NoYW5nZWxvZyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvY2hhbmdlbG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMTM2ODUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL2NoYW5nZWxvZwpAQCAtMCwwICsxLDIyOSBAQAorICAgIENoYW5nZUxvZworCisgICAgUHJlaGlzdG9yeSBNYXJ0aW4gVGlzY2ho5HVzZXIgPG1hcnRpbkBpa2NiYXJrYS5memsuZGU+CisJICAgICAgIEluaXRpYWwgcmVnaXN0ZXItc2V0dGluZyBjb2RlIChmcm9tIHByb2Zvcm0tMS4wKS4KKyAgICAxOTk3MTIxNiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgT3JpZ2luYWwgdmVyc2lvbiBmb3IgL3Byb2MvbXRyciBpbnRlcmZhY2UsIFNNUC1zYWZlLgorICB2MS4wCisgICAgMTk5NzEyMTcgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIEJ1ZyBmaXggZm9yIGlvY3RscygpJ3MuCisJICAgICAgIEFkZGVkIHNhbXBsZSBjb2RlIGluIERvY3VtZW50YXRpb24vbXRyci50eHQKKyAgdjEuMQorICAgIDE5OTcxMjE4ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisgICAgICAgICAgICAgICBEaXNhbGxvdyBvdmVybGFwcGluZyByZWdpb25zLgorICAgIDE5OTcxMjE5ICAgSmVucyBNYXVyZXIgPGptYXVyZXJAbWVudWV0dC5yaGVpbi1tYWluLmRlPgorICAgICAgICAgICAgICAgUmVnaXN0ZXItc2V0dGluZyBmaXh1cHMuCisgIHYxLjIKKyAgICAxOTk3MTIyMiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgRml4dXBzIGZvciBrZXJuZWwgMi4xLjc1LgorICB2MS4zCisgICAgMTk5NzEyMjkgICBEYXZpZCBXcmFnZyA8ZHB3QGRvYy5pYy5hYy51az4KKyAgICAgICAgICAgICAgIFJlZ2lzdGVyLXNldHRpbmcgZml4dXBzIGFuZCBjb25mb3JtaXR5IHdpdGggSW50ZWwgY29udmVudGlvbnMuCisgICAgMTk5NzEyMjkgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIENvc21ldGljIGNoYW5nZXMgYW5kIHdyb3RlIHRoaXMgQ2hhbmdlTG9nIDstKQorICAgIDE5OTgwMTA2ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisgICAgICAgICAgICAgICBGaXh1cHMgZm9yIGtlcm5lbCAyLjEuNzguCisgIHYxLjQKKyAgICAxOTk4MDExOSAgIERhdmlkIFdyYWdnIDxkcHdAZG9jLmljLmFjLnVrPgorICAgICAgICAgICAgICAgSW5jbHVkZWQgcGFzc2l2ZS1yZWxlYXNlIGVuYWJsZSBjb2RlIChlbHNld2hlcmUgaW4gUENJIHNldHVwKS4KKyAgdjEuNQorICAgIDE5OTgwMTMxICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisgICAgICAgICAgICAgICBSZXBsYWNlZCBnbG9iYWwga2VybmVsIGxvY2sgd2l0aCBwcml2YXRlIHNwaW5sb2NrLgorICB2MS42CisgICAgMTk5ODAyMDEgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIEFkZGVkIHdhaXQgZm9yIG90aGVyIENQVXMgdG8gY29tcGxldGUgY2hhbmdlcy4KKyAgdjEuNworICAgIDE5OTgwMjAyICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisgICAgICAgICAgICAgICBCdWcgZml4IGluIGRlZmluaXRpb24gb2YgPHNldF9tdHJyPiBmb3IgVVAuCisgIHYxLjgKKyAgICAxOTk4MDMxOSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgRml4dXBzIGZvciBrZXJuZWwgMi4xLjkwLgorICAgIDE5OTgwMzIzICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisgICAgICAgICAgICAgICBNb3ZlIFNNUCBCSU9TIGZpeHVwIGJlZm9yZSBzZWNvbmRhcnkgQ1BVcyBjYWxsIDxjYWxpYnJhdGVfZGVsYXk+CisgIHYxLjkKKyAgICAxOTk4MDMyNSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgRml4ZWQgdGVzdCBmb3Igb3ZlcmxhcHBpbmcgcmVnaW9uczogY29uZnVzZWQgYnkgYWRqYWNlbnQgcmVnaW9ucworICAgIDE5OTgwMzI2ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisgICAgICAgICAgICAgICBBZGRlZCB3YmludmQgaW4gPHNldF9tdHJyX3ByZXBhcmU+LgorICAgIDE5OTgwNDAxICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisgICAgICAgICAgICAgICBCdWcgZml4IGZvciBub24tU01QIGNvbXBpbGF0aW9uLgorICAgIDE5OTgwNDE4ICAgRGF2aWQgV3JhZ2cgPGRwd0Bkb2MuaWMuYWMudWs+CisgICAgICAgICAgICAgICBGaXhlZC1NVFJSIHN5bmNocm9uaXNhdGlvbiBmb3IgU01QIGFuZCB1c2UgYXRvbWljIG9wZXJhdGlvbnMKKwkgICAgICAgaW5zdGVhZCBvZiBzcGlubG9ja3MuCisgICAgMTk5ODA0MTggICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgRGlmZmVyZW50aWF0ZSBkaWZmZXJlbnQgTVRSUiByZWdpc3RlciBjbGFzc2VzIGZvciBCSU9TIGZpeHVwLgorICB2MS4xMAorICAgIDE5OTgwNDE5ICAgRGF2aWQgV3JhZ2cgPGRwd0Bkb2MuaWMuYWMudWs+CisJICAgICAgIEJ1ZyBmaXggaW4gdmFyaWFibGUgTVRSUiBzeW5jaHJvbmlzYXRpb24uCisgIHYxLjExCisgICAgMTk5ODA0MTkgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgRml4dXBzIGZvciBrZXJuZWwgMi4xLjk3LgorICB2MS4xMgorICAgIDE5OTgwNDIxICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFNhZmVyIHN5bmNocm9uaXNhdGlvbiBhY3Jvc3MgQ1BVcyB3aGVuIGNoYW5naW5nIE1UUlJzLgorICB2MS4xMworICAgIDE5OTgwNDIzICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEJ1Z2ZpeCBmb3IgU01QIHN5c3RlbXMgd2l0aG91dCBNVFJSIHN1cHBvcnQuCisgIHYxLjE0CisgICAgMTk5ODA0MjcgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgVHJhcCBjYWxscyB0byA8bXRycl9hZGQ+IGFuZCA8bXRycl9kZWw+IG9uIG5vbi1NVFJSIG1hY2hpbmVzLgorICB2MS4xNQorICAgIDE5OTgwNDI3ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFVzZSBhdG9taWMgYml0b3BzIGZvciBzZXR0aW5nIFNNUCBjaGFuZ2UgbWFzay4KKyAgdjEuMTYKKyAgICAxOTk4MDQyOCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBSZW1vdmVkIHNwdXJpb3VzIGRpYWdub3N0aWMgbWVzc2FnZS4KKyAgdjEuMTcKKyAgICAxOTk4MDQyOSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBNb3ZlZCByZWdpc3Rlci1zZXR0aW5nIG1hY3JvcyBpbnRvIHRoaXMgZmlsZS4KKwkgICAgICAgTW92ZWQgc2V0dXAgY29kZSBmcm9tIGluaXQvbWFpbi5jIHRvIGkzODYtc3BlY2lmaWMgYXJlYXMuCisgIHYxLjE4CisgICAgMTk5ODA1MDIgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgTW92ZWQgTVRSUiBkZXRlY3Rpb24gb3V0c2lkZSBjb25kaXRpb25hbHMgaW4gPG10cnJfaW5pdD4uCisgIHYxLjE5CisgICAgMTk5ODA1MDIgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgRG9jdW1lbnRhdGlvbiBpbXByb3ZlbWVudDogbWVudGlvbiBQZW50aXVtIElJIGFuZCBBR1AuCisgIHYxLjIwCisgICAgMTk5ODA1MjEgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgT25seSBtYW5pcHVsYXRlIGludGVycnVwdCBlbmFibGUgZmxhZyBvbiBsb2NhbCBDUFUuCisJICAgICAgIEFsbG93IGVuY2xvc2VkIHVuY2FjaGFibGUgcmVnaW9ucy4KKyAgdjEuMjEKKyAgICAxOTk4MDYxMSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBBbHdheXMgZGVmaW5lIDxtYWluX2xvY2s+LgorICB2MS4yMgorICAgIDE5OTgwOTAxICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFJlbW92ZWQgbW9kdWxlIHN1cHBvcnQgaW4gb3JkZXIgdG8gdGlkeSB1cCBjb2RlLgorCSAgICAgICBBZGRlZCBzYW5pdHkgY2hlY2sgZm9yIDxtdHJyX2FkZD4vPG10cnJfZGVsPiBiZWZvcmUgPG10cnJfaW5pdD4uCisJICAgICAgIENyZWF0ZWQgYWRkaXRpb24gcXVldWUgZm9yIHByaW9yIHRvIFNNUCBjb21tZW5jZS4KKyAgdjEuMjMKKyAgICAxOTk4MDkwMiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBQb3J0ZWQgcGF0Y2ggdG8ga2VybmVsIDIuMS4xMjAtcHJlMy4KKyAgdjEuMjQKKyAgICAxOTk4MDkxMCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBSZW1vdmVkIHNhbml0eSBjaGVja3MgYW5kIGFkZGl0aW9uIHF1ZXVlOiBMaW51cyBwcmVmZXJzIGFuIE9PUFMuCisgIHYxLjI1CisgICAgMTk5ODEwMDEgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgRml4ZWQgaGFybWxlc3MgY29tcGlsZXIgd2FybmluZyBpbiBpbmNsdWRlL2FzbS1pMzg2L210cnIuaAorCSAgICAgICBGaXhlZCB2ZXJzaW9uIG51bWJlcmluZyBhbmQgaGlzdG9yeSBmb3IgdjEuMjMgLT4gdjEuMjQuCisgIHYxLjI2CisgICAgMTk5OTAxMTggICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQWRkZWQgZGV2ZnMgc3VwcG9ydC4KKyAgdjEuMjcKKyAgICAxOTk5MDEyMyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBDaGFuZ2VkIGxvY2tpbmcgdG8gc3BpbiB3aXRoIHJlc2NoZWR1bGUuCisJICAgICAgIE1hZGUgdXNlIG9mIG5ldyA8c21wX2NhbGxfZnVuY3Rpb24+LgorICB2MS4yOAorICAgIDE5OTkwMjAxICAgWm9sdOFuIEL2c3r2cm3pbnlpIDx6Ym9zem9yQG1haWwuZXh0ZXJuZXQuaHU+CisJICAgICAgIEV4dGVuZGVkIHRoZSBkcml2ZXIgdG8gYmUgYWJsZSB0byB1c2UgQ3lyaXggc3R5bGUgQVJScy4KKyAgICAxOTk5MDIwNCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBSZXN0cnVjdHVyZWQgQ3lyaXggc3VwcG9ydC4KKyAgdjEuMjkKKyAgICAxOTk5MDIwNCAgIFpvbHThbiBC9nN69nJt6W55aSA8emJvc3pvckBtYWlsLmV4dGVybmV0Lmh1PgorCSAgICAgICBSZWZpbmVkIEFSUiBzdXBwb3J0OiBlbmFibGUgTUFQRU4gaW4gc2V0X210cnJfcHJlcGFyZSgpCisJICAgICAgIGFuZCBkaXNhYmxlIE1BUEVOIGluIHNldF9tdHJyX2RvbmUoKS4KKyAgICAxOTk5MDIwNSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBNaW5vciBjbGVhbnVwcy4KKyAgdjEuMzAKKyAgICAxOTk5MDIwOCAgIFpvbHThbiBC9nN69nJt6W55aSA8emJvc3pvckBtYWlsLmV4dGVybmV0Lmh1PgorICAgICAgICAgICAgICAgUHJvdGVjdCBwbGFpbiA2eDg2cyAoYW5kIG90aGVyIHByb2Nlc3NvcnMgd2l0aG91dCB0aGUKKyAgICAgICAgICAgICAgIFBhZ2UgR2xvYmFsIEVuYWJsZSBmZWF0dXJlKSBhZ2FpbnN0IGFjY2Vzc2luZyBDUjQgaW4KKyAgICAgICAgICAgICAgIHNldF9tdHJyX3ByZXBhcmUoKSBhbmQgc2V0X210cnJfZG9uZSgpLgorICAgIDE5OTkwMjEwICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFR1cm5lZCA8c2V0X210cnJfdXA+IGFuZCA8Z2V0X210cnI+IGludG8gZnVuY3Rpb24gcG9pbnRlcnMuCisgIHYxLjMxCisgICAgMTk5OTAyMTIgICBab2x04W4gQvZzevZybelueWkgPHpib3N6b3JAbWFpbC5leHRlcm5ldC5odT4KKyAgICAgICAgICAgICAgIE1ham9yIHJld3JpdGUgb2YgY3lyaXhfYXJyX2luaXQoKTogZG8gbm90IHRvdWNoIEFSUnMsCisgICAgICAgICAgICAgICBsZWF2ZSB0aGVtIGFzIHRoZSBCSU9TIGhhdmUgc2V0IHRoZW0gdXAuCisgICAgICAgICAgICAgICBFbmFibGUgdXNhZ2Ugb2YgYWxsIDggQVJScy4KKyAgICAgICAgICAgICAgIEF2b2lkIG11bHRpcGxpY2F0aW9ucyBieSAzIGV2ZXJ5d2hlcmUgYW5kIG90aGVyCisgICAgICAgICAgICAgICBjb2RlIGNsZWFuIHVwcy9zcGVlZCB1cHMuCisgICAgMTk5OTAyMTMgICBab2x04W4gQvZzevZybelueWkgPHpib3N6b3JAbWFpbC5leHRlcm5ldC5odT4KKyAgICAgICAgICAgICAgIFNldCB1cCBvdGhlciBDeXJpeCBwcm9jZXNzb3JzIGlkZW50aWNhbCB0byB0aGUgYm9vdCBjcHUuCisgICAgICAgICAgICAgICBTaW5jZSBDeXJpeCBkb24ndCBzdXBwb3J0IEludGVsIEFQSUMsIHRoaXMgaXMgbCdhcnQgcG91ciBsJ2FydC4KKyAgICAgICAgICAgICAgIFdlaWdoIEFSUnMgYnkgc2l6ZToKKyAgICAgICAgICAgICAgIElmIHNpemUgPD0gMzJNIGlzIGdpdmVuLCBzZXQgdXAgQVJSIyB3ZSB3ZXJlIGdpdmVuLgorICAgICAgICAgICAgICAgSWYgc2l6ZSA+ICAzMk0gaXMgZ2l2ZW4sIHNldCB1cCBBUlI3IG9ubHkgaWYgaXQgaXMgZnJlZSwKKyAgICAgICAgICAgICAgIGZhaWwgb3RoZXJ3aXNlLgorICAgIDE5OTkwMjE0ICAgWm9sdOFuIEL2c3r2cm3pbnlpIDx6Ym9zem9yQG1haWwuZXh0ZXJuZXQuaHU+CisgICAgICAgICAgICAgICBBbHNvIGNoZWNrIGZvciBzaXplID49IDI1NksgaWYgd2UgYXJlIHRvIHNldCB1cCBBUlI3LAorICAgICAgICAgICAgICAgbXRycl9hZGQoKSByZXR1cm5zIHRoZSB2YWx1ZSBpdCBnZXRzIGZyb20gc2V0X210cnIoKQorICAgIDE5OTkwMjE4ICAgWm9sdOFuIEL2c3r2cm3pbnlpIDx6Ym9zem9yQG1haWwuZXh0ZXJuZXQuaHU+CisgICAgICAgICAgICAgICBSZW1vdmUgQ3lyaXggImNvbWEgYnVnIiB3b3JrYXJvdW5kIGZyb20gaGVyZS4KKyAgICAgICAgICAgICAgIE1vdmVkIHRvIGxpbnV4L2FyY2gvaTM4Ni9rZXJuZWwvc2V0dXAuYyBhbmQKKyAgICAgICAgICAgICAgIGxpbnV4L2luY2x1ZGUvYXNtLWkzODYvYnVncy5oCisgICAgMTk5OTAyMjggICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQWRkZWQgTVRSUklPQ19LSUxMX0VOVFJZIGlvY3RsKDIpCisJICAgICAgIFRyYXAgZm9yIGNvdW50ZXIgdW5kZXJmbG93IGluIDxtdHJyX2ZpbGVfZGVsPi4KKwkgICAgICAgVHJhcCBmb3IgNCBNaUIgYWxpZ25lZCByZWdpb25zIGZvciBQUHJvLCBzdGVwcGluZyA8PSA3LgorICAgIDE5OTkwMzAxICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIENyZWF0ZWQgPGdldF9mcmVlX3JlZ2lvbj4gaG9vay4KKyAgICAxOTk5MDMwNSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBUZW1wb3JhcmlseSBkaXNhYmxlIEFNRCBzdXBwb3J0IG5vdyBNVFJSIGNhcGFiaWxpdHkgZmxhZyBpcyBzZXQuCisgIHYxLjMyCisgICAgMTk5OTAzMDggICBab2x04W4gQvZzevZybelueWkgPHpib3N6b3JAbWFpbC5leHRlcm5ldC5odT4KKwkgICAgICAgQWRqdXN0IG15IGNoYW5nZXMgKDE5OTkwMjEyLTE5OTkwMjE4KSB0byBSaWNoYXJkIEdvb2NoJ3MKKwkgICAgICAgbGF0ZXN0IGNoYW5nZXMuICgxOTk5MDIyOC0xOTk5MDMwNSkKKyAgdjEuMzMKKyAgICAxOTk5MDMwOSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBGaXhlZCB0eXBvIGluIDxwcmludGs+IG1lc3NhZ2UuCisgICAgMTk5OTAzMTAgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgU3VwcG9ydCBLNi1JSS9JSUkgYmFzZWQgb24gQWxhbiBDb3gncyA8YWxhbkByZWRoYXQuY29tPiBwYXRjaGVzLgorICB2MS4zNAorICAgIDE5OTkwNTExICAgQmFydCBIYXJ0Z2VycyA8YmFydEBldHBtb2QucGh5cy50dWUubmw+CisJICAgICAgIFN1cHBvcnQgQ2VudGF1ciBDNiBNQ1Incy4KKyAgICAxOTk5MDUxMiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBNaW5vciBjbGVhbnVwcy4KKyAgdjEuMzUKKyAgICAxOTk5MDcwNyAgIFpvbHThbiBC9nN69nJt6W55aSA8emJvc3pvckBtYWlsLmV4dGVybmV0Lmh1PgorICAgICAgICAgICAgICAgQ2hlY2sgd2hldGhlciBBUlIzIGlzIHByb3RlY3RlZCBpbiBjeXJpeF9nZXRfZnJlZV9yZWdpb24oKQorICAgICAgICAgICAgICAgYW5kIG10cnJfZGVsKCkuIFRoZSBjb2RlIHdvbid0IGF0dGVtcHQgdG8gZGVsZXRlIG9yIGNoYW5nZSBpdAorICAgICAgICAgICAgICAgZnJvbSBub3cgb24gaWYgdGhlIEJJT1MgcHJvdGVjdGVkIEFSUjMuIEl0IHNpbGVudGx5IHNraXBzIEFSUjMKKyAgICAgICAgICAgICAgIGluIGN5cml4X2dldF9mcmVlX3JlZ2lvbigpIG9yIHJldHVybnMgd2l0aCBhbiBlcnJvciBjb2RlIGZyb20KKyAgICAgICAgICAgICAgIG10cnJfZGVsKCkuCisgICAgMTk5OTA3MTEgICBab2x04W4gQvZzevZybelueWkgPHpib3N6b3JAbWFpbC5leHRlcm5ldC5odT4KKyAgICAgICAgICAgICAgIFJlc2V0IHNvbWUgYml0cyBpbiB0aGUgQ0NScyBpbiBjeXJpeF9hcnJfaW5pdCgpIHRvIGRpc2FibGUgU01NCisgICAgICAgICAgICAgICBpZiBBUlIzIGlzbid0IHByb3RlY3RlZC4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBpZiBTTU0gaXMgYWN0aXZlCisgICAgICAgICAgICAgICBhbmQgQVJSMyBpc24ndCBwcm90ZWN0ZWQgdGhlbiBkZWxldGluZyBhbmQgc2V0dGluZyBBUlIzIGFnYWluCisgICAgICAgICAgICAgICBtYXkgbG9jayB1cCB0aGUgcHJvY2Vzc29yLiBXaXRoIFNNTSBlbnRpcmVseSBkaXNhYmxlZCwgaXQgZG9lcworICAgICAgICAgICAgICAgbm90IGhhcHBlbi4KKyAgICAxOTk5MDgxMiAgIFpvbHThbiBC9nN69nJt6W55aSA8emJvc3pvckBtYWlsLmV4dGVybmV0Lmh1PgorICAgICAgICAgICAgICAgUmVhcnJhbmdlIHN3aXRjaCgpIHN0YXRlbWVudHMgc28gdGhlIGRyaXZlciBhY2NvbW9kYXRlcyB0bworICAgICAgICAgICAgICAgdGhlIGZhY3QgdGhhdCB0aGUgQU1EIEF0aGxvbiBoYW5kbGVzIGl0cyBNVFJScyB0aGUgc2FtZSB3YXkKKyAgICAgICAgICAgICAgIGFzIEludGVsIGRvZXMuCisgICAgMTk5OTA4MTQgICBab2x04W4gQvZzevZybelueWkgPHpib3N6b3JAbWFpbC5leHRlcm5ldC5odT4KKwkgICAgICAgRG91YmxlIGNoZWNrIGZvciBJbnRlbCBpbiBtdHJyX2FkZCgpJ3MgYmlnIHN3aXRjaCgpIGJlY2F1c2UKKwkgICAgICAgdGhhdCByZXZpc2lvbiBjaGVjayBpcyBvbmx5IHZhbGlkIGZvciBJbnRlbCBDUFVzLgorICAgIDE5OTkwODE5ICAgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAgICAgICAgICAgICAgIFRlc3RlZCBab2x0YW4ncyBjaGFuZ2VzIG9uIGEgcHJlIHByb2R1Y3Rpb24gQXRobG9uIC0gMTAwJQorICAgICAgICAgICAgICAgc3VjY2Vzcy4KKyAgICAxOTk5MTAwOCAgIE1hbmZyZWQgU3ByYXVsIDxtYW5mcmVkc0Bjb2xvcmZ1bGxpZmUuY29tPgorICAgIAkgICAgICAgcmVwbGFjZWQgc3Bpbl9sb2NrX3Jlc2NoZWR1bGUoKSB3aXRoIGEgbm9ybWFsIHNlbWFwaG9yZS4KKyAgdjEuMzYKKyAgICAyMDAwMDIyMSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgQ29tcGlsZSBmaXggaWYgcHJvY2ZzIGFuZCBkZXZmcyBub3QgZW5hYmxlZC4KKwkgICAgICAgRm9ybWF0dGluZyBjaGFuZ2VzLgorICB2MS4zNworICAgIDIwMDAxMTA5ICAgSC4gUGV0ZXIgQW52aW4gPGhwYUB6eXRvci5jb20+CisJICAgICAgIFVzZSB0aGUgbmV3IGNlbnRyYWxpemVkIENQVSBmZWF0dXJlIGRldGVjdHMuCisKKyAgdjEuMzgKKyAgICAyMDAxMDMwOSAgIERhdmUgSm9uZXMgPGRhdmVqQHN1c2UuZGU+CisJICAgICAgIEFkZCBzdXBwb3J0IGZvciBDeXJpeCBJSUkuCisKKyAgdjEuMzkKKyAgICAyMDAxMDMxMiAgIERhdmUgSm9uZXMgPGRhdmVqQHN1c2UuZGU+CisgICAgICAgICAgICAgICBVZ2gsIEkgYnJva2UgQU1EIHN1cHBvcnQuCisJICAgICAgIFJld29ya2VkIGZpeCBieSBUcm9lbHMgV2Fsc3RlZCBIYW5zZW4gPHRyb2Vsc0B0aHVsZS5ubz4KKworICB2MS40MAorICAgIDIwMDEwMzI3ICAgRGF2ZSBKb25lcyA8ZGF2ZWpAc3VzZS5kZT4KKwkgICAgICAgQWRhcHRlZCBDeXJpeCBJSUkgc3VwcG9ydCB0byBpbmNsdWRlIFZJQSBDMy4KKworICB2Mi4wCisgICAgMjAwMjAzMDYgICBQYXRyaWNrIE1vY2hlbCA8bW9jaGVsQG9zZGwub3JnPgorICAgICAgICAgICAgICAgU3BsaXQgbXRyci5jIC0+IG10cnIvKi5jCisgICAgICAgICAgICAgICBDb252ZXJ0ZWQgdG8gTGludXggS2VybmVsIENvZGluZyBTdHlsZQorICAgICAgICAgICAgICAgRml4ZWQgc2V2ZXJhbCBtaW5vciBuaXRzIGluIGZvcm0KKyAgICAgICAgICAgICAgIE1vdmVkIHNvbWUgU01QLW9ubHkgZnVuY3Rpb25zIG91dCwgc28gdGhleSBjYW4gYmUgdXNlZAorICAgICAgICAgICAgICAgIGZvciBwb3dlciBtYW5hZ2VtZW50IGluIHRoZSBmdXR1cmUuCisgICAgICAgICAgICAgICBUT0RPOiBGaXggdXNlciBpbnRlcmZhY2UgY3J1ZnQuCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL2N5cml4LmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL2N5cml4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMzYjBkZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvY3lyaXguYwpAQCAtMCwwICsxLDM2NCBAQAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGFzbS9tdHJyLmg+CisjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgIm10cnIuaCIKKworaW50IGFycjNfcHJvdGVjdGVkOworCitzdGF0aWMgdm9pZAorY3lyaXhfZ2V0X2Fycih1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBsb25nICpiYXNlLAorCSAgICAgIHVuc2lnbmVkIGludCAqc2l6ZSwgbXRycl90eXBlICogdHlwZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgYXJyLCBjY3IzLCByY3IsIHNoaWZ0OworCisJYXJyID0gQ1g4Nl9BUlJfQkFTRSArIChyZWcgPDwgMSkgKyByZWc7CS8qIGF2b2lkIG11bHRpcGxpY2F0aW9uIGJ5IDMgKi8KKworCS8qIFNhdmUgZmxhZ3MgYW5kIGRpc2FibGUgaW50ZXJydXB0cyAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWNjcjMgPSBnZXRDeDg2KENYODZfQ0NSMyk7CisJc2V0Q3g4NihDWDg2X0NDUjMsIChjY3IzICYgMHgwZikgfCAweDEwKTsJLyogZW5hYmxlIE1BUEVOICovCisJKCh1bnNpZ25lZCBjaGFyICopIGJhc2UpWzNdID0gZ2V0Q3g4NihhcnIpOworCSgodW5zaWduZWQgY2hhciAqKSBiYXNlKVsyXSA9IGdldEN4ODYoYXJyICsgMSk7CisJKCh1bnNpZ25lZCBjaGFyICopIGJhc2UpWzFdID0gZ2V0Q3g4NihhcnIgKyAyKTsKKwlyY3IgPSBnZXRDeDg2KENYODZfUkNSX0JBU0UgKyByZWcpOworCXNldEN4ODYoQ1g4Nl9DQ1IzLCBjY3IzKTsJLyogZGlzYWJsZSBNQVBFTiAqLworCisJLyogRW5hYmxlIGludGVycnVwdHMgaWYgaXQgd2FzIGVuYWJsZWQgcHJldmlvdXNseSAqLworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlzaGlmdCA9ICgodW5zaWduZWQgY2hhciAqKSBiYXNlKVsxXSAmIDB4MGY7CisJKmJhc2UgPj49IFBBR0VfU0hJRlQ7CisKKwkvKiBQb3dlciBvZiB0d28sIGF0IGxlYXN0IDRLIG9uIEFSUjAtQVJSNiwgMjU2SyBvbiBBUlI3CisJICogTm90ZTogc2hpZnQ9PTB4ZiBtZWFucyA0RywgdGhpcyBpcyB1bnN1cHBvcnRlZC4KKwkgKi8KKwlpZiAoc2hpZnQpCisJCSpzaXplID0gKHJlZyA8IDcgPyAweDFVTCA6IDB4NDBVTCkgPDwgKHNoaWZ0IC0gMSk7CisJZWxzZQorCQkqc2l6ZSA9IDA7CisKKwkvKiBCaXQgMCBpcyBDYWNoZSBFbmFibGUgb24gQVJSNywgQ2FjaGUgRGlzYWJsZSBvbiBBUlIwLUFSUjYgKi8KKwlpZiAocmVnIDwgNykgeworCQlzd2l0Y2ggKHJjcikgeworCQljYXNlIDE6CisJCQkqdHlwZSA9IE1UUlJfVFlQRV9VTkNBQ0hBQkxFOworCQkJYnJlYWs7CisJCWNhc2UgODoKKwkJCSp0eXBlID0gTVRSUl9UWVBFX1dSQkFDSzsKKwkJCWJyZWFrOworCQljYXNlIDk6CisJCQkqdHlwZSA9IE1UUlJfVFlQRV9XUkNPTUI7CisJCQlicmVhazsKKwkJY2FzZSAyNDoKKwkJZGVmYXVsdDoKKwkJCSp0eXBlID0gTVRSUl9UWVBFX1dSVEhST1VHSDsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJc3dpdGNoIChyY3IpIHsKKwkJY2FzZSAwOgorCQkJKnR5cGUgPSBNVFJSX1RZUEVfVU5DQUNIQUJMRTsKKwkJCWJyZWFrOworCQljYXNlIDg6CisJCQkqdHlwZSA9IE1UUlJfVFlQRV9XUkNPTUI7CisJCQlicmVhazsKKwkJY2FzZSA5OgorCQkJKnR5cGUgPSBNVFJSX1RZUEVfV1JCQUNLOworCQkJYnJlYWs7CisJCWNhc2UgMjU6CisJCWRlZmF1bHQ6CisJCQkqdHlwZSA9IE1UUlJfVFlQRV9XUlRIUk9VR0g7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIGludAorY3lyaXhfZ2V0X2ZyZWVfcmVnaW9uKHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyBzaXplKQorLyogIFtTVU1NQVJZXSBHZXQgYSBmcmVlIEFSUi4KKyAgICA8YmFzZT4gVGhlIHN0YXJ0aW5nIChiYXNlKSBhZGRyZXNzIG9mIHRoZSByZWdpb24uCisgICAgPHNpemU+IFRoZSBzaXplIChpbiBieXRlcykgb2YgdGhlIHJlZ2lvbi4KKyAgICBbUkVUVVJOU10gVGhlIGluZGV4IG9mIHRoZSByZWdpb24gb24gc3VjY2VzcywgZWxzZSAtMSBvbiBlcnJvci4KKyovCit7CisJaW50IGk7CisJbXRycl90eXBlIGx0eXBlOworCXVuc2lnbmVkIGxvbmcgbGJhc2U7CisJdW5zaWduZWQgaW50ICBsc2l6ZTsKKworCS8qIElmIHdlIGFyZSB0byBzZXQgdXAgYSByZWdpb24gPjMyTSB0aGVuIGxvb2sgYXQgQVJSNyBpbW1lZGlhdGVseSAqLworCWlmIChzaXplID4gMHgyMDAwKSB7CisJCWN5cml4X2dldF9hcnIoNywgJmxiYXNlLCAmbHNpemUsICZsdHlwZSk7CisJCWlmIChsc2l6ZSA9PSAwKQorCQkJcmV0dXJuIDc7CisJCS8qICBFbHNlIHRyeSBBUlIwLUFSUjYgZmlyc3QgICovCisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworCQkJY3lyaXhfZ2V0X2FycihpLCAmbGJhc2UsICZsc2l6ZSwgJmx0eXBlKTsKKwkJCWlmICgoaSA9PSAzKSAmJiBhcnIzX3Byb3RlY3RlZCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChsc2l6ZSA9PSAwKQorCQkJCXJldHVybiBpOworCQl9CisJCS8qIEFSUjAtQVJSNiBpc24ndCBmcmVlLCB0cnkgQVJSNyBidXQgaXRzIHNpemUgbXVzdCBiZSBhdCBsZWFzdCAyNTZLICovCisJCWN5cml4X2dldF9hcnIoaSwgJmxiYXNlLCAmbHNpemUsICZsdHlwZSk7CisJCWlmICgobHNpemUgPT0gMCkgJiYgKHNpemUgPj0gMHg0MCkpCisJCQlyZXR1cm4gaTsKKwl9CisJcmV0dXJuIC1FTk9TUEM7Cit9CisKK3N0YXRpYyB1MzIgY3I0ID0gMDsKK3N0YXRpYyB1MzIgY2NyMzsKKworc3RhdGljIHZvaWQgcHJlcGFyZV9zZXQodm9pZCkKK3sKKwl1MzIgY3IwOworCisJLyogIFNhdmUgdmFsdWUgb2YgQ1I0IGFuZCBjbGVhciBQYWdlIEdsb2JhbCBFbmFibGUgKGJpdCA3KSAgKi8KKwlpZiAoIGNwdV9oYXNfcGdlICkgeworCQljcjQgPSByZWFkX2NyNCgpOworCQl3cml0ZV9jcjQoY3I0ICYgKHVuc2lnbmVkIGNoYXIpIH4oMSA8PCA3KSk7CisJfQorCisJLyogIERpc2FibGUgYW5kIGZsdXNoIGNhY2hlcy4gTm90ZSB0aGF0IHdiaW52ZCBmbHVzaGVzIHRoZSBUTEJzIGFzCisJICAgIGEgc2lkZS1lZmZlY3QgICovCisJY3IwID0gcmVhZF9jcjAoKSB8IDB4NDAwMDAwMDA7CisJd2JpbnZkKCk7CisJd3JpdGVfY3IwKGNyMCk7CisJd2JpbnZkKCk7CisKKwkvKiBDeXJpeCBBUlJzIC0gZXZlcnl0aGluZyBlbHNlIHdlcmUgZXhjbHVkZWQgYXQgdGhlIHRvcCAqLworCWNjcjMgPSBnZXRDeDg2KENYODZfQ0NSMyk7CisKKwkvKiBDeXJpeCBBUlJzIC0gZXZlcnl0aGluZyBlbHNlIHdlcmUgZXhjbHVkZWQgYXQgdGhlIHRvcCAqLworCXNldEN4ODYoQ1g4Nl9DQ1IzLCAoY2NyMyAmIDB4MGYpIHwgMHgxMCk7CisKK30KKworc3RhdGljIHZvaWQgcG9zdF9zZXQodm9pZCkKK3sKKwkvKiAgRmx1c2ggY2FjaGVzIGFuZCBUTEJzICAqLworCXdiaW52ZCgpOworCisJLyogQ3lyaXggQVJScyAtIGV2ZXJ5dGhpbmcgZWxzZSB3YXMgZXhjbHVkZWQgYXQgdGhlIHRvcCAqLworCXNldEN4ODYoQ1g4Nl9DQ1IzLCBjY3IzKTsKKwkJCisJLyogIEVuYWJsZSBjYWNoZXMgICovCisJd3JpdGVfY3IwKHJlYWRfY3IwKCkgJiAweGJmZmZmZmZmKTsKKworCS8qICBSZXN0b3JlIHZhbHVlIG9mIENSNCAgKi8KKwlpZiAoIGNwdV9oYXNfcGdlICkKKwkJd3JpdGVfY3I0KGNyNCk7Cit9CisKK3N0YXRpYyB2b2lkIGN5cml4X3NldF9hcnIodW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgbG9uZyBiYXNlLAorCQkJICB1bnNpZ25lZCBsb25nIHNpemUsIG10cnJfdHlwZSB0eXBlKQoreworCXVuc2lnbmVkIGNoYXIgYXJyLCBhcnJfdHlwZSwgYXJyX3NpemU7CisKKwlhcnIgPSBDWDg2X0FSUl9CQVNFICsgKHJlZyA8PCAxKSArIHJlZzsJLyogYXZvaWQgbXVsdGlwbGljYXRpb24gYnkgMyAqLworCisJLyogY291bnQgZG93biBmcm9tIDMyTSAoQVJSMC1BUlI2KSBvciBmcm9tIDJHIChBUlI3KSAqLworCWlmIChyZWcgPj0gNykKKwkJc2l6ZSA+Pj0gNjsKKworCXNpemUgJj0gMHg3ZmZmOwkJLyogbWFrZSBzdXJlIGFycl9zaXplIDw9IDE0ICovCisJZm9yIChhcnJfc2l6ZSA9IDA7IHNpemU7IGFycl9zaXplKyssIHNpemUgPj49IDEpIDsKKworCWlmIChyZWcgPCA3KSB7CisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIE1UUlJfVFlQRV9VTkNBQ0hBQkxFOgorCQkJYXJyX3R5cGUgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgTVRSUl9UWVBFX1dSQ09NQjoKKwkJCWFycl90eXBlID0gOTsKKwkJCWJyZWFrOworCQljYXNlIE1UUlJfVFlQRV9XUlRIUk9VR0g6CisJCQlhcnJfdHlwZSA9IDI0OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlhcnJfdHlwZSA9IDg7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIE1UUlJfVFlQRV9VTkNBQ0hBQkxFOgorCQkJYXJyX3R5cGUgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgTVRSUl9UWVBFX1dSQ09NQjoKKwkJCWFycl90eXBlID0gODsKKwkJCWJyZWFrOworCQljYXNlIE1UUlJfVFlQRV9XUlRIUk9VR0g6CisJCQlhcnJfdHlwZSA9IDI1OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlhcnJfdHlwZSA9IDk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXByZXBhcmVfc2V0KCk7CisKKwliYXNlIDw8PSBQQUdFX1NISUZUOworCXNldEN4ODYoYXJyLCAoKHVuc2lnbmVkIGNoYXIgKikgJmJhc2UpWzNdKTsKKwlzZXRDeDg2KGFyciArIDEsICgodW5zaWduZWQgY2hhciAqKSAmYmFzZSlbMl0pOworCXNldEN4ODYoYXJyICsgMiwgKCgodW5zaWduZWQgY2hhciAqKSAmYmFzZSlbMV0pIHwgYXJyX3NpemUpOworCXNldEN4ODYoQ1g4Nl9SQ1JfQkFTRSArIHJlZywgYXJyX3R5cGUpOworCisJcG9zdF9zZXQoKTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgYmFzZTsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwltdHJyX3R5cGUgdHlwZTsKK30gYXJyX3N0YXRlX3Q7CisKK3N0YXRpYyBhcnJfc3RhdGVfdCBhcnJfc3RhdGVbOF0gX19pbml0ZGF0YSA9IHsKKwl7MFVMLCAwVUwsIDBVTH0sIHswVUwsIDBVTCwgMFVMfSwgezBVTCwgMFVMLCAwVUx9LCB7MFVMLCAwVUwsIDBVTH0sCisJezBVTCwgMFVMLCAwVUx9LCB7MFVMLCAwVUwsIDBVTH0sIHswVUwsIDBVTCwgMFVMfSwgezBVTCwgMFVMLCAwVUx9Cit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjY3Jfc3RhdGVbN10gX19pbml0ZGF0YSA9IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OworCitzdGF0aWMgdm9pZCBjeXJpeF9zZXRfYWxsKHZvaWQpCit7CisJaW50IGk7CisKKwlwcmVwYXJlX3NldCgpOworCisJLyogdGhlIENDUnMgYXJlIG5vdCBjb250aWd1b3VzICovCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJc2V0Q3g4NihDWDg2X0NDUjAgKyBpLCBjY3Jfc3RhdGVbaV0pOworCWZvciAoOyBpIDwgNzsgaSsrKQorCQlzZXRDeDg2KENYODZfQ0NSNCArIGksIGNjcl9zdGF0ZVtpXSk7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJY3lyaXhfc2V0X2FycihpLCBhcnJfc3RhdGVbaV0uYmFzZSwgCisJCQkgICAgICBhcnJfc3RhdGVbaV0uc2l6ZSwgYXJyX3N0YXRlW2ldLnR5cGUpOworCisJcG9zdF9zZXQoKTsKK30KKworI2lmIDAKKy8qCisgKiBPbiBDeXJpeCA2eDg2KE1YKSBhbmQgTSBJSSB0aGUgQVJSMyBpcyBzcGVjaWFsOiBpdCBoYXMgY29ubmVjdGlvbgorICogd2l0aCB0aGUgU01NIChTeXN0ZW0gTWFuYWdlbWVudCBNb2RlKSBtb2RlLiBTbyB3ZSBuZWVkIHRoZSBmb2xsb3dpbmc6CisgKiBDaGVjayB3aGV0aGVyIFNNSV9MT0NLIChDQ1IzIGJpdCAwKSBpcyBzZXQKKyAqICAgaWYgaXQgaXMgc2V0LCB3cml0ZSBhIHdhcm5pbmcgbWVzc2FnZTogQVJSMyBjYW5ub3QgYmUgY2hhbmdlZCEKKyAqICAgICAoaXQgY2Fubm90IGJlIGNoYW5nZWQgdW50aWwgdGhlIG5leHQgcHJvY2Vzc29yIHJlc2V0KQorICogICBpZiBpdCBpcyByZXNldCwgdGhlbiB3ZSBjYW4gY2hhbmdlIGl0LCBzZXQgYWxsIHRoZSBuZWVkZWQgYml0czoKKyAqICAgLSBkaXNhYmxlIGFjY2VzcyB0byBTTU0gbWVtb3J5IHRocm91Z2ggQVJSMyByYW5nZSAoQ0NSMSBiaXQgNyByZXNldCkKKyAqICAgLSBkaXNhYmxlIGFjY2VzcyB0byBTTU0gbWVtb3J5IChDQ1IxIGJpdCAyIHJlc2V0KQorICogICAtIGRpc2FibGUgU01NIG1vZGUgKENDUjEgYml0IDEgcmVzZXQpCisgKiAgIC0gZGlzYWJsZSB3cml0ZSBwcm90ZWN0aW9uIG9mIEFSUjMgKENDUjYgYml0IDEgcmVzZXQpCisgKiAgIC0gKG1heWJlKSBkaXNhYmxlIEFSUjMKKyAqIEp1c3QgdG8gYmUgc3VyZSwgd2UgZW5hYmxlIEFSUiB1c2FnZSBieSB0aGUgcHJvY2Vzc29yIChDQ1I1IGJpdCA1IHNldCkKKyAqLworc3RhdGljIHZvaWQgX19pbml0CitjeXJpeF9hcnJfaW5pdCh2b2lkKQoreworCXN0cnVjdCBzZXRfbXRycl9jb250ZXh0IGN0eHQ7CisJdW5zaWduZWQgY2hhciBjY3JbN107CisJaW50IGNjcmNbN10gPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKKyNpZmRlZiBDT05GSUdfU01QCisJaW50IGk7CisjZW5kaWYKKworCS8qIGZsdXNoIGNhY2hlIGFuZCBlbmFibGUgTUFQRU4gKi8KKwlzZXRfbXRycl9wcmVwYXJlX3NhdmUoJmN0eHQpOworCXNldF9tdHJyX2NhY2hlX2Rpc2FibGUoJmN0eHQpOworCisJLyogU2F2ZSBhbGwgQ0NScyBsb2NhbGx5ICovCisJY2NyWzBdID0gZ2V0Q3g4NihDWDg2X0NDUjApOworCWNjclsxXSA9IGdldEN4ODYoQ1g4Nl9DQ1IxKTsKKwljY3JbMl0gPSBnZXRDeDg2KENYODZfQ0NSMik7CisJY2NyWzNdID0gY3R4dC5jY3IzOworCWNjcls0XSA9IGdldEN4ODYoQ1g4Nl9DQ1I0KTsKKwljY3JbNV0gPSBnZXRDeDg2KENYODZfQ0NSNSk7CisJY2NyWzZdID0gZ2V0Q3g4NihDWDg2X0NDUjYpOworCisJaWYgKGNjclszXSAmIDEpIHsKKwkJY2NyY1szXSA9IDE7CisJCWFycjNfcHJvdGVjdGVkID0gMTsKKwl9IGVsc2UgeworCQkvKiBEaXNhYmxlIFNNTSBtb2RlIChiaXQgMSksIGFjY2VzcyB0byBTTU0gbWVtb3J5IChiaXQgMikgYW5kCisJCSAqIGFjY2VzcyB0byBTTU0gbWVtb3J5IHRocm91Z2ggQVJSMyAoYml0IDcpLgorCQkgKi8KKwkJaWYgKGNjclsxXSAmIDB4ODApIHsKKwkJCWNjclsxXSAmPSAweDdmOworCQkJY2NyY1sxXSB8PSAweDgwOworCQl9CisJCWlmIChjY3JbMV0gJiAweDA0KSB7CisJCQljY3JbMV0gJj0gMHhmYjsKKwkJCWNjcmNbMV0gfD0gMHgwNDsKKwkJfQorCQlpZiAoY2NyWzFdICYgMHgwMikgeworCQkJY2NyWzFdICY9IDB4ZmQ7CisJCQljY3JjWzFdIHw9IDB4MDI7CisJCX0KKwkJYXJyM19wcm90ZWN0ZWQgPSAwOworCQlpZiAoY2NyWzZdICYgMHgwMikgeworCQkJY2NyWzZdICY9IDB4ZmQ7CisJCQljY3JjWzZdID0gMTsJLyogRGlzYWJsZSB3cml0ZSBwcm90ZWN0aW9uIG9mIEFSUjMgKi8KKwkJCXNldEN4ODYoQ1g4Nl9DQ1I2LCBjY3JbNl0pOworCQl9CisJCS8qIERpc2FibGUgQVJSMy4gVGhpcyBpcyBzYWZlIG5vdyB0aGF0IHdlIGRpc2FibGVkIFNNTS4gKi8KKwkJLyogY3lyaXhfc2V0X2Fycl91cCAoMywgMCwgMCwgMCwgRkFMU0UpOyAqLworCX0KKwkvKiBJZiB3ZSBjaGFuZ2VkIENDUjEgaW4gbWVtb3J5LCBjaGFuZ2UgaXQgaW4gdGhlIHByb2Nlc3NvciwgdG9vLiAqLworCWlmIChjY3JjWzFdKQorCQlzZXRDeDg2KENYODZfQ0NSMSwgY2NyWzFdKTsKKworCS8qIEVuYWJsZSBBUlIgdXNhZ2UgYnkgdGhlIHByb2Nlc3NvciAqLworCWlmICghKGNjcls1XSAmIDB4MjApKSB7CisJCWNjcls1XSB8PSAweDIwOworCQljY3JjWzVdID0gMTsKKwkJc2V0Q3g4NihDWDg2X0NDUjUsIGNjcls1XSk7CisJfQorI2lmZGVmIENPTkZJR19TTVAKKwlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQorCQljY3Jfc3RhdGVbaV0gPSBjY3JbaV07CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJY3lyaXhfZ2V0X2FycihpLAorCQkJICAgICAgJmFycl9zdGF0ZVtpXS5iYXNlLCAmYXJyX3N0YXRlW2ldLnNpemUsCisJCQkgICAgICAmYXJyX3N0YXRlW2ldLnR5cGUpOworI2VuZGlmCisKKwlzZXRfbXRycl9kb25lKCZjdHh0KTsJLyogZmx1c2ggY2FjaGUgYW5kIGRpc2FibGUgTUFQRU4gKi8KKworCWlmIChjY3JjWzVdKQorCQlwcmludGsoS0VSTl9JTkZPICJtdHJyOiBBUlIgdXNhZ2Ugd2FzIG5vdCBlbmFibGVkLCBlbmFibGVkIG1hbnVhbGx5XG4iKTsKKwlpZiAoY2NyY1szXSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAibXRycjogQVJSMyBjYW5ub3QgYmUgY2hhbmdlZFxuIik7CisvKgorICAgIGlmICggY2NyY1sxXSAmIDB4ODApIHByaW50ayAoIm10cnI6IFNNTSBtZW1vcnkgYWNjZXNzIHRocm91Z2ggQVJSMyBkaXNhYmxlZFxuIik7CisgICAgaWYgKCBjY3JjWzFdICYgMHgwNCkgcHJpbnRrICgibXRycjogU01NIG1lbW9yeSBhY2Nlc3MgZGlzYWJsZWRcbiIpOworICAgIGlmICggY2NyY1sxXSAmIDB4MDIpIHByaW50ayAoIm10cnI6IFNNTSBtb2RlIGRpc2FibGVkXG4iKTsKKyovCisJaWYgKGNjcmNbNl0pCisJCXByaW50ayhLRVJOX0lORk8gIm10cnI6IEFSUjMgd2FzIHdyaXRlIHByb3RlY3RlZCwgdW5wcm90ZWN0ZWRcbiIpOworfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgbXRycl9vcHMgY3lyaXhfbXRycl9vcHMgPSB7CisJLnZlbmRvciAgICAgICAgICAgID0gWDg2X1ZFTkRPUl9DWVJJWCwKKy8vCS5pbml0ICAgICAgICAgICAgICA9IGN5cml4X2Fycl9pbml0LAorCS5zZXRfYWxsCSAgID0gY3lyaXhfc2V0X2FsbCwKKwkuc2V0ICAgICAgICAgICAgICAgPSBjeXJpeF9zZXRfYXJyLAorCS5nZXQgICAgICAgICAgICAgICA9IGN5cml4X2dldF9hcnIsCisJLmdldF9mcmVlX3JlZ2lvbiAgID0gY3lyaXhfZ2V0X2ZyZWVfcmVnaW9uLAorCS52YWxpZGF0ZV9hZGRfcGFnZSA9IGdlbmVyaWNfdmFsaWRhdGVfYWRkX3BhZ2UsCisJLmhhdmVfd3Jjb21iICAgICAgID0gcG9zaXRpdmVfaGF2ZV93cmNvbWIsCit9OworCitpbnQgX19pbml0IGN5cml4X2luaXRfbXRycih2b2lkKQoreworCXNldF9tdHJyX29wcygmY3lyaXhfbXRycl9vcHMpOworCXJldHVybiAwOworfQorCisvL2FyY2hfaW5pdGNhbGwoY3lyaXhfaW5pdF9tdHJyKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvZ2VuZXJpYy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9nZW5lcmljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRjY2U0NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvZ2VuZXJpYy5jCkBAIC0wLDAgKzEsNDE3IEBACisvKiBUaGlzIG9ubHkgaGFuZGxlcyAzMmJpdCBNVFJSIG9uIDMyYml0IGhvc3RzLiBUaGlzIGlzIHN0cmljdGx5IHdyb25nCisgICBiZWNhdXNlIE1UUlJzIGNhbiBzcGFuIHVwdG8gNDAgYml0cyAoMzZiaXRzIG9uIG1vc3QgbW9kZXJuIHg4NikgKi8gCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9tdHJyLmg+CisjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgorI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorI2luY2x1ZGUgIm10cnIuaCIKKworc3RydWN0IG10cnJfc3RhdGUgeworCXN0cnVjdCBtdHJyX3Zhcl9yYW5nZSAqdmFyX3JhbmdlczsKKwltdHJyX3R5cGUgZml4ZWRfcmFuZ2VzW05VTV9GSVhFRF9SQU5HRVNdOworCXVuc2lnbmVkIGNoYXIgZW5hYmxlZDsKKwltdHJyX3R5cGUgZGVmX3R5cGU7Cit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzbXBfY2hhbmdlc19tYXNrOworc3RhdGljIHN0cnVjdCBtdHJyX3N0YXRlIG10cnJfc3RhdGUgPSB7fTsKKworLyogIEdldCB0aGUgTVNSIHBhaXIgcmVsYXRpbmcgdG8gYSB2YXIgcmFuZ2UgICovCitzdGF0aWMgdm9pZCBfX2luaXQKK2dldF9tdHJyX3Zhcl9yYW5nZSh1bnNpZ25lZCBpbnQgaW5kZXgsIHN0cnVjdCBtdHJyX3Zhcl9yYW5nZSAqdnIpCit7CisJcmRtc3IoTVRSUnBoeXNCYXNlX01TUihpbmRleCksIHZyLT5iYXNlX2xvLCB2ci0+YmFzZV9oaSk7CisJcmRtc3IoTVRSUnBoeXNNYXNrX01TUihpbmRleCksIHZyLT5tYXNrX2xvLCB2ci0+bWFza19oaSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdAorZ2V0X2ZpeGVkX3JhbmdlcyhtdHJyX3R5cGUgKiBmcnMpCit7CisJdW5zaWduZWQgaW50ICpwID0gKHVuc2lnbmVkIGludCAqKSBmcnM7CisJaW50IGk7CisKKwlyZG1zcihNVFJSZml4NjRLXzAwMDAwX01TUiwgcFswXSwgcFsxXSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCQlyZG1zcihNVFJSZml4MTZLXzgwMDAwX01TUiArIGksIHBbMiArIGkgKiAyXSwgcFszICsgaSAqIDJdKTsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQlyZG1zcihNVFJSZml4NEtfQzAwMDBfTVNSICsgaSwgcFs2ICsgaSAqIDJdLCBwWzcgKyBpICogMl0pOworfQorCisvKiAgR3JhYiBhbGwgb2YgdGhlIE1UUlIgc3RhdGUgZm9yIHRoaXMgQ1BVIGludG8gKnN0YXRlICAqLwordm9pZCBfX2luaXQgZ2V0X210cnJfc3RhdGUodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgbXRycl92YXJfcmFuZ2UgKnZyczsKKwl1bnNpZ25lZCBsbywgZHVtbXk7CisKKwlpZiAoIW10cnJfc3RhdGUudmFyX3JhbmdlcykgeworCQltdHJyX3N0YXRlLnZhcl9yYW5nZXMgPSBrbWFsbG9jKG51bV92YXJfcmFuZ2VzICogc2l6ZW9mIChzdHJ1Y3QgbXRycl92YXJfcmFuZ2UpLCAKKwkJCQkJCUdGUF9LRVJORUwpOworCQlpZiAoIW10cnJfc3RhdGUudmFyX3JhbmdlcykKKwkJCXJldHVybjsKKwl9IAorCXZycyA9IG10cnJfc3RhdGUudmFyX3JhbmdlczsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fdmFyX3JhbmdlczsgaSsrKQorCQlnZXRfbXRycl92YXJfcmFuZ2UoaSwgJnZyc1tpXSk7CisJZ2V0X2ZpeGVkX3JhbmdlcyhtdHJyX3N0YXRlLmZpeGVkX3Jhbmdlcyk7CisKKwlyZG1zcihNVFJSZGVmVHlwZV9NU1IsIGxvLCBkdW1teSk7CisJbXRycl9zdGF0ZS5kZWZfdHlwZSA9IChsbyAmIDB4ZmYpOworCW10cnJfc3RhdGUuZW5hYmxlZCA9IChsbyAmIDB4YzAwKSA+PiAxMDsKK30KKworLyogIEZyZWUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhIHN0cnVjdCBtdHJyX3N0YXRlICAqLwordm9pZCBfX2luaXQgZmluYWxpemVfbXRycl9zdGF0ZSh2b2lkKQoreworCWlmIChtdHJyX3N0YXRlLnZhcl9yYW5nZXMpCisJCWtmcmVlKG10cnJfc3RhdGUudmFyX3Jhbmdlcyk7CisJbXRycl9zdGF0ZS52YXJfcmFuZ2VzID0gTlVMTDsKK30KKworLyogIFNvbWUgQklPUydzIGFyZSBmdWNrZWQgYW5kIGRvbid0IHNldCBhbGwgTVRSUnMgdGhlIHNhbWUhICAqLwordm9pZCBfX2luaXQgbXRycl9zdGF0ZV93YXJuKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBtYXNrID0gc21wX2NoYW5nZXNfbWFzazsKKworCWlmICghbWFzaykKKwkJcmV0dXJuOworCWlmIChtYXNrICYgTVRSUl9DSEFOR0VfTUFTS19GSVhFRCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibXRycjogeW91ciBDUFVzIGhhZCBpbmNvbnNpc3RlbnQgZml4ZWQgTVRSUiBzZXR0aW5nc1xuIik7CisJaWYgKG1hc2sgJiBNVFJSX0NIQU5HRV9NQVNLX1ZBUklBQkxFKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJtdHJyOiB5b3VyIENQVXMgaGFkIGluY29uc2lzdGVudCB2YXJpYWJsZSBNVFJSIHNldHRpbmdzXG4iKTsKKwlpZiAobWFzayAmIE1UUlJfQ0hBTkdFX01BU0tfREVGVFlQRSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibXRycjogeW91ciBDUFVzIGhhZCBpbmNvbnNpc3RlbnQgTVRSUmRlZlR5cGUgc2V0dGluZ3NcbiIpOworCXByaW50ayhLRVJOX0lORk8gIm10cnI6IHByb2JhYmx5IHlvdXIgQklPUyBkb2VzIG5vdCBzZXR1cCBhbGwgQ1BVcy5cbiIpOworCXByaW50ayhLRVJOX0lORk8gIm10cnI6IGNvcnJlY3RlZCBjb25maWd1cmF0aW9uLlxuIik7Cit9CisKKy8qIERvZXNuJ3QgYXR0ZW1wdCB0byBwYXNzIGFuIGVycm9yIG91dCB0byBNVFJSIHVzZXJzCisgICBiZWNhdXNlIGl0J3MgcXVpdGUgY29tcGxpY2F0ZWQgaW4gc29tZSBjYXNlcyBhbmQgcHJvYmFibHkgbm90CisgICB3b3J0aCBpdCBiZWNhdXNlIHRoZSBiZXN0IGVycm9yIGhhbmRsaW5nIGlzIHRvIGlnbm9yZSBpdC4gKi8KK3ZvaWQgbXRycl93cm1zcih1bnNpZ25lZCBtc3IsIHVuc2lnbmVkIGEsIHVuc2lnbmVkIGIpCit7CisJaWYgKHdybXNyX3NhZmUobXNyLCBhLCBiKSA8IDApCisJCXByaW50ayhLRVJOX0VSUgorCQkJIk1UUlI6IENQVSAldTogV3JpdGluZyBNU1IgJXggdG8gJXg6JXggZmFpbGVkXG4iLAorCQkJc21wX3Byb2Nlc3Nvcl9pZCgpLCBtc3IsIGEsIGIpOworfQorCitpbnQgZ2VuZXJpY19nZXRfZnJlZV9yZWdpb24odW5zaWduZWQgbG9uZyBiYXNlLCB1bnNpZ25lZCBsb25nIHNpemUpCisvKiAgW1NVTU1BUlldIEdldCBhIGZyZWUgTVRSUi4KKyAgICA8YmFzZT4gVGhlIHN0YXJ0aW5nIChiYXNlKSBhZGRyZXNzIG9mIHRoZSByZWdpb24uCisgICAgPHNpemU+IFRoZSBzaXplIChpbiBieXRlcykgb2YgdGhlIHJlZ2lvbi4KKyAgICBbUkVUVVJOU10gVGhlIGluZGV4IG9mIHRoZSByZWdpb24gb24gc3VjY2VzcywgZWxzZSAtMSBvbiBlcnJvci4KKyovCit7CisJaW50IGksIG1heDsKKwltdHJyX3R5cGUgbHR5cGU7CisJdW5zaWduZWQgbG9uZyBsYmFzZTsKKwl1bnNpZ25lZCBsc2l6ZTsKKworCW1heCA9IG51bV92YXJfcmFuZ2VzOworCWZvciAoaSA9IDA7IGkgPCBtYXg7ICsraSkgeworCQltdHJyX2lmLT5nZXQoaSwgJmxiYXNlLCAmbHNpemUsICZsdHlwZSk7CisJCWlmIChsc2l6ZSA9PSAwKQorCQkJcmV0dXJuIGk7CisJfQorCXJldHVybiAtRU5PU1BDOworfQorCit2b2lkIGdlbmVyaWNfZ2V0X210cnIodW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgbG9uZyAqYmFzZSwKKwkJICAgICAgdW5zaWduZWQgaW50ICpzaXplLCBtdHJyX3R5cGUgKiB0eXBlKQoreworCXVuc2lnbmVkIGludCBtYXNrX2xvLCBtYXNrX2hpLCBiYXNlX2xvLCBiYXNlX2hpOworCisJcmRtc3IoTVRSUnBoeXNNYXNrX01TUihyZWcpLCBtYXNrX2xvLCBtYXNrX2hpKTsKKwlpZiAoKG1hc2tfbG8gJiAweDgwMCkgPT0gMCkgeworCQkvKiAgSW52YWxpZCAoaS5lLiBmcmVlKSByYW5nZSAgKi8KKwkJKmJhc2UgPSAwOworCQkqc2l6ZSA9IDA7CisJCSp0eXBlID0gMDsKKwkJcmV0dXJuOworCX0KKworCXJkbXNyKE1UUlJwaHlzQmFzZV9NU1IocmVnKSwgYmFzZV9sbywgYmFzZV9oaSk7CisKKwkvKiBXb3JrIG91dCB0aGUgc2hpZnRlZCBhZGRyZXNzIG1hc2suICovCisJbWFza19sbyA9IHNpemVfb3JfbWFzayB8IG1hc2tfaGkgPDwgKDMyIC0gUEFHRV9TSElGVCkKKwkgICAgfCBtYXNrX2xvID4+IFBBR0VfU0hJRlQ7CisKKwkvKiBUaGlzIHdvcmtzIGNvcnJlY3RseSBpZiBzaXplIGlzIGEgcG93ZXIgb2YgdHdvLCBpLmUuIGEKKwkgICBjb250aWd1b3VzIHJhbmdlLiAqLworCSpzaXplID0gLW1hc2tfbG87CisJKmJhc2UgPSBiYXNlX2hpIDw8ICgzMiAtIFBBR0VfU0hJRlQpIHwgYmFzZV9sbyA+PiBQQUdFX1NISUZUOworCSp0eXBlID0gYmFzZV9sbyAmIDB4ZmY7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2ZpeGVkX3JhbmdlcyhtdHJyX3R5cGUgKiBmcnMpCit7CisJdW5zaWduZWQgaW50ICpwID0gKHVuc2lnbmVkIGludCAqKSBmcnM7CisJaW50IGNoYW5nZWQgPSBGQUxTRTsKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgbG8sIGhpOworCisJcmRtc3IoTVRSUmZpeDY0S18wMDAwMF9NU1IsIGxvLCBoaSk7CisJaWYgKHBbMF0gIT0gbG8gfHwgcFsxXSAhPSBoaSkgeworCQltdHJyX3dybXNyKE1UUlJmaXg2NEtfMDAwMDBfTVNSLCBwWzBdLCBwWzFdKTsKKwkJY2hhbmdlZCA9IFRSVUU7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlyZG1zcihNVFJSZml4MTZLXzgwMDAwX01TUiArIGksIGxvLCBoaSk7CisJCWlmIChwWzIgKyBpICogMl0gIT0gbG8gfHwgcFszICsgaSAqIDJdICE9IGhpKSB7CisJCQltdHJyX3dybXNyKE1UUlJmaXgxNktfODAwMDBfTVNSICsgaSwgcFsyICsgaSAqIDJdLAorCQkJICAgICAgcFszICsgaSAqIDJdKTsKKwkJCWNoYW5nZWQgPSBUUlVFOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlyZG1zcihNVFJSZml4NEtfQzAwMDBfTVNSICsgaSwgbG8sIGhpKTsKKwkJaWYgKHBbNiArIGkgKiAyXSAhPSBsbyB8fCBwWzcgKyBpICogMl0gIT0gaGkpIHsKKwkJCW10cnJfd3Jtc3IoTVRSUmZpeDRLX0MwMDAwX01TUiArIGksIHBbNiArIGkgKiAyXSwKKwkJCSAgICAgIHBbNyArIGkgKiAyXSk7CisJCQljaGFuZ2VkID0gVFJVRTsKKwkJfQorCX0KKwlyZXR1cm4gY2hhbmdlZDsKK30KKworLyogIFNldCB0aGUgTVNSIHBhaXIgcmVsYXRpbmcgdG8gYSB2YXIgcmFuZ2UuIFJldHVybnMgVFJVRSBpZgorICAgIGNoYW5nZXMgYXJlIG1hZGUgICovCitzdGF0aWMgaW50IHNldF9tdHJyX3Zhcl9yYW5nZXModW5zaWduZWQgaW50IGluZGV4LCBzdHJ1Y3QgbXRycl92YXJfcmFuZ2UgKnZyKQoreworCXVuc2lnbmVkIGludCBsbywgaGk7CisJaW50IGNoYW5nZWQgPSBGQUxTRTsKKworCXJkbXNyKE1UUlJwaHlzQmFzZV9NU1IoaW5kZXgpLCBsbywgaGkpOworCWlmICgodnItPmJhc2VfbG8gJiAweGZmZmZmMGZmVUwpICE9IChsbyAmIDB4ZmZmZmYwZmZVTCkKKwkgICAgfHwgKHZyLT5iYXNlX2hpICYgMHhmVUwpICE9IChoaSAmIDB4ZlVMKSkgeworCQltdHJyX3dybXNyKE1UUlJwaHlzQmFzZV9NU1IoaW5kZXgpLCB2ci0+YmFzZV9sbywgdnItPmJhc2VfaGkpOworCQljaGFuZ2VkID0gVFJVRTsKKwl9CisKKwlyZG1zcihNVFJScGh5c01hc2tfTVNSKGluZGV4KSwgbG8sIGhpKTsKKworCWlmICgodnItPm1hc2tfbG8gJiAweGZmZmZmODAwVUwpICE9IChsbyAmIDB4ZmZmZmY4MDBVTCkKKwkgICAgfHwgKHZyLT5tYXNrX2hpICYgMHhmVUwpICE9IChoaSAmIDB4ZlVMKSkgeworCQltdHJyX3dybXNyKE1UUlJwaHlzTWFza19NU1IoaW5kZXgpLCB2ci0+bWFza19sbywgdnItPm1hc2tfaGkpOworCQljaGFuZ2VkID0gVFJVRTsKKwl9CisJcmV0dXJuIGNoYW5nZWQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNldF9tdHJyX3N0YXRlKHUzMiBkZWZ0eXBlX2xvLCB1MzIgZGVmdHlwZV9oaSkKKy8qICBbU1VNTUFSWV0gU2V0IHRoZSBNVFJSIHN0YXRlIGZvciB0aGlzIENQVS4KKyAgICA8c3RhdGU+IFRoZSBNVFJSIHN0YXRlIGluZm9ybWF0aW9uIHRvIHJlYWQuCisgICAgPGN0eHQ+IFNvbWUgcmVsZXZhbnQgQ1BVIGNvbnRleHQuCisgICAgW05PVEVdIFRoZSBDUFUgbXVzdCBhbHJlYWR5IGJlIGluIGEgc2FmZSBzdGF0ZSBmb3IgTVRSUiBjaGFuZ2VzLgorICAgIFtSRVRVUk5TXSAwIGlmIG5vIGNoYW5nZXMgbWFkZSwgZWxzZSBhIG1hc2sgaW5kaWNhdGlvbiB3aGF0IHdhcyBjaGFuZ2VkLgorKi8KK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGNoYW5nZV9tYXNrID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fdmFyX3JhbmdlczsgaSsrKQorCQlpZiAoc2V0X210cnJfdmFyX3JhbmdlcyhpLCAmbXRycl9zdGF0ZS52YXJfcmFuZ2VzW2ldKSkKKwkJCWNoYW5nZV9tYXNrIHw9IE1UUlJfQ0hBTkdFX01BU0tfVkFSSUFCTEU7CisKKwlpZiAoc2V0X2ZpeGVkX3JhbmdlcyhtdHJyX3N0YXRlLmZpeGVkX3JhbmdlcykpCisJCWNoYW5nZV9tYXNrIHw9IE1UUlJfQ0hBTkdFX01BU0tfRklYRUQ7CisKKwkvKiAgU2V0X210cnJfcmVzdG9yZSByZXN0b3JlcyB0aGUgb2xkIHZhbHVlIG9mIE1UUlJkZWZUeXBlLAorCSAgIHNvIHRvIHNldCBpdCB3ZSBmaWRkbGUgd2l0aCB0aGUgc2F2ZWQgdmFsdWUgICovCisJaWYgKChkZWZ0eXBlX2xvICYgMHhmZikgIT0gbXRycl9zdGF0ZS5kZWZfdHlwZQorCSAgICB8fCAoKGRlZnR5cGVfbG8gJiAweGMwMCkgPj4gMTApICE9IG10cnJfc3RhdGUuZW5hYmxlZCkgeworCQlkZWZ0eXBlX2xvIHw9IChtdHJyX3N0YXRlLmRlZl90eXBlIHwgbXRycl9zdGF0ZS5lbmFibGVkIDw8IDEwKTsKKwkJY2hhbmdlX21hc2sgfD0gTVRSUl9DSEFOR0VfTUFTS19ERUZUWVBFOworCX0KKworCXJldHVybiBjaGFuZ2VfbWFzazsKK30KKworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjcjQgPSAwOworc3RhdGljIHUzMiBkZWZ0eXBlX2xvLCBkZWZ0eXBlX2hpOworc3RhdGljIERFRklORV9TUElOTE9DSyhzZXRfYXRvbWljaXR5X2xvY2spOworCisvKgorICogU2luY2Ugd2UgYXJlIGRpc2FibGluZyB0aGUgY2FjaGUgZG9uJ3QgYWxsb3cgYW55IGludGVycnVwdHMgLSB0aGV5CisgKiB3b3VsZCBydW4gZXh0cmVtZWx5IHNsb3cgYW5kIHdvdWxkIG9ubHkgaW5jcmVhc2UgdGhlIHBhaW4uICBUaGUgY2FsbGVyIG11c3QKKyAqIGVuc3VyZSB0aGF0IGxvY2FsIGludGVycnVwdHMgYXJlIGRpc2FibGVkIGFuZCBhcmUgcmVlbmFibGVkIGFmdGVyIHBvc3Rfc2V0KCkKKyAqIGhhcyBiZWVuIGNhbGxlZC4KKyAqLworCitzdGF0aWMgdm9pZCBwcmVwYXJlX3NldCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgY3IwOworCisJLyogIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCBpZGVhbCwgc2luY2UgdGhlIGNhY2hlIGlzIG9ubHkgZmx1c2hlZC9kaXNhYmxlZAorCSAgIGZvciB0aGlzIENQVSB3aGlsZSB0aGUgTVRSUnMgYXJlIGNoYW5nZWQsIGJ1dCBjaGFuZ2luZyB0aGlzIHJlcXVpcmVzCisJICAgbW9yZSBpbnZhc2l2ZSBjaGFuZ2VzIHRvIHRoZSB3YXkgdGhlIGtlcm5lbCBib290cyAgKi8KKworCXNwaW5fbG9jaygmc2V0X2F0b21pY2l0eV9sb2NrKTsKKworCS8qICBFbnRlciB0aGUgbm8tZmlsbCAoQ0Q9MSwgTlc9MCkgY2FjaGUgbW9kZSBhbmQgZmx1c2ggY2FjaGVzLiAqLworCWNyMCA9IHJlYWRfY3IwKCkgfCAweDQwMDAwMDAwOwkvKiBzZXQgQ0QgZmxhZyAqLworCXdyaXRlX2NyMChjcjApOworCXdiaW52ZCgpOworCisJLyogIFNhdmUgdmFsdWUgb2YgQ1I0IGFuZCBjbGVhciBQYWdlIEdsb2JhbCBFbmFibGUgKGJpdCA3KSAgKi8KKwlpZiAoIGNwdV9oYXNfcGdlICkgeworCQljcjQgPSByZWFkX2NyNCgpOworCQl3cml0ZV9jcjQoY3I0ICYgflg4Nl9DUjRfUEdFKTsKKwl9CisKKwkvKiBGbHVzaCBhbGwgVExCcyB2aWEgYSBtb3YgJWNyMywgJXJlZzsgbW92ICVyZWcsICVjcjMgKi8KKwlfX2ZsdXNoX3RsYigpOworCisJLyogIFNhdmUgTVRSUiBzdGF0ZSAqLworCXJkbXNyKE1UUlJkZWZUeXBlX01TUiwgZGVmdHlwZV9sbywgZGVmdHlwZV9oaSk7CisKKwkvKiAgRGlzYWJsZSBNVFJScywgYW5kIHNldCB0aGUgZGVmYXVsdCB0eXBlIHRvIHVuY2FjaGVkICAqLworCW10cnJfd3Jtc3IoTVRSUmRlZlR5cGVfTVNSLCBkZWZ0eXBlX2xvICYgMHhmMzAwVUwsIGRlZnR5cGVfaGkpOworfQorCitzdGF0aWMgdm9pZCBwb3N0X3NldCh2b2lkKQoreworCS8qICBGbHVzaCBUTEJzIChubyBuZWVkIHRvIGZsdXNoIGNhY2hlcyAtIHRoZXkgYXJlIGRpc2FibGVkKSAgKi8KKwlfX2ZsdXNoX3RsYigpOworCisJLyogSW50ZWwgKFA2KSBzdGFuZGFyZCBNVFJScyAqLworCW10cnJfd3Jtc3IoTVRSUmRlZlR5cGVfTVNSLCBkZWZ0eXBlX2xvLCBkZWZ0eXBlX2hpKTsKKwkJCisJLyogIEVuYWJsZSBjYWNoZXMgICovCisJd3JpdGVfY3IwKHJlYWRfY3IwKCkgJiAweGJmZmZmZmZmKTsKKworCS8qICBSZXN0b3JlIHZhbHVlIG9mIENSNCAgKi8KKwlpZiAoIGNwdV9oYXNfcGdlICkKKwkJd3JpdGVfY3I0KGNyNCk7CisJc3Bpbl91bmxvY2soJnNldF9hdG9taWNpdHlfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGdlbmVyaWNfc2V0X2FsbCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgbWFzaywgY291bnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlwcmVwYXJlX3NldCgpOworCisJLyogQWN0dWFsbHkgc2V0IHRoZSBzdGF0ZSAqLworCW1hc2sgPSBzZXRfbXRycl9zdGF0ZShkZWZ0eXBlX2xvLGRlZnR5cGVfaGkpOworCisJcG9zdF9zZXQoKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwkvKiAgVXNlIHRoZSBhdG9taWMgYml0b3BzIHRvIHVwZGF0ZSB0aGUgZ2xvYmFsIG1hc2sgICovCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgc2l6ZW9mIG1hc2sgKiA4OyArK2NvdW50KSB7CisJCWlmIChtYXNrICYgMHgwMSkKKwkJCXNldF9iaXQoY291bnQsICZzbXBfY2hhbmdlc19tYXNrKTsKKwkJbWFzayA+Pj0gMTsKKwl9CisJCit9CisKK3N0YXRpYyB2b2lkIGdlbmVyaWNfc2V0X210cnIodW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgbG9uZyBiYXNlLAorCQkJICAgICB1bnNpZ25lZCBsb25nIHNpemUsIG10cnJfdHlwZSB0eXBlKQorLyogIFtTVU1NQVJZXSBTZXQgdmFyaWFibGUgTVRSUiByZWdpc3RlciBvbiB0aGUgbG9jYWwgQ1BVLgorICAgIDxyZWc+IFRoZSByZWdpc3RlciB0byBzZXQuCisgICAgPGJhc2U+IFRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbi4KKyAgICA8c2l6ZT4gVGhlIHNpemUgb2YgdGhlIHJlZ2lvbi4gSWYgdGhpcyBpcyAwIHRoZSByZWdpb24gaXMgZGlzYWJsZWQuCisgICAgPHR5cGU+IFRoZSB0eXBlIG9mIHRoZSByZWdpb24uCisgICAgPGRvX3NhZmU+IElmIFRSVUUsIGRvIHRoZSBjaGFuZ2Ugc2FmZWx5LiBJZiBGQUxTRSwgc2FmZXR5IG1lYXN1cmVzIHNob3VsZAorICAgIGJlIGRvbmUgZXh0ZXJuYWxseS4KKyAgICBbUkVUVVJOU10gTm90aGluZy4KKyovCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlwcmVwYXJlX3NldCgpOworCisJaWYgKHNpemUgPT0gMCkgeworCQkvKiBUaGUgaW52YWxpZCBiaXQgaXMga2VwdCBpbiB0aGUgbWFzaywgc28gd2Ugc2ltcGx5IGNsZWFyIHRoZQorCQkgICByZWxldmFudCBtYXNrIHJlZ2lzdGVyIHRvIGRpc2FibGUgYSByYW5nZS4gKi8KKwkJbXRycl93cm1zcihNVFJScGh5c01hc2tfTVNSKHJlZyksIDAsIDApOworCX0gZWxzZSB7CisJCW10cnJfd3Jtc3IoTVRSUnBoeXNCYXNlX01TUihyZWcpLCBiYXNlIDw8IFBBR0VfU0hJRlQgfCB0eXBlLAorCQkgICAgICAoYmFzZSAmIHNpemVfYW5kX21hc2spID4+ICgzMiAtIFBBR0VfU0hJRlQpKTsKKwkJbXRycl93cm1zcihNVFJScGh5c01hc2tfTVNSKHJlZyksIC1zaXplIDw8IFBBR0VfU0hJRlQgfCAweDgwMCwKKwkJICAgICAgKC1zaXplICYgc2l6ZV9hbmRfbWFzaykgPj4gKDMyIC0gUEFHRV9TSElGVCkpOworCX0KKworCXBvc3Rfc2V0KCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitpbnQgZ2VuZXJpY192YWxpZGF0ZV9hZGRfcGFnZSh1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgaW50IHR5cGUpCit7CisJdW5zaWduZWQgbG9uZyBsYmFzZSwgbGFzdDsKKworCS8qICBGb3IgSW50ZWwgUFBybyBzdGVwcGluZyA8PSA3LCBtdXN0IGJlIDQgTWlCIGFsaWduZWQgCisJICAgIGFuZCBub3QgdG91Y2ggMHg3MDAwMDAwMC0+MHg3MDAzRkZGRiAqLworCWlmIChpc19jcHUoSU5URUwpICYmIGJvb3RfY3B1X2RhdGEueDg2ID09IDYgJiYKKwkgICAgYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPT0gMSAmJgorCSAgICBib290X2NwdV9kYXRhLng4Nl9tYXNrIDw9IDcpIHsKKwkJaWYgKGJhc2UgJiAoKDEgPDwgKDIyIC0gUEFHRV9TSElGVCkpIC0gMSkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm10cnI6IGJhc2UoMHglbHgwMDApIGlzIG5vdCA0IE1pQiBhbGlnbmVkXG4iLCBiYXNlKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmICghKGJhc2UgKyBzaXplIDwgMHg3MDAwMDAwMCB8fCBiYXNlID4gMHg3MDAzRkZGRikgJiYKKwkJICAgICh0eXBlID09IE1UUlJfVFlQRV9XUkNPTUIKKwkJICAgICB8fCB0eXBlID09IE1UUlJfVFlQRV9XUkJBQ0spKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtdHJyOiB3cml0YWJsZSBtdHJyIGJldHdlZW4gMHg3MDAwMDAwMCBhbmQgMHg3MDAzRkZGRiBtYXkgaGFuZyB0aGUgQ1BVLlxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCWlmIChiYXNlICsgc2l6ZSA8IDB4MTAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm10cnI6IGNhbm5vdCBzZXQgcmVnaW9uIGJlbG93IDEgTWlCICgweCVseDAwMCwweCVseDAwMClcbiIsCisJCSAgICAgICBiYXNlLCBzaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qICBDaGVjayB1cHBlciBiaXRzIG9mIGJhc2UgYW5kIGxhc3QgYXJlIGVxdWFsIGFuZCBsb3dlciBiaXRzIGFyZSAwCisJICAgIGZvciBiYXNlIGFuZCAxIGZvciBsYXN0ICAqLworCWxhc3QgPSBiYXNlICsgc2l6ZSAtIDE7CisJZm9yIChsYmFzZSA9IGJhc2U7ICEobGJhc2UgJiAxKSAmJiAobGFzdCAmIDEpOworCSAgICAgbGJhc2UgPSBsYmFzZSA+PiAxLCBsYXN0ID0gbGFzdCA+PiAxKSA7CisJaWYgKGxiYXNlICE9IGxhc3QpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibXRycjogYmFzZSgweCVseDAwMCkgaXMgbm90IGFsaWduZWQgb24gYSBzaXplKDB4JWx4MDAwKSBib3VuZGFyeVxuIiwKKwkJICAgICAgIGJhc2UsIHNpemUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBnZW5lcmljX2hhdmVfd3Jjb21iKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBjb25maWcsIGR1bW15OworCXJkbXNyKE1UUlJjYXBfTVNSLCBjb25maWcsIGR1bW15KTsKKwlyZXR1cm4gKGNvbmZpZyAmICgxIDw8IDEwKSk7Cit9CisKK2ludCBwb3NpdGl2ZV9oYXZlX3dyY29tYih2b2lkKQoreworCXJldHVybiAxOworfQorCisvKiBnZW5lcmljIHN0cnVjdHVyZS4uLgorICovCitzdHJ1Y3QgbXRycl9vcHMgZ2VuZXJpY19tdHJyX29wcyA9IHsKKwkudXNlX2ludGVsX2lmICAgICAgPSAxLAorCS5zZXRfYWxsCSAgID0gZ2VuZXJpY19zZXRfYWxsLAorCS5nZXQgICAgICAgICAgICAgICA9IGdlbmVyaWNfZ2V0X210cnIsCisJLmdldF9mcmVlX3JlZ2lvbiAgID0gZ2VuZXJpY19nZXRfZnJlZV9yZWdpb24sCisJLnNldCAgICAgICAgICAgICAgID0gZ2VuZXJpY19zZXRfbXRyciwKKwkudmFsaWRhdGVfYWRkX3BhZ2UgPSBnZW5lcmljX3ZhbGlkYXRlX2FkZF9wYWdlLAorCS5oYXZlX3dyY29tYiAgICAgICA9IGdlbmVyaWNfaGF2ZV93cmNvbWIsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9pZi5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9pZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MjNlMGEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL2lmLmMKQEAgLTAsMCArMSwzNzQgQEAKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjZGVmaW5lIExJTkVfU0laRSA4MAorCisjaW5jbHVkZSA8YXNtL210cnIuaD4KKyNpbmNsdWRlICJtdHJyLmgiCisKKy8qIFJFRC1QRU46IHRoaXMgaXMgYWNjZXNzZWQgd2l0aG91dCBhbnkgbG9ja2luZyAqLworZXh0ZXJuIHVuc2lnbmVkIGludCAqdXNhZ2VfdGFibGU7CisKKworI2RlZmluZSBGSUxFX0ZDT1VOVChmKSAoKChzdHJ1Y3Qgc2VxX2ZpbGUgKikoKGYpLT5wcml2YXRlX2RhdGEpKS0+cHJpdmF0ZSkKKworc3RhdGljIGNoYXIgKm10cnJfc3RyaW5nc1tNVFJSX05VTV9UWVBFU10gPQoreworICAgICJ1bmNhY2hhYmxlIiwgICAgICAgICAgICAgICAvKiAwICovCisgICAgIndyaXRlLWNvbWJpbmluZyIsICAgICAgICAgIC8qIDEgKi8KKyAgICAiPyIsICAgICAgICAgICAgICAgICAgICAgICAgLyogMiAqLworICAgICI/IiwgICAgICAgICAgICAgICAgICAgICAgICAvKiAzICovCisgICAgIndyaXRlLXRocm91Z2giLCAgICAgICAgICAgIC8qIDQgKi8KKyAgICAid3JpdGUtcHJvdGVjdCIsICAgICAgICAgICAgLyogNSAqLworICAgICJ3cml0ZS1iYWNrIiwgICAgICAgICAgICAgICAvKiA2ICovCit9OworCitjaGFyICptdHJyX2F0dHJpYl90b19zdHIoaW50IHgpCit7CisJcmV0dXJuICh4IDw9IDYpID8gbXRycl9zdHJpbmdzW3hdIDogIj8iOworfQorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKworc3RhdGljIGludAorbXRycl9maWxlX2FkZCh1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkgICAgICB1bnNpZ25lZCBpbnQgdHlwZSwgY2hhciBpbmNyZW1lbnQsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgcGFnZSkKK3sKKwlpbnQgcmVnLCBtYXg7CisJdW5zaWduZWQgaW50ICpmY291bnQgPSBGSUxFX0ZDT1VOVChmaWxlKTsgCisKKwltYXggPSBudW1fdmFyX3JhbmdlczsKKwlpZiAoZmNvdW50ID09IE5VTEwpIHsKKwkJZmNvdW50ID0ga21hbGxvYyhtYXggKiBzaXplb2YgKmZjb3VudCwgR0ZQX0tFUk5FTCk7CisJCWlmICghZmNvdW50KQorCQkJcmV0dXJuIC1FTk9NRU07CisJCW1lbXNldChmY291bnQsIDAsIG1heCAqIHNpemVvZiAqZmNvdW50KTsKKwkJRklMRV9GQ09VTlQoZmlsZSkgPSBmY291bnQ7CisJfQorCWlmICghcGFnZSkgeworCQlpZiAoKGJhc2UgJiAoUEFHRV9TSVpFIC0gMSkpIHx8IChzaXplICYgKFBBR0VfU0laRSAtIDEpKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQliYXNlID4+PSBQQUdFX1NISUZUOworCQlzaXplID4+PSBQQUdFX1NISUZUOworCX0KKwlyZWcgPSBtdHJyX2FkZF9wYWdlKGJhc2UsIHNpemUsIHR5cGUsIDEpOworCWlmIChyZWcgPj0gMCkKKwkJKytmY291bnRbcmVnXTsKKwlyZXR1cm4gcmVnOworfQorCitzdGF0aWMgaW50CittdHJyX2ZpbGVfZGVsKHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyBzaXplLAorCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgcGFnZSkKK3sKKwlpbnQgcmVnOworCXVuc2lnbmVkIGludCAqZmNvdW50ID0gRklMRV9GQ09VTlQoZmlsZSk7CisKKwlpZiAoIXBhZ2UpIHsKKwkJaWYgKChiYXNlICYgKFBBR0VfU0laRSAtIDEpKSB8fCAoc2l6ZSAmIChQQUdFX1NJWkUgLSAxKSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYmFzZSA+Pj0gUEFHRV9TSElGVDsKKwkJc2l6ZSA+Pj0gUEFHRV9TSElGVDsKKwl9CisJcmVnID0gbXRycl9kZWxfcGFnZSgtMSwgYmFzZSwgc2l6ZSk7CisJaWYgKHJlZyA8IDApCisJCXJldHVybiByZWc7CisJaWYgKGZjb3VudCA9PSBOVUxMKQorCQlyZXR1cm4gcmVnOworCWlmIChmY291bnRbcmVnXSA8IDEpCisJCXJldHVybiAtRUlOVkFMOworCS0tZmNvdW50W3JlZ107CisJcmV0dXJuIHJlZzsKK30KKworLyogUkVELVBFTjogc2VxX2ZpbGUgY2FuIHNlZWsgbm93LiB0aGlzIGlzIGlnbm9yZWQuICovCitzdGF0aWMgc3NpemVfdAorbXRycl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwgbG9mZl90ICogcHBvcykKKy8qICBGb3JtYXQgb2YgY29udHJvbCBsaW5lOgorICAgICJiYXNlPSVMeCBzaXplPSVMeCB0eXBlPSVzIiAgICAgT1I6CisgICAgImRpc2FibGU9JWQiCisqLworeworCWludCBpLCBlcnI7CisJdW5zaWduZWQgbG9uZyByZWc7CisJdW5zaWduZWQgbG9uZyBsb25nIGJhc2UsIHNpemU7CisJY2hhciAqcHRyOworCWNoYXIgbGluZVtMSU5FX1NJWkVdOworCXNpemVfdCBsaW5lbGVuOworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCWlmICghbGVuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwltZW1zZXQobGluZSwgMCwgTElORV9TSVpFKTsKKwlpZiAobGVuID4gTElORV9TSVpFKQorCQlsZW4gPSBMSU5FX1NJWkU7CisJaWYgKGNvcHlfZnJvbV91c2VyKGxpbmUsIGJ1ZiwgbGVuIC0gMSkpCisJCXJldHVybiAtRUZBVUxUOworCWxpbmVsZW4gPSBzdHJsZW4obGluZSk7CisJcHRyID0gbGluZSArIGxpbmVsZW4gLSAxOworCWlmIChsaW5lbGVuICYmICpwdHIgPT0gJ1xuJykKKwkJKnB0ciA9ICdcMCc7CisJaWYgKCFzdHJuY21wKGxpbmUsICJkaXNhYmxlPSIsIDgpKSB7CisJCXJlZyA9IHNpbXBsZV9zdHJ0b3VsKGxpbmUgKyA4LCAmcHRyLCAwKTsKKwkJZXJyID0gbXRycl9kZWxfcGFnZShyZWcsIDAsIDApOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCXJldHVybiBsZW47CisJfQorCWlmIChzdHJuY21wKGxpbmUsICJiYXNlPSIsIDUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwliYXNlID0gc2ltcGxlX3N0cnRvdWxsKGxpbmUgKyA1LCAmcHRyLCAwKTsKKwlmb3IgKDsgaXNzcGFjZSgqcHRyKTsgKytwdHIpIDsKKwlpZiAoc3RybmNtcChwdHIsICJzaXplPSIsIDUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzaXplID0gc2ltcGxlX3N0cnRvdWxsKHB0ciArIDUsICZwdHIsIDApOworCWlmICgoYmFzZSAmIDB4ZmZmKSB8fCAoc2l6ZSAmIDB4ZmZmKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZm9yICg7IGlzc3BhY2UoKnB0cik7ICsrcHRyKSA7CisJaWYgKHN0cm5jbXAocHRyLCAidHlwZT0iLCA1KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcHRyICs9IDU7CisJZm9yICg7IGlzc3BhY2UoKnB0cik7ICsrcHRyKSA7CisJZm9yIChpID0gMDsgaSA8IE1UUlJfTlVNX1RZUEVTOyArK2kpIHsKKwkJaWYgKHN0cmNtcChwdHIsIG10cnJfc3RyaW5nc1tpXSkpCisJCQljb250aW51ZTsKKwkJYmFzZSA+Pj0gUEFHRV9TSElGVDsKKwkJc2l6ZSA+Pj0gUEFHRV9TSElGVDsKKwkJZXJyID0KKwkJICAgIG10cnJfYWRkX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGJhc2UsICh1bnNpZ25lZCBsb25nKSBzaXplLCBpLAorCQkJCSAgMSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJcmV0dXJuIGxlbjsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQKK210cnJfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBfX2FyZykKK3sKKwlpbnQgZXJyOworCW10cnJfdHlwZSB0eXBlOworCXN0cnVjdCBtdHJyX3NlbnRyeSBzZW50cnk7CisJc3RydWN0IG10cnJfZ2VudHJ5IGdlbnRyeTsKKwl2b2lkIF9fdXNlciAqYXJnID0gKHZvaWQgX191c2VyICopIF9fYXJnOworCisJc3dpdGNoIChjbWQpIHsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1RUWTsKKwljYXNlIE1UUlJJT0NfQUREX0VOVFJZOgorCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoY29weV9mcm9tX3VzZXIoJnNlbnRyeSwgYXJnLCBzaXplb2Ygc2VudHJ5KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQllcnIgPQorCQkgICAgbXRycl9maWxlX2FkZChzZW50cnkuYmFzZSwgc2VudHJ5LnNpemUsIHNlbnRyeS50eXBlLCAxLAorCQkJCSAgZmlsZSwgMCk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJYnJlYWs7CisJY2FzZSBNVFJSSU9DX1NFVF9FTlRSWToKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZzZW50cnksIGFyZywgc2l6ZW9mIHNlbnRyeSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJZXJyID0gbXRycl9hZGQoc2VudHJ5LmJhc2UsIHNlbnRyeS5zaXplLCBzZW50cnkudHlwZSwgMCk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJYnJlYWs7CisJY2FzZSBNVFJSSU9DX0RFTF9FTlRSWToKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZzZW50cnksIGFyZywgc2l6ZW9mIHNlbnRyeSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJZXJyID0gbXRycl9maWxlX2RlbChzZW50cnkuYmFzZSwgc2VudHJ5LnNpemUsIGZpbGUsIDApOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWJyZWFrOworCWNhc2UgTVRSUklPQ19LSUxMX0VOVFJZOgorCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoY29weV9mcm9tX3VzZXIoJnNlbnRyeSwgYXJnLCBzaXplb2Ygc2VudHJ5KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQllcnIgPSBtdHJyX2RlbCgtMSwgc2VudHJ5LmJhc2UsIHNlbnRyeS5zaXplKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQlicmVhazsKKwljYXNlIE1UUlJJT0NfR0VUX0VOVFJZOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJmdlbnRyeSwgYXJnLCBzaXplb2YgZ2VudHJ5KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoZ2VudHJ5LnJlZ251bSA+PSBudW1fdmFyX3JhbmdlcykKKwkJCXJldHVybiAtRUlOVkFMOworCQltdHJyX2lmLT5nZXQoZ2VudHJ5LnJlZ251bSwgJmdlbnRyeS5iYXNlLCAmZ2VudHJ5LnNpemUsICZ0eXBlKTsKKworCQkvKiBIaWRlIGVudHJpZXMgdGhhdCBnbyBhYm92ZSA0R0IgKi8KKwkJaWYgKGdlbnRyeS5iYXNlICsgZ2VudHJ5LnNpemUgPiAweDEwMDAwMAorCQkgICAgfHwgZ2VudHJ5LnNpemUgPT0gMHgxMDAwMDApCisJCQlnZW50cnkuYmFzZSA9IGdlbnRyeS5zaXplID0gZ2VudHJ5LnR5cGUgPSAwOworCQllbHNlIHsKKwkJCWdlbnRyeS5iYXNlIDw8PSBQQUdFX1NISUZUOworCQkJZ2VudHJ5LnNpemUgPDw9IFBBR0VfU0hJRlQ7CisJCQlnZW50cnkudHlwZSA9IHR5cGU7CisJCX0KKworCQlpZiAoY29weV90b191c2VyKGFyZywgJmdlbnRyeSwgc2l6ZW9mIGdlbnRyeSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBNVFJSSU9DX0FERF9QQUdFX0VOVFJZOgorCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoY29weV9mcm9tX3VzZXIoJnNlbnRyeSwgYXJnLCBzaXplb2Ygc2VudHJ5KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQllcnIgPQorCQkgICAgbXRycl9maWxlX2FkZChzZW50cnkuYmFzZSwgc2VudHJ5LnNpemUsIHNlbnRyeS50eXBlLCAxLAorCQkJCSAgZmlsZSwgMSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJYnJlYWs7CisJY2FzZSBNVFJSSU9DX1NFVF9QQUdFX0VOVFJZOgorCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoY29weV9mcm9tX3VzZXIoJnNlbnRyeSwgYXJnLCBzaXplb2Ygc2VudHJ5KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQllcnIgPSBtdHJyX2FkZF9wYWdlKHNlbnRyeS5iYXNlLCBzZW50cnkuc2l6ZSwgc2VudHJ5LnR5cGUsIDApOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWJyZWFrOworCWNhc2UgTVRSUklPQ19ERUxfUEFHRV9FTlRSWToKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZzZW50cnksIGFyZywgc2l6ZW9mIHNlbnRyeSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJZXJyID0gbXRycl9maWxlX2RlbChzZW50cnkuYmFzZSwgc2VudHJ5LnNpemUsIGZpbGUsIDEpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWJyZWFrOworCWNhc2UgTVRSUklPQ19LSUxMX1BBR0VfRU5UUlk6CisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmIChjb3B5X2Zyb21fdXNlcigmc2VudHJ5LCBhcmcsIHNpemVvZiBzZW50cnkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWVyciA9IG10cnJfZGVsX3BhZ2UoLTEsIHNlbnRyeS5iYXNlLCBzZW50cnkuc2l6ZSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJYnJlYWs7CisJY2FzZSBNVFJSSU9DX0dFVF9QQUdFX0VOVFJZOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJmdlbnRyeSwgYXJnLCBzaXplb2YgZ2VudHJ5KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoZ2VudHJ5LnJlZ251bSA+PSBudW1fdmFyX3JhbmdlcykKKwkJCXJldHVybiAtRUlOVkFMOworCQltdHJyX2lmLT5nZXQoZ2VudHJ5LnJlZ251bSwgJmdlbnRyeS5iYXNlLCAmZ2VudHJ5LnNpemUsICZ0eXBlKTsKKwkJZ2VudHJ5LnR5cGUgPSB0eXBlOworCisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmZ2VudHJ5LCBzaXplb2YgZ2VudHJ5KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK210cnJfY2xvc2Uoc3RydWN0IGlub2RlICppbm8sIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBpLCBtYXg7CisJdW5zaWduZWQgaW50ICpmY291bnQgPSBGSUxFX0ZDT1VOVChmaWxlKTsKKworCWlmIChmY291bnQgIT0gTlVMTCkgeworCQltYXggPSBudW1fdmFyX3JhbmdlczsKKwkJZm9yIChpID0gMDsgaSA8IG1heDsgKytpKSB7CisJCQl3aGlsZSAoZmNvdW50W2ldID4gMCkgeworCQkJCW10cnJfZGVsKGksIDAsIDApOworCQkJCS0tZmNvdW50W2ldOworCQkJfQorCQl9CisJCWtmcmVlKGZjb3VudCk7CisJCUZJTEVfRkNPVU5UKGZpbGUpID0gTlVMTDsKKwl9CisJcmV0dXJuIHNpbmdsZV9yZWxlYXNlKGlubywgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgbXRycl9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KTsKKworc3RhdGljIGludCBtdHJyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKCFtdHJyX2lmKSAKKwkJcmV0dXJuIC1FSU87CisJaWYgKCFtdHJyX2lmLT5nZXQpIAorCQlyZXR1cm4gLUVOWElPOyAKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgbXRycl9zZXFfc2hvdywgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG10cnJfZm9wcyA9IHsKKwkub3duZXIgICA9IFRISVNfTU9EVUxFLAorCS5vcGVuCSA9IG10cnJfb3BlbiwgCisJLnJlYWQgICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrICA9IHNlcV9sc2VlaywKKwkud3JpdGUgICA9IG10cnJfd3JpdGUsCisJLmlvY3RsICAgPSBtdHJyX2lvY3RsLAorCS5yZWxlYXNlID0gbXRycl9jbG9zZSwKK307CisKKworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19yb290X210cnI7CisKKworc3RhdGljIGludCBtdHJyX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCit7CisJY2hhciBmYWN0b3I7CisJaW50IGksIG1heCwgbGVuOworCW10cnJfdHlwZSB0eXBlOworCXVuc2lnbmVkIGxvbmcgYmFzZTsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKworCWxlbiA9IDA7CisJbWF4ID0gbnVtX3Zhcl9yYW5nZXM7CisJZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKSB7CisJCW10cnJfaWYtPmdldChpLCAmYmFzZSwgJnNpemUsICZ0eXBlKTsKKwkJaWYgKHNpemUgPT0gMCkKKwkJCXVzYWdlX3RhYmxlW2ldID0gMDsKKwkJZWxzZSB7CisJCQlpZiAoc2l6ZSA8ICgweDEwMDAwMCA+PiBQQUdFX1NISUZUKSkgeworCQkJCS8qIGxlc3MgdGhhbiAxTUIgKi8KKwkJCQlmYWN0b3IgPSAnSyc7CisJCQkJc2l6ZSA8PD0gUEFHRV9TSElGVCAtIDEwOworCQkJfSBlbHNlIHsKKwkJCQlmYWN0b3IgPSAnTSc7CisJCQkJc2l6ZSA+Pj0gMjAgLSBQQUdFX1NISUZUOworCQkJfQorCQkJLyogUkVELVBFTjogYmFzZSBjYW4gYmUgPiAzMmJpdCAqLyAKKwkJCWxlbiArPSBzZXFfcHJpbnRmKHNlcSwgCisJCQkJICAgInJlZyUwMmk6IGJhc2U9MHglMDVseDAwMCAoJTRsaU1CKSwgc2l6ZT0lNGklY0I6ICVzLCBjb3VudD0lZFxuIiwKKwkJCSAgICAgaSwgYmFzZSwgYmFzZSA+PiAoMjAgLSBQQUdFX1NISUZUKSwgc2l6ZSwgZmFjdG9yLAorCQkJICAgICBtdHJyX2F0dHJpYl90b19zdHIodHlwZSksIHVzYWdlX3RhYmxlW2ldKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgbXRycl9pZl9pbml0KHZvaWQpCit7CisJc3RydWN0IGNwdWluZm9feDg2ICpjID0gJmJvb3RfY3B1X2RhdGE7CisKKwlpZiAoKCFjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX01UUlIpKSAmJgorCSAgICAoIWNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfSzZfTVRSUikpICYmCisJICAgICghY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9DWVJJWF9BUlIpKSAmJgorCSAgICAoIWNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfQ0VOVEFVUl9NQ1IpKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwcm9jX3Jvb3RfbXRyciA9CisJICAgIGNyZWF0ZV9wcm9jX2VudHJ5KCJtdHJyIiwgU19JV1VTUiB8IFNfSVJVR08sICZwcm9jX3Jvb3QpOworCWlmIChwcm9jX3Jvb3RfbXRycikgeworCQlwcm9jX3Jvb3RfbXRyci0+b3duZXIgPSBUSElTX01PRFVMRTsKKwkJcHJvY19yb290X210cnItPnByb2NfZm9wcyA9ICZtdHJyX2ZvcHM7CisJfQorCXJldHVybiAwOworfQorCithcmNoX2luaXRjYWxsKG10cnJfaWZfaW5pdCk7CisjZW5kaWYJCQkvKiAgQ09ORklHX1BST0NfRlMgICovCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL21haW4uYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNjdiNDkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL21haW4uYwpAQCAtMCwwICsxLDY5MyBAQAorLyogIEdlbmVyaWMgTVRSUiAoTWVtb3J5IFR5cGUgUmFuZ2UgUmVnaXN0ZXIpIGRyaXZlci4KKworICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDAwICBSaWNoYXJkIEdvb2NoCisgICAgQ29weXJpZ2h0IChjKSAyMDAyCSAgICAgUGF0cmljayBNb2NoZWwKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgICAgUmljaGFyZCBHb29jaCBtYXkgYmUgcmVhY2hlZCBieSBlbWFpbCBhdCAgcmdvb2NoQGF0bmYuY3Npcm8uYXUKKyAgICBUaGUgcG9zdGFsIGFkZHJlc3MgaXM6CisgICAgICBSaWNoYXJkIEdvb2NoLCBjL28gQVRORiwgUC4gTy4gQm94IDc2LCBFcHBpbmcsIE4uUy5XLiwgMjEyMSwgQXVzdHJhbGlhLgorCisgICAgU291cmNlOiAiUGVudGl1bSBQcm8gRmFtaWx5IERldmVsb3BlcidzIE1hbnVhbCwgVm9sdW1lIDM6CisgICAgT3BlcmF0aW5nIFN5c3RlbSBXcml0ZXIncyBHdWlkZSIgKEludGVsIGRvY3VtZW50IG51bWJlciAyNDI2OTIpLAorICAgIHNlY3Rpb24gMTEuMTEuNworCisgICAgVGhpcyB3YXMgY2xlYW5lZCBhbmQgbWFkZSByZWFkYWJsZSBieSBQYXRyaWNrIE1vY2hlbCA8bW9jaGVsQG9zZGwub3JnPiAKKyAgICBvbiA2LTcgTWFyY2ggMjAwMi4gCisgICAgU291cmNlOiBJbnRlbCBBcmNoaXRlY3R1cmUgU29mdHdhcmUgRGV2ZWxvcGVycyBNYW51YWwsIFZvbHVtZSAzOiAKKyAgICBTeXN0ZW0gUHJvZ3JhbW1pbmcgR3VpZGU7IFNlY3Rpb24gOS4xMS4gKDE5OTcgZWRpdGlvbiAtIFBQcm8pLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKworI2luY2x1ZGUgPGFzbS9tdHJyLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSAibXRyci5oIgorCisjZGVmaW5lIE1UUlJfVkVSU0lPTiAgICAgICAgICAgICIyLjAgKDIwMDIwNTE5KSIKKwordTMyIG51bV92YXJfcmFuZ2VzID0gMDsKKwordW5zaWduZWQgaW50ICp1c2FnZV90YWJsZTsKK3N0YXRpYyBERUNMQVJFX01VVEVYKG1haW5fbG9jayk7CisKK3UzMiBzaXplX29yX21hc2ssIHNpemVfYW5kX21hc2s7CisKK3N0YXRpYyBzdHJ1Y3QgbXRycl9vcHMgKiBtdHJyX29wc1tYODZfVkVORE9SX05VTV0gPSB7fTsKKworc3RydWN0IG10cnJfb3BzICogbXRycl9pZiA9IE5VTEw7CisKK3N0YXRpYyB2b2lkIHNldF9tdHJyKHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGxvbmcgYmFzZSwKKwkJICAgICB1bnNpZ25lZCBsb25nIHNpemUsIG10cnJfdHlwZSB0eXBlKTsKKworZXh0ZXJuIGludCBhcnIzX3Byb3RlY3RlZDsKKwordm9pZCBzZXRfbXRycl9vcHMoc3RydWN0IG10cnJfb3BzICogb3BzKQoreworCWlmIChvcHMtPnZlbmRvciAmJiBvcHMtPnZlbmRvciA8IFg4Nl9WRU5ET1JfTlVNKQorCQltdHJyX29wc1tvcHMtPnZlbmRvcl0gPSBvcHM7Cit9CisKKy8qICBSZXR1cm5zIG5vbi16ZXJvIGlmIHdlIGhhdmUgdGhlIHdyaXRlLWNvbWJpbmluZyBtZW1vcnkgdHlwZSAgKi8KK3N0YXRpYyBpbnQgaGF2ZV93cmNvbWIodm9pZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2OworCQorCWlmICgoZGV2ID0gcGNpX2dldF9jbGFzcyhQQ0lfQ0xBU1NfQlJJREdFX0hPU1QgPDwgOCwgTlVMTCkpICE9IE5VTEwpIHsKKwkJLyogU2VydmVyV29ya3MgTEUgY2hpcHNldHMgaGF2ZSBwcm9ibGVtcyB3aXRoIHdyaXRlLWNvbWJpbmluZyAKKwkJICAgRG9uJ3QgYWxsb3cgaXQgYW5kIGxlYXZlIHJvb20gZm9yIG90aGVyIGNoaXBzZXRzIHRvIGJlIHRhZ2dlZCAqLworCQlpZiAoZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9TRVJWRVJXT1JLUyAmJgorCQkgICAgZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19MRSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAibXRycjogU2VydmVyd29ya3MgTEUgZGV0ZWN0ZWQuIFdyaXRlLWNvbWJpbmluZyBkaXNhYmxlZC5cbiIpOworCQkJcGNpX2Rldl9wdXQoZGV2KTsKKwkJCXJldHVybiAwOworCQl9CisJCS8qIEludGVsIDQ1ME5YIGVycmF0YSAjIDIzLiBOb24gYXNjZW5kaW5nIGNhY2hsaW5lIGV2aWN0aW9ucyB0bworCQkgICB3cml0ZSBjb21iaW5pbmcgbWVtb3J5IG1heSByZXN1bHRpbmcgaW4gZGF0YSBjb3JydXB0aW9uICovCisJCWlmIChkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0lOVEVMICYmCisJCSAgICBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNDUxTlgpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIm10cnI6IEludGVsIDQ1ME5YIE1NQyBkZXRlY3RlZC4gV3JpdGUtY29tYmluaW5nIGRpc2FibGVkLlxuIik7CisJCQlwY2lfZGV2X3B1dChkZXYpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcGNpX2Rldl9wdXQoZGV2KTsKKwl9CQkKKwlyZXR1cm4gKG10cnJfaWYtPmhhdmVfd3Jjb21iID8gbXRycl9pZi0+aGF2ZV93cmNvbWIoKSA6IDApOworfQorCisvKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgdmFyaWFibGUgTVRSUnMgICovCitzdGF0aWMgdm9pZCBfX2luaXQgc2V0X251bV92YXJfcmFuZ2VzKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBjb25maWcgPSAwLCBkdW1teTsKKworCWlmICh1c2VfaW50ZWwoKSkgeworCQlyZG1zcihNVFJSY2FwX01TUiwgY29uZmlnLCBkdW1teSk7CisJfSBlbHNlIGlmIChpc19jcHUoQU1EKSkKKwkJY29uZmlnID0gMjsKKwllbHNlIGlmIChpc19jcHUoQ1lSSVgpIHx8IGlzX2NwdShDRU5UQVVSKSkKKwkJY29uZmlnID0gODsKKwludW1fdmFyX3JhbmdlcyA9IGNvbmZpZyAmIDB4ZmY7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBpbml0X3RhYmxlKHZvaWQpCit7CisJaW50IGksIG1heDsKKworCW1heCA9IG51bV92YXJfcmFuZ2VzOworCWlmICgodXNhZ2VfdGFibGUgPSBrbWFsbG9jKG1heCAqIHNpemVvZiAqdXNhZ2VfdGFibGUsIEdGUF9LRVJORUwpKQorCSAgICA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAibXRycjogY291bGQgbm90IGFsbG9jYXRlXG4iKTsKKwkJcmV0dXJuOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspCisJCXVzYWdlX3RhYmxlW2ldID0gMTsKK30KKworc3RydWN0IHNldF9tdHJyX2RhdGEgeworCWF0b21pY190CWNvdW50OworCWF0b21pY190CWdhdGU7CisJdW5zaWduZWQgbG9uZwlzbXBfYmFzZTsKKwl1bnNpZ25lZCBsb25nCXNtcF9zaXplOworCXVuc2lnbmVkIGludAlzbXBfcmVnOworCW10cnJfdHlwZQlzbXBfdHlwZTsKK307CisKKyNpZmRlZiBDT05GSUdfU01QCisKK3N0YXRpYyB2b2lkIGlwaV9oYW5kbGVyKHZvaWQgKmluZm8pCisvKiAgW1NVTU1BUlldIFN5bmNocm9uaXNhdGlvbiBoYW5kbGVyLiBFeGVjdXRlZCBieSAib3RoZXIiIENQVXMuCisgICAgW1JFVFVSTlNdIE5vdGhpbmcuCisqLworeworCXN0cnVjdCBzZXRfbXRycl9kYXRhICpkYXRhID0gaW5mbzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJYXRvbWljX2RlYygmZGF0YS0+Y291bnQpOworCXdoaWxlKCFhdG9taWNfcmVhZCgmZGF0YS0+Z2F0ZSkpCisJCWNwdV9yZWxheCgpOworCisJLyogIFRoZSBtYXN0ZXIgaGFzIGNsZWFyZWQgbWUgdG8gZXhlY3V0ZSAgKi8KKwlpZiAoZGF0YS0+c21wX3JlZyAhPSB+MFUpIAorCQltdHJyX2lmLT5zZXQoZGF0YS0+c21wX3JlZywgZGF0YS0+c21wX2Jhc2UsIAorCQkJICAgICBkYXRhLT5zbXBfc2l6ZSwgZGF0YS0+c21wX3R5cGUpOworCWVsc2UKKwkJbXRycl9pZi0+c2V0X2FsbCgpOworCisJYXRvbWljX2RlYygmZGF0YS0+Y291bnQpOworCXdoaWxlKGF0b21pY19yZWFkKCZkYXRhLT5nYXRlKSkKKwkJY3B1X3JlbGF4KCk7CisKKwlhdG9taWNfZGVjKCZkYXRhLT5jb3VudCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisjZW5kaWYKKworLyoqCisgKiBzZXRfbXRyciAtIHVwZGF0ZSBtdHJycyBvbiBhbGwgcHJvY2Vzc29ycworICogQHJlZzoJbXRyciBpbiBxdWVzdGlvbgorICogQGJhc2U6CW10cnIgYmFzZQorICogQHNpemU6CW10cnIgc2l6ZQorICogQHR5cGU6CW10cnIgdHlwZQorICoKKyAqIFRoaXMgaXMga2luZGEgdHJpY2t5LCBidXQgZm9ydHVuYXRlbHksIEludGVsIHNwZWxsZWQgaXQgb3V0IGZvciB1cyBjbGVhbmx5OgorICogCisgKiAxLiBTZW5kIElQSSB0byBkbyB0aGUgZm9sbG93aW5nOgorICogMi4gRGlzYWJsZSBJbnRlcnJ1cHRzCisgKiAzLiBXYWl0IGZvciBhbGwgcHJvY3MgdG8gZG8gc28gCisgKiA0LiBFbnRlciBuby1maWxsIGNhY2hlIG1vZGUKKyAqIDUuIEZsdXNoIGNhY2hlcworICogNi4gQ2xlYXIgUEdFIGJpdAorICogNy4gRmx1c2ggYWxsIFRMQnMKKyAqIDguIERpc2FibGUgYWxsIHJhbmdlIHJlZ2lzdGVycworICogOS4gVXBkYXRlIHRoZSBNVFJScworICogMTAuIEVuYWJsZSBhbGwgcmFuZ2UgcmVnaXN0ZXJzCisgKiAxMS4gRmx1c2ggYWxsIFRMQnMgYW5kIGNhY2hlcyBhZ2FpbgorICogMTIuIEVudGVyIG5vcm1hbCBjYWNoZSBtb2RlIGFuZCByZWVuYWJsZSBjYWNoaW5nCisgKiAxMy4gU2V0IFBHRSAKKyAqIDE0LiBXYWl0IGZvciBidWRkaWVzIHRvIGNhdGNoIHVwCisgKiAxNS4gRW5hYmxlIGludGVycnVwdHMuCisgKiAKKyAqIFdoYXQgZG9lcyB0aGF0IG1lYW4gZm9yIHVzPyBXZWxsLCBmaXJzdCB3ZSBzZXQgZGF0YS5jb3VudCB0byB0aGUgbnVtYmVyCisgKiBvZiBDUFVzLiBBcyBlYWNoIENQVSBkaXNhYmxlcyBpbnRlcnJ1cHRzLCBpdCdsbCBkZWNyZW1lbnQgaXQgb25jZS4gV2Ugd2FpdAorICogdW50aWwgaXQgaGl0cyAwIGFuZCBwcm9jZWVkLiBXZSBzZXQgdGhlIGRhdGEuZ2F0ZSBmbGFnIGFuZCByZXNldCBkYXRhLmNvdW50LgorICogTWVhbndoaWxlLCB0aGV5IGFyZSB3YWl0aW5nIGZvciB0aGF0IGZsYWcgdG8gYmUgc2V0LiBPbmNlIGl0J3Mgc2V0LCBlYWNoIAorICogQ1BVIGdvZXMgdGhyb3VnaCB0aGUgdHJhbnNpdGlvbiBvZiB1cGRhdGluZyBNVFJScy4gVGhlIENQVSB2ZW5kb3JzIG1heSBlYWNoIGRvIGl0IAorICogZGlmZmVyZW50bHksIHNvIHdlIGNhbGwgbXRycl9pZi0+c2V0KCkgY2FsbGJhY2sgYW5kIGxldCB0aGVtIHRha2UgY2FyZSBvZiBpdC4KKyAqIFdoZW4gdGhleSdyZSBkb25lLCB0aGV5IGFnYWluIGRlY3JlbWVudCBkYXRhLT5jb3VudCBhbmQgd2FpdCBmb3IgZGF0YS5nYXRlIHRvIAorICogYmUgcmVzZXQuIAorICogV2hlbiB3ZSBmaW5pc2gsIHdlIHdhaXQgZm9yIGRhdGEuY291bnQgdG8gaGl0IDAgYW5kIHRvZ2dsZSB0aGUgZGF0YS5nYXRlIGZsYWcuCisgKiBFdmVyeW9uZSB0aGVuIGVuYWJsZXMgaW50ZXJydXB0cyBhbmQgd2UgYWxsIGNvbnRpbnVlIG9uLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgbWVjaGFuaXNtIGlzIHRoZSBzYW1lIGZvciBVUCBzeXN0ZW1zLCB0b287IGFsbCB0aGUgU01QIHN0dWZmCisgKiBiZWNvbWVzIG5vcHMuCisgKi8KK3N0YXRpYyB2b2lkIHNldF9tdHJyKHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGxvbmcgYmFzZSwKKwkJICAgICB1bnNpZ25lZCBsb25nIHNpemUsIG10cnJfdHlwZSB0eXBlKQoreworCXN0cnVjdCBzZXRfbXRycl9kYXRhIGRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRhdGEuc21wX3JlZyA9IHJlZzsKKwlkYXRhLnNtcF9iYXNlID0gYmFzZTsKKwlkYXRhLnNtcF9zaXplID0gc2l6ZTsKKwlkYXRhLnNtcF90eXBlID0gdHlwZTsKKwlhdG9taWNfc2V0KCZkYXRhLmNvdW50LCBudW1fYm9vdGluZ19jcHVzKCkgLSAxKTsKKwlhdG9taWNfc2V0KCZkYXRhLmdhdGUsMCk7CisKKwkvKiAgU3RhcnQgdGhlIGJhbGwgcm9sbGluZyBvbiBvdGhlciBDUFVzICAqLworCWlmIChzbXBfY2FsbF9mdW5jdGlvbihpcGlfaGFuZGxlciwgJmRhdGEsIDEsIDApICE9IDApCisJCXBhbmljKCJtdHJyOiB0aW1lZCBvdXQgd2FpdGluZyBmb3Igb3RoZXIgQ1BVc1xuIik7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwl3aGlsZShhdG9taWNfcmVhZCgmZGF0YS5jb3VudCkpCisJCWNwdV9yZWxheCgpOworCisJLyogb2ssIHJlc2V0IGNvdW50IGFuZCB0b2dnbGUgZ2F0ZSAqLworCWF0b21pY19zZXQoJmRhdGEuY291bnQsIG51bV9ib290aW5nX2NwdXMoKSAtIDEpOworCWF0b21pY19zZXQoJmRhdGEuZ2F0ZSwxKTsKKworCS8qIGRvIG91ciBNVFJSIGJ1c2luZXNzICovCisKKwkvKiBIQUNLIQorCSAqIFdlIHVzZSB0aGlzIHNhbWUgZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSB0aGUgbXRycnMgb24gYm9vdC4KKwkgKiBUaGUgc3RhdGUgb2YgdGhlIGJvb3QgY3B1J3MgbXRycnMgaGFzIGJlZW4gc2F2ZWQsIGFuZCB3ZSB3YW50CisJICogdG8gcmVwbGljYXRlIGFjcm9zcyBhbGwgdGhlIEFQcy4gCisJICogSWYgd2UncmUgZG9pbmcgdGhhdCBAcmVnIGlzIHNldCB0byBzb21ldGhpbmcgc3BlY2lhbC4uLgorCSAqLworCWlmIChyZWcgIT0gfjBVKSAKKwkJbXRycl9pZi0+c2V0KHJlZyxiYXNlLHNpemUsdHlwZSk7CisKKwkvKiB3YWl0IGZvciB0aGUgb3RoZXJzICovCisJd2hpbGUoYXRvbWljX3JlYWQoJmRhdGEuY291bnQpKQorCQljcHVfcmVsYXgoKTsKKworCWF0b21pY19zZXQoJmRhdGEuY291bnQsIG51bV9ib290aW5nX2NwdXMoKSAtIDEpOworCWF0b21pY19zZXQoJmRhdGEuZ2F0ZSwwKTsKKworCS8qCisJICogV2FpdCBoZXJlIGZvciBldmVyeW9uZSB0byBoYXZlIHNlZW4gdGhlIGdhdGUgY2hhbmdlCisJICogU28gd2UncmUgdGhlIGxhc3Qgb25lcyB0byB0b3VjaCAnZGF0YScKKwkgKi8KKwl3aGlsZShhdG9taWNfcmVhZCgmZGF0YS5jb3VudCkpCisJCWNwdV9yZWxheCgpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisvKioKKyAqCW10cnJfYWRkX3BhZ2UgLSBBZGQgYSBtZW1vcnkgdHlwZSByZWdpb24KKyAqCUBiYXNlOiBQaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgcmVnaW9uIGluIHBhZ2VzICg0IEtCKQorICoJQHNpemU6IFBoeXNpY2FsIHNpemUgb2YgcmVnaW9uIGluIHBhZ2VzICg0IEtCKQorICoJQHR5cGU6IFR5cGUgb2YgTVRSUiBkZXNpcmVkCisgKglAaW5jcmVtZW50OiBJZiB0aGlzIGlzIHRydWUgZG8gdXNhZ2UgY291bnRpbmcgb24gdGhlIHJlZ2lvbgorICoKKyAqCU1lbW9yeSB0eXBlIHJlZ2lvbiByZWdpc3RlcnMgY29udHJvbCB0aGUgY2FjaGluZyBvbiBuZXdlciBJbnRlbCBhbmQKKyAqCW5vbiBJbnRlbCBwcm9jZXNzb3JzLiBUaGlzIGZ1bmN0aW9uIGFsbG93cyBkcml2ZXJzIHRvIHJlcXVlc3QgYW4KKyAqCU1UUlIgaXMgYWRkZWQuIFRoZSBkZXRhaWxzIGFuZCBoYXJkd2FyZSBzcGVjaWZpY3Mgb2YgZWFjaCBwcm9jZXNzb3IncworICoJaW1wbGVtZW50YXRpb24gYXJlIGhpZGRlbiBmcm9tIHRoZSBjYWxsZXIsIGJ1dCBuZXZlcnRoZWxlc3MgdGhlIAorICoJY2FsbGVyIHNob3VsZCBleHBlY3QgdG8gbmVlZCB0byBwcm92aWRlIGEgcG93ZXIgb2YgdHdvIHNpemUgb24gYW4KKyAqCWVxdWl2YWxlbnQgcG93ZXIgb2YgdHdvIGJvdW5kYXJ5LgorICoKKyAqCUlmIHRoZSByZWdpb24gY2Fubm90IGJlIGFkZGVkIGVpdGhlciBiZWNhdXNlIGFsbCByZWdpb25zIGFyZSBpbiB1c2UKKyAqCW9yIHRoZSBDUFUgY2Fubm90IHN1cHBvcnQgaXQgYSBuZWdhdGl2ZSB2YWx1ZSBpcyByZXR1cm5lZC4gT24gc3VjY2VzcworICoJdGhlIHJlZ2lzdGVyIG51bWJlciBmb3IgdGhpcyBlbnRyeSBpcyByZXR1cm5lZCwgYnV0IHNob3VsZCBiZSB0cmVhdGVkCisgKglhcyBhIGNvb2tpZSBvbmx5LgorICoKKyAqCU9uIGEgbXVsdGlwcm9jZXNzb3IgbWFjaGluZSB0aGUgY2hhbmdlcyBhcmUgbWFkZSB0byBhbGwgcHJvY2Vzc29ycy4KKyAqCVRoaXMgaXMgcmVxdWlyZWQgb24geDg2IGJ5IHRoZSBJbnRlbCBwcm9jZXNzb3JzLgorICoKKyAqCVRoZSBhdmFpbGFibGUgdHlwZXMgYXJlCisgKgorICoJJU1UUlJfVFlQRV9VTkNBQ0hBQkxFCS0JTm8gY2FjaGluZworICoKKyAqCSVNVFJSX1RZUEVfV1JCQUNLCS0JV3JpdGUgZGF0YSBiYWNrIGluIGJ1cnN0cyB3aGVuZXZlcgorICoKKyAqCSVNVFJSX1RZUEVfV1JDT01CCS0JV3JpdGUgZGF0YSBiYWNrIHNvb24gYnV0IGFsbG93IGJ1cnN0cworICoKKyAqCSVNVFJSX1RZUEVfV1JUSFJPVUdICS0JQ2FjaGUgcmVhZHMgYnV0IG5vdCB3cml0ZXMKKyAqCisgKglCVUdTOiBOZWVkcyBhIHF1aWV0IGZsYWcgZm9yIHRoZSBjYXNlcyB3aGVyZSBkcml2ZXJzIGRvIG5vdCBtaW5kCisgKglmYWlsdXJlcyBhbmQgZG8gbm90IHdpc2ggc3lzdGVtIGxvZyBtZXNzYWdlcyB0byBiZSBzZW50LgorICovCisKK2ludCBtdHJyX2FkZF9wYWdlKHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyBzaXplLCAKKwkJICB1bnNpZ25lZCBpbnQgdHlwZSwgY2hhciBpbmNyZW1lbnQpCit7CisJaW50IGk7CisJbXRycl90eXBlIGx0eXBlOworCXVuc2lnbmVkIGxvbmcgbGJhc2U7CisJdW5zaWduZWQgaW50IGxzaXplOworCWludCBlcnJvcjsKKworCWlmICghbXRycl9pZikKKwkJcmV0dXJuIC1FTlhJTzsKKwkJCisJaWYgKChlcnJvciA9IG10cnJfaWYtPnZhbGlkYXRlX2FkZF9wYWdlKGJhc2Usc2l6ZSx0eXBlKSkpCisJCXJldHVybiBlcnJvcjsKKworCWlmICh0eXBlID49IE1UUlJfTlVNX1RZUEVTKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm10cnI6IHR5cGU6ICV1IGludmFsaWRcbiIsIHR5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiAgSWYgdGhlIHR5cGUgaXMgV0MsIGNoZWNrIHRoYXQgdGhpcyBwcm9jZXNzb3Igc3VwcG9ydHMgaXQgICovCisJaWYgKCh0eXBlID09IE1UUlJfVFlQRV9XUkNPTUIpICYmICFoYXZlX3dyY29tYigpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJtdHJyOiB5b3VyIHByb2Nlc3NvciBkb2Vzbid0IHN1cHBvcnQgd3JpdGUtY29tYmluaW5nXG4iKTsKKwkJcmV0dXJuIC1FTk9TWVM7CisJfQorCisJaWYgKGJhc2UgJiBzaXplX29yX21hc2sgfHwgc2l6ZSAmIHNpemVfb3JfbWFzaykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtdHJyOiBiYXNlIG9yIHNpemUgZXhjZWVkcyB0aGUgTVRSUiB3aWR0aFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWVycm9yID0gLUVJTlZBTDsKKworCS8qICBTZWFyY2ggZm9yIGV4aXN0aW5nIE1UUlIgICovCisJZG93bigmbWFpbl9sb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3Zhcl9yYW5nZXM7ICsraSkgeworCQltdHJyX2lmLT5nZXQoaSwgJmxiYXNlLCAmbHNpemUsICZsdHlwZSk7CisJCWlmIChiYXNlID49IGxiYXNlICsgbHNpemUpCisJCQljb250aW51ZTsKKwkJaWYgKChiYXNlIDwgbGJhc2UpICYmIChiYXNlICsgc2l6ZSA8PSBsYmFzZSkpCisJCQljb250aW51ZTsKKwkJLyogIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGVyZSBpcyBzb21lIGtpbmQgb2Ygb3ZlcmxhcC9lbmNsb3N1cmUgICovCisJCWlmICgoYmFzZSA8IGxiYXNlKSB8fCAoYmFzZSArIHNpemUgPiBsYmFzZSArIGxzaXplKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJtdHJyOiAweCVseDAwMCwweCVseDAwMCBvdmVybGFwcyBleGlzdGluZyIKKwkJCSAgICAgICAiIDB4JWx4MDAwLDB4JXgwMDBcbiIsIGJhc2UsIHNpemUsIGxiYXNlLAorCQkJICAgICAgIGxzaXplKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCS8qICBOZXcgcmVnaW9uIGlzIGVuY2xvc2VkIGJ5IGFuIGV4aXN0aW5nIHJlZ2lvbiAgKi8KKwkJaWYgKGx0eXBlICE9IHR5cGUpIHsKKwkJCWlmICh0eXBlID09IE1UUlJfVFlQRV9VTkNBQ0hBQkxFKQorCQkJCWNvbnRpbnVlOworCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIm10cnI6IHR5cGUgbWlzbWF0Y2ggZm9yICVseDAwMCwlbHgwMDAgb2xkOiAlcyBuZXc6ICVzXG4iLAorCQkJICAgICBiYXNlLCBzaXplLCBtdHJyX2F0dHJpYl90b19zdHIobHR5cGUpLAorCQkJICAgICBtdHJyX2F0dHJpYl90b19zdHIodHlwZSkpOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKGluY3JlbWVudCkKKwkJCSsrdXNhZ2VfdGFibGVbaV07CisJCWVycm9yID0gaTsKKwkJZ290byBvdXQ7CisJfQorCS8qICBTZWFyY2ggZm9yIGFuIGVtcHR5IE1UUlIgICovCisJaSA9IG10cnJfaWYtPmdldF9mcmVlX3JlZ2lvbihiYXNlLCBzaXplKTsKKwlpZiAoaSA+PSAwKSB7CisJCXNldF9tdHJyKGksIGJhc2UsIHNpemUsIHR5cGUpOworCQl1c2FnZV90YWJsZVtpXSA9IDE7CisJfSBlbHNlCisJCXByaW50ayhLRVJOX0lORk8gIm10cnI6IG5vIG1vcmUgTVRSUnMgYXZhaWxhYmxlXG4iKTsKKwllcnJvciA9IGk7Cisgb3V0OgorCXVwKCZtYWluX2xvY2spOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKgltdHJyX2FkZCAtIEFkZCBhIG1lbW9yeSB0eXBlIHJlZ2lvbgorICoJQGJhc2U6IFBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiByZWdpb24KKyAqCUBzaXplOiBQaHlzaWNhbCBzaXplIG9mIHJlZ2lvbgorICoJQHR5cGU6IFR5cGUgb2YgTVRSUiBkZXNpcmVkCisgKglAaW5jcmVtZW50OiBJZiB0aGlzIGlzIHRydWUgZG8gdXNhZ2UgY291bnRpbmcgb24gdGhlIHJlZ2lvbgorICoKKyAqCU1lbW9yeSB0eXBlIHJlZ2lvbiByZWdpc3RlcnMgY29udHJvbCB0aGUgY2FjaGluZyBvbiBuZXdlciBJbnRlbCBhbmQKKyAqCW5vbiBJbnRlbCBwcm9jZXNzb3JzLiBUaGlzIGZ1bmN0aW9uIGFsbG93cyBkcml2ZXJzIHRvIHJlcXVlc3QgYW4KKyAqCU1UUlIgaXMgYWRkZWQuIFRoZSBkZXRhaWxzIGFuZCBoYXJkd2FyZSBzcGVjaWZpY3Mgb2YgZWFjaCBwcm9jZXNzb3IncworICoJaW1wbGVtZW50YXRpb24gYXJlIGhpZGRlbiBmcm9tIHRoZSBjYWxsZXIsIGJ1dCBuZXZlcnRoZWxlc3MgdGhlIAorICoJY2FsbGVyIHNob3VsZCBleHBlY3QgdG8gbmVlZCB0byBwcm92aWRlIGEgcG93ZXIgb2YgdHdvIHNpemUgb24gYW4KKyAqCWVxdWl2YWxlbnQgcG93ZXIgb2YgdHdvIGJvdW5kYXJ5LgorICoKKyAqCUlmIHRoZSByZWdpb24gY2Fubm90IGJlIGFkZGVkIGVpdGhlciBiZWNhdXNlIGFsbCByZWdpb25zIGFyZSBpbiB1c2UKKyAqCW9yIHRoZSBDUFUgY2Fubm90IHN1cHBvcnQgaXQgYSBuZWdhdGl2ZSB2YWx1ZSBpcyByZXR1cm5lZC4gT24gc3VjY2VzcworICoJdGhlIHJlZ2lzdGVyIG51bWJlciBmb3IgdGhpcyBlbnRyeSBpcyByZXR1cm5lZCwgYnV0IHNob3VsZCBiZSB0cmVhdGVkCisgKglhcyBhIGNvb2tpZSBvbmx5LgorICoKKyAqCU9uIGEgbXVsdGlwcm9jZXNzb3IgbWFjaGluZSB0aGUgY2hhbmdlcyBhcmUgbWFkZSB0byBhbGwgcHJvY2Vzc29ycy4KKyAqCVRoaXMgaXMgcmVxdWlyZWQgb24geDg2IGJ5IHRoZSBJbnRlbCBwcm9jZXNzb3JzLgorICoKKyAqCVRoZSBhdmFpbGFibGUgdHlwZXMgYXJlCisgKgorICoJJU1UUlJfVFlQRV9VTkNBQ0hBQkxFCS0JTm8gY2FjaGluZworICoKKyAqCSVNVFJSX1RZUEVfV1JCQUNLCS0JV3JpdGUgZGF0YSBiYWNrIGluIGJ1cnN0cyB3aGVuZXZlcgorICoKKyAqCSVNVFJSX1RZUEVfV1JDT01CCS0JV3JpdGUgZGF0YSBiYWNrIHNvb24gYnV0IGFsbG93IGJ1cnN0cworICoKKyAqCSVNVFJSX1RZUEVfV1JUSFJPVUdICS0JQ2FjaGUgcmVhZHMgYnV0IG5vdCB3cml0ZXMKKyAqCisgKglCVUdTOiBOZWVkcyBhIHF1aWV0IGZsYWcgZm9yIHRoZSBjYXNlcyB3aGVyZSBkcml2ZXJzIGRvIG5vdCBtaW5kCisgKglmYWlsdXJlcyBhbmQgZG8gbm90IHdpc2ggc3lzdGVtIGxvZyBtZXNzYWdlcyB0byBiZSBzZW50LgorICovCisKK2ludAorbXRycl9hZGQodW5zaWduZWQgbG9uZyBiYXNlLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGludCB0eXBlLAorCSBjaGFyIGluY3JlbWVudCkKK3sKKwlpZiAoKGJhc2UgJiAoUEFHRV9TSVpFIC0gMSkpIHx8IChzaXplICYgKFBBR0VfU0laRSAtIDEpKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtdHJyOiBzaXplIGFuZCBiYXNlIG11c3QgYmUgbXVsdGlwbGVzIG9mIDQga2lCXG4iKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIm10cnI6IHNpemU6IDB4JWx4ICBiYXNlOiAweCVseFxuIiwgc2l6ZSwgYmFzZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gbXRycl9hZGRfcGFnZShiYXNlID4+IFBBR0VfU0hJRlQsIHNpemUgPj4gUEFHRV9TSElGVCwgdHlwZSwKKwkJCSAgICAgaW5jcmVtZW50KTsKK30KKworLyoqCisgKgltdHJyX2RlbF9wYWdlIC0gZGVsZXRlIGEgbWVtb3J5IHR5cGUgcmVnaW9uCisgKglAcmVnOiBSZWdpc3RlciByZXR1cm5lZCBieSBtdHJyX2FkZAorICoJQGJhc2U6IFBoeXNpY2FsIGJhc2UgYWRkcmVzcworICoJQHNpemU6IFNpemUgb2YgcmVnaW9uCisgKgorICoJSWYgcmVnaXN0ZXIgaXMgc3VwcGxpZWQgdGhlbiBiYXNlIGFuZCBzaXplIGFyZSBpZ25vcmVkLiBUaGlzIGlzCisgKglob3cgZHJpdmVycyBzaG91bGQgY2FsbCBpdC4KKyAqCisgKglSZWxlYXNlcyBhbiBNVFJSIHJlZ2lvbi4gSWYgdGhlIHVzYWdlIGNvdW50IGRyb3BzIHRvIHplcm8gdGhlIAorICoJcmVnaXN0ZXIgaXMgZnJlZWQgYW5kIHRoZSByZWdpb24gcmV0dXJucyB0byBkZWZhdWx0IHN0YXRlLgorICoJT24gc3VjY2VzcyB0aGUgcmVnaXN0ZXIgaXMgcmV0dXJuZWQsIG9uIGZhaWx1cmUgYSBuZWdhdGl2ZSBlcnJvcgorICoJY29kZS4KKyAqLworCitpbnQgbXRycl9kZWxfcGFnZShpbnQgcmVnLCB1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlpbnQgaSwgbWF4OworCW10cnJfdHlwZSBsdHlwZTsKKwl1bnNpZ25lZCBsb25nIGxiYXNlOworCXVuc2lnbmVkIGludCBsc2l6ZTsKKwlpbnQgZXJyb3IgPSAtRUlOVkFMOworCisJaWYgKCFtdHJyX2lmKQorCQlyZXR1cm4gLUVOWElPOworCisJbWF4ID0gbnVtX3Zhcl9yYW5nZXM7CisJZG93bigmbWFpbl9sb2NrKTsKKwlpZiAocmVnIDwgMCkgeworCQkvKiAgU2VhcmNoIGZvciBleGlzdGluZyBNVFJSICAqLworCQlmb3IgKGkgPSAwOyBpIDwgbWF4OyArK2kpIHsKKwkJCW10cnJfaWYtPmdldChpLCAmbGJhc2UsICZsc2l6ZSwgJmx0eXBlKTsKKwkJCWlmIChsYmFzZSA9PSBiYXNlICYmIGxzaXplID09IHNpemUpIHsKKwkJCQlyZWcgPSBpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChyZWcgPCAwKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAibXRycjogbm8gTVRSUiBmb3IgJWx4MDAwLCVseDAwMCBmb3VuZFxuIiwgYmFzZSwKKwkJCSAgICAgICBzaXplKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCWlmIChyZWcgPj0gbWF4KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm10cnI6IHJlZ2lzdGVyOiAlZCB0b28gYmlnXG4iLCByZWcpOworCQlnb3RvIG91dDsKKwl9CisJaWYgKGlzX2NwdShDWVJJWCkgJiYgIXVzZV9pbnRlbCgpKSB7CisJCWlmICgocmVnID09IDMpICYmIGFycjNfcHJvdGVjdGVkKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtdHJyOiBBUlIzIGNhbm5vdCBiZSBjaGFuZ2VkXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCW10cnJfaWYtPmdldChyZWcsICZsYmFzZSwgJmxzaXplLCAmbHR5cGUpOworCWlmIChsc2l6ZSA8IDEpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibXRycjogTVRSUiAlZCBub3QgdXNlZFxuIiwgcmVnKTsKKwkJZ290byBvdXQ7CisJfQorCWlmICh1c2FnZV90YWJsZVtyZWddIDwgMSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtdHJyOiByZWc6ICVkIGhhcyBjb3VudD0wXG4iLCByZWcpOworCQlnb3RvIG91dDsKKwl9CisJaWYgKC0tdXNhZ2VfdGFibGVbcmVnXSA8IDEpCisJCXNldF9tdHJyKHJlZywgMCwgMCwgMCk7CisJZXJyb3IgPSByZWc7Cisgb3V0OgorCXVwKCZtYWluX2xvY2spOworCXJldHVybiBlcnJvcjsKK30KKy8qKgorICoJbXRycl9kZWwgLSBkZWxldGUgYSBtZW1vcnkgdHlwZSByZWdpb24KKyAqCUByZWc6IFJlZ2lzdGVyIHJldHVybmVkIGJ5IG10cnJfYWRkCisgKglAYmFzZTogUGh5c2ljYWwgYmFzZSBhZGRyZXNzCisgKglAc2l6ZTogU2l6ZSBvZiByZWdpb24KKyAqCisgKglJZiByZWdpc3RlciBpcyBzdXBwbGllZCB0aGVuIGJhc2UgYW5kIHNpemUgYXJlIGlnbm9yZWQuIFRoaXMgaXMKKyAqCWhvdyBkcml2ZXJzIHNob3VsZCBjYWxsIGl0LgorICoKKyAqCVJlbGVhc2VzIGFuIE1UUlIgcmVnaW9uLiBJZiB0aGUgdXNhZ2UgY291bnQgZHJvcHMgdG8gemVybyB0aGUgCisgKglyZWdpc3RlciBpcyBmcmVlZCBhbmQgdGhlIHJlZ2lvbiByZXR1cm5zIHRvIGRlZmF1bHQgc3RhdGUuCisgKglPbiBzdWNjZXNzIHRoZSByZWdpc3RlciBpcyByZXR1cm5lZCwgb24gZmFpbHVyZSBhIG5lZ2F0aXZlIGVycm9yCisgKgljb2RlLgorICovCisKK2ludAorbXRycl9kZWwoaW50IHJlZywgdW5zaWduZWQgbG9uZyBiYXNlLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaWYgKChiYXNlICYgKFBBR0VfU0laRSAtIDEpKSB8fCAoc2l6ZSAmIChQQUdFX1NJWkUgLSAxKSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAibXRycjogc2l6ZSBhbmQgYmFzZSBtdXN0IGJlIG11bHRpcGxlcyBvZiA0IGtpQlxuIik7CisJCXByaW50ayhLRVJOX0RFQlVHICJtdHJyOiBzaXplOiAweCVseCAgYmFzZTogMHglbHhcbiIsIHNpemUsIGJhc2UpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIG10cnJfZGVsX3BhZ2UocmVnLCBiYXNlID4+IFBBR0VfU0hJRlQsIHNpemUgPj4gUEFHRV9TSElGVCk7Cit9CisKK0VYUE9SVF9TWU1CT0wobXRycl9hZGQpOworRVhQT1JUX1NZTUJPTChtdHJyX2RlbCk7CisKKy8qIEhBQ0sgQUxFUlQhCisgKiBUaGVzZSBzaG91bGQgYmUgY2FsbGVkIGltcGxpY2l0bHksIGJ1dCB3ZSBjYW4ndCB5ZXQgdW50aWwgYWxsIHRoZSBpbml0Y2FsbAorICogc3R1ZmYgaXMgZG9uZS4uLgorICovCitleHRlcm4gdm9pZCBhbWRfaW5pdF9tdHJyKHZvaWQpOworZXh0ZXJuIHZvaWQgY3lyaXhfaW5pdF9tdHJyKHZvaWQpOworZXh0ZXJuIHZvaWQgY2VudGF1cl9pbml0X210cnIodm9pZCk7CisKK3N0YXRpYyB2b2lkIF9faW5pdCBpbml0X2lmcyh2b2lkKQoreworCWFtZF9pbml0X210cnIoKTsKKwljeXJpeF9pbml0X210cnIoKTsKKwljZW50YXVyX2luaXRfbXRycigpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9vdGhlcl9jcHVzKHZvaWQpCit7CisJaWYgKHVzZV9pbnRlbCgpKQorCQlnZXRfbXRycl9zdGF0ZSgpOworCisJLyogYnJpbmcgdXAgdGhlIG90aGVyIHByb2Nlc3NvcnMgKi8KKwlzZXRfbXRycih+MFUsMCwwLDApOworCisJaWYgKHVzZV9pbnRlbCgpKSB7CisJCWZpbmFsaXplX210cnJfc3RhdGUoKTsKKwkJbXRycl9zdGF0ZV93YXJuKCk7CisJfQorfQorCisKK3N0cnVjdCBtdHJyX3ZhbHVlIHsKKwltdHJyX3R5cGUJbHR5cGU7CisJdW5zaWduZWQgbG9uZwlsYmFzZTsKKwl1bnNpZ25lZCBpbnQJbHNpemU7Cit9OworCitzdGF0aWMgc3RydWN0IG10cnJfdmFsdWUgKiBtdHJyX3N0YXRlOworCitzdGF0aWMgaW50IG10cnJfc2F2ZShzdHJ1Y3Qgc3lzX2RldmljZSAqIHN5c2RldiwgdTMyIHN0YXRlKQoreworCWludCBpOworCWludCBzaXplID0gbnVtX3Zhcl9yYW5nZXMgKiBzaXplb2Yoc3RydWN0IG10cnJfdmFsdWUpOworCisJbXRycl9zdGF0ZSA9IGttYWxsb2Moc2l6ZSxHRlBfQVRPTUlDKTsKKwlpZiAobXRycl9zdGF0ZSkKKwkJbWVtc2V0KG10cnJfc3RhdGUsMCxzaXplKTsKKwllbHNlCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IG51bV92YXJfcmFuZ2VzOyBpKyspIHsKKwkJbXRycl9pZi0+Z2V0KGksCisJCQkgICAgICZtdHJyX3N0YXRlW2ldLmxiYXNlLAorCQkJICAgICAmbXRycl9zdGF0ZVtpXS5sc2l6ZSwKKwkJCSAgICAgJm10cnJfc3RhdGVbaV0ubHR5cGUpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdHJyX3Jlc3RvcmUoc3RydWN0IHN5c19kZXZpY2UgKiBzeXNkZXYpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3Zhcl9yYW5nZXM7IGkrKykgeworCQlpZiAobXRycl9zdGF0ZVtpXS5sc2l6ZSkgCisJCQlzZXRfbXRycihpLAorCQkJCSBtdHJyX3N0YXRlW2ldLmxiYXNlLAorCQkJCSBtdHJyX3N0YXRlW2ldLmxzaXplLAorCQkJCSBtdHJyX3N0YXRlW2ldLmx0eXBlKTsKKwl9CisJa2ZyZWUobXRycl9zdGF0ZSk7CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgc3RydWN0IHN5c2Rldl9kcml2ZXIgbXRycl9zeXNkZXZfZHJpdmVyID0geworCS5zdXNwZW5kCT0gbXRycl9zYXZlLAorCS5yZXN1bWUJCT0gbXRycl9yZXN0b3JlLAorfTsKKworCisvKioKKyAqIG10cnJfaW5pdCAtIGluaXRpYWxpemUgbXRycnMgb24gdGhlIGJvb3QgQ1BVCisgKgorICogVGhpcyBuZWVkcyB0byBiZSBjYWxsZWQgZWFybHk7IGJlZm9yZSBhbnkgb2YgdGhlIG90aGVyIENQVXMgYXJlIAorICogaW5pdGlhbGl6ZWQgKGkuZS4gYmVmb3JlIHNtcF9pbml0KCkpLgorICogCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IG10cnJfaW5pdCh2b2lkKQoreworCWluaXRfaWZzKCk7CisKKwlpZiAoY3B1X2hhc19tdHJyKSB7CisJCW10cnJfaWYgPSAmZ2VuZXJpY19tdHJyX29wczsKKwkJc2l6ZV9vcl9tYXNrID0gMHhmZjAwMDAwMDsJLyogMzYgYml0cyAqLworCQlzaXplX2FuZF9tYXNrID0gMHgwMGYwMDAwMDsKKwkJCQorCQlzd2l0Y2ggKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvcikgeworCQljYXNlIFg4Nl9WRU5ET1JfQU1EOgorCQkJLyogVGhlIG9yaWdpbmFsIEF0aGxvbiBkb2NzIHNhaWQgdGhhdAorCQkJICAgdG90YWwgYWRkcmVzc2FibGUgbWVtb3J5IGlzIDQ0IGJpdHMgd2lkZS4KKwkJCSAgIEl0IHdhcyBub3QgcmVhbGx5IGNsZWFyIHdoZXRoZXIgaXRzIE1UUlJzCisJCQkgICBmb2xsb3cgdGhpcyBvciBub3QuIChSZWFkOiA0NCBvciAzNiBiaXRzKS4KKwkJCSAgIEhvd2V2ZXIsICJ4ODYtNjRfb3ZlcnZpZXcucGRmIiBleHBsaWNpdGx5CisJCQkgICBzdGF0ZXMgdGhhdCAicHJldmlvdXMgaW1wbGVtZW50YXRpb25zIHN1cHBvcnQKKwkJCSAgIDM2IGJpdCBNVFJScyIgYW5kIGFsc28gcHJvdmlkZXMgYSB3YXkgdG8KKwkJCSAgIHF1ZXJ5IHRoZSB3aWR0aCAoaW4gYml0cykgb2YgdGhlIHBoeXNpY2FsCisJCQkgICBhZGRyZXNzYWJsZSBtZW1vcnkgb24gdGhlIEhhbW1lciBmYW1pbHkuCisJCQkgKi8KKwkJCWlmIChib290X2NwdV9kYXRhLng4NiA9PSAxNQorCQkJICAgICYmIChjcHVpZF9lYXgoMHg4MDAwMDAwMCkgPj0gMHg4MDAwMDAwOCkpIHsKKwkJCQl1MzIgcGh5c19hZGRyOworCQkJCXBoeXNfYWRkciA9IGNwdWlkX2VheCgweDgwMDAwMDA4KSAmIDB4ZmY7CisJCQkJc2l6ZV9vcl9tYXNrID0KKwkJCQkgICAgfigoMSA8PCAocGh5c19hZGRyIC0gUEFHRV9TSElGVCkpIC0gMSk7CisJCQkJc2l6ZV9hbmRfbWFzayA9IH5zaXplX29yX21hc2sgJiAweGZmZjAwMDAwOworCQkJfQorCQkJLyogQXRobG9uIE1UUlJzIHVzZSBhbiBJbnRlbC1jb21wYXRpYmxlIGludGVyZmFjZSBmb3IgCisJCQkgKiBnZXR0aW5nIGFuZCBzZXR0aW5nICovCisJCQlicmVhazsKKwkJY2FzZSBYODZfVkVORE9SX0NFTlRBVVI6CisJCQlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPT0gNikgeworCQkJCS8qIFZJQSBDeXJpeCBmYW1pbHkgaGF2ZSBJbnRlbCBzdHlsZSBNVFJScywgYnV0IGRvbid0IHN1cHBvcnQgUEFFICovCisJCQkJc2l6ZV9vcl9tYXNrID0gMHhmZmYwMDAwMDsJLyogMzIgYml0cyAqLworCQkJCXNpemVfYW5kX21hc2sgPSAwOworCQkJfQorCQkJYnJlYWs7CisJCQorCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlzd2l0Y2ggKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvcikgeworCQljYXNlIFg4Nl9WRU5ET1JfQU1EOgorCQkJaWYgKGNwdV9oYXNfazZfbXRycikgeworCQkJCS8qIFByZS1BdGhsb24gKEs2KSBBTUQgQ1BVIE1UUlJzICovCisJCQkJbXRycl9pZiA9IG10cnJfb3BzW1g4Nl9WRU5ET1JfQU1EXTsKKwkJCQlzaXplX29yX21hc2sgPSAweGZmZjAwMDAwOwkvKiAzMiBiaXRzICovCisJCQkJc2l6ZV9hbmRfbWFzayA9IDA7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBYODZfVkVORE9SX0NFTlRBVVI6CisJCQlpZiAoY3B1X2hhc19jZW50YXVyX21jcikgeworCQkJCW10cnJfaWYgPSBtdHJyX29wc1tYODZfVkVORE9SX0NFTlRBVVJdOworCQkJCXNpemVfb3JfbWFzayA9IDB4ZmZmMDAwMDA7CS8qIDMyIGJpdHMgKi8KKwkJCQlzaXplX2FuZF9tYXNrID0gMDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFg4Nl9WRU5ET1JfQ1lSSVg6CisJCQlpZiAoY3B1X2hhc19jeXJpeF9hcnIpIHsKKwkJCQltdHJyX2lmID0gbXRycl9vcHNbWDg2X1ZFTkRPUl9DWVJJWF07CisJCQkJc2l6ZV9vcl9tYXNrID0gMHhmZmYwMDAwMDsJLyogMzIgYml0cyAqLworCQkJCXNpemVfYW5kX21hc2sgPSAwOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKwlwcmludGsoS0VSTl9JTkZPICJtdHJyOiB2JXNcbiIsTVRSUl9WRVJTSU9OKTsKKworCWlmIChtdHJyX2lmKSB7CisJCXNldF9udW1fdmFyX3JhbmdlcygpOworCQlpbml0X3RhYmxlKCk7CisJCWluaXRfb3RoZXJfY3B1cygpOworCisJCXJldHVybiBzeXNkZXZfZHJpdmVyX3JlZ2lzdGVyKCZjcHVfc3lzZGV2X2NsYXNzLAorCQkJCQkgICAgICAmbXRycl9zeXNkZXZfZHJpdmVyKTsKKwl9CisJcmV0dXJuIC1FTlhJTzsKK30KKworc3Vic3lzX2luaXRjYWxsKG10cnJfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL210cnIuaCBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvbXRyci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMTM1MTI0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9tdHJyLmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIGxvY2FsIG10cnIgZGVmaW5lcy4KKyAqLworCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRSAgMQorI2RlZmluZSBGQUxTRSAwCisjZW5kaWYKKworI2RlZmluZSBNVFJSY2FwX01TUiAgICAgMHgwZmUKKyNkZWZpbmUgTVRSUmRlZlR5cGVfTVNSIDB4MmZmCisKKyNkZWZpbmUgTVRSUnBoeXNCYXNlX01TUihyZWcpICgweDIwMCArIDIgKiAocmVnKSkKKyNkZWZpbmUgTVRSUnBoeXNNYXNrX01TUihyZWcpICgweDIwMCArIDIgKiAocmVnKSArIDEpCisKKyNkZWZpbmUgTlVNX0ZJWEVEX1JBTkdFUyA4OAorI2RlZmluZSBNVFJSZml4NjRLXzAwMDAwX01TUiAweDI1MAorI2RlZmluZSBNVFJSZml4MTZLXzgwMDAwX01TUiAweDI1OAorI2RlZmluZSBNVFJSZml4MTZLX0EwMDAwX01TUiAweDI1OQorI2RlZmluZSBNVFJSZml4NEtfQzAwMDBfTVNSIDB4MjY4CisjZGVmaW5lIE1UUlJmaXg0S19DODAwMF9NU1IgMHgyNjkKKyNkZWZpbmUgTVRSUmZpeDRLX0QwMDAwX01TUiAweDI2YQorI2RlZmluZSBNVFJSZml4NEtfRDgwMDBfTVNSIDB4MjZiCisjZGVmaW5lIE1UUlJmaXg0S19FMDAwMF9NU1IgMHgyNmMKKyNkZWZpbmUgTVRSUmZpeDRLX0U4MDAwX01TUiAweDI2ZAorI2RlZmluZSBNVFJSZml4NEtfRjAwMDBfTVNSIDB4MjZlCisjZGVmaW5lIE1UUlJmaXg0S19GODAwMF9NU1IgMHgyNmYKKworI2RlZmluZSBNVFJSX0NIQU5HRV9NQVNLX0ZJWEVEICAgICAweDAxCisjZGVmaW5lIE1UUlJfQ0hBTkdFX01BU0tfVkFSSUFCTEUgIDB4MDIKKyNkZWZpbmUgTVRSUl9DSEFOR0VfTUFTS19ERUZUWVBFICAgMHgwNAorCisvKiBJbiB0aGUgSW50ZWwgcHJvY2Vzc29yJ3MgTVRSUiBpbnRlcmZhY2UsIHRoZSBNVFJSIHR5cGUgaXMgYWx3YXlzIGhlbGQgaW4KKyAgIGFuIDggYml0IGZpZWxkOiAqLwordHlwZWRlZiB1OCBtdHJyX3R5cGU7CisKK3N0cnVjdCBtdHJyX29wcyB7CisJdTMyCXZlbmRvcjsKKwl1MzIJdXNlX2ludGVsX2lmOworLy8Jdm9pZAkoKmluaXQpKHZvaWQpOworCXZvaWQJKCpzZXQpKHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGxvbmcgYmFzZSwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgbXRycl90eXBlIHR5cGUpOworCXZvaWQJKCpzZXRfYWxsKSh2b2lkKTsKKworCXZvaWQJKCpnZXQpKHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGxvbmcgKmJhc2UsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgKnNpemUsIG10cnJfdHlwZSAqIHR5cGUpOworCWludAkoKmdldF9mcmVlX3JlZ2lvbikgKHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyBzaXplKTsKKworCWludAkoKnZhbGlkYXRlX2FkZF9wYWdlKSh1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCQkgICAgIHVuc2lnbmVkIGludCB0eXBlKTsKKwlpbnQJKCpoYXZlX3dyY29tYikodm9pZCk7Cit9OworCitleHRlcm4gaW50IGdlbmVyaWNfZ2V0X2ZyZWVfcmVnaW9uKHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyBzaXplKTsKK2V4dGVybiBpbnQgZ2VuZXJpY192YWxpZGF0ZV9hZGRfcGFnZSh1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCQkgICAgIHVuc2lnbmVkIGludCB0eXBlKTsKKworZXh0ZXJuIHN0cnVjdCBtdHJyX29wcyBnZW5lcmljX210cnJfb3BzOworCitleHRlcm4gaW50IHBvc2l0aXZlX2hhdmVfd3Jjb21iKHZvaWQpOworCisvKiBsaWJyYXJ5IGZ1bmN0aW9ucyBmb3IgcHJvY2Vzc29yLXNwZWNpZmljIHJvdXRpbmVzICovCitzdHJ1Y3Qgc2V0X210cnJfY29udGV4dCB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIGRlZnR5cGVfbG87CisJdW5zaWduZWQgbG9uZyBkZWZ0eXBlX2hpOworCXVuc2lnbmVkIGxvbmcgY3I0dmFsOworCXVuc2lnbmVkIGxvbmcgY2NyMzsKK307CisKK3N0cnVjdCBtdHJyX3Zhcl9yYW5nZSB7CisJdW5zaWduZWQgbG9uZyBiYXNlX2xvOworCXVuc2lnbmVkIGxvbmcgYmFzZV9oaTsKKwl1bnNpZ25lZCBsb25nIG1hc2tfbG87CisJdW5zaWduZWQgbG9uZyBtYXNrX2hpOworfTsKKwordm9pZCBzZXRfbXRycl9kb25lKHN0cnVjdCBzZXRfbXRycl9jb250ZXh0ICpjdHh0KTsKK3ZvaWQgc2V0X210cnJfY2FjaGVfZGlzYWJsZShzdHJ1Y3Qgc2V0X210cnJfY29udGV4dCAqY3R4dCk7Cit2b2lkIHNldF9tdHJyX3ByZXBhcmVfc2F2ZShzdHJ1Y3Qgc2V0X210cnJfY29udGV4dCAqY3R4dCk7CisKK3ZvaWQgZ2V0X210cnJfc3RhdGUodm9pZCk7CisKK2V4dGVybiB2b2lkIHNldF9tdHJyX29wcyhzdHJ1Y3QgbXRycl9vcHMgKiBvcHMpOworCitleHRlcm4gdTMyIHNpemVfb3JfbWFzaywgc2l6ZV9hbmRfbWFzazsKK2V4dGVybiBzdHJ1Y3QgbXRycl9vcHMgKiBtdHJyX2lmOworCisjZGVmaW5lIGlzX2NwdSh2bmQpCShtdHJyX2lmICYmIG10cnJfaWYtPnZlbmRvciA9PSBYODZfVkVORE9SXyMjdm5kKQorI2RlZmluZSB1c2VfaW50ZWwoKQkobXRycl9pZiAmJiBtdHJyX2lmLT51c2VfaW50ZWxfaWYgPT0gMSkKKworZXh0ZXJuIHVuc2lnbmVkIGludCBudW1fdmFyX3JhbmdlczsKKwordm9pZCBmaW5hbGl6ZV9tdHJyX3N0YXRlKHZvaWQpOwordm9pZCBtdHJyX3N0YXRlX3dhcm4odm9pZCk7CitjaGFyICptdHJyX2F0dHJpYl90b19zdHIoaW50IHgpOwordm9pZCBtdHJyX3dybXNyKHVuc2lnbmVkLCB1bnNpZ25lZCwgdW5zaWduZWQpOworCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL3N0YXRlLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL3N0YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYyZWNkMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvc3RhdGUuYwpAQCAtMCwwICsxLDc4IEBACisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL210cnIuaD4KKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSAibXRyci5oIgorCisKKy8qICBQdXQgdGhlIHByb2Nlc3NvciBpbnRvIGEgc3RhdGUgd2hlcmUgTVRSUnMgY2FuIGJlIHNhZmVseSBzZXQgICovCit2b2lkIHNldF9tdHJyX3ByZXBhcmVfc2F2ZShzdHJ1Y3Qgc2V0X210cnJfY29udGV4dCAqY3R4dCkKK3sKKwl1bnNpZ25lZCBpbnQgY3IwOworCisJLyogIERpc2FibGUgaW50ZXJydXB0cyBsb2NhbGx5ICAqLworCWxvY2FsX2lycV9zYXZlKGN0eHQtPmZsYWdzKTsKKworCWlmICh1c2VfaW50ZWwoKSB8fCBpc19jcHUoQ1lSSVgpKSB7CisKKwkJLyogIFNhdmUgdmFsdWUgb2YgQ1I0IGFuZCBjbGVhciBQYWdlIEdsb2JhbCBFbmFibGUgKGJpdCA3KSAgKi8KKwkJaWYgKCBjcHVfaGFzX3BnZSApIHsKKwkJCWN0eHQtPmNyNHZhbCA9IHJlYWRfY3I0KCk7CisJCQl3cml0ZV9jcjQoY3R4dC0+Y3I0dmFsICYgKHVuc2lnbmVkIGNoYXIpIH4oMSA8PCA3KSk7CisJCX0KKworCQkvKiAgRGlzYWJsZSBhbmQgZmx1c2ggY2FjaGVzLiBOb3RlIHRoYXQgd2JpbnZkIGZsdXNoZXMgdGhlIFRMQnMgYXMKKwkJICAgIGEgc2lkZS1lZmZlY3QgICovCisJCWNyMCA9IHJlYWRfY3IwKCkgfCAweDQwMDAwMDAwOworCQl3YmludmQoKTsKKwkJd3JpdGVfY3IwKGNyMCk7CisJCXdiaW52ZCgpOworCisJCWlmICh1c2VfaW50ZWwoKSkKKwkJCS8qICBTYXZlIE1UUlIgc3RhdGUgKi8KKwkJCXJkbXNyKE1UUlJkZWZUeXBlX01TUiwgY3R4dC0+ZGVmdHlwZV9sbywgY3R4dC0+ZGVmdHlwZV9oaSk7CisJCWVsc2UKKwkJCS8qIEN5cml4IEFSUnMgLSBldmVyeXRoaW5nIGVsc2Ugd2VyZSBleGNsdWRlZCBhdCB0aGUgdG9wICovCisJCQljdHh0LT5jY3IzID0gZ2V0Q3g4NihDWDg2X0NDUjMpOworCX0KK30KKwordm9pZCBzZXRfbXRycl9jYWNoZV9kaXNhYmxlKHN0cnVjdCBzZXRfbXRycl9jb250ZXh0ICpjdHh0KQoreworCWlmICh1c2VfaW50ZWwoKSkgCisJCS8qICBEaXNhYmxlIE1UUlJzLCBhbmQgc2V0IHRoZSBkZWZhdWx0IHR5cGUgdG8gdW5jYWNoZWQgICovCisJCW10cnJfd3Jtc3IoTVRSUmRlZlR5cGVfTVNSLCBjdHh0LT5kZWZ0eXBlX2xvICYgMHhmMzAwVUwsCisJCSAgICAgIGN0eHQtPmRlZnR5cGVfaGkpOworCWVsc2UgaWYgKGlzX2NwdShDWVJJWCkpCisJCS8qIEN5cml4IEFSUnMgLSBldmVyeXRoaW5nIGVsc2Ugd2VyZSBleGNsdWRlZCBhdCB0aGUgdG9wICovCisJCXNldEN4ODYoQ1g4Nl9DQ1IzLCAoY3R4dC0+Y2NyMyAmIDB4MGYpIHwgMHgxMCk7Cit9CisKKy8qICBSZXN0b3JlIHRoZSBwcm9jZXNzb3IgYWZ0ZXIgYSBzZXRfbXRycl9wcmVwYXJlICAqLwordm9pZCBzZXRfbXRycl9kb25lKHN0cnVjdCBzZXRfbXRycl9jb250ZXh0ICpjdHh0KQoreworCWlmICh1c2VfaW50ZWwoKSB8fCBpc19jcHUoQ1lSSVgpKSB7CisKKwkJLyogIEZsdXNoIGNhY2hlcyBhbmQgVExCcyAgKi8KKwkJd2JpbnZkKCk7CisKKwkJLyogIFJlc3RvcmUgTVRSUmRlZlR5cGUgICovCisJCWlmICh1c2VfaW50ZWwoKSkKKwkJCS8qIEludGVsIChQNikgc3RhbmRhcmQgTVRSUnMgKi8KKwkJCW10cnJfd3Jtc3IoTVRSUmRlZlR5cGVfTVNSLCBjdHh0LT5kZWZ0eXBlX2xvLCBjdHh0LT5kZWZ0eXBlX2hpKTsKKwkJZWxzZQorCQkJLyogQ3lyaXggQVJScyAtIGV2ZXJ5dGhpbmcgZWxzZSB3YXMgZXhjbHVkZWQgYXQgdGhlIHRvcCAqLworCQkJc2V0Q3g4NihDWDg2X0NDUjMsIGN0eHQtPmNjcjMpOworCQkKKwkJLyogIEVuYWJsZSBjYWNoZXMgICovCisJCXdyaXRlX2NyMChyZWFkX2NyMCgpICYgMHhiZmZmZmZmZik7CisKKwkJLyogIFJlc3RvcmUgdmFsdWUgb2YgQ1I0ICAqLworCQlpZiAoIGNwdV9oYXNfcGdlICkKKwkJCXdyaXRlX2NyNChjdHh0LT5jcjR2YWwpOworCX0KKwkvKiAgUmUtZW5hYmxlIGludGVycnVwdHMgbG9jYWxseSAoaWYgZW5hYmxlZCBwcmV2aW91c2x5KSAgKi8KKwlsb2NhbF9pcnFfcmVzdG9yZShjdHh0LT5mbGFncyk7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L25leGdlbi5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbmV4Z2VuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA4OThhMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L25leGdlbi5jCkBAIC0wLDAgKzEsNjMgQEAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorCisjaW5jbHVkZSAiY3B1LmgiCisKKy8qCisgKglEZXRlY3QgYSBOZXhHZW4gQ1BVIHJ1bm5pbmcgd2l0aG91dCBCSU9TIGh5cGVyY29kZSBuZXcgZW5vdWdoCisgKgl0byBoYXZlIENQVUlELiAoVGhhbmtzIHRvIEhlcmJlcnQgT3BwbWFubikKKyAqLworIAorc3RhdGljIGludCBfX2luaXQgZGVlcF9tYWdpY19uZXhnZW5fcHJvYmUodm9pZCkKK3sKKwlpbnQgcmV0OworCQorCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJIgltb3Z3CSQweDU1NTUsICUlYXhcbiIKKwkJIgl4b3J3CSUlZHgsJSVkeFxuIgorCQkiCW1vdncJJDIsICUlY3hcbiIKKwkJIglkaXZ3CSUlY3hcbiIKKwkJIgltb3ZsCSQwLCAlJWVheFxuIgorCQkiCWpuegkxZlxuIgorCQkiCW1vdmwJJDEsICUlZWF4XG4iCisJCSIxOlxuIiAKKwkJOiAiPWEiIChyZXQpIDogOiAiY3giLCAiZHgiICk7CisJcmV0dXJuICByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBpbml0X25leGdlbihzdHJ1Y3QgY3B1aW5mb194ODYgKiBjKQoreworCWMtPng4Nl9jYWNoZV9zaXplID0gMjU2OyAvKiBBIGZldyBoYWQgMSBNQi4uLiAqLworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgbmV4Z2VuX2lkZW50aWZ5KHN0cnVjdCBjcHVpbmZvX3g4NiAqIGMpCit7CisJLyogRGV0ZWN0IE5leEdlbiB3aXRoIG9sZCBoeXBlcmNvZGUgKi8KKwlpZiAoIGRlZXBfbWFnaWNfbmV4Z2VuX3Byb2JlKCkgKSB7CisJCXN0cmNweShjLT54ODZfdmVuZG9yX2lkLCAiTmV4R2VuRHJpdmVuIik7CisJfQorCWdlbmVyaWNfaWRlbnRpZnkoYyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3B1X2RldiBuZXhnZW5fY3B1X2RldiBfX2luaXRkYXRhID0geworCS5jX3ZlbmRvcgk9ICJOZXhnZW4iLAorCS5jX2lkZW50CT0geyAiTmV4R2VuRHJpdmVuIiB9LAorCS5jX21vZGVscyA9IHsKKwkJCXsgLnZlbmRvciA9IFg4Nl9WRU5ET1JfTkVYR0VOLAorCQkJICAuZmFtaWx5ID0gNSwKKwkJCSAgLm1vZGVsX25hbWVzID0geyBbMV0gPSAiTng1ODYiIH0KKwkJCX0sCisJfSwKKwkuY19pbml0CQk9IGluaXRfbmV4Z2VuLAorCS5jX2lkZW50aWZ5CT0gbmV4Z2VuX2lkZW50aWZ5LAorfTsKKworaW50IF9faW5pdCBuZXhnZW5faW5pdF9jcHUodm9pZCkKK3sKKwljcHVfZGV2c1tYODZfVkVORE9SX05FWEdFTl0gPSAmbmV4Z2VuX2NwdV9kZXY7CisJcmV0dXJuIDA7Cit9CisKKy8vZWFybHlfYXJjaF9pbml0Y2FsbChuZXhnZW5faW5pdF9jcHUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvcHJvYy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvcHJvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZDgzZmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9wcm9jLmMKQEAgLTAsMCArMSwxNDkgQEAKKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1leC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorCisvKgorICoJR2V0IENQVSBpbmZvcm1hdGlvbiBmb3IgdXNlIGJ5IHRoZSBwcm9jZnMuCisgKi8KK3N0YXRpYyBpbnQgc2hvd19jcHVpbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwkvKiAKKwkgKiBUaGVzZSBmbGFnIGJpdHMgbXVzdCBtYXRjaCB0aGUgZGVmaW5pdGlvbnMgaW4gPGFzbS9jcHVmZWF0dXJlLmg+LgorCSAqIE5VTEwgbWVhbnMgdGhpcyBiaXQgaXMgdW5kZWZpbmVkIG9yIHJlc2VydmVkOyBlaXRoZXIgd2F5IGl0IGRvZXNuJ3QKKwkgKiBoYXZlIG1lYW5pbmcgYXMgZmFyIGFzIExpbnV4IGlzIGNvbmNlcm5lZC4gIE5vdGUgdGhhdCBpdCdzIGltcG9ydGFudAorCSAqIHRvIHJlYWxpemUgdGhlcmUgaXMgYSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyB0YWJsZSBhbmQgQ1BVSUQgLS0gaWYKKwkgKiBhcHBsaWNhdGlvbnMgd2FudCB0byBnZXQgdGhlIHJhdyBDUFVJRCBkYXRhLCB0aGV5IHNob3VsZCBhY2Nlc3MKKwkgKiAvZGV2L2NwdS88Y3B1X25yPi9jcHVpZCBpbnN0ZWFkLgorCSAqLworCXN0YXRpYyBjaGFyICp4ODZfY2FwX2ZsYWdzW10gPSB7CisJCS8qIEludGVsLWRlZmluZWQgKi8KKwkgICAgICAgICJmcHUiLCAidm1lIiwgImRlIiwgInBzZSIsICJ0c2MiLCAibXNyIiwgInBhZSIsICJtY2UiLAorCSAgICAgICAgImN4OCIsICJhcGljIiwgTlVMTCwgInNlcCIsICJtdHJyIiwgInBnZSIsICJtY2EiLCAiY21vdiIsCisJICAgICAgICAicGF0IiwgInBzZTM2IiwgInBuIiwgImNsZmx1c2giLCBOVUxMLCAiZHRzIiwgImFjcGkiLCAibW14IiwKKwkgICAgICAgICJmeHNyIiwgInNzZSIsICJzc2UyIiwgInNzIiwgImh0IiwgInRtIiwgImlhNjQiLCAicGJlIiwKKworCQkvKiBBTUQtZGVmaW5lZCAqLworCQkicG5pIiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgInN5c2NhbGwiLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorCQlOVUxMLCBOVUxMLCBOVUxMLCAibXAiLCAibngiLCBOVUxMLCAibW14ZXh0IiwgTlVMTCwKKwkJTlVMTCwgImZ4c3Jfb3B0IiwgTlVMTCwgTlVMTCwgTlVMTCwgImxtIiwgIjNkbm93ZXh0IiwgIjNkbm93IiwKKworCQkvKiBUcmFuc21ldGEtZGVmaW5lZCAqLworCQkicmVjb3ZlcnkiLCAibG9uZ3J1biIsIE5VTEwsICJscnRpIiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKworCQkvKiBPdGhlciAoTGludXgtZGVmaW5lZCkgKi8KKwkJImN4bW14IiwgIms2X210cnIiLCAiY3lyaXhfYXJyIiwgImNlbnRhdXJfbWNyIiwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKworCQkvKiBJbnRlbC1kZWZpbmVkICgjMikgKi8KKwkJInBuaSIsIE5VTEwsIE5VTEwsICJtb25pdG9yIiwgImRzX2NwbCIsIE5VTEwsIE5VTEwsICJlc3QiLAorCQkidG0yIiwgTlVMTCwgImNpZCIsIE5VTEwsIE5VTEwsICJjeDE2IiwgInh0cHIiLCBOVUxMLAorCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorCisJCS8qIFZJQS9DeXJpeC9DZW50YXVyLWRlZmluZWQgKi8KKwkJTlVMTCwgTlVMTCwgInJuZyIsICJybmdfZW4iLCBOVUxMLCBOVUxMLCAiYWNlIiwgImFjZV9lbiIsCisJCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisJCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisJCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisKKwkJLyogQU1ELWRlZmluZWQgKCMyKSAqLworCQkibGFoZl9sbSIsICJjbXBfbGVnYWN5IiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwl9OworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9IHY7CisJaW50IGksIG4gPSBjIC0gY3B1X2RhdGE7CisJaW50IGZwdV9leGNlcHRpb247CisKKyNpZmRlZiBDT05GSUdfU01QCisJaWYgKCFjcHVfb25saW5lKG4pKQorCQlyZXR1cm4gMDsKKyNlbmRpZgorCXNlcV9wcmludGYobSwgInByb2Nlc3Nvclx0OiAlZFxuIgorCQkidmVuZG9yX2lkXHQ6ICVzXG4iCisJCSJjcHUgZmFtaWx5XHQ6ICVkXG4iCisJCSJtb2RlbFx0XHQ6ICVkXG4iCisJCSJtb2RlbCBuYW1lXHQ6ICVzXG4iLAorCQluLAorCQljLT54ODZfdmVuZG9yX2lkWzBdID8gYy0+eDg2X3ZlbmRvcl9pZCA6ICJ1bmtub3duIiwKKwkJYy0+eDg2LAorCQljLT54ODZfbW9kZWwsCisJCWMtPng4Nl9tb2RlbF9pZFswXSA/IGMtPng4Nl9tb2RlbF9pZCA6ICJ1bmtub3duIik7CisKKwlpZiAoYy0+eDg2X21hc2sgfHwgYy0+Y3B1aWRfbGV2ZWwgPj0gMCkKKwkJc2VxX3ByaW50ZihtLCAic3RlcHBpbmdcdDogJWRcbiIsIGMtPng4Nl9tYXNrKTsKKwllbHNlCisJCXNlcV9wcmludGYobSwgInN0ZXBwaW5nXHQ6IHVua25vd25cbiIpOworCisJaWYgKCBjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX1RTQykgKSB7CisJCXNlcV9wcmludGYobSwgImNwdSBNSHpcdFx0OiAlbHUuJTAzbHVcbiIsCisJCQljcHVfa2h6IC8gMTAwMCwgKGNwdV9raHogJSAxMDAwKSk7CisJfQorCisJLyogQ2FjaGUgc2l6ZSAqLworCWlmIChjLT54ODZfY2FjaGVfc2l6ZSA+PSAwKQorCQlzZXFfcHJpbnRmKG0sICJjYWNoZSBzaXplXHQ6ICVkIEtCXG4iLCBjLT54ODZfY2FjaGVfc2l6ZSk7CisjaWZkZWYgQ09ORklHX1g4Nl9IVAorCXNlcV9wcmludGYobSwgInBoeXNpY2FsIGlkXHQ6ICVkXG4iLCBwaHlzX3Byb2NfaWRbbl0pOworCXNlcV9wcmludGYobSwgInNpYmxpbmdzXHQ6ICVkXG4iLCBjLT54ODZfbnVtX2NvcmVzICogc21wX251bV9zaWJsaW5ncyk7CisjZW5kaWYKKwkKKwkvKiBXZSB1c2UgZXhjZXB0aW9uIDE2IGlmIHdlIGhhdmUgaGFyZHdhcmUgbWF0aCBhbmQgd2UndmUgZWl0aGVyIHNlZW4gaXQgb3IgdGhlIENQVSBjbGFpbXMgaXQgaXMgaW50ZXJuYWwgKi8KKwlmcHVfZXhjZXB0aW9uID0gYy0+aGFyZF9tYXRoICYmIChpZ25vcmVfZnB1X2lycSB8fCBjcHVfaGFzX2ZwdSk7CisJc2VxX3ByaW50ZihtLCAiZmRpdl9idWdcdDogJXNcbiIKKwkJCSJobHRfYnVnXHRcdDogJXNcbiIKKwkJCSJmMDBmX2J1Z1x0OiAlc1xuIgorCQkJImNvbWFfYnVnXHQ6ICVzXG4iCisJCQkiZnB1XHRcdDogJXNcbiIKKwkJCSJmcHVfZXhjZXB0aW9uXHQ6ICVzXG4iCisJCQkiY3B1aWQgbGV2ZWxcdDogJWRcbiIKKwkJCSJ3cFx0XHQ6ICVzXG4iCisJCQkiZmxhZ3NcdFx0OiIsCisJCSAgICAgYy0+ZmRpdl9idWcgPyAieWVzIiA6ICJubyIsCisJCSAgICAgYy0+aGx0X3dvcmtzX29rID8gIm5vIiA6ICJ5ZXMiLAorCQkgICAgIGMtPmYwMGZfYnVnID8gInllcyIgOiAibm8iLAorCQkgICAgIGMtPmNvbWFfYnVnID8gInllcyIgOiAibm8iLAorCQkgICAgIGMtPmhhcmRfbWF0aCA/ICJ5ZXMiIDogIm5vIiwKKwkJICAgICBmcHVfZXhjZXB0aW9uID8gInllcyIgOiAibm8iLAorCQkgICAgIGMtPmNwdWlkX2xldmVsLAorCQkgICAgIGMtPndwX3dvcmtzX29rID8gInllcyIgOiAibm8iKTsKKworCWZvciAoIGkgPSAwIDsgaSA8IDMyKk5DQVBJTlRTIDsgaSsrICkKKwkJaWYgKCB0ZXN0X2JpdChpLCBjLT54ODZfY2FwYWJpbGl0eSkgJiYKKwkJICAgICB4ODZfY2FwX2ZsYWdzW2ldICE9IE5VTEwgKQorCQkJc2VxX3ByaW50ZihtLCAiICVzIiwgeDg2X2NhcF9mbGFnc1tpXSk7CisKKwlzZXFfcHJpbnRmKG0sICJcbmJvZ29taXBzXHQ6ICVsdS4lMDJsdVxuXG4iLAorCQkgICAgIGMtPmxvb3BzX3Blcl9qaWZmeS8oNTAwMDAwL0haKSwKKwkJICAgICAoYy0+bG9vcHNfcGVyX2ppZmZ5Lyg1MDAwL0haKSkgJSAxMDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCAqY19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqcG9zKQoreworCXJldHVybiAqcG9zIDwgTlJfQ1BVUyA/IGNwdV9kYXRhICsgKnBvcyA6IE5VTEw7Cit9CitzdGF0aWMgdm9pZCAqY19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJKysqcG9zOworCXJldHVybiBjX3N0YXJ0KG0sIHBvcyk7Cit9CitzdGF0aWMgdm9pZCBjX3N0b3Aoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworfQorc3RydWN0IHNlcV9vcGVyYXRpb25zIGNwdWluZm9fb3AgPSB7CisJLnN0YXJ0CT0gY19zdGFydCwKKwkubmV4dAk9IGNfbmV4dCwKKwkuc3RvcAk9IGNfc3RvcCwKKwkuc2hvdwk9IHNob3dfY3B1aW5mbywKK307CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9yaXNlLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9yaXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYwMjQyNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L3Jpc2UuYwpAQCAtMCwwICsxLDUzIEBACisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworI2luY2x1ZGUgImNwdS5oIgorCitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9yaXNlKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKKwlwcmludGsoIkNQVTogUmlzZSBpRHJhZ29uIik7CisJaWYgKGMtPng4Nl9tb2RlbCA+IDIpCisJCXByaW50aygiIElJIik7CisJcHJpbnRrKCJcbiIpOworCisJLyogVW5oaWRlIHBvc3NpYmx5IGhpZGRlbiBjYXBhYmlsaXR5IGZsYWdzCisJICAgVGhlIG1wNiBpRHJhZ29uIGZhbWlseSBkb24ndCBoYXZlIE1TUnMuCisJICAgV2Ugc3dpdGNoIG9uIGV4dHJhIGZlYXR1cmVzIHdpdGggdGhpcyBjcHVpZCB3ZWlyZG5lc3M6ICovCisJX19hc21fXyAoCisJCSJtb3ZsICQweDYzNjM0NTJhLCAlJWVheFxuXHQiCisJCSJtb3ZsICQweDMyMzEyMDZjLCAlJWVjeFxuXHQiCisJCSJtb3ZsICQweDJhMzIzMTNhLCAlJWVkeFxuXHQiCisJCSJjcHVpZFxuXHQiCisJCSJtb3ZsICQweDYzNjM0NTIzLCAlJWVheFxuXHQiCisJCSJtb3ZsICQweDMyMzE1ZjZjLCAlJWVjeFxuXHQiCisJCSJtb3ZsICQweDIzMzMzMTNhLCAlJWVkeFxuXHQiCisJCSJjcHVpZFxuXHQiIDogOiA6ICJlYXgiLCAiZWJ4IiwgImVjeCIsICJlZHgiCisJKTsKKwlzZXRfYml0KFg4Nl9GRUFUVVJFX0NYOCwgYy0+eDg2X2NhcGFiaWxpdHkpOworfQorCitzdGF0aWMgc3RydWN0IGNwdV9kZXYgcmlzZV9jcHVfZGV2IF9faW5pdGRhdGEgPSB7CisJLmNfdmVuZG9yCT0gIlJpc2UiLAorCS5jX2lkZW50CT0geyAiUmlzZVJpc2VSaXNlIiB9LAorCS5jX21vZGVscyA9IHsKKwkJeyAudmVuZG9yID0gWDg2X1ZFTkRPUl9SSVNFLCAuZmFtaWx5ID0gNSwgLm1vZGVsX25hbWVzID0gCisJCSAgeyAKKwkJCSAgWzBdID0gImlEcmFnb24iLCAKKwkJCSAgWzJdID0gImlEcmFnb24iLCAKKwkJCSAgWzhdID0gImlEcmFnb24gSUkiLCAKKwkJCSAgWzldID0gImlEcmFnb24gSUkiCisJCSAgfQorCQl9LAorCX0sCisJLmNfaW5pdAkJPSBpbml0X3Jpc2UsCit9OworCitpbnQgX19pbml0IHJpc2VfaW5pdF9jcHUodm9pZCkKK3sKKwljcHVfZGV2c1tYODZfVkVORE9SX1JJU0VdID0gJnJpc2VfY3B1X2RldjsKKwlyZXR1cm4gMDsKK30KKworLy9lYXJseV9hcmNoX2luaXRjYWxsKHJpc2VfaW5pdF9jcHUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvdHJhbnNtZXRhLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS90cmFuc21ldGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTdlNWVlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvdHJhbnNtZXRhLmMKQEAgLTAsMCArMSwxMDcgQEAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9tc3IuaD4KKyNpbmNsdWRlICJjcHUuaCIKKworc3RhdGljIHZvaWQgX19pbml0IGluaXRfdHJhbnNtZXRhKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKKwl1bnNpZ25lZCBpbnQgY2FwX21hc2ssIHVrLCBtYXgsIGR1bW15OworCXVuc2lnbmVkIGludCBjbXNfcmV2MSwgY21zX3JldjI7CisJdW5zaWduZWQgaW50IGNwdV9yZXYsIGNwdV9mcmVxLCBjcHVfZmxhZ3MsIG5ld19jcHVfcmV2OworCWNoYXIgY3B1X2luZm9bNjVdOworCisJZ2V0X21vZGVsX25hbWUoYyk7CS8qIFNhbWUgYXMgQU1EL0N5cml4ICovCisJZGlzcGxheV9jYWNoZWluZm8oYyk7CisKKwkvKiBQcmludCBDTVMgYW5kIENQVSByZXZpc2lvbiAqLworCW1heCA9IGNwdWlkX2VheCgweDgwODYwMDAwKTsKKwljcHVfcmV2ID0gMDsKKwlpZiAoIG1heCA+PSAweDgwODYwMDAxICkgeworCQljcHVpZCgweDgwODYwMDAxLCAmZHVtbXksICZjcHVfcmV2LCAmY3B1X2ZyZXEsICZjcHVfZmxhZ3MpOyAKKwkJaWYgKGNwdV9yZXYgIT0gMHgwMjAwMDAwMCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiQ1BVOiBQcm9jZXNzb3IgcmV2aXNpb24gJXUuJXUuJXUuJXUsICV1IE1IelxuIiwKKwkJCQkoY3B1X3JldiA+PiAyNCkgJiAweGZmLAorCQkJCShjcHVfcmV2ID4+IDE2KSAmIDB4ZmYsCisJCQkJKGNwdV9yZXYgPj4gOCkgJiAweGZmLAorCQkJCWNwdV9yZXYgJiAweGZmLAorCQkJCWNwdV9mcmVxKTsKKwkJfQorCX0KKwlpZiAoIG1heCA+PSAweDgwODYwMDAyICkgeworCQljcHVpZCgweDgwODYwMDAyLCAmbmV3X2NwdV9yZXYsICZjbXNfcmV2MSwgJmNtc19yZXYyLCAmZHVtbXkpOworCQlpZiAoY3B1X3JldiA9PSAweDAyMDAwMDAwKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJDUFU6IFByb2Nlc3NvciByZXZpc2lvbiAlMDhYLCAldSBNSHpcbiIsCisJCQkJbmV3X2NwdV9yZXYsIGNwdV9mcmVxKTsKKwkJfQorCQlwcmludGsoS0VSTl9JTkZPICJDUFU6IENvZGUgTW9ycGhpbmcgU29mdHdhcmUgcmV2aXNpb24gJXUuJXUuJXUtJXUtJXVcbiIsCisJCSAgICAgICAoY21zX3JldjEgPj4gMjQpICYgMHhmZiwKKwkJICAgICAgIChjbXNfcmV2MSA+PiAxNikgJiAweGZmLAorCQkgICAgICAgKGNtc19yZXYxID4+IDgpICYgMHhmZiwKKwkJICAgICAgIGNtc19yZXYxICYgMHhmZiwKKwkJICAgICAgIGNtc19yZXYyKTsKKwl9CisJaWYgKCBtYXggPj0gMHg4MDg2MDAwNiApIHsKKwkJY3B1aWQoMHg4MDg2MDAwMywKKwkJICAgICAgKHZvaWQgKikmY3B1X2luZm9bMF0sCisJCSAgICAgICh2b2lkICopJmNwdV9pbmZvWzRdLAorCQkgICAgICAodm9pZCAqKSZjcHVfaW5mb1s4XSwKKwkJICAgICAgKHZvaWQgKikmY3B1X2luZm9bMTJdKTsKKwkJY3B1aWQoMHg4MDg2MDAwNCwKKwkJICAgICAgKHZvaWQgKikmY3B1X2luZm9bMTZdLAorCQkgICAgICAodm9pZCAqKSZjcHVfaW5mb1syMF0sCisJCSAgICAgICh2b2lkICopJmNwdV9pbmZvWzI0XSwKKwkJICAgICAgKHZvaWQgKikmY3B1X2luZm9bMjhdKTsKKwkJY3B1aWQoMHg4MDg2MDAwNSwKKwkJICAgICAgKHZvaWQgKikmY3B1X2luZm9bMzJdLAorCQkgICAgICAodm9pZCAqKSZjcHVfaW5mb1szNl0sCisJCSAgICAgICh2b2lkICopJmNwdV9pbmZvWzQwXSwKKwkJICAgICAgKHZvaWQgKikmY3B1X2luZm9bNDRdKTsKKwkJY3B1aWQoMHg4MDg2MDAwNiwKKwkJICAgICAgKHZvaWQgKikmY3B1X2luZm9bNDhdLAorCQkgICAgICAodm9pZCAqKSZjcHVfaW5mb1s1Ml0sCisJCSAgICAgICh2b2lkICopJmNwdV9pbmZvWzU2XSwKKwkJICAgICAgKHZvaWQgKikmY3B1X2luZm9bNjBdKTsKKwkJY3B1X2luZm9bNjRdID0gJ1wwJzsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQ1BVOiAlc1xuIiwgY3B1X2luZm8pOworCX0KKworCS8qIFVuaGlkZSBwb3NzaWJseSBoaWRkZW4gY2FwYWJpbGl0eSBmbGFncyAqLworCXJkbXNyKDB4ODA4NjAwMDQsIGNhcF9tYXNrLCB1ayk7CisJd3Jtc3IoMHg4MDg2MDAwNCwgfjAsIHVrKTsKKwljLT54ODZfY2FwYWJpbGl0eVswXSA9IGNwdWlkX2VkeCgweDAwMDAwMDAxKTsKKwl3cm1zcigweDgwODYwMDA0LCBjYXBfbWFzaywgdWspOworCQorCS8qIElmIHdlIGNhbiBydW4gaTY4NiB1c2VyLXNwYWNlIGNvZGUsIGNhbGwgdXMgYW4gaTY4NiAqLworI2RlZmluZSBVU0VSNjg2IChYODZfRkVBVFVSRV9UU0N8WDg2X0ZFQVRVUkVfQ1g4fFg4Nl9GRUFUVVJFX0NNT1YpCisgICAgICAgIGlmICggYy0+eDg2ID09IDUgJiYgKGMtPng4Nl9jYXBhYmlsaXR5WzBdICYgVVNFUjY4NikgPT0gVVNFUjY4NiApCisJCWMtPng4NiA9IDY7Cit9CisKK3N0YXRpYyB2b2lkIHRyYW5zbWV0YV9pZGVudGlmeShzdHJ1Y3QgY3B1aW5mb194ODYgKiBjKQoreworCXUzMiB4bHZsOworCWdlbmVyaWNfaWRlbnRpZnkoYyk7CisKKwkvKiBUcmFuc21ldGEtZGVmaW5lZCBmbGFnczogbGV2ZWwgMHg4MDg2MDAwMSAqLworCXhsdmwgPSBjcHVpZF9lYXgoMHg4MDg2MDAwMCk7CisJaWYgKCAoeGx2bCAmIDB4ZmZmZjAwMDApID09IDB4ODA4NjAwMDAgKSB7CisJCWlmICggIHhsdmwgPj0gMHg4MDg2MDAwMSApCisJCQljLT54ODZfY2FwYWJpbGl0eVsyXSA9IGNwdWlkX2VkeCgweDgwODYwMDAxKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3B1X2RldiB0cmFuc21ldGFfY3B1X2RldiBfX2luaXRkYXRhID0geworCS5jX3ZlbmRvcgk9ICJUcmFuc21ldGEiLAorCS5jX2lkZW50CT0geyAiR2VudWluZVRNeDg2IiwgIlRyYW5zbWV0YUNQVSIgfSwKKwkuY19pbml0CQk9IGluaXRfdHJhbnNtZXRhLAorCS5jX2lkZW50aWZ5CT0gdHJhbnNtZXRhX2lkZW50aWZ5LAorfTsKKworaW50IF9faW5pdCB0cmFuc21ldGFfaW5pdF9jcHUodm9pZCkKK3sKKwljcHVfZGV2c1tYODZfVkVORE9SX1RSQU5TTUVUQV0gPSAmdHJhbnNtZXRhX2NwdV9kZXY7CisJcmV0dXJuIDA7Cit9CisKKy8vZWFybHlfYXJjaF9pbml0Y2FsbCh0cmFuc21ldGFfaW5pdF9jcHUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvdW1jLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS91bWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjRmY2FkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvdW1jLmMKQEAgLTAsMCArMSwzMyBAQAorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSAiY3B1LmgiCisKKy8qIFVNQyBjaGlwcyBhcHBlYXIgdG8gYmUgb25seSBlaXRoZXIgMzg2IG9yIDQ4Niwgc28gbm8gc3BlY2lhbCBpbml0IHRha2VzIHBsYWNlLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF91bWMoc3RydWN0IGNwdWluZm9feDg2ICogYykKK3sKKworfQorCitzdGF0aWMgc3RydWN0IGNwdV9kZXYgdW1jX2NwdV9kZXYgX19pbml0ZGF0YSA9IHsKKwkuY192ZW5kb3IJPSAiVU1DIiwKKwkuY19pZGVudCAJPSB7ICJVTUMgVU1DIFVNQyIgfSwKKwkuY19tb2RlbHMgPSB7CisJCXsgLnZlbmRvciA9IFg4Nl9WRU5ET1JfVU1DLCAuZmFtaWx5ID0gNCwgLm1vZGVsX25hbWVzID0KKwkJICB7IAorCQkJICBbMV0gPSAiVTVEIiwgCisJCQkgIFsyXSA9ICJVNVMiLCAKKwkJICB9CisJCX0sCisJfSwKKwkuY19pbml0CQk9IGluaXRfdW1jLAorfTsKKworaW50IF9faW5pdCB1bWNfaW5pdF9jcHUodm9pZCkKK3sKKwljcHVfZGV2c1tYODZfVkVORE9SX1VNQ10gPSAmdW1jX2NwdV9kZXY7CisJcmV0dXJuIDA7Cit9CisKKy8vZWFybHlfYXJjaF9pbml0Y2FsbCh1bWNfaW5pdF9jcHUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHVpZC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHVpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMjc1NjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdWlkLmMKQEAgLTAsMCArMSwyNDYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqICAgCisgKiAgIENvcHlyaWdodCAyMDAwIEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UgTUEgMDIxMzksCisgKiAgIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKyAqICAgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGNwdWlkLmMKKyAqCisgKiB4ODYgQ1BVSUQgYWNjZXNzIGRldmljZQorICoKKyAqIFRoaXMgZGV2aWNlIGlzIGFjY2Vzc2VkIGJ5IGxzZWVrKCkgdG8gdGhlIGFwcHJvcHJpYXRlIENQVUlEIGxldmVsCisgKiBhbmQgdGhlbiByZWFkIGluIGNodW5rcyBvZiAxNiBieXRlcy4gIEEgbGFyZ2VyIHNpemUgbWVhbnMgbXVsdGlwbGUKKyAqIHJlYWRzIG9mIGNvbnNlY3V0aXZlIGxldmVscy4KKyAqCisgKiBUaGlzIGRyaXZlciB1c2VzIC9kZXYvY3B1LyVkL2NwdWlkIHdoZXJlICVkIGlzIHRoZSBtaW5vciBudW1iZXIsIGFuZCBvbgorICogYW4gU01QIGJveCB3aWxsIGRpcmVjdCB0aGUgYWNjZXNzIHRvIENQVSAlZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3Nfc2ltcGxlICpjcHVpZF9jbGFzczsKKworI2lmZGVmIENPTkZJR19TTVAKKworc3RydWN0IGNwdWlkX2NvbW1hbmQgeworCWludCBjcHU7CisJdTMyIHJlZzsKKwl1MzIgKmRhdGE7Cit9OworCitzdGF0aWMgdm9pZCBjcHVpZF9zbXBfY3B1aWQodm9pZCAqY21kX2Jsb2NrKQoreworCXN0cnVjdCBjcHVpZF9jb21tYW5kICpjbWQgPSAoc3RydWN0IGNwdWlkX2NvbW1hbmQgKiljbWRfYmxvY2s7CisKKwlpZiAoY21kLT5jcHUgPT0gc21wX3Byb2Nlc3Nvcl9pZCgpKQorCQljcHVpZChjbWQtPnJlZywgJmNtZC0+ZGF0YVswXSwgJmNtZC0+ZGF0YVsxXSwgJmNtZC0+ZGF0YVsyXSwKKwkJICAgICAgJmNtZC0+ZGF0YVszXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkb19jcHVpZChpbnQgY3B1LCB1MzIgcmVnLCB1MzIgKiBkYXRhKQoreworCXN0cnVjdCBjcHVpZF9jb21tYW5kIGNtZDsKKworCXByZWVtcHRfZGlzYWJsZSgpOworCWlmIChjcHUgPT0gc21wX3Byb2Nlc3Nvcl9pZCgpKSB7CisJCWNwdWlkKHJlZywgJmRhdGFbMF0sICZkYXRhWzFdLCAmZGF0YVsyXSwgJmRhdGFbM10pOworCX0gZWxzZSB7CisJCWNtZC5jcHUgPSBjcHU7CisJCWNtZC5yZWcgPSByZWc7CisJCWNtZC5kYXRhID0gZGF0YTsKKworCQlzbXBfY2FsbF9mdW5jdGlvbihjcHVpZF9zbXBfY3B1aWQsICZjbWQsIDEsIDEpOworCX0KKwlwcmVlbXB0X2VuYWJsZSgpOworfQorI2Vsc2UJCQkJLyogISBDT05GSUdfU01QICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkb19jcHVpZChpbnQgY3B1LCB1MzIgcmVnLCB1MzIgKiBkYXRhKQoreworCWNwdWlkKHJlZywgJmRhdGFbMF0sICZkYXRhWzFdLCAmZGF0YVsyXSwgJmRhdGFbM10pOworfQorCisjZW5kaWYJCQkJLyogISBDT05GSUdfU01QICovCisKK3N0YXRpYyBsb2ZmX3QgY3B1aWRfc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWcpCit7CisJbG9mZl90IHJldDsKKworCWxvY2tfa2VybmVsKCk7CisKKwlzd2l0Y2ggKG9yaWcpIHsKKwljYXNlIDA6CisJCWZpbGUtPmZfcG9zID0gb2Zmc2V0OworCQlyZXQgPSBmaWxlLT5mX3BvczsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlmaWxlLT5mX3BvcyArPSBvZmZzZXQ7CisJCXJldCA9IGZpbGUtPmZfcG9zOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCX0KKworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBjcHVpZF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCit7CisJY2hhciBfX3VzZXIgKnRtcCA9IGJ1ZjsKKwl1MzIgZGF0YVs0XTsKKwlzaXplX3QgcnY7CisJdTMyIHJlZyA9ICpwcG9zOworCWludCBjcHUgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCisJaWYgKGNvdW50ICUgMTYpCisJCXJldHVybiAtRUlOVkFMOwkvKiBJbnZhbGlkIGNodW5rIHNpemUgKi8KKworCWZvciAocnYgPSAwOyBjb3VudDsgY291bnQgLT0gMTYpIHsKKwkJZG9fY3B1aWQoY3B1LCByZWcsIGRhdGEpOworCQlpZiAoY29weV90b191c2VyKHRtcCwgJmRhdGEsIDE2KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQl0bXAgKz0gMTY7CisJCSpwcG9zID0gcmVnKys7CisJfQorCisJcmV0dXJuIHRtcCAtIGJ1ZjsKK30KKworc3RhdGljIGludCBjcHVpZF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXVuc2lnbmVkIGludCBjcHUgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICYoY3B1X2RhdGEpW2NwdV07CisKKwlpZiAoY3B1ID49IE5SX0NQVVMgfHwgIWNwdV9vbmxpbmUoY3B1KSkKKwkJcmV0dXJuIC1FTlhJTzsJLyogTm8gc3VjaCBDUFUgKi8KKwlpZiAoYy0+Y3B1aWRfbGV2ZWwgPCAwKQorCQlyZXR1cm4gLUVJTzsJLyogQ1BVSUQgbm90IHN1cHBvcnRlZCAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGaWxlIG9wZXJhdGlvbnMgd2Ugc3VwcG9ydAorICovCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjcHVpZF9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgPSBjcHVpZF9zZWVrLAorCS5yZWFkID0gY3B1aWRfcmVhZCwKKwkub3BlbiA9IGNwdWlkX29wZW4sCit9OworCitzdGF0aWMgaW50IGNwdWlkX2NsYXNzX3NpbXBsZV9kZXZpY2VfYWRkKGludCBpKSAKK3sKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19lcnI7CisKKwljbGFzc19lcnIgPSBjbGFzc19zaW1wbGVfZGV2aWNlX2FkZChjcHVpZF9jbGFzcywgTUtERVYoQ1BVSURfTUFKT1IsIGkpLCBOVUxMLCAiY3B1JWQiLGkpOworCWlmIChJU19FUlIoY2xhc3NfZXJyKSkKKwkJZXJyID0gUFRSX0VSUihjbGFzc19lcnIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGNwdWlkX2NsYXNzX2NwdV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCit7CisJdW5zaWduZWQgaW50IGNwdSA9ICh1bnNpZ25lZCBsb25nKWhjcHU7CisKKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgQ1BVX09OTElORToKKwkJY3B1aWRfY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQoY3B1KTsKKwkJYnJlYWs7CisJY2FzZSBDUFVfREVBRDoKKwkJY2xhc3Nfc2ltcGxlX2RldmljZV9yZW1vdmUoTUtERVYoQ1BVSURfTUFKT1IsIGNwdSkpOworCQlicmVhazsKKwl9CisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBjcHVpZF9jbGFzc19jcHVfbm90aWZpZXIgPQoreworCS5ub3RpZmllcl9jYWxsID0gY3B1aWRfY2xhc3NfY3B1X2NhbGxiYWNrLAorfTsKKworc3RhdGljIGludCBfX2luaXQgY3B1aWRfaW5pdCh2b2lkKQoreworCWludCBpLCBlcnIgPSAwOworCWkgPSAwOworCisJaWYgKHJlZ2lzdGVyX2NocmRldihDUFVJRF9NQUpPUiwgImNwdS9jcHVpZCIsICZjcHVpZF9mb3BzKSkgeworCQlwcmludGsoS0VSTl9FUlIgImNwdWlkOiB1bmFibGUgdG8gZ2V0IG1ham9yICVkIGZvciBjcHVpZFxuIiwKKwkJICAgICAgIENQVUlEX01BSk9SKTsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisJY3B1aWRfY2xhc3MgPSBjbGFzc19zaW1wbGVfY3JlYXRlKFRISVNfTU9EVUxFLCAiY3B1aWQiKTsKKwlpZiAoSVNfRVJSKGNwdWlkX2NsYXNzKSkgeworCQllcnIgPSBQVFJfRVJSKGNwdWlkX2NsYXNzKTsKKwkJZ290byBvdXRfY2hyZGV2OworCX0KKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpIHsKKwkJZXJyID0gY3B1aWRfY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQoaSk7CisJCWlmIChlcnIgIT0gMCkgCisJCQlnb3RvIG91dF9jbGFzczsKKwl9CisJcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZjcHVpZF9jbGFzc19jcHVfbm90aWZpZXIpOworCisJZXJyID0gMDsKKwlnb3RvIG91dDsKKworb3V0X2NsYXNzOgorCWkgPSAwOworCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgeworCQljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihDUFVJRF9NQUpPUiwgaSkpOworCX0KKwljbGFzc19zaW1wbGVfZGVzdHJveShjcHVpZF9jbGFzcyk7CitvdXRfY2hyZGV2OgorCXVucmVnaXN0ZXJfY2hyZGV2KENQVUlEX01BSk9SLCAiY3B1L2NwdWlkIik7CQorb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjcHVpZF9leGl0KHZvaWQpCit7CisJaW50IGNwdSA9IDA7CisKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKKwkJY2xhc3Nfc2ltcGxlX2RldmljZV9yZW1vdmUoTUtERVYoQ1BVSURfTUFKT1IsIGNwdSkpOworCWNsYXNzX3NpbXBsZV9kZXN0cm95KGNwdWlkX2NsYXNzKTsKKwl1bnJlZ2lzdGVyX2NocmRldihDUFVJRF9NQUpPUiwgImNwdS9jcHVpZCIpOworCXVucmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZjcHVpZF9jbGFzc19jcHVfbm90aWZpZXIpOworfQorCittb2R1bGVfaW5pdChjcHVpZF9pbml0KTsKK21vZHVsZV9leGl0KGNwdWlkX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJILiBQZXRlciBBbnZpbiA8aHBhQHp5dG9yLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigieDg2IGdlbmVyaWMgQ1BVSUQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2RtaV9zY2FuLmMgYi9hcmNoL2kzODYva2VybmVsL2RtaV9zY2FuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVkN2UyOGYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2RtaV9zY2FuLmMKQEAgLTAsMCArMSw0ODcgQEAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKworCitzdHJ1Y3QgZG1pX2hlYWRlcgoreworCXU4CXR5cGU7CisJdTgJbGVuZ3RoOworCXUxNgloYW5kbGU7Cit9OworCisjdW5kZWYgRE1JX0RFQlVHCisKKyNpZmRlZiBETUlfREVCVUcKKyNkZWZpbmUgZG1pX3ByaW50ayh4KSBwcmludGsgeAorI2Vsc2UKKyNkZWZpbmUgZG1pX3ByaW50ayh4KQorI2VuZGlmCisKK3N0YXRpYyBjaGFyICogX19pbml0IGRtaV9zdHJpbmcoc3RydWN0IGRtaV9oZWFkZXIgKmRtLCB1OCBzKQoreworCXU4ICpicD0odTggKilkbTsKKwlicCs9ZG0tPmxlbmd0aDsKKwlpZighcykKKwkJcmV0dXJuICIiOworCXMtLTsKKwl3aGlsZShzPjAgJiYgKmJwKQorCXsKKwkJYnArPXN0cmxlbihicCk7CisJCWJwKys7CisJCXMtLTsKKwl9CisJcmV0dXJuIGJwOworfQorCisvKgorICoJV2UgaGF2ZSB0byBiZSBjYXV0aW91cyBoZXJlLiBXZSBoYXZlIHNlZW4gQklPU2VzIHdpdGggRE1JIHBvaW50ZXJzCisgKglwb2ludGluZyB0byBjb21wbGV0ZWx5IHRoZSB3cm9uZyBwbGFjZSBmb3IgZXhhbXBsZQorICovCisgCitzdGF0aWMgaW50IF9faW5pdCBkbWlfdGFibGUodTMyIGJhc2UsIGludCBsZW4sIGludCBudW0sIHZvaWQgKCpkZWNvZGUpKHN0cnVjdCBkbWlfaGVhZGVyICopKQoreworCXU4ICpidWY7CisJc3RydWN0IGRtaV9oZWFkZXIgKmRtOworCXU4ICpkYXRhOworCWludCBpPTA7CisJCQorCWJ1ZiA9IGJ0X2lvcmVtYXAoYmFzZSwgbGVuKTsKKwlpZihidWY9PU5VTEwpCisJCXJldHVybiAtMTsKKworCWRhdGEgPSBidWY7CisKKwkvKgorIAkgKglTdG9wIHdoZW4gd2Ugc2VlIGFsbCB0aGUgaXRlbXMgdGhlIHRhYmxlIGNsYWltZWQgdG8gaGF2ZQorIAkgKglPUiB3ZSBydW4gb2ZmIHRoZSBlbmQgb2YgdGhlIHRhYmxlIChhbHNvIGhhcHBlbnMpCisgCSAqLworIAorCXdoaWxlKGk8bnVtICYmIGRhdGEtYnVmK3NpemVvZihzdHJ1Y3QgZG1pX2hlYWRlcik8PWxlbikKKwl7CisJCWRtPShzdHJ1Y3QgZG1pX2hlYWRlciAqKWRhdGE7CisJCS8qCisJCSAqICBXZSB3YW50IHRvIGtub3cgdGhlIHRvdGFsIGxlbmd0aCAoZm9ybWF0ZWQgYXJlYSBhbmQgc3RyaW5ncykKKwkJICogIGJlZm9yZSBkZWNvZGluZyB0byBtYWtlIHN1cmUgd2Ugd29uJ3QgcnVuIG9mZiB0aGUgdGFibGUgaW4KKwkJICogIGRtaV9kZWNvZGUgb3IgZG1pX3N0cmluZworCQkgKi8KKwkJZGF0YSs9ZG0tPmxlbmd0aDsKKwkJd2hpbGUoZGF0YS1idWY8bGVuLTEgJiYgKGRhdGFbMF0gfHwgZGF0YVsxXSkpCisJCQlkYXRhKys7CisJCWlmKGRhdGEtYnVmPGxlbi0xKQorCQkJZGVjb2RlKGRtKTsKKwkJZGF0YSs9MjsKKwkJaSsrOworCX0KKwlidF9pb3VubWFwKGJ1ZiwgbGVuKTsKKwlyZXR1cm4gMDsKK30KKworCitpbmxpbmUgc3RhdGljIGludCBfX2luaXQgZG1pX2NoZWNrc3VtKHU4ICpidWYpCit7CisJdTggc3VtPTA7CisJaW50IGE7CisJCisJZm9yKGE9MDsgYTwxNTsgYSsrKQorCQlzdW0rPWJ1ZlthXTsKKwlyZXR1cm4gKHN1bT09MCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGRtaV9pdGVyYXRlKHZvaWQgKCpkZWNvZGUpKHN0cnVjdCBkbWlfaGVhZGVyICopKQoreworCXU4IGJ1ZlsxNV07CisJY2hhciBfX2lvbWVtICpwLCAqcTsKKworCS8qCisJICogbm8gaW91bm1hcCgpIGZvciB0aGF0IGlvcmVtYXAoKTsgaXQgd291bGQgYmUgYSBuby1vcCwgYnV0IGl0J3MKKwkgKiBzbyBlYXJseSBpbiBzZXR1cCB0aGF0IHN1Y2tlciBnZXRzIGNvbmZ1c2VkIGludG8gZG9pbmcgd2hhdAorCSAqIGl0IHNob3VsZG4ndCBpZiB3ZSBhY3R1YWxseSBjYWxsIGl0LgorCSAqLworCXAgPSBpb3JlbWFwKDB4RjAwMDAsIDB4MTAwMDApOworCWlmIChwID09IE5VTEwpCisJCXJldHVybiAtMTsKKwlmb3IgKHEgPSBwOyBxIDwgcCArIDB4MTAwMDA7IHEgKz0gMTYpIHsKKwkJbWVtY3B5X2Zyb21pbyhidWYsIHEsIDE1KTsKKwkJaWYobWVtY21wKGJ1ZiwgIl9ETUlfIiwgNSk9PTAgJiYgZG1pX2NoZWNrc3VtKGJ1ZikpCisJCXsKKwkJCXUxNiBudW09YnVmWzEzXTw8OHxidWZbMTJdOworCQkJdTE2IGxlbj1idWZbN108PDh8YnVmWzZdOworCQkJdTMyIGJhc2U9YnVmWzExXTw8MjR8YnVmWzEwXTw8MTZ8YnVmWzldPDw4fGJ1Zls4XTsKKworCQkJLyoKKwkJCSAqIERNSSB2ZXJzaW9uIDAuMCBtZWFucyB0aGF0IHRoZSByZWFsIHZlcnNpb24gaXMgdGFrZW4gZnJvbQorCQkJICogdGhlIFNNQklPUyB2ZXJzaW9uLCB3aGljaCB3ZSBkb24ndCBrbm93IGF0IHRoaXMgcG9pbnQuCisJCQkgKi8KKwkJCWlmKGJ1ZlsxNF0hPTApCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiRE1JICVkLiVkIHByZXNlbnQuXG4iLAorCQkJCQlidWZbMTRdPj40LCBidWZbMTRdJjB4MEYpOworCQkJZWxzZQorCQkJCXByaW50ayhLRVJOX0lORk8gIkRNSSBwcmVzZW50LlxuIik7CisJCQlkbWlfcHJpbnRrKChLRVJOX0lORk8gIiVkIHN0cnVjdHVyZXMgb2NjdXB5aW5nICVkIGJ5dGVzLlxuIiwKKwkJCQludW0sIGxlbikpOworCQkJZG1pX3ByaW50aygoS0VSTl9JTkZPICJETUkgdGFibGUgYXQgMHglMDhYLlxuIiwKKwkJCQliYXNlKSk7CisJCQlpZihkbWlfdGFibGUoYmFzZSxsZW4sIG51bSwgZGVjb2RlKT09MCkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBjaGFyICpkbWlfaWRlbnRbRE1JX1NUUklOR19NQVhdOworCisvKgorICoJU2F2ZSBhIERNSSBzdHJpbmcKKyAqLworIAorc3RhdGljIHZvaWQgX19pbml0IGRtaV9zYXZlX2lkZW50KHN0cnVjdCBkbWlfaGVhZGVyICpkbSwgaW50IHNsb3QsIGludCBzdHJpbmcpCit7CisJY2hhciAqZCA9IChjaGFyKilkbTsKKwljaGFyICpwID0gZG1pX3N0cmluZyhkbSwgZFtzdHJpbmddKTsKKwlpZihwPT1OVUxMIHx8ICpwID09IDApCisJCXJldHVybjsKKwlpZiAoZG1pX2lkZW50W3Nsb3RdKQorCQlyZXR1cm47CisJZG1pX2lkZW50W3Nsb3RdID0gYWxsb2NfYm9vdG1lbShzdHJsZW4ocCkrMSk7CisJaWYoZG1pX2lkZW50W3Nsb3RdKQorCQlzdHJjcHkoZG1pX2lkZW50W3Nsb3RdLCBwKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0VSUiAiZG1pX3NhdmVfaWRlbnQ6IG91dCBvZiBtZW1vcnkuXG4iKTsKK30KKworLyoKKyAqIFVnbHkgY29tcGF0aWJpbGl0eSBjcmFwLgorICovCisjZGVmaW5lIGRtaV9ibGFja2xpc3QJZG1pX3N5c3RlbV9pZAorI2RlZmluZSBOT19NQVRDSAl7IERNSV9OT05FLCBOVUxMfQorI2RlZmluZSBNQVRDSAkJRE1JX01BVENICisKKy8qCisgKiBUb3NoaWJhIGtleWJvYXJkIGxpa2VzIHRvIHJlcGVhdCBrZXlzIHdoZW4gdGhleSBhcmUgbm90IHJlcGVhdGVkLgorICovCisKK3N0YXRpYyBfX2luaXQgaW50IGJyb2tlbl90b3NoaWJhX2tleWJvYXJkKHN0cnVjdCBkbWlfYmxhY2tsaXN0ICpkKQoreworCXByaW50ayhLRVJOX1dBUk5JTkcgIlRvc2hpYmEgd2l0aCBicm9rZW4ga2V5Ym9hcmQgZGV0ZWN0ZWQuIElmIHlvdXIga2V5Ym9hcmQgc29tZXRpbWVzIGdlbmVyYXRlcyAzIGtleXByZXNzZXMgaW5zdGVhZCBvZiBvbmUsIHNlZSBodHRwOi8vZGF2eWQudWNjLmFzbi5hdS9wcm9qZWN0cy90b3NoaWJhL1JFQURNRVxuIik7CisJcmV0dXJuIDA7Cit9CisKKworI2lmZGVmIENPTkZJR19BQ1BJX1NMRUVQCitzdGF0aWMgX19pbml0IGludCByZXNldF92aWRlb21vZGVfYWZ0ZXJfczMoc3RydWN0IGRtaV9ibGFja2xpc3QgKmQpCit7CisJLyogU2VlIGFjcGlfd2FrZXVwLlMgKi8KKwlleHRlcm4gbG9uZyBhY3BpX3ZpZGVvX2ZsYWdzOworCWFjcGlfdmlkZW9fZmxhZ3MgfD0gMjsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisKKyNpZmRlZglDT05GSUdfQUNQSV9CT09UCitleHRlcm4gaW50IGFjcGlfZm9yY2U7CisKK3N0YXRpYyBfX2luaXQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgaW50IGRtaV9kaXNhYmxlX2FjcGkoc3RydWN0IGRtaV9ibGFja2xpc3QgKmQpIAoreyAKKwlpZiAoIWFjcGlfZm9yY2UpIHsgCisJCXByaW50ayhLRVJOX05PVElDRSAiJXMgZGV0ZWN0ZWQ6IGFjcGkgb2ZmXG4iLGQtPmlkZW50KTsgCisJCWRpc2FibGVfYWNwaSgpOworCX0gZWxzZSB7IAorCQlwcmludGsoS0VSTl9OT1RJQ0UgCisJCSAgICAgICAiV2FybmluZzogRE1JIGJsYWNrbGlzdCBzYXlzIGJyb2tlbiwgYnV0IGFjcGkgZm9yY2VkXG4iKTsgCisJfQorCXJldHVybiAwOworfSAKKworLyoKKyAqIExpbWl0IEFDUEkgdG8gQ1BVIGVudW1lcmF0aW9uIGZvciBIVAorICovCitzdGF0aWMgX19pbml0IF9fYXR0cmlidXRlX18oKHVudXNlZCkpIGludCBmb3JjZV9hY3BpX2h0KHN0cnVjdCBkbWlfYmxhY2tsaXN0ICpkKSAKK3sgCisJaWYgKCFhY3BpX2ZvcmNlKSB7IAorCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzIGRldGVjdGVkOiBmb3JjZSB1c2Ugb2YgYWNwaT1odFxuIiwgZC0+aWRlbnQpOyAKKwkJZGlzYWJsZV9hY3BpKCk7CisJCWFjcGlfaHQgPSAxOyAKKwl9IGVsc2UgeyAKKwkJcHJpbnRrKEtFUk5fTk9USUNFIAorCQkgICAgICAgIldhcm5pbmc6IGFjcGk9Zm9yY2Ugb3ZlcnJ1bGVzIERNSSBibGFja2xpc3Q6IGFjcGk9aHRcbiIpOyAKKwl9CisJcmV0dXJuIDA7Cit9IAorI2VuZGlmCisKKyNpZmRlZglDT05GSUdfQUNQSV9QQ0kKK3N0YXRpYyBfX2luaXQgaW50IGRpc2FibGVfYWNwaV9pcnEoc3RydWN0IGRtaV9ibGFja2xpc3QgKmQpIAoreworCWlmICghYWNwaV9mb3JjZSkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzIGRldGVjdGVkOiBmb3JjZSB1c2Ugb2YgYWNwaT1ub2lycVxuIiwKKwkJICAgICAgIGQtPmlkZW50KTsgCQorCQlhY3BpX25vaXJxX3NldCgpOworCX0KKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBfX2luaXQgaW50IGRpc2FibGVfYWNwaV9wY2koc3RydWN0IGRtaV9ibGFja2xpc3QgKmQpIAoreworCWlmICghYWNwaV9mb3JjZSkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzIGRldGVjdGVkOiBmb3JjZSB1c2Ugb2YgcGNpPW5vYWNwaVxuIiwKKwkJICAgICAgIGQtPmlkZW50KTsgCQorCQlhY3BpX2Rpc2FibGVfcGNpKCk7CisJfQorCXJldHVybiAwOworfSAgCisjZW5kaWYKKworLyoKKyAqCVByb2Nlc3MgdGhlIERNSSBibGFja2xpc3RzCisgKi8KKyAKKworLyoKKyAqCVRoaXMgd2lsbCBiZSBleHBhbmRlZCBvdmVyIHRpbWUgdG8gZm9yY2UgdGhpbmdzIGxpa2UgdGhlIEFQTSAKKyAqCWludGVycnVwdCBtYXNrIHNldHRpbmdzIGFjY29yZGluZyB0byB0aGUgbGFwdG9wCisgKi8KKyAKK3N0YXRpYyBfX2luaXRkYXRhIHN0cnVjdCBkbWlfYmxhY2tsaXN0IGRtaV9ibGFja2xpc3RbXT17CisKKwl7IGJyb2tlbl90b3NoaWJhX2tleWJvYXJkLCAiVG9zaGliYSBTYXRlbGxpdGUgNDAzMGNkdCIsIHsgLyogS2V5Ym9hcmQgZ2VuZXJhdGVzIHNwdXJpb3VzIHJlcGVhdHMgKi8KKwkJCU1BVENIKERNSV9QUk9EVUNUX05BTUUsICJTNDAzMENEVC80LjMiKSwKKwkJCU5PX01BVENILCBOT19NQVRDSCwgTk9fTUFUQ0gKKwkJCX0gfSwKKyNpZmRlZiBDT05GSUdfQUNQSV9TTEVFUAorCXsgcmVzZXRfdmlkZW9tb2RlX2FmdGVyX3MzLCAiVG9zaGliYSBTYXRlbGxpdGUgNDAzMGNkdCIsIHsgLyogUmVzZXQgdmlkZW8gbW9kZSBhZnRlciByZXR1cm5pbmcgZnJvbSBBQ1BJIFMzIHNsZWVwICovCisJCQlNQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUzQwMzBDRFQvNC4zIiksCisJCQlOT19NQVRDSCwgTk9fTUFUQ0gsIE5PX01BVENICisJCQl9IH0sCisjZW5kaWYKKworI2lmZGVmCUNPTkZJR19BQ1BJX0JPT1QKKwkvKgorCSAqIElmIHlvdXIgc3lzdGVtIGlzIGJsYWNrbGlzdGVkIGhlcmUsIGJ1dCB5b3UgZmluZCB0aGF0IGFjcGk9Zm9yY2UKKwkgKiB3b3JrcyBmb3IgeW91LCBwbGVhc2UgY29udGFjdCBhY3BpLWRldmVsQHNvdXJjZWZvcmdlLm5ldAorCSAqLworCisJLyoKKwkgKglCb3hlcyB0aGF0IG5lZWQgQUNQSSBkaXNhYmxlZAorCSAqLworCisJeyBkbWlfZGlzYWJsZV9hY3BpLCAiSUJNIFRoaW5rcGFkIiwgeworCQkJTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIklCTSIpLAorCQkJTUFUQ0goRE1JX0JPQVJEX05BTUUsICIyNjI5SDFHIiksCisJCQlOT19NQVRDSCwgTk9fTUFUQ0ggfX0sCisKKwkvKgorCSAqCUJveGVzIHRoYXQgbmVlZCBhY3BpPWh0IAorCSAqLworCisJeyBmb3JjZV9hY3BpX2h0LCAiRlNDIFByaW1lcmd5IFQ4NTAiLCB7CisJCQlNQVRDSChETUlfU1lTX1ZFTkRPUiwgIkZVSklUU1UgU0lFTUVOUyIpLAorCQkJTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlBSSU1FUkdZIFQ4NTAiKSwKKwkJCU5PX01BVENILCBOT19NQVRDSCB9fSwKKworCXsgZm9yY2VfYWNwaV9odCwgIkRFTEwgR1gyNDAiLCB7CisJCQlNQVRDSChETUlfQk9BUkRfVkVORE9SLCAiRGVsbCBDb21wdXRlciBDb3Jwb3JhdGlvbiIpLAorCQkJTUFUQ0goRE1JX0JPQVJEX05BTUUsICJPcHRpUGxleCBHWDI0MCIpLAorCQkJTk9fTUFUQ0gsIE5PX01BVENIIH19LAorCisJeyBmb3JjZV9hY3BpX2h0LCAiSFAgVklTVUFMSVpFIE5UIFdvcmtzdGF0aW9uIiwgeworCQkJTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkhld2xldHQtUGFja2FyZCIpLAorCQkJTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkhQIFZJU1VBTElaRSBOVCBXb3Jrc3RhdGlvbiIpLAorCQkJTk9fTUFUQ0gsIE5PX01BVENIIH19LAorCisJeyBmb3JjZV9hY3BpX2h0LCAiQ29tcGFxIFdvcmtzdGF0aW9uIFc4MDAwIiwgeworCQkJTUFUQ0goRE1JX1NZU19WRU5ET1IsICJDb21wYXEiKSwKKwkJCU1BVENIKERNSV9QUk9EVUNUX05BTUUsICJXb3Jrc3RhdGlvbiBXODAwMCIpLAorCQkJTk9fTUFUQ0gsIE5PX01BVENIIH19LAorCisJeyBmb3JjZV9hY3BpX2h0LCAiQVNVUyBQNEIyNjYiLCB7CisJCQlNQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQVNVU1RlSyBDb21wdXRlciBJTkMuIiksCisJCQlNQVRDSChETUlfQk9BUkRfTkFNRSwgIlA0QjI2NiIpLAorCQkJTk9fTUFUQ0gsIE5PX01BVENIIH19LAorCisJeyBmb3JjZV9hY3BpX2h0LCAiQVNVUyBQMkItRFMiLCB7CisJCQlNQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQVNVU1RlSyBDb21wdXRlciBJTkMuIiksCisJCQlNQVRDSChETUlfQk9BUkRfTkFNRSwgIlAyQi1EUyIpLAorCQkJTk9fTUFUQ0gsIE5PX01BVENIIH19LAorCisJeyBmb3JjZV9hY3BpX2h0LCAiQVNVUyBDVVItRExTIiwgeworCQkJTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFTVVNUZUsgQ29tcHV0ZXIgSU5DLiIpLAorCQkJTUFUQ0goRE1JX0JPQVJEX05BTUUsICJDVVItRExTIiksCisJCQlOT19NQVRDSCwgTk9fTUFUQ0ggfX0sCisKKwl7IGZvcmNlX2FjcGlfaHQsICJBQklUIGk0NDBCWC1XODM5NzciLCB7CisJCQlNQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQUJJVCA8aHR0cDovL3d3dy5hYml0LmNvbT4iKSwKKwkJCU1BVENIKERNSV9CT0FSRF9OQU1FLCAiaTQ0MEJYLVc4Mzk3NyAoQlA2KSIpLAorCQkJTk9fTUFUQ0gsIE5PX01BVENIIH19LAorCisJeyBmb3JjZV9hY3BpX2h0LCAiSUJNIEJsYWRlY2VudGVyIiwgeworCQkJTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIklCTSIpLAorCQkJTUFUQ0goRE1JX0JPQVJEX05BTUUsICJJQk0gZVNlcnZlciBCbGFkZUNlbnRlciBIUzIwIiksCisJCQlOT19NQVRDSCwgTk9fTUFUQ0ggfX0sCisKKwl7IGZvcmNlX2FjcGlfaHQsICJJQk0gZVNlcnZlciB4U2VyaWVzIDM2MCIsIHsKKwkJCU1BVENIKERNSV9CT0FSRF9WRU5ET1IsICJJQk0iKSwKKwkJCU1BVENIKERNSV9CT0FSRF9OQU1FLCAiZVNlcnZlciB4U2VyaWVzIDM2MCIpLAorCQkJTk9fTUFUQ0gsIE5PX01BVENIIH19LAorCisJeyBmb3JjZV9hY3BpX2h0LCAiSUJNIGVzZXJ2ZXIgeFNlcmllcyAzMzAiLCB7CisJCQlNQVRDSChETUlfQk9BUkRfVkVORE9SLCAiSUJNIiksCisJCQlNQVRDSChETUlfQk9BUkRfTkFNRSwgImVzZXJ2ZXIgeFNlcmllcyAzMzAiKSwKKwkJCU5PX01BVENILCBOT19NQVRDSCB9fSwKKworCXsgZm9yY2VfYWNwaV9odCwgIklCTSBlc2VydmVyIHhTZXJpZXMgNDQwIiwgeworCQkJTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIklCTSIpLAorCQkJTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgImVzZXJ2ZXIgeFNlcmllcyA0NDAiKSwKKwkJCU5PX01BVENILCBOT19NQVRDSCB9fSwKKworI2VuZGlmCS8vIENPTkZJR19BQ1BJX0JPT1QKKworI2lmZGVmCUNPTkZJR19BQ1BJX1BDSQorCS8qCisJICoJQm94ZXMgdGhhdCBuZWVkIEFDUEkgUENJIElSUSByb3V0aW5nIGRpc2FibGVkCisJICovCisKKwl7IGRpc2FibGVfYWNwaV9pcnEsICJBU1VTIEE3ViIsIHsKKwkJCU1BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBU1VTVGVLIENvbXB1dGVyIElOQyIpLAorCQkJTUFUQ0goRE1JX0JPQVJEX05BTUUsICI8QTdWPiIpLAorCQkJLyogbmV3ZXIgQklPUywgUmV2aXNpb24gMTAxMSwgZG9lcyB3b3JrICovCisJCQlNQVRDSChETUlfQklPU19WRVJTSU9OLCAiQVNVUyBBN1YgQUNQSSBCSU9TIFJldmlzaW9uIDEwMDciKSwKKwkJCU5PX01BVENIIH19LAorCisJLyoKKwkgKglCb3hlcyB0aGF0IG5lZWQgQUNQSSBQQ0kgSVJRIHJvdXRpbmcgYW5kIFBDSSBzY2FuIGRpc2FibGVkCisJICovCisJeyBkaXNhYmxlX2FjcGlfcGNpLCAiQVNVUyBQUi1ETFMiLCB7CS8qIF9CQk4gMCBidWcgKi8KKwkJCU1BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBU1VTVGVLIENvbXB1dGVyIElOQy4iKSwKKwkJCU1BVENIKERNSV9CT0FSRF9OQU1FLCAiUFItRExTIiksCisJCQlNQVRDSChETUlfQklPU19WRVJTSU9OLCAiQVNVUyBQUi1ETFMgQUNQSSBCSU9TIFJldmlzaW9uIDEwMTAiKSwKKwkJCU1BVENIKERNSV9CSU9TX0RBVEUsICIwMy8yMS8yMDAzIikgfX0sCisKKyAJeyBkaXNhYmxlX2FjcGlfcGNpLCAiQWNlciBUcmF2ZWxNYXRlIDM2eCBMYXB0b3AiLCB7CisgCQkJTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBY2VyIiksCisgCQkJTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlRyYXZlbE1hdGUgMzYwIiksCisgCQkJTk9fTUFUQ0gsIE5PX01BVENICisgCQkJfSB9LAorCisjZW5kaWYKKworCXsgTlVMTCwgfQorfTsKKworLyoKKyAqCVByb2Nlc3MgYSBETUkgdGFibGUgZW50cnkuIFJpZ2h0IG5vdyBhbGwgd2UgY2FyZSBhYm91dCBhcmUgdGhlIEJJT1MKKyAqCWFuZCBtYWNoaW5lIGVudHJpZXMuIEZvciAyLjUgd2Ugc2hvdWxkIHB1bGwgdGhlIHNtYnVzIGNvbnRyb2xsZXIgaW5mbworICoJb3V0IG9mIGhlcmUuCisgKi8KKworc3RhdGljIHZvaWQgX19pbml0IGRtaV9kZWNvZGUoc3RydWN0IGRtaV9oZWFkZXIgKmRtKQoreworI2lmZGVmIERNSV9ERUJVRworCXU4ICpkYXRhID0gKHU4ICopZG07CisjZW5kaWYKKwkKKwlzd2l0Y2goZG0tPnR5cGUpCisJeworCQljYXNlICAwOgorCQkJZG1pX3ByaW50aygoIkJJT1MgVmVuZG9yOiAlc1xuIiwKKwkJCQlkbWlfc3RyaW5nKGRtLCBkYXRhWzRdKSkpOworCQkJZG1pX3NhdmVfaWRlbnQoZG0sIERNSV9CSU9TX1ZFTkRPUiwgNCk7CisJCQlkbWlfcHJpbnRrKCgiQklPUyBWZXJzaW9uOiAlc1xuIiwgCisJCQkJZG1pX3N0cmluZyhkbSwgZGF0YVs1XSkpKTsKKwkJCWRtaV9zYXZlX2lkZW50KGRtLCBETUlfQklPU19WRVJTSU9OLCA1KTsKKwkJCWRtaV9wcmludGsoKCJCSU9TIFJlbGVhc2U6ICVzXG4iLAorCQkJCWRtaV9zdHJpbmcoZG0sIGRhdGFbOF0pKSk7CisJCQlkbWlfc2F2ZV9pZGVudChkbSwgRE1JX0JJT1NfREFURSwgOCk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJZG1pX3ByaW50aygoIlN5c3RlbSBWZW5kb3I6ICVzXG4iLAorCQkJCWRtaV9zdHJpbmcoZG0sIGRhdGFbNF0pKSk7CisJCQlkbWlfc2F2ZV9pZGVudChkbSwgRE1JX1NZU19WRU5ET1IsIDQpOworCQkJZG1pX3ByaW50aygoIlByb2R1Y3QgTmFtZTogJXNcbiIsCisJCQkJZG1pX3N0cmluZyhkbSwgZGF0YVs1XSkpKTsKKwkJCWRtaV9zYXZlX2lkZW50KGRtLCBETUlfUFJPRFVDVF9OQU1FLCA1KTsKKwkJCWRtaV9wcmludGsoKCJWZXJzaW9uOiAlc1xuIiwKKwkJCQlkbWlfc3RyaW5nKGRtLCBkYXRhWzZdKSkpOworCQkJZG1pX3NhdmVfaWRlbnQoZG0sIERNSV9QUk9EVUNUX1ZFUlNJT04sIDYpOworCQkJZG1pX3ByaW50aygoIlNlcmlhbCBOdW1iZXI6ICVzXG4iLAorCQkJCWRtaV9zdHJpbmcoZG0sIGRhdGFbN10pKSk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJZG1pX3ByaW50aygoIkJvYXJkIFZlbmRvcjogJXNcbiIsCisJCQkJZG1pX3N0cmluZyhkbSwgZGF0YVs0XSkpKTsKKwkJCWRtaV9zYXZlX2lkZW50KGRtLCBETUlfQk9BUkRfVkVORE9SLCA0KTsKKwkJCWRtaV9wcmludGsoKCJCb2FyZCBOYW1lOiAlc1xuIiwKKwkJCQlkbWlfc3RyaW5nKGRtLCBkYXRhWzVdKSkpOworCQkJZG1pX3NhdmVfaWRlbnQoZG0sIERNSV9CT0FSRF9OQU1FLCA1KTsKKwkJCWRtaV9wcmludGsoKCJCb2FyZCBWZXJzaW9uOiAlc1xuIiwKKwkJCQlkbWlfc3RyaW5nKGRtLCBkYXRhWzZdKSkpOworCQkJZG1pX3NhdmVfaWRlbnQoZG0sIERNSV9CT0FSRF9WRVJTSU9OLCA2KTsKKwkJCWJyZWFrOworCX0KK30KKwordm9pZCBfX2luaXQgZG1pX3NjYW5fbWFjaGluZSh2b2lkKQoreworCWludCBlcnIgPSBkbWlfaXRlcmF0ZShkbWlfZGVjb2RlKTsKKwlpZihlcnIgPT0gMCkKKyAJCWRtaV9jaGVja19zeXN0ZW0oZG1pX2JsYWNrbGlzdCk7CisJZWxzZQorCQlwcmludGsoS0VSTl9JTkZPICJETUkgbm90IHByZXNlbnQuXG4iKTsKK30KKworCisvKioKKyAqCWRtaV9jaGVja19zeXN0ZW0gLSBjaGVjayBzeXN0ZW0gRE1JIGRhdGEKKyAqCUBsaXN0OiBhcnJheSBvZiBkbWlfc3lzdGVtX2lkIHN0cnVjdHVyZXMgdG8gbWF0Y2ggYWdhaW5zdAorICoKKyAqCVdhbGsgdGhlIGJsYWNrbGlzdCB0YWJsZSBydW5uaW5nIG1hdGNoaW5nIGZ1bmN0aW9ucyB1bnRpbCBzb21lb25lCisgKglyZXR1cm5zIG5vbiB6ZXJvIG9yIHdlIGhpdCB0aGUgZW5kLiBDYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yCisgKgllYWNoIHN1Y2Nlc3NmdWxsIG1hdGNoLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbWF0Y2hlcy4KKyAqLworaW50IGRtaV9jaGVja19zeXN0ZW0oc3RydWN0IGRtaV9zeXN0ZW1faWQgKmxpc3QpCit7CisJaW50IGksIGNvdW50ID0gMDsKKwlzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZCA9IGxpc3Q7CisKKwl3aGlsZSAoZC0+aWRlbnQpIHsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZC0+bWF0Y2hlcyk7IGkrKykgeworCQkJaW50IHMgPSBkLT5tYXRjaGVzW2ldLnNsb3Q7CisJCQlpZiAocyA9PSBETUlfTk9ORSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChkbWlfaWRlbnRbc10gJiYgc3Ryc3RyKGRtaV9pZGVudFtzXSwgZC0+bWF0Y2hlc1tpXS5zdWJzdHIpKQorCQkJCWNvbnRpbnVlOworCQkJLyogTm8gbWF0Y2ggKi8KKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlpZiAoZC0+Y2FsbGJhY2sgJiYgZC0+Y2FsbGJhY2soZCkpCisJCQlicmVhazsKKwkJY291bnQrKzsKK2ZhaWw6CQlkKys7CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCitFWFBPUlRfU1lNQk9MKGRtaV9jaGVja19zeXN0ZW0pOworCisvKioKKyAqCWRtaV9nZXRfc3lzdGVtX2luZm8gLSByZXR1cm4gRE1JIGRhdGEgdmFsdWUKKyAqCUBmaWVsZDogZGF0YSBpbmRleCAoc2VlIGVudW0gZG1pX2ZpbGVkKQorICoKKyAqCVJldHVybnMgb25lIERNSSBkYXRhIHZhbHVlLCBjYW4gYmUgdXNlZCB0byBwZXJmb3JtCisgKgljb21wbGV4IERNSSBkYXRhIGNoZWNrcy4KKyAqLworY2hhciAqIGRtaV9nZXRfc3lzdGVtX2luZm8oaW50IGZpZWxkKQoreworCXJldHVybiBkbWlfaWRlbnRbZmllbGRdOworfQorCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2RvdWJsZWZhdWx0LmMgYi9hcmNoL2kzODYva2VybmVsL2RvdWJsZWZhdWx0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg5YWYzZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvZG91YmxlZmF1bHQuYwpAQCAtMCwwICsxLDY1IEBACisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0X3Rhc2suaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vZGVzYy5oPgorCisjZGVmaW5lIERPVUJMRUZBVUxUX1NUQUNLU0laRSAoMTAyNCkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRvdWJsZWZhdWx0X3N0YWNrW0RPVUJMRUZBVUxUX1NUQUNLU0laRV07CisjZGVmaW5lIFNUQUNLX1NUQVJUICh1bnNpZ25lZCBsb25nKShkb3VibGVmYXVsdF9zdGFjaytET1VCTEVGQVVMVF9TVEFDS1NJWkUpCisKKyNkZWZpbmUgcHRyX29rKHgpICgoeCkgPiBQQUdFX09GRlNFVCAmJiAoeCkgPCBQQUdFX09GRlNFVCArIDB4MTAwMDAwMCkKKworc3RhdGljIHZvaWQgZG91YmxlZmF1bHRfZm4odm9pZCkKK3sKKwlzdHJ1Y3QgWGd0X2Rlc2Nfc3RydWN0IGdkdF9kZXNjID0gezAsIDB9OworCXVuc2lnbmVkIGxvbmcgZ2R0LCB0c3M7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygic2dkdCAlMCI6ICI9bSIgKGdkdF9kZXNjKTogOiJtZW1vcnkiKTsKKwlnZHQgPSBnZHRfZGVzYy5hZGRyZXNzOworCisJcHJpbnRrKCJkb3VibGUgZmF1bHQsIGdkdCBhdCAlMDhseCBbJWQgYnl0ZXNdXG4iLCBnZHQsIGdkdF9kZXNjLnNpemUpOworCisJaWYgKHB0cl9vayhnZHQpKSB7CisJCWdkdCArPSBHRFRfRU5UUllfVFNTIDw8IDM7CisJCXRzcyA9ICoodTE2ICopKGdkdCsyKTsKKwkJdHNzICs9ICoodTggKikoZ2R0KzQpIDw8IDE2OworCQl0c3MgKz0gKih1OCAqKShnZHQrNykgPDwgMjQ7CisJCXByaW50aygiZG91YmxlIGZhdWx0LCB0c3MgYXQgJTA4bHhcbiIsIHRzcyk7CisKKwkJaWYgKHB0cl9vayh0c3MpKSB7CisJCQlzdHJ1Y3QgdHNzX3N0cnVjdCAqdCA9IChzdHJ1Y3QgdHNzX3N0cnVjdCAqKXRzczsKKworCQkJcHJpbnRrKCJlaXAgPSAlMDhseCwgZXNwID0gJTA4bHhcbiIsIHQtPmVpcCwgdC0+ZXNwKTsKKworCQkJcHJpbnRrKCJlYXggPSAlMDhseCwgZWJ4ID0gJTA4bHgsIGVjeCA9ICUwOGx4LCBlZHggPSAlMDhseFxuIiwKKwkJCQl0LT5lYXgsIHQtPmVieCwgdC0+ZWN4LCB0LT5lZHgpOworCQkJcHJpbnRrKCJlc2kgPSAlMDhseCwgZWRpID0gJTA4bHhcbiIsCisJCQkJdC0+ZXNpLCB0LT5lZGkpOworCQl9CisJfQorCisJZm9yICg7OykgLyogbm90aGluZyAqLzsKK30KKworc3RydWN0IHRzc19zdHJ1Y3QgZG91YmxlZmF1bHRfdHNzIF9fY2FjaGVsaW5lX2FsaWduZWQgPSB7CisJLmVzcDAJCT0gU1RBQ0tfU1RBUlQsCisJLnNzMAkJPSBfX0tFUk5FTF9EUywKKwkubGR0CQk9IDAsCisJLmlvX2JpdG1hcF9iYXNlCT0gSU5WQUxJRF9JT19CSVRNQVBfT0ZGU0VULAorCisJLmVpcAkJPSAodW5zaWduZWQgbG9uZykgZG91YmxlZmF1bHRfZm4sCisJLmVmbGFncwkJPSBYODZfRUZMQUdTX1NGIHwgMHgyLAkvKiAweDIgYml0IGlzIGFsd2F5cyBzZXQgKi8KKwkuZXNwCQk9IFNUQUNLX1NUQVJULAorCS5lcwkJPSBfX1VTRVJfRFMsCisJLmNzCQk9IF9fS0VSTkVMX0NTLAorCS5zcwkJPSBfX0tFUk5FTF9EUywKKwkuZHMJCT0gX19VU0VSX0RTLAorCisJLl9fY3IzCQk9IF9fcGEoc3dhcHBlcl9wZ19kaXIpCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9lYXJseV9wcmludGsuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvZWFybHlfcHJpbnRrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJmODEyYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvZWFybHlfcHJpbnRrLmMKQEAgLTAsMCArMSwyIEBACisKKyNpbmNsdWRlICIuLi8uLi94ODZfNjQva2VybmVsL2Vhcmx5X3ByaW50ay5jIgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9lZmkuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvZWZpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU1ZTBkOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvZWZpLmMKQEAgLTAsMCArMSw2MzUgQEAKKy8qCisgKiBFeHRlbnNpYmxlIEZpcm13YXJlIEludGVyZmFjZQorICoKKyAqIEJhc2VkIG9uIEV4dGVuc2libGUgRmlybXdhcmUgSW50ZXJmYWNlIFNwZWNpZmljYXRpb24gdmVyc2lvbiAxLjAKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgVkEgTGludXggU3lzdGVtcworICogQ29weXJpZ2h0IChDKSAxOTk5IFdhbHQgRHJ1bW1vbmQgPGRydW1tb25kQHZhbGludXguY29tPgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDIgSGV3bGV0dC1QYWNrYXJkIENvLgorICoJRGF2aWQgTW9zYmVyZ2VyLVRhbmcgPGRhdmlkbUBocGwuaHAuY29tPgorICoJU3RlcGhhbmUgRXJhbmlhbiA8ZXJhbmlhbkBocGwuaHAuY29tPgorICoKKyAqIEFsbCBFRkkgUnVudGltZSBTZXJ2aWNlcyBhcmUgbm90IGltcGxlbWVudGVkIHlldCBhcyBFRkkgb25seQorICogc3VwcG9ydHMgcGh5c2ljYWwgbW9kZSBhZGRyZXNzaW5nIG9uIFNvZnRTRFYuIFRoaXMgaXMgdG8gYmUgZml4ZWQKKyAqIGluIGEgZnV0dXJlIHZlcnNpb24uICAtLWRydW1tb25kIDE5OTktMDctMjAKKyAqCisgKiBJbXBsZW1lbnRlZCBFRkkgcnVudGltZSBzZXJ2aWNlcyBhbmQgdmlydHVhbCBtb2RlIGNhbGxzLiAgLS1kYXZpZG0KKyAqCisgKiBHb3V0aGFtIFJhbzogPGdvdXRoYW0ucmFvQGludGVsLmNvbT4KKyAqCVNraXAgbm9uLVdCIG1lbW9yeSBhbmQgaWdub3JlIGVtcHR5IG1lbW9yeSByYW5nZXMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgorCisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vZGVzYy5oPgorI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorCisjZGVmaW5lIEVGSV9ERUJVRwkwCisjZGVmaW5lIFBGWCAJCSJFRkk6ICIKKworZXh0ZXJuIGVmaV9zdGF0dXNfdCBhc21saW5rYWdlIGVmaV9jYWxsX3BoeXModm9pZCAqLCAuLi4pOworCitzdHJ1Y3QgZWZpIGVmaTsKK0VYUE9SVF9TWU1CT0woZWZpKTsKK3N0YXRpYyBzdHJ1Y3QgZWZpIGVmaV9waHlzIF9faW5pdGRhdGE7CitzdHJ1Y3QgZWZpX21lbW9yeV9tYXAgbWVtbWFwIF9faW5pdGRhdGE7CisKKy8qCisgKiBXZSByZXF1aXJlIGFuIGVhcmx5IGJvb3RfaW9yZW1hcCBtYXBwaW5nIG1lY2hhbmlzbSBpbml0aWFsbHkKKyAqLworZXh0ZXJuIHZvaWQgKiBib290X2lvcmVtYXAodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CisKKy8qCisgKiBUbyBtYWtlIEVGSSBjYWxsIEVGSSBydW50aW1lIHNlcnZpY2UgaW4gcGh5c2ljYWwgYWRkcmVzc2luZyBtb2RlIHdlIG5lZWQKKyAqIHByZWxvZy9lcGlsb2cgYmVmb3JlL2FmdGVyIHRoZSBpbnZvY2F0aW9uIHRvIGRpc2FibGUgaW50ZXJydXB0LCB0bworICogY2xhaW0gRUZJIHJ1bnRpbWUgc2VydmljZSBoYW5kbGVyIGV4Y2x1c2l2ZWx5IGFuZCB0byBkdXBsaWNhdGUgYSBtZW1vcnkgaW4KKyAqIGxvdyBtZW1vcnkgc3BhY2Ugc2F5IDAgLSAzRy4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBlZmlfcnRfZWZsYWdzOworc3RhdGljIERFRklORV9TUElOTE9DSyhlZmlfcnRfbG9jayk7CitzdGF0aWMgcGdkX3QgZWZpX2Jha19wZ19kaXJfcG9pbnRlclsyXTsKKworc3RhdGljIHZvaWQgZWZpX2NhbGxfcGh5c19wcmVsb2codm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGNyNDsKKwl1bnNpZ25lZCBsb25nIHRlbXA7CisKKwlzcGluX2xvY2soJmVmaV9ydF9sb2NrKTsKKwlsb2NhbF9pcnFfc2F2ZShlZmlfcnRfZWZsYWdzKTsKKworCS8qCisJICogSWYgSSBkb24ndCBoYXZlIFBTRSwgSSBzaG91bGQganVzdCBkdXBsaWNhdGUgdHdvIGVudHJpZXMgaW4gcGFnZQorCSAqIGRpcmVjdG9yeS4gSWYgSSBoYXZlIFBTRSwgSSBqdXN0IG5lZWQgdG8gZHVwbGljYXRlIG9uZSBlbnRyeSBpbgorCSAqIHBhZ2UgZGlyZWN0b3J5LgorCSAqLworCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZsICUlY3I0LCAlMCI6Ij1yIihjcjQpKTsKKworCWlmIChjcjQgJiBYODZfQ1I0X1BTRSkgeworCQllZmlfYmFrX3BnX2Rpcl9wb2ludGVyWzBdLnBnZCA9CisJCSAgICBzd2FwcGVyX3BnX2RpcltwZ2RfaW5kZXgoMCldLnBnZDsKKwkJc3dhcHBlcl9wZ19kaXJbMF0ucGdkID0KKwkJICAgIHN3YXBwZXJfcGdfZGlyW3BnZF9pbmRleChQQUdFX09GRlNFVCldLnBnZDsKKwl9IGVsc2UgeworCQllZmlfYmFrX3BnX2Rpcl9wb2ludGVyWzBdLnBnZCA9CisJCSAgICBzd2FwcGVyX3BnX2RpcltwZ2RfaW5kZXgoMCldLnBnZDsKKwkJZWZpX2Jha19wZ19kaXJfcG9pbnRlclsxXS5wZ2QgPQorCQkgICAgc3dhcHBlcl9wZ19kaXJbcGdkX2luZGV4KDB4NDAwMDAwKV0ucGdkOworCQlzd2FwcGVyX3BnX2RpcltwZ2RfaW5kZXgoMCldLnBnZCA9CisJCSAgICBzd2FwcGVyX3BnX2RpcltwZ2RfaW5kZXgoUEFHRV9PRkZTRVQpXS5wZ2Q7CisJCXRlbXAgPSBQQUdFX09GRlNFVCArIDB4NDAwMDAwOworCQlzd2FwcGVyX3BnX2RpcltwZ2RfaW5kZXgoMHg0MDAwMDApXS5wZ2QgPQorCQkgICAgc3dhcHBlcl9wZ19kaXJbcGdkX2luZGV4KHRlbXApXS5wZ2Q7CisJfQorCisJLyoKKwkgKiBBZnRlciB0aGUgbG9jayBpcyByZWxlYXNlZCwgdGhlIG9yaWdpbmFsIHBhZ2UgdGFibGUgaXMgcmVzdG9yZWQuCisJICovCisJbG9jYWxfZmx1c2hfdGxiKCk7CisKKwljcHVfZ2R0X2Rlc2NyWzBdLmFkZHJlc3MgPSBfX3BhKGNwdV9nZHRfZGVzY3JbMF0uYWRkcmVzcyk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oImxnZHQgJTAiOiI9bSIKKwkJCSAgICAoKihzdHJ1Y3QgWGd0X2Rlc2Nfc3RydWN0ICopIF9fcGEoJmNwdV9nZHRfZGVzY3JbMF0pKSk7Cit9CisKK3N0YXRpYyB2b2lkIGVmaV9jYWxsX3BoeXNfZXBpbG9nKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBjcjQ7CisKKwljcHVfZ2R0X2Rlc2NyWzBdLmFkZHJlc3MgPQorCQkodW5zaWduZWQgbG9uZykgX192YShjcHVfZ2R0X2Rlc2NyWzBdLmFkZHJlc3MpOworCV9fYXNtX18gX192b2xhdGlsZV9fKCJsZ2R0ICUwIjoiPW0iKGNwdV9nZHRfZGVzY3IpKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92bCAlJWNyNCwgJTAiOiI9ciIoY3I0KSk7CisKKwlpZiAoY3I0ICYgWDg2X0NSNF9QU0UpIHsKKwkJc3dhcHBlcl9wZ19kaXJbcGdkX2luZGV4KDApXS5wZ2QgPQorCQkgICAgZWZpX2Jha19wZ19kaXJfcG9pbnRlclswXS5wZ2Q7CisJfSBlbHNlIHsKKwkJc3dhcHBlcl9wZ19kaXJbcGdkX2luZGV4KDApXS5wZ2QgPQorCQkgICAgZWZpX2Jha19wZ19kaXJfcG9pbnRlclswXS5wZ2Q7CisJCXN3YXBwZXJfcGdfZGlyW3BnZF9pbmRleCgweDQwMDAwMCldLnBnZCA9CisJCSAgICBlZmlfYmFrX3BnX2Rpcl9wb2ludGVyWzFdLnBnZDsKKwl9CisKKwkvKgorCSAqIEFmdGVyIHRoZSBsb2NrIGlzIHJlbGVhc2VkLCB0aGUgb3JpZ2luYWwgcGFnZSB0YWJsZSBpcyByZXN0b3JlZC4KKwkgKi8KKwlsb2NhbF9mbHVzaF90bGIoKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGVmaV9ydF9lZmxhZ3MpOworCXNwaW5fdW5sb2NrKCZlZmlfcnRfbG9jayk7Cit9CisKK3N0YXRpYyBlZmlfc3RhdHVzX3QKK3BoeXNfZWZpX3NldF92aXJ0dWFsX2FkZHJlc3NfbWFwKHVuc2lnbmVkIGxvbmcgbWVtb3J5X21hcF9zaXplLAorCQkJCSB1bnNpZ25lZCBsb25nIGRlc2NyaXB0b3Jfc2l6ZSwKKwkJCQkgdTMyIGRlc2NyaXB0b3JfdmVyc2lvbiwKKwkJCQkgZWZpX21lbW9yeV9kZXNjX3QgKnZpcnR1YWxfbWFwKQoreworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisKKwllZmlfY2FsbF9waHlzX3ByZWxvZygpOworCXN0YXR1cyA9IGVmaV9jYWxsX3BoeXMoZWZpX3BoeXMuc2V0X3ZpcnR1YWxfYWRkcmVzc19tYXAsCisJCQkJICAgICBtZW1vcnlfbWFwX3NpemUsIGRlc2NyaXB0b3Jfc2l6ZSwKKwkJCQkgICAgIGRlc2NyaXB0b3JfdmVyc2lvbiwgdmlydHVhbF9tYXApOworCWVmaV9jYWxsX3BoeXNfZXBpbG9nKCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGVmaV9zdGF0dXNfdAorcGh5c19lZmlfZ2V0X3RpbWUoZWZpX3RpbWVfdCAqdG0sIGVmaV90aW1lX2NhcF90ICp0YykKK3sKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCisJZWZpX2NhbGxfcGh5c19wcmVsb2coKTsKKwlzdGF0dXMgPSBlZmlfY2FsbF9waHlzKGVmaV9waHlzLmdldF90aW1lLCB0bSwgdGMpOworCWVmaV9jYWxsX3BoeXNfZXBpbG9nKCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworaW5saW5lIGludCBlZmlfc2V0X3J0Y19tbXNzKHVuc2lnbmVkIGxvbmcgbm93dGltZSkKK3sKKwlpbnQgcmVhbF9zZWNvbmRzLCByZWFsX21pbnV0ZXM7CisJZWZpX3N0YXR1c190IAlzdGF0dXM7CisJZWZpX3RpbWVfdCAJZWZ0OworCWVmaV90aW1lX2NhcF90IAljYXA7CisKKwlzcGluX2xvY2soJmVmaV9ydF9sb2NrKTsKKwlzdGF0dXMgPSBlZmkuZ2V0X3RpbWUoJmVmdCwgJmNhcCk7CisJc3Bpbl91bmxvY2soJmVmaV9ydF9sb2NrKTsKKwlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCQlwYW5pYygiT29vcHMsIGVmaXRpbWU6IGNhbid0IHJlYWQgdGltZSFcbiIpOworCXJlYWxfc2Vjb25kcyA9IG5vd3RpbWUgJSA2MDsKKwlyZWFsX21pbnV0ZXMgPSBub3d0aW1lIC8gNjA7CisKKwlpZiAoKChhYnMocmVhbF9taW51dGVzIC0gZWZ0Lm1pbnV0ZSkgKyAxNSkvMzApICYgMSkKKwkJcmVhbF9taW51dGVzICs9IDMwOworCXJlYWxfbWludXRlcyAlPSA2MDsKKworCWVmdC5taW51dGUgPSByZWFsX21pbnV0ZXM7CisJZWZ0LnNlY29uZCA9IHJlYWxfc2Vjb25kczsKKworCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHsKKwkJcHJpbnRrKCJPb29wczogZWZpdGltZTogY2FuJ3QgcmVhZCB0aW1lIVxuIik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisvKgorICogVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGR1cmluZyBrZXJuZWwgaW5pdCBhbmQgYmVmb3JlIHJ1bnRpbWUKKyAqIHNlcnZpY2VzIGhhdmUgYmVlbiByZW1hcHBlZCwgdGhlcmVmb3JlLCB3ZSdsbCBuZWVkIHRvIGNhbGwgaW4gcGh5c2ljYWwKKyAqIG1vZGUuICBOb3RlLCB0aGlzIGNhbGwgaXNuJ3QgdXNlZCBsYXRlciwgc28gbWFyayBpdCBfX2luaXQuCisgKi8KK2lubGluZSB1bnNpZ25lZCBsb25nIF9faW5pdCBlZmlfZ2V0X3RpbWUodm9pZCkKK3sKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCWVmaV90aW1lX3QgZWZ0OworCWVmaV90aW1lX2NhcF90IGNhcDsKKworCXN0YXR1cyA9IHBoeXNfZWZpX2dldF90aW1lKCZlZnQsICZjYXApOworCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCisJCXByaW50aygiT29wczogZWZpdGltZTogY2FuJ3QgcmVhZCB0aW1lIHN0YXR1czogMHglbHhcbiIsc3RhdHVzKTsKKworCXJldHVybiBta3RpbWUoZWZ0LnllYXIsIGVmdC5tb250aCwgZWZ0LmRheSwgZWZ0LmhvdXIsCisJCQllZnQubWludXRlLCBlZnQuc2Vjb25kKTsKK30KKworaW50IGlzX2F2YWlsYWJsZV9tZW1vcnkoZWZpX21lbW9yeV9kZXNjX3QgKiBtZCkKK3sKKwlpZiAoIShtZC0+YXR0cmlidXRlICYgRUZJX01FTU9SWV9XQikpCisJCXJldHVybiAwOworCisJc3dpdGNoIChtZC0+dHlwZSkgeworCQljYXNlIEVGSV9MT0FERVJfQ09ERToKKwkJY2FzZSBFRklfTE9BREVSX0RBVEE6CisJCWNhc2UgRUZJX0JPT1RfU0VSVklDRVNfQ09ERToKKwkJY2FzZSBFRklfQk9PVF9TRVJWSUNFU19EQVRBOgorCQljYXNlIEVGSV9DT05WRU5USU9OQUxfTUVNT1JZOgorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogV2UgbmVlZCB0byBtYXAgdGhlIEVGSSBtZW1vcnkgbWFwIGFnYWluIGFmdGVyIHBhZ2luZ19pbml0KCkuCisgKi8KK3ZvaWQgX19pbml0IGVmaV9tYXBfbWVtbWFwKHZvaWQpCit7CisJbWVtbWFwLm1hcCA9IE5VTEw7CisKKwltZW1tYXAubWFwID0gKGVmaV9tZW1vcnlfZGVzY190ICopCisJCWJ0X2lvcmVtYXAoKHVuc2lnbmVkIGxvbmcpIG1lbW1hcC5waHlzX21hcCwKKwkJCShtZW1tYXAubnJfbWFwICogc2l6ZW9mKGVmaV9tZW1vcnlfZGVzY190KSkpOworCisJaWYgKG1lbW1hcC5tYXAgPT0gTlVMTCkKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ291bGQgbm90IHJlbWFwIHRoZSBFRkkgbWVtbWFwIVxuIik7Cit9CisKKyNpZiBFRklfREVCVUcKK3N0YXRpYyB2b2lkIF9faW5pdCBwcmludF9lZmlfbWVtbWFwKHZvaWQpCit7CisJZWZpX21lbW9yeV9kZXNjX3QgKm1kOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG1lbW1hcC5ucl9tYXA7IGkrKykgeworCQltZCA9ICZtZW1tYXAubWFwW2ldOworCQlwcmludGsoS0VSTl9JTkZPICJtZW0lMDJ1OiB0eXBlPSV1LCBhdHRyPTB4JWxseCwgIgorCQkJInJhbmdlPVsweCUwMTZsbHgtMHglMDE2bGx4KSAoJWxsdU1CKVxuIiwKKwkJCWksIG1kLT50eXBlLCBtZC0+YXR0cmlidXRlLCBtZC0+cGh5c19hZGRyLAorCQkJbWQtPnBoeXNfYWRkciArIChtZC0+bnVtX3BhZ2VzIDw8IEVGSV9QQUdFX1NISUZUKSwKKwkJCShtZC0+bnVtX3BhZ2VzID4+ICgyMCAtIEVGSV9QQUdFX1NISUZUKSkpOworCX0KK30KKyNlbmRpZiAgLyogIEVGSV9ERUJVRyAgKi8KKworLyoKKyAqIFdhbGtzIHRoZSBFRkkgbWVtb3J5IG1hcCBhbmQgY2FsbHMgQ0FMTEJBQ0sgb25jZSBmb3IgZWFjaCBFRkkKKyAqIG1lbW9yeSBkZXNjcmlwdG9yIHRoYXQgaGFzIG1lbW9yeSB0aGF0IGlzIGF2YWlsYWJsZSBmb3Iga2VybmVsIHVzZS4KKyAqLwordm9pZCBlZmlfbWVtbWFwX3dhbGsoZWZpX2ZyZWVtZW1fY2FsbGJhY2tfdCBjYWxsYmFjaywgdm9pZCAqYXJnKQoreworCWludCBwcmV2X3ZhbGlkID0gMDsKKwlzdHJ1Y3QgcmFuZ2UgeworCQl1bnNpZ25lZCBsb25nIHN0YXJ0OworCQl1bnNpZ25lZCBsb25nIGVuZDsKKwl9IHByZXYsIGN1cnI7CisJZWZpX21lbW9yeV9kZXNjX3QgKm1kOworCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBtZW1tYXAubnJfbWFwOyBpKyspIHsKKwkJbWQgPSAmbWVtbWFwLm1hcFtpXTsKKworCQlpZiAoKG1kLT5udW1fcGFnZXMgPT0gMCkgfHwgKCFpc19hdmFpbGFibGVfbWVtb3J5KG1kKSkpCisJCQljb250aW51ZTsKKworCQljdXJyLnN0YXJ0ID0gbWQtPnBoeXNfYWRkcjsKKwkJY3Vyci5lbmQgPSBjdXJyLnN0YXJ0ICsgKG1kLT5udW1fcGFnZXMgPDwgRUZJX1BBR0VfU0hJRlQpOworCisJCWlmICghcHJldl92YWxpZCkgeworCQkJcHJldiA9IGN1cnI7CisJCQlwcmV2X3ZhbGlkID0gMTsKKwkJfSBlbHNlIHsKKwkJCWlmIChjdXJyLnN0YXJ0IDwgcHJldi5zdGFydCkKKwkJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiVW5vcmRlcmVkIG1lbW9yeSBtYXBcbiIpOworCQkJaWYgKHByZXYuZW5kID09IGN1cnIuc3RhcnQpCisJCQkJcHJldi5lbmQgPSBjdXJyLmVuZDsKKwkJCWVsc2UgeworCQkJCXN0YXJ0ID0KKwkJCQkgICAgKHVuc2lnbmVkIGxvbmcpIChQQUdFX0FMSUdOKHByZXYuc3RhcnQpKTsKKwkJCQllbmQgPSAodW5zaWduZWQgbG9uZykgKHByZXYuZW5kICYgUEFHRV9NQVNLKTsKKwkJCQlpZiAoKGVuZCA+IHN0YXJ0KQorCQkJCSAgICAmJiAoKmNhbGxiYWNrKSAoc3RhcnQsIGVuZCwgYXJnKSA8IDApCisJCQkJCXJldHVybjsKKwkJCQlwcmV2ID0gY3VycjsKKwkJCX0KKwkJfQorCX0KKwlpZiAocHJldl92YWxpZCkgeworCQlzdGFydCA9ICh1bnNpZ25lZCBsb25nKSBQQUdFX0FMSUdOKHByZXYuc3RhcnQpOworCQllbmQgPSAodW5zaWduZWQgbG9uZykgKHByZXYuZW5kICYgUEFHRV9NQVNLKTsKKwkJaWYgKGVuZCA+IHN0YXJ0KQorCQkJKCpjYWxsYmFjaykgKHN0YXJ0LCBlbmQsIGFyZyk7CisJfQorfQorCit2b2lkIF9faW5pdCBlZmlfaW5pdCh2b2lkKQoreworCWVmaV9jb25maWdfdGFibGVfdCAqY29uZmlnX3RhYmxlczsKKwllZmlfcnVudGltZV9zZXJ2aWNlc190ICpydW50aW1lOworCWVmaV9jaGFyMTZfdCAqYzE2OworCWNoYXIgdmVuZG9yWzEwMF0gPSAidW5rbm93biI7CisJdW5zaWduZWQgbG9uZyBudW1fY29uZmlnX3RhYmxlczsKKwlpbnQgaSA9IDA7CisKKwltZW1zZXQoJmVmaSwgMCwgc2l6ZW9mKGVmaSkgKTsKKwltZW1zZXQoJmVmaV9waHlzLCAwLCBzaXplb2YoZWZpX3BoeXMpKTsKKworCWVmaV9waHlzLnN5c3RhYiA9IEVGSV9TWVNUQUI7CisJbWVtbWFwLnBoeXNfbWFwID0gRUZJX01FTU1BUDsKKwltZW1tYXAubnJfbWFwID0gRUZJX01FTU1BUF9TSVpFL0VGSV9NRU1ERVNDX1NJWkU7CisJbWVtbWFwLmRlc2NfdmVyc2lvbiA9IEVGSV9NRU1ERVNDX1ZFUlNJT047CisKKwllZmkuc3lzdGFiID0gKGVmaV9zeXN0ZW1fdGFibGVfdCAqKQorCQlib290X2lvcmVtYXAoKHVuc2lnbmVkIGxvbmcpIGVmaV9waHlzLnN5c3RhYiwKKwkJCXNpemVvZihlZmlfc3lzdGVtX3RhYmxlX3QpKTsKKwkvKgorCSAqIFZlcmlmeSB0aGUgRUZJIFRhYmxlCisJICovCisJaWYgKGVmaS5zeXN0YWIgPT0gTlVMTCkKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiV29haCEgQ291bGRuJ3QgbWFwIHRoZSBFRkkgc3lzdGVtIHRhYmxlLlxuIik7CisJaWYgKGVmaS5zeXN0YWItPmhkci5zaWduYXR1cmUgIT0gRUZJX1NZU1RFTV9UQUJMRV9TSUdOQVRVUkUpCisJCXByaW50ayhLRVJOX0VSUiBQRlggIldvYWghIEVGSSBzeXN0ZW0gdGFibGUgc2lnbmF0dXJlIGluY29ycmVjdFxuIik7CisJaWYgKChlZmkuc3lzdGFiLT5oZHIucmV2aXNpb24gXiBFRklfU1lTVEVNX1RBQkxFX1JFVklTSU9OKSA+PiAxNiAhPSAwKQorCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCSAgICAgICAiV2FybmluZzogRUZJIHN5c3RlbSB0YWJsZSBtYWpvciB2ZXJzaW9uIG1pc21hdGNoOiAiCisJCSAgICAgICAiZ290ICVkLiUwMmQsIGV4cGVjdGVkICVkLiUwMmRcbiIsCisJCSAgICAgICBlZmkuc3lzdGFiLT5oZHIucmV2aXNpb24gPj4gMTYsCisJCSAgICAgICBlZmkuc3lzdGFiLT5oZHIucmV2aXNpb24gJiAweGZmZmYsCisJCSAgICAgICBFRklfU1lTVEVNX1RBQkxFX1JFVklTSU9OID4+IDE2LAorCQkgICAgICAgRUZJX1NZU1RFTV9UQUJMRV9SRVZJU0lPTiAmIDB4ZmZmZik7CisJLyoKKwkgKiBHcmFiIHNvbWUgZGV0YWlscyBmcm9tIHRoZSBzeXN0ZW0gdGFibGUKKwkgKi8KKwludW1fY29uZmlnX3RhYmxlcyA9IGVmaS5zeXN0YWItPm5yX3RhYmxlczsKKwljb25maWdfdGFibGVzID0gKGVmaV9jb25maWdfdGFibGVfdCAqKWVmaS5zeXN0YWItPnRhYmxlczsKKwlydW50aW1lID0gZWZpLnN5c3RhYi0+cnVudGltZTsKKworCS8qCisJICogU2hvdyB3aGF0IHdlIGtub3cgZm9yIHBvc3Rlcml0eQorCSAqLworCWMxNiA9IChlZmlfY2hhcjE2X3QgKikgYm9vdF9pb3JlbWFwKGVmaS5zeXN0YWItPmZ3X3ZlbmRvciwgMik7CisJaWYgKGMxNikgeworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHZlbmRvcikgJiYgKmMxNjsgKytpKQorCQkJdmVuZG9yW2ldID0gKmMxNisrOworCQl2ZW5kb3JbaV0gPSAnXDAnOworCX0gZWxzZQorCQlwcmludGsoS0VSTl9FUlIgUEZYICJDb3VsZCBub3QgbWFwIHRoZSBmaXJtd2FyZSB2ZW5kb3IhXG4iKTsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICJFRkkgdiV1LiUuMDJ1IGJ5ICVzIFxuIiwKKwkgICAgICAgZWZpLnN5c3RhYi0+aGRyLnJldmlzaW9uID4+IDE2LAorCSAgICAgICBlZmkuc3lzdGFiLT5oZHIucmV2aXNpb24gJiAweGZmZmYsIHZlbmRvcik7CisKKwkvKgorCSAqIExldCdzIHNlZSB3aGF0IGNvbmZpZyB0YWJsZXMgdGhlIGZpcm13YXJlIHBhc3NlZCB0byB1cy4KKwkgKi8KKwljb25maWdfdGFibGVzID0gKGVmaV9jb25maWdfdGFibGVfdCAqKQorCQkJCWJvb3RfaW9yZW1hcCgodW5zaWduZWQgbG9uZykgY29uZmlnX3RhYmxlcywKKwkJCSAgICAgICAgbnVtX2NvbmZpZ190YWJsZXMgKiBzaXplb2YoZWZpX2NvbmZpZ190YWJsZV90KSk7CisKKwlpZiAoY29uZmlnX3RhYmxlcyA9PSBOVUxMKQorCQlwcmludGsoS0VSTl9FUlIgUEZYICJDb3VsZCBub3QgbWFwIEVGSSBDb25maWd1cmF0aW9uIFRhYmxlIVxuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvbmZpZ190YWJsZXM7IGkrKykgeworCQlpZiAoZWZpX2d1aWRjbXAoY29uZmlnX3RhYmxlc1tpXS5ndWlkLCBNUFNfVEFCTEVfR1VJRCkgPT0gMCkgeworCQkJZWZpLm1wcyA9ICh2b2lkICopY29uZmlnX3RhYmxlc1tpXS50YWJsZTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiBNUFM9MHglbHggIiwgY29uZmlnX3RhYmxlc1tpXS50YWJsZSk7CisJCX0gZWxzZQorCQkgICAgaWYgKGVmaV9ndWlkY21wKGNvbmZpZ190YWJsZXNbaV0uZ3VpZCwgQUNQSV8yMF9UQUJMRV9HVUlEKSA9PSAwKSB7CisJCQllZmkuYWNwaTIwID0gX192YShjb25maWdfdGFibGVzW2ldLnRhYmxlKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiBBQ1BJIDIuMD0weCVseCAiLCBjb25maWdfdGFibGVzW2ldLnRhYmxlKTsKKwkJfSBlbHNlCisJCSAgICBpZiAoZWZpX2d1aWRjbXAoY29uZmlnX3RhYmxlc1tpXS5ndWlkLCBBQ1BJX1RBQkxFX0dVSUQpID09IDApIHsKKwkJCWVmaS5hY3BpID0gX192YShjb25maWdfdGFibGVzW2ldLnRhYmxlKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiBBQ1BJPTB4JWx4ICIsIGNvbmZpZ190YWJsZXNbaV0udGFibGUpOworCQl9IGVsc2UKKwkJICAgIGlmIChlZmlfZ3VpZGNtcChjb25maWdfdGFibGVzW2ldLmd1aWQsIFNNQklPU19UQUJMRV9HVUlEKSA9PSAwKSB7CisJCQllZmkuc21iaW9zID0gKHZvaWQgKikgY29uZmlnX3RhYmxlc1tpXS50YWJsZTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiBTTUJJT1M9MHglbHggIiwgY29uZmlnX3RhYmxlc1tpXS50YWJsZSk7CisJCX0gZWxzZQorCQkgICAgaWYgKGVmaV9ndWlkY21wKGNvbmZpZ190YWJsZXNbaV0uZ3VpZCwgSENEUF9UQUJMRV9HVUlEKSA9PSAwKSB7CisJCQllZmkuaGNkcCA9ICh2b2lkICopY29uZmlnX3RhYmxlc1tpXS50YWJsZTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiBIQ0RQPTB4JWx4ICIsIGNvbmZpZ190YWJsZXNbaV0udGFibGUpOworCQl9IGVsc2UKKwkJICAgIGlmIChlZmlfZ3VpZGNtcChjb25maWdfdGFibGVzW2ldLmd1aWQsIFVHQV9JT19QUk9UT0NPTF9HVUlEKSA9PSAwKSB7CisJCQllZmkudWdhID0gKHZvaWQgKiljb25maWdfdGFibGVzW2ldLnRhYmxlOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiIFVHQT0weCVseCAiLCBjb25maWdfdGFibGVzW2ldLnRhYmxlKTsKKwkJfQorCX0KKwlwcmludGsoIlxuIik7CisKKwkvKgorCSAqIENoZWNrIG91dCB0aGUgcnVudGltZSBzZXJ2aWNlcyB0YWJsZS4gV2UgbmVlZCB0byBtYXAKKwkgKiB0aGUgcnVudGltZSBzZXJ2aWNlcyB0YWJsZSBzbyB0aGF0IHdlIGNhbiBncmFiIHRoZSBwaHlzaWNhbAorCSAqIGFkZHJlc3Mgb2Ygc2V2ZXJhbCBvZiB0aGUgRUZJIHJ1bnRpbWUgZnVuY3Rpb25zLCBuZWVkZWQgdG8KKwkgKiBzZXQgdGhlIGZpcm13YXJlIGludG8gdmlydHVhbCBtb2RlLgorCSAqLworCisJcnVudGltZSA9IChlZmlfcnVudGltZV9zZXJ2aWNlc190ICopIGJvb3RfaW9yZW1hcCgodW5zaWduZWQgbG9uZykKKwkJCQkJCXJ1bnRpbWUsCisJCQkJICAgICAgCQlzaXplb2YoZWZpX3J1bnRpbWVfc2VydmljZXNfdCkpOworCWlmIChydW50aW1lICE9IE5VTEwpIHsKKwkJLyoKKwkgCSAqIFdlIHdpbGwgb25seSBuZWVkICplYXJseSogYWNjZXNzIHRvIHRoZSBmb2xsb3dpbmcKKwkJICogdHdvIEVGSSBydW50aW1lIHNlcnZpY2VzIGJlZm9yZSBzZXRfdmlydHVhbF9hZGRyZXNzX21hcAorCQkgKiBpcyBpbnZva2VkLgorIAkgCSAqLworCQllZmlfcGh5cy5nZXRfdGltZSA9IChlZmlfZ2V0X3RpbWVfdCAqKSBydW50aW1lLT5nZXRfdGltZTsKKwkJZWZpX3BoeXMuc2V0X3ZpcnR1YWxfYWRkcmVzc19tYXAgPQorCQkJKGVmaV9zZXRfdmlydHVhbF9hZGRyZXNzX21hcF90ICopCisJCQkJcnVudGltZS0+c2V0X3ZpcnR1YWxfYWRkcmVzc19tYXA7CisJfSBlbHNlCisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNvdWxkIG5vdCBtYXAgdGhlIHJ1bnRpbWUgc2VydmljZSB0YWJsZSFcbiIpOworCisJLyogTWFwIHRoZSBFRkkgbWVtb3J5IG1hcCBmb3IgdXNlIHVudGlsIHBhZ2luZ19pbml0KCkgKi8KKworCW1lbW1hcC5tYXAgPSAoZWZpX21lbW9yeV9kZXNjX3QgKikKKwkJYm9vdF9pb3JlbWFwKCh1bnNpZ25lZCBsb25nKSBFRklfTUVNTUFQLCBFRklfTUVNTUFQX1NJWkUpOworCisJaWYgKG1lbW1hcC5tYXAgPT0gTlVMTCkKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ291bGQgbm90IG1hcCB0aGUgRUZJIG1lbW9yeSBtYXAhXG4iKTsKKworCWlmIChFRklfTUVNREVTQ19TSVpFICE9IHNpemVvZihlZmlfbWVtb3J5X2Rlc2NfdCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIldhcm5pbmchIEtlcm5lbC1kZWZpbmVkIG1lbWRlc2MgZG9lc24ndCAiCisJCQkgICAibWF0Y2ggdGhlIG9uZSBmcm9tIEVGSSFcbiIpOworCX0KKyNpZiBFRklfREVCVUcKKwlwcmludF9lZmlfbWVtbWFwKCk7CisjZW5kaWYKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBzd2l0Y2ggdGhlIEVGSSBydW50aW1lIHNlcnZpY2VzIHRvIHZpcnR1YWwgbW9kZS4KKyAqIEVzc2VudGlhbGx5LCBsb29rIHRocm91Z2ggdGhlIEVGSSBtZW1tYXAgYW5kIG1hcCBldmVyeSByZWdpb24gdGhhdAorICogaGFzIHRoZSBydW50aW1lIGF0dHJpYnV0ZSBiaXQgc2V0IGluIGl0cyBtZW1vcnkgZGVzY3JpcHRvciBhbmQgdXBkYXRlCisgKiB0aGF0IG1lbW9yeSBkZXNjcmlwdG9yIHdpdGggdGhlIHZpcnR1YWwgYWRkcmVzcyBvYnRhaW5lZCBmcm9tIGlvcmVtYXAoKS4KKyAqIFRoaXMgZW5hYmxlcyB0aGUgcnVudGltZSBzZXJ2aWNlcyB0byBiZSBjYWxsZWQgd2l0aG91dCBoYXZpbmcgdG8KKyAqIHRodW5rIGJhY2sgaW50byBwaHlzaWNhbCBtb2RlIGZvciBldmVyeSBpbnZvY2F0aW9uLgorICovCisKK3ZvaWQgX19pbml0IGVmaV9lbnRlcl92aXJ0dWFsX21vZGUodm9pZCkKK3sKKwllZmlfbWVtb3J5X2Rlc2NfdCAqbWQ7CisJZWZpX3N0YXR1c190IHN0YXR1czsKKwlpbnQgaTsKKworCWVmaS5zeXN0YWIgPSBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IG1lbW1hcC5ucl9tYXA7IGkrKykgeworCQltZCA9ICZtZW1tYXAubWFwW2ldOworCisJCWlmIChtZC0+YXR0cmlidXRlICYgRUZJX01FTU9SWV9SVU5USU1FKSB7CisJCQltZC0+dmlydF9hZGRyID0KKwkJCQkodW5zaWduZWQgbG9uZylpb3JlbWFwKG1kLT5waHlzX2FkZHIsCisJCQkJCW1kLT5udW1fcGFnZXMgPDwgRUZJX1BBR0VfU0hJRlQpOworCQkJaWYgKCEodW5zaWduZWQgbG9uZyltZC0+dmlydF9hZGRyKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiaW9yZW1hcCBvZiAweCVsWCBmYWlsZWRcbiIsCisJCQkJCSh1bnNpZ25lZCBsb25nKW1kLT5waHlzX2FkZHIpOworCQkJfQorCisJCQlpZiAoKCh1bnNpZ25lZCBsb25nKW1kLT5waHlzX2FkZHIgPD0KKwkJCQkJKHVuc2lnbmVkIGxvbmcpZWZpX3BoeXMuc3lzdGFiKSAmJgorCQkJCSgodW5zaWduZWQgbG9uZyllZmlfcGh5cy5zeXN0YWIgPAorCQkJCQltZC0+cGh5c19hZGRyICsKKwkJCQkJKCh1bnNpZ25lZCBsb25nKW1kLT5udW1fcGFnZXMgPDwKKwkJCQkJCUVGSV9QQUdFX1NISUZUKSkpIHsKKwkJCQl1bnNpZ25lZCBsb25nIGFkZHI7CisKKwkJCQlhZGRyID0gbWQtPnZpcnRfYWRkciAtIG1kLT5waHlzX2FkZHIgKworCQkJCQkJKHVuc2lnbmVkIGxvbmcpZWZpX3BoeXMuc3lzdGFiOworCQkJCWVmaS5zeXN0YWIgPSAoZWZpX3N5c3RlbV90YWJsZV90ICopYWRkcjsKKwkJCX0KKwkJfQorCX0KKworCWlmICghZWZpLnN5c3RhYikKKwkJQlVHKCk7CisKKwlzdGF0dXMgPSBwaHlzX2VmaV9zZXRfdmlydHVhbF9hZGRyZXNzX21hcCgKKwkJCXNpemVvZihlZmlfbWVtb3J5X2Rlc2NfdCkgKiBtZW1tYXAubnJfbWFwLAorCQkJc2l6ZW9mKGVmaV9tZW1vcnlfZGVzY190KSwKKwkJCW1lbW1hcC5kZXNjX3ZlcnNpb24sCisJCSAgICAgICAJbWVtbWFwLnBoeXNfbWFwKTsKKworCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHsKKwkJcHJpbnRrIChLRVJOX0FMRVJUICJZb3UgYXJlIHNjcmV3ZWQhICIKKwkJCSJVbmFibGUgdG8gc3dpdGNoIEVGSSBpbnRvIHZpcnR1YWwgbW9kZSAiCisJCQkiKHN0YXR1cz0lbHgpXG4iLCBzdGF0dXMpOworCQlwYW5pYygiRUZJIGNhbGwgdG8gU2V0VmlydHVhbEFkZHJlc3NNYXAoKSBmYWlsZWQhIik7CisJfQorCisJLyoKKwkgKiBOb3cgdGhhdCBFRkkgaXMgaW4gdmlydHVhbCBtb2RlLCB1cGRhdGUgdGhlIGZ1bmN0aW9uCisJICogcG9pbnRlcnMgaW4gdGhlIHJ1bnRpbWUgc2VydmljZSB0YWJsZSB0byB0aGUgbmV3IHZpcnR1YWwgYWRkcmVzc2VzLgorCSAqLworCisJZWZpLmdldF90aW1lID0gKGVmaV9nZXRfdGltZV90ICopIGVmaS5zeXN0YWItPnJ1bnRpbWUtPmdldF90aW1lOworCWVmaS5zZXRfdGltZSA9IChlZmlfc2V0X3RpbWVfdCAqKSBlZmkuc3lzdGFiLT5ydW50aW1lLT5zZXRfdGltZTsKKwllZmkuZ2V0X3dha2V1cF90aW1lID0gKGVmaV9nZXRfd2FrZXVwX3RpbWVfdCAqKQorCQkJCQllZmkuc3lzdGFiLT5ydW50aW1lLT5nZXRfd2FrZXVwX3RpbWU7CisJZWZpLnNldF93YWtldXBfdGltZSA9IChlZmlfc2V0X3dha2V1cF90aW1lX3QgKikKKwkJCQkJZWZpLnN5c3RhYi0+cnVudGltZS0+c2V0X3dha2V1cF90aW1lOworCWVmaS5nZXRfdmFyaWFibGUgPSAoZWZpX2dldF92YXJpYWJsZV90ICopCisJCQkJCWVmaS5zeXN0YWItPnJ1bnRpbWUtPmdldF92YXJpYWJsZTsKKwllZmkuZ2V0X25leHRfdmFyaWFibGUgPSAoZWZpX2dldF9uZXh0X3ZhcmlhYmxlX3QgKikKKwkJCQkJZWZpLnN5c3RhYi0+cnVudGltZS0+Z2V0X25leHRfdmFyaWFibGU7CisJZWZpLnNldF92YXJpYWJsZSA9IChlZmlfc2V0X3ZhcmlhYmxlX3QgKikKKwkJCQkJZWZpLnN5c3RhYi0+cnVudGltZS0+c2V0X3ZhcmlhYmxlOworCWVmaS5nZXRfbmV4dF9oaWdoX21vbm9fY291bnQgPSAoZWZpX2dldF9uZXh0X2hpZ2hfbW9ub19jb3VudF90ICopCisJCQkJCWVmaS5zeXN0YWItPnJ1bnRpbWUtPmdldF9uZXh0X2hpZ2hfbW9ub19jb3VudDsKKwllZmkucmVzZXRfc3lzdGVtID0gKGVmaV9yZXNldF9zeXN0ZW1fdCAqKQorCQkJCQllZmkuc3lzdGFiLT5ydW50aW1lLT5yZXNldF9zeXN0ZW07Cit9CisKK3ZvaWQgX19pbml0CitlZmlfaW5pdGlhbGl6ZV9pb21lbV9yZXNvdXJjZXMoc3RydWN0IHJlc291cmNlICpjb2RlX3Jlc291cmNlLAorCQkJICAgICAgIHN0cnVjdCByZXNvdXJjZSAqZGF0YV9yZXNvdXJjZSkKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwllZmlfbWVtb3J5X2Rlc2NfdCAqbWQ7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWVtbWFwLm5yX21hcDsgaSsrKSB7CisJCW1kID0gJm1lbW1hcC5tYXBbaV07CisKKwkJaWYgKChtZC0+cGh5c19hZGRyICsgKG1kLT5udW1fcGFnZXMgPDwgRUZJX1BBR0VfU0hJRlQpKSA+CisJCSAgICAweDEwMDAwMDAwMFVMTCkKKwkJCWNvbnRpbnVlOworCQlyZXMgPSBhbGxvY19ib290bWVtX2xvdyhzaXplb2Yoc3RydWN0IHJlc291cmNlKSk7CisJCXN3aXRjaCAobWQtPnR5cGUpIHsKKwkJY2FzZSBFRklfUkVTRVJWRURfVFlQRToKKwkJCXJlcy0+bmFtZSA9ICJSZXNlcnZlZCBNZW1vcnkiOworCQkJYnJlYWs7CisJCWNhc2UgRUZJX0xPQURFUl9DT0RFOgorCQkJcmVzLT5uYW1lID0gIkxvYWRlciBDb2RlIjsKKwkJCWJyZWFrOworCQljYXNlIEVGSV9MT0FERVJfREFUQToKKwkJCXJlcy0+bmFtZSA9ICJMb2FkZXIgRGF0YSI7CisJCQlicmVhazsKKwkJY2FzZSBFRklfQk9PVF9TRVJWSUNFU19EQVRBOgorCQkJcmVzLT5uYW1lID0gIkJvb3RTZXJ2aWNlcyBEYXRhIjsKKwkJCWJyZWFrOworCQljYXNlIEVGSV9CT09UX1NFUlZJQ0VTX0NPREU6CisJCQlyZXMtPm5hbWUgPSAiQm9vdFNlcnZpY2VzIENvZGUiOworCQkJYnJlYWs7CisJCWNhc2UgRUZJX1JVTlRJTUVfU0VSVklDRVNfQ09ERToKKwkJCXJlcy0+bmFtZSA9ICJSdW50aW1lIFNlcnZpY2UgQ29kZSI7CisJCQlicmVhazsKKwkJY2FzZSBFRklfUlVOVElNRV9TRVJWSUNFU19EQVRBOgorCQkJcmVzLT5uYW1lID0gIlJ1bnRpbWUgU2VydmljZSBEYXRhIjsKKwkJCWJyZWFrOworCQljYXNlIEVGSV9DT05WRU5USU9OQUxfTUVNT1JZOgorCQkJcmVzLT5uYW1lID0gIkNvbnZlbnRpb25hbCBNZW1vcnkiOworCQkJYnJlYWs7CisJCWNhc2UgRUZJX1VOVVNBQkxFX01FTU9SWToKKwkJCXJlcy0+bmFtZSA9ICJVbnVzYWJsZSBNZW1vcnkiOworCQkJYnJlYWs7CisJCWNhc2UgRUZJX0FDUElfUkVDTEFJTV9NRU1PUlk6CisJCQlyZXMtPm5hbWUgPSAiQUNQSSBSZWNsYWltIjsKKwkJCWJyZWFrOworCQljYXNlIEVGSV9BQ1BJX01FTU9SWV9OVlM6CisJCQlyZXMtPm5hbWUgPSAiQUNQSSBOVlMiOworCQkJYnJlYWs7CisJCWNhc2UgRUZJX01FTU9SWV9NQVBQRURfSU86CisJCQlyZXMtPm5hbWUgPSAiTWVtb3J5IE1hcHBlZCBJTyI7CisJCQlicmVhazsKKwkJY2FzZSBFRklfTUVNT1JZX01BUFBFRF9JT19QT1JUX1NQQUNFOgorCQkJcmVzLT5uYW1lID0gIk1lbW9yeSBNYXBwZWQgSU8gUG9ydCBTcGFjZSI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJlcy0+bmFtZSA9ICJSZXNlcnZlZCI7CisJCQlicmVhazsKKwkJfQorCQlyZXMtPnN0YXJ0ID0gbWQtPnBoeXNfYWRkcjsKKwkJcmVzLT5lbmQgPSByZXMtPnN0YXJ0ICsgKChtZC0+bnVtX3BhZ2VzIDw8IEVGSV9QQUdFX1NISUZUKSAtIDEpOworCQlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9NRU0gfCBJT1JFU09VUkNFX0JVU1k7CisJCWlmIChyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgcmVzKSA8IDApCisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJGYWlsZWQgdG8gYWxsb2NhdGUgcmVzICVzIDogMHglbHgtMHglbHhcbiIsCisJCQkJcmVzLT5uYW1lLCByZXMtPnN0YXJ0LCByZXMtPmVuZCk7CisJCS8qCisJCSAqIFdlIGRvbid0IGtub3cgd2hpY2ggcmVnaW9uIGNvbnRhaW5zIGtlcm5lbCBkYXRhIHNvIHdlIHRyeQorCQkgKiBpdCByZXBlYXRlZGx5IGFuZCBsZXQgdGhlIHJlc291cmNlIG1hbmFnZXIgdGVzdCBpdC4KKwkJICovCisJCWlmIChtZC0+dHlwZSA9PSBFRklfQ09OVkVOVElPTkFMX01FTU9SWSkgeworCQkJcmVxdWVzdF9yZXNvdXJjZShyZXMsIGNvZGVfcmVzb3VyY2UpOworCQkJcmVxdWVzdF9yZXNvdXJjZShyZXMsIGRhdGFfcmVzb3VyY2UpOworCQl9CisJfQorfQorCisvKgorICogQ29udmVuaWVuY2UgZnVuY3Rpb25zIHRvIG9idGFpbiBtZW1vcnkgdHlwZXMgYW5kIGF0dHJpYnV0ZXMKKyAqLworCit1MzIgZWZpX21lbV90eXBlKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyKQoreworCWVmaV9tZW1vcnlfZGVzY190ICptZDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBtZW1tYXAubnJfbWFwOyBpKyspIHsKKwkJbWQgPSAmbWVtbWFwLm1hcFtpXTsKKwkJaWYgKChtZC0+cGh5c19hZGRyIDw9IHBoeXNfYWRkcikgJiYgKHBoeXNfYWRkciA8CisJCQkobWQtPnBoeXNfYWRkciArIChtZC0+IG51bV9wYWdlcyA8PCBFRklfUEFHRV9TSElGVCkpICkpCisJCQlyZXR1cm4gbWQtPnR5cGU7CisJfQorCXJldHVybiAwOworfQorCit1NjQgZWZpX21lbV9hdHRyaWJ1dGVzKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyKQoreworCWVmaV9tZW1vcnlfZGVzY190ICptZDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBtZW1tYXAubnJfbWFwOyBpKyspIHsKKwkJbWQgPSAmbWVtbWFwLm1hcFtpXTsKKwkJaWYgKChtZC0+cGh5c19hZGRyIDw9IHBoeXNfYWRkcikgJiYgKHBoeXNfYWRkciA8CisJCQkobWQtPnBoeXNfYWRkciArIChtZC0+IG51bV9wYWdlcyA8PCBFRklfUEFHRV9TSElGVCkpICkpCisJCQlyZXR1cm4gbWQtPmF0dHJpYnV0ZTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2VmaV9zdHViLlMgYi9hcmNoL2kzODYva2VybmVsL2VmaV9zdHViLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhjMDMxMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvZWZpX3N0dWIuUwpAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIEVGSSBjYWxsIHN0dWIgZm9yIElBMzIuCisgKgorICogVGhpcyBzdHViIGFsbG93cyB1cyB0byBtYWtlIEVGSSBjYWxscyBpbiBwaHlzaWNhbCBtb2RlIHdpdGggaW50ZXJydXB0cworICogdHVybmVkIG9mZi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKworLyoKKyAqIGVmaV9jYWxsX3BoeXModm9pZCAqLCAuLi4pIGlzIGEgZnVuY3Rpb24gd2l0aCB2YXJpYWJsZSBwYXJhbWV0ZXJzLgorICogQWxsIHRoZSBjYWxsZXJzIG9mIHRoaXMgZnVuY3Rpb24gYXNzdXJlIHRoYXQgYWxsIHRoZSBwYXJhbWV0ZXJzIGFyZSA0LWJ5dGVzLgorICovCisKKy8qCisgKiBJbiBnY2MgY2FsbGluZyBjb252ZW50aW9uLCBFQlgsIEVTUCwgRUJQLCBFU0kgYW5kIEVESSBhcmUgYWxsIGNhbGxlZSBzYXZlLgorICogU28gd2UnZCBiZXR0ZXIgc2F2ZSBhbGwgb2YgdGhlbSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgZnVuY3Rpb24gYW5kIHJlc3RvcmUKKyAqIGF0IHRoZSBlbmQgbm8gbWF0dGVyIGhvdyBtYW55IHdlIHVzZSwgYmVjYXVzZSB3ZSBjYW4gbm90IGFzc3VyZSBFRkkgcnVudGltZQorICogc2VydmljZSBmdW5jdGlvbnMgd2lsbCBjb21wbHkgd2l0aCBnY2MgY2FsbGluZyBjb252ZW50aW9uLCB0b28uCisgKi8KKworLnRleHQKK0VOVFJZKGVmaV9jYWxsX3BoeXMpCisJLyoKKwkgKiAwLiBUaGUgZnVuY3Rpb24gY2FuIG9ubHkgYmUgY2FsbGVkIGluIExpbnV4IGtlcm5lbC4gU28gQ1MgaGFzIGJlZW4KKwkgKiBzZXQgdG8gMHgwMDEwLCBEUyBhbmQgU1MgaGF2ZSBiZWVuIHNldCB0byAweDAwMTguIEluIEVGSSwgSSBmb3VuZAorCSAqIHRoZSB2YWx1ZXMgb2YgdGhlc2UgcmVnaXN0ZXJzIGFyZSB0aGUgc2FtZS4gQW5kLCB0aGUgY29ycmVzcG9uZGluZworCSAqIEdEVCBlbnRyaWVzIGFyZSBpZGVudGljYWwuIFNvIEkgd2lsbCBkbyBub3RoaW5nIGFib3V0IHNlZ21lbnQgcmVnCisJICogYW5kIEdEVCwgYnV0IGNoYW5nZSBHRFQgYmFzZSByZWdpc3RlciBpbiBwcmVsb2cgYW5kIGVwaWxvZy4KKwkgKi8KKworCS8qCisJICogMS4gTm93IEkgYW0gcnVubmluZyB3aXRoIEVJUCA9IDxwaHlzaWNhbCBhZGRyZXNzPiArIFBBR0VfT0ZGU0VULgorCSAqIEJ1dCB0byBtYWtlIGl0IHNtb290aGx5IHN3aXRjaCBmcm9tIHZpcnR1YWwgbW9kZSB0byBmbGF0IG1vZGUuCisJICogVGhlIG1hcHBpbmcgb2YgbG93ZXIgdmlydHVhbCBtZW1vcnkgaGFzIGJlZW4gY3JlYXRlZCBpbiBwcmVsb2cgYW5kCisJICogZXBpbG9nLgorCSAqLworCW1vdmwJJDFmLCAlZWR4CisJc3VibAkkX19QQUdFX09GRlNFVCwgJWVkeAorCWptcAkqJWVkeAorMToKKworCS8qCisJICogMi4gTm93IG9uIHRoZSB0b3Agb2Ygc3RhY2sgaXMgdGhlIHJldHVybgorCSAqIGFkZHJlc3MgaW4gdGhlIGNhbGxlciBvZiBlZmlfY2FsbF9waHlzKCksIHRoZW4gcGFyYW1ldGVyIDEsCisJICogcGFyYW1ldGVyIDIsIC4uLiwgcGFyYW0gbi4gVG8gbWFrZSB0aGluZ3MgZWFzeSwgd2Ugc2F2ZSB0aGUgcmV0dXJuCisJICogYWRkcmVzcyBvZiBlZmlfY2FsbF9waHlzIGluIGEgZ2xvYmFsIHZhcmlhYmxlLgorCSAqLworCXBvcGwJJWVkeAorCW1vdmwJJWVkeCwgc2F2ZWRfcmV0dXJuX2FkZHIKKwkvKiBnZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgaW50byBFQ1gqLworCXBvcGwJJWVjeAorCW1vdmwJJWVjeCwgZWZpX3J0X2Z1bmN0aW9uX3B0cgorCW1vdmwJJDJmLCAlZWR4CisJc3VibAkkX19QQUdFX09GRlNFVCwgJWVkeAorCXB1c2hsCSVlZHgKKworCS8qCisJICogMy4gQ2xlYXIgUEcgYml0IGluICVDUjAuCisJICovCisJbW92bAklY3IwLCAlZWR4CisJYW5kbAkkMHg3ZmZmZmZmZiwgJWVkeAorCW1vdmwJJWVkeCwgJWNyMAorCWptcAkxZgorMToKKworCS8qCisJICogNC4gQWRqdXN0IHN0YWNrIHBvaW50ZXIuCisJICovCisJc3VibAkkX19QQUdFX09GRlNFVCwgJWVzcAorCisJLyoKKwkgKiA1LiBDYWxsIHRoZSBwaHlzaWNhbCBmdW5jdGlvbi4KKwkgKi8KKwlqbXAJKiVlY3gKKworMjoKKwkvKgorCSAqIDYuIEFmdGVyIEVGSSBydW50aW1lIHNlcnZpY2UgcmV0dXJucywgY29udHJvbCB3aWxsIHJldHVybiB0bworCSAqIGZvbGxvd2luZyBpbnN0cnVjdGlvbi4gV2UnZCBiZXR0ZXIgcmVhZGp1c3Qgc3RhY2sgcG9pbnRlciBmaXJzdC4KKwkgKi8KKwlhZGRsCSRfX1BBR0VfT0ZGU0VULCAlZXNwCisKKwkvKgorCSAqIDcuIFJlc3RvcmUgUEcgYml0CisJICovCisJbW92bAklY3IwLCAlZWR4CisJb3JsCSQweDgwMDAwMDAwLCAlZWR4CisJbW92bAklZWR4LCAlY3IwCisJam1wCTFmCisxOgorCS8qCisJICogOC4gTm93IHJlc3RvcmUgdGhlIHZpcnR1YWwgbW9kZSBmcm9tIGZsYXQgbW9kZSBieQorCSAqIGFkZGluZyBFSVAgd2l0aCBQQUdFX09GRlNFVC4KKwkgKi8KKwltb3ZsCSQxZiwgJWVkeAorCWptcAkqJWVkeAorMToKKworCS8qCisJICogOS4gQmFsYW5jZSB0aGUgc3RhY2suIEFuZCBiZWNhdXNlIEVBWCBjb250YWluIHRoZSByZXR1cm4gdmFsdWUsCisJICogd2UnZCBiZXR0ZXIgbm90IGNsb2JiZXIgaXQuCisJICovCisJbGVhbAllZmlfcnRfZnVuY3Rpb25fcHRyLCAlZWR4CisJbW92bAkoJWVkeCksICVlY3gKKwlwdXNobAklZWN4CisKKwkvKgorCSAqIDEwLiBQdXNoIHRoZSBzYXZlZCByZXR1cm4gYWRkcmVzcyBvbnRvIHRoZSBzdGFjayBhbmQgcmV0dXJuLgorCSAqLworCWxlYWwJc2F2ZWRfcmV0dXJuX2FkZHIsICVlZHgKKwltb3ZsCSglZWR4KSwgJWVjeAorCXB1c2hsCSVlY3gKKwlyZXQKKy5wcmV2aW91cworCisuZGF0YQorc2F2ZWRfcmV0dXJuX2FkZHI6CisJLmxvbmcgMAorZWZpX3J0X2Z1bmN0aW9uX3B0cjoKKwkubG9uZyAwCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2VudHJ5LlMgYi9hcmNoL2kzODYva2VybmVsL2VudHJ5LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU0NWZmMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvZW50cnkuUwpAQCAtMCwwICsxLDk1MCBAQAorLyoKKyAqICBsaW51eC9hcmNoL2kzODYvZW50cnkuUworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKi8KKworLyoKKyAqIGVudHJ5LlMgY29udGFpbnMgdGhlIHN5c3RlbS1jYWxsIGFuZCBmYXVsdCBsb3ctbGV2ZWwgaGFuZGxpbmcgcm91dGluZXMuCisgKiBUaGlzIGFsc28gY29udGFpbnMgdGhlIHRpbWVyLWludGVycnVwdCBoYW5kbGVyLCBhcyB3ZWxsIGFzIGFsbCBpbnRlcnJ1cHRzCisgKiBhbmQgZmF1bHRzIHRoYXQgY2FuIHJlc3VsdCBpbiBhIHRhc2stc3dpdGNoLgorICoKKyAqIE5PVEU6IFRoaXMgY29kZSBoYW5kbGVzIHNpZ25hbC1yZWNvZ25pdGlvbiwgd2hpY2ggaGFwcGVucyBldmVyeSB0aW1lCisgKiBhZnRlciBhIHRpbWVyLWludGVycnVwdCBhbmQgYWZ0ZXIgZWFjaCBzeXN0ZW0gY2FsbC4KKyAqCisgKiBJIGNoYW5nZWQgYWxsIHRoZSAuYWxpZ24ncyB0byA0ICgxNiBieXRlIGFsaWdubWVudCksIGFzIHRoYXQncyBmYXN0ZXIKKyAqIG9uIGEgNDg2LgorICoKKyAqIFN0YWNrIGxheW91dCBpbiAncmV0X2Zyb21fc3lzdGVtX2NhbGwnOgorICogCXB0cmFjZSBuZWVkcyB0byBoYXZlIGFsbCByZWdzIG9uIHRoZSBzdGFjay4KKyAqCWlmIHRoZSBvcmRlciBoZXJlIGlzIGNoYW5nZWQsIGl0IG5lZWRzIHRvIGJlCisgKgl1cGRhdGVkIGluIGZvcmsuYzpjb3B5X3Byb2Nlc3MsIHNpZ25hbC5jOmRvX3NpZ25hbCwKKyAqCXB0cmFjZS5jIGFuZCBwdHJhY2UuaAorICoKKyAqCSAwKCVlc3ApIC0gJWVieAorICoJIDQoJWVzcCkgLSAlZWN4CisgKgkgOCglZXNwKSAtICVlZHgKKyAqICAgICAgIEMoJWVzcCkgLSAlZXNpCisgKgkxMCglZXNwKSAtICVlZGkKKyAqCTE0KCVlc3ApIC0gJWVicAorICoJMTgoJWVzcCkgLSAlZWF4CisgKgkxQyglZXNwKSAtICVkcworICoJMjAoJWVzcCkgLSAlZXMKKyAqCTI0KCVlc3ApIC0gb3JpZ19lYXgKKyAqCTI4KCVlc3ApIC0gJWVpcAorICoJMkMoJWVzcCkgLSAlY3MKKyAqCTMwKCVlc3ApIC0gJWVmbGFncworICoJMzQoJWVzcCkgLSAlb2xkZXNwCisgKgkzOCglZXNwKSAtICVvbGRzcworICoKKyAqICJjdXJyZW50IiBpcyBpbiByZWdpc3RlciAlZWJ4IGR1cmluZyBhbnkgc2xvdyBlbnRyaWVzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisjaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KKyNpbmNsdWRlIDxhc20vc21wLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vZGVzYy5oPgorI2luY2x1ZGUgImlycV92ZWN0b3JzLmgiCisKKyNkZWZpbmUgbnJfc3lzY2FsbHMgKChzeXNjYWxsX3RhYmxlX3NpemUpLzQpCisKK0VCWAkJPSAweDAwCitFQ1gJCT0gMHgwNAorRURYCQk9IDB4MDgKK0VTSQkJPSAweDBDCitFREkJCT0gMHgxMAorRUJQCQk9IDB4MTQKK0VBWAkJPSAweDE4CitEUwkJPSAweDFDCitFUwkJPSAweDIwCitPUklHX0VBWAk9IDB4MjQKK0VJUAkJPSAweDI4CitDUwkJPSAweDJDCitFRkxBR1MJCT0gMHgzMAorT0xERVNQCQk9IDB4MzQKK09MRFNTCQk9IDB4MzgKKworQ0ZfTUFTSwkJPSAweDAwMDAwMDAxCitURl9NQVNLCQk9IDB4MDAwMDAxMDAKK0lGX01BU0sJCT0gMHgwMDAwMDIwMAorREZfTUFTSwkJPSAweDAwMDAwNDAwIAorTlRfTUFTSwkJPSAweDAwMDA0MDAwCitWTV9NQVNLCQk9IDB4MDAwMjAwMDAKKworI2lmZGVmIENPTkZJR19QUkVFTVBUCisjZGVmaW5lIHByZWVtcHRfc3RvcAkJY2xpCisjZWxzZQorI2RlZmluZSBwcmVlbXB0X3N0b3AKKyNkZWZpbmUgcmVzdW1lX2tlcm5lbAkJcmVzdG9yZV9ub2NoZWNrCisjZW5kaWYKKworI2RlZmluZSBTQVZFX0FMTCBcCisJY2xkOyBcCisJcHVzaGwgJWVzOyBcCisJcHVzaGwgJWRzOyBcCisJcHVzaGwgJWVheDsgXAorCXB1c2hsICVlYnA7IFwKKwlwdXNobCAlZWRpOyBcCisJcHVzaGwgJWVzaTsgXAorCXB1c2hsICVlZHg7IFwKKwlwdXNobCAlZWN4OyBcCisJcHVzaGwgJWVieDsgXAorCW1vdmwgJChfX1VTRVJfRFMpLCAlZWR4OyBcCisJbW92bCAlZWR4LCAlZHM7IFwKKwltb3ZsICVlZHgsICVlczsKKworI2RlZmluZSBSRVNUT1JFX0lOVF9SRUdTIFwKKwlwb3BsICVlYng7CVwKKwlwb3BsICVlY3g7CVwKKwlwb3BsICVlZHg7CVwKKwlwb3BsICVlc2k7CVwKKwlwb3BsICVlZGk7CVwKKwlwb3BsICVlYnA7CVwKKwlwb3BsICVlYXgKKworI2RlZmluZSBSRVNUT1JFX1JFR1MJXAorCVJFU1RPUkVfSU5UX1JFR1M7IFwKKzE6CXBvcGwgJWRzOwlcCisyOglwb3BsICVlczsJXAorLnNlY3Rpb24gLmZpeHVwLCJheCI7CVwKKzM6CW1vdmwgJDAsKCVlc3ApOwlcCisJam1wIDFiOwkJXAorNDoJbW92bCAkMCwoJWVzcCk7CVwKKwlqbXAgMmI7CQlcCisucHJldmlvdXM7CQlcCisuc2VjdGlvbiBfX2V4X3RhYmxlLCJhIjtcCisJLmFsaWduIDQ7CVwKKwkubG9uZyAxYiwzYjsJXAorCS5sb25nIDJiLDRiOwlcCisucHJldmlvdXMKKworCitFTlRSWShyZXRfZnJvbV9mb3JrKQorCXB1c2hsICVlYXgKKwljYWxsIHNjaGVkdWxlX3RhaWwKKwlHRVRfVEhSRUFEX0lORk8oJWVicCkKKwlwb3BsICVlYXgKKwlqbXAgc3lzY2FsbF9leGl0CisKKy8qCisgKiBSZXR1cm4gdG8gdXNlciBtb2RlIGlzIG5vdCBhcyBjb21wbGV4IGFzIGFsbCB0aGlzIGxvb2tzLAorICogYnV0IHdlIHdhbnQgdGhlIGRlZmF1bHQgcGF0aCBmb3IgYSBzeXN0ZW0gY2FsbCByZXR1cm4gdG8KKyAqIGdvIGFzIHF1aWNrbHkgYXMgcG9zc2libGUgd2hpY2ggaXMgd2h5IHNvbWUgb2YgdGhpcyBpcworICogbGVzcyBjbGVhciB0aGFuIGl0IG90aGVyd2lzZSBzaG91bGQgYmUuCisgKi8KKworCSMgdXNlcnNwYWNlIHJlc3VtcHRpb24gc3R1YiBieXBhc3Npbmcgc3lzY2FsbCBleGl0IHRyYWNpbmcKKwlBTElHTgorcmV0X2Zyb21fZXhjZXB0aW9uOgorCXByZWVtcHRfc3RvcAorcmV0X2Zyb21faW50cjoKKwlHRVRfVEhSRUFEX0lORk8oJWVicCkKKwltb3ZsIEVGTEFHUyglZXNwKSwgJWVheAkJIyBtaXggRUZMQUdTIGFuZCBDUworCW1vdmIgQ1MoJWVzcCksICVhbAorCXRlc3RsICQoVk1fTUFTSyB8IDMpLCAlZWF4CisJanogcmVzdW1lX2tlcm5lbAorRU5UUlkocmVzdW1lX3VzZXJzcGFjZSkKKyAJY2xpCQkJCSMgbWFrZSBzdXJlIHdlIGRvbid0IG1pc3MgYW4gaW50ZXJydXB0CisJCQkJCSMgc2V0dGluZyBuZWVkX3Jlc2NoZWQgb3Igc2lncGVuZGluZworCQkJCQkjIGJldHdlZW4gc2FtcGxpbmcgYW5kIHRoZSBpcmV0CisJbW92bCBUSV9mbGFncyglZWJwKSwgJWVjeAorCWFuZGwgJF9USUZfV09SS19NQVNLLCAlZWN4CSMgaXMgdGhlcmUgYW55IHdvcmsgdG8gYmUgZG9uZSBvbgorCQkJCQkjIGludC9leGNlcHRpb24gcmV0dXJuPworCWpuZSB3b3JrX3BlbmRpbmcKKwlqbXAgcmVzdG9yZV9hbGwKKworI2lmZGVmIENPTkZJR19QUkVFTVBUCitFTlRSWShyZXN1bWVfa2VybmVsKQorCWNsaQorCWNtcGwgJDAsVElfcHJlZW1wdF9jb3VudCglZWJwKQkjIG5vbi16ZXJvIHByZWVtcHRfY291bnQgPworCWpueiByZXN0b3JlX25vY2hlY2sKK25lZWRfcmVzY2hlZDoKKwltb3ZsIFRJX2ZsYWdzKCVlYnApLCAlZWN4CSMgbmVlZF9yZXNjaGVkIHNldCA/CisJdGVzdGIgJF9USUZfTkVFRF9SRVNDSEVELCAlY2wKKwlqeiByZXN0b3JlX2FsbAorCXRlc3RsICRJRl9NQVNLLEVGTEFHUyglZXNwKSAgICAgIyBpbnRlcnJ1cHRzIG9mZiAoZXhjZXB0aW9uIHBhdGgpID8KKwlqeiByZXN0b3JlX2FsbAorCWNhbGwgcHJlZW1wdF9zY2hlZHVsZV9pcnEKKwlqbXAgbmVlZF9yZXNjaGVkCisjZW5kaWYKKworLyogU1lTRU5URVJfUkVUVVJOIHBvaW50cyB0byBhZnRlciB0aGUgInN5c2VudGVyIiBpbnN0cnVjdGlvbiBpbgorICAgdGhlIHZzeXNjYWxsIHBhZ2UuICBTZWUgdnN5c2NhbGwtc3lzZW50cnkuUywgd2hpY2ggZGVmaW5lcyB0aGUgc3ltYm9sLiAgKi8KKworCSMgc3lzZW50ZXIgY2FsbCBoYW5kbGVyIHN0dWIKK0VOVFJZKHN5c2VudGVyX2VudHJ5KQorCW1vdmwgVFNTX3N5c2VudGVyX2VzcDAoJWVzcCksJWVzcAorc3lzZW50ZXJfcGFzdF9lc3A6CisJc3RpCisJcHVzaGwgJChfX1VTRVJfRFMpCisJcHVzaGwgJWVicAorCXB1c2hmbAorCXB1c2hsICQoX19VU0VSX0NTKQorCXB1c2hsICRTWVNFTlRFUl9SRVRVUk4KKworLyoKKyAqIExvYWQgdGhlIHBvdGVudGlhbCBzaXh0aCBhcmd1bWVudCBmcm9tIHVzZXIgc3RhY2suCisgKiBDYXJlZnVsIGFib3V0IHNlY3VyaXR5LgorICovCisJY21wbCAkX19QQUdFX09GRlNFVC0zLCVlYnAKKwlqYWUgc3lzY2FsbF9mYXVsdAorMToJbW92bCAoJWVicCksJWVicAorLnNlY3Rpb24gX19leF90YWJsZSwiYSIKKwkuYWxpZ24gNAorCS5sb25nIDFiLHN5c2NhbGxfZmF1bHQKKy5wcmV2aW91cworCisJcHVzaGwgJWVheAorCVNBVkVfQUxMCisJR0VUX1RIUkVBRF9JTkZPKCVlYnApCisKKwkvKiBOb3RlLCBfVElGX1NFQ0NPTVAgaXMgYml0IG51bWJlciA4LCBhbmQgc28gaXQgbmVlZHMgdGVzdHcgYW5kIG5vdCB0ZXN0YiAqLworCXRlc3R3ICQoX1RJRl9TWVNDQUxMX1RSQUNFfF9USUZfU1lTQ0FMTF9BVURJVHxfVElGX1NFQ0NPTVApLFRJX2ZsYWdzKCVlYnApCisJam56IHN5c2NhbGxfdHJhY2VfZW50cnkKKwljbXBsICQobnJfc3lzY2FsbHMpLCAlZWF4CisJamFlIHN5c2NhbGxfYmFkc3lzCisJY2FsbCAqc3lzX2NhbGxfdGFibGUoLCVlYXgsNCkKKwltb3ZsICVlYXgsRUFYKCVlc3ApCisJY2xpCisJbW92bCBUSV9mbGFncyglZWJwKSwgJWVjeAorCXRlc3R3ICRfVElGX0FMTFdPUktfTUFTSywgJWN4CisJam5lIHN5c2NhbGxfZXhpdF93b3JrCisvKiBpZiBzb21ldGhpbmcgbW9kaWZpZXMgcmVnaXN0ZXJzIGl0IG11c3QgYWxzbyBkaXNhYmxlIHN5c2V4aXQgKi8KKwltb3ZsIEVJUCglZXNwKSwgJWVkeAorCW1vdmwgT0xERVNQKCVlc3ApLCAlZWN4CisJeG9ybCAlZWJwLCVlYnAKKwlzdGkKKwlzeXNleGl0CisKKworCSMgc3lzdGVtIGNhbGwgaGFuZGxlciBzdHViCitFTlRSWShzeXN0ZW1fY2FsbCkKKwlwdXNobCAlZWF4CQkJIyBzYXZlIG9yaWdfZWF4CisJU0FWRV9BTEwKKwlHRVRfVEhSRUFEX0lORk8oJWVicCkKKwkJCQkJIyBzeXN0ZW0gY2FsbCB0cmFjaW5nIGluIG9wZXJhdGlvbgorCS8qIE5vdGUsIF9USUZfU0VDQ09NUCBpcyBiaXQgbnVtYmVyIDgsIGFuZCBzbyBpdCBuZWVkcyB0ZXN0dyBhbmQgbm90IHRlc3RiICovCisJdGVzdHcgJChfVElGX1NZU0NBTExfVFJBQ0V8X1RJRl9TWVNDQUxMX0FVRElUfF9USUZfU0VDQ09NUCksVElfZmxhZ3MoJWVicCkKKwlqbnogc3lzY2FsbF90cmFjZV9lbnRyeQorCWNtcGwgJChucl9zeXNjYWxscyksICVlYXgKKwlqYWUgc3lzY2FsbF9iYWRzeXMKK3N5c2NhbGxfY2FsbDoKKwljYWxsICpzeXNfY2FsbF90YWJsZSgsJWVheCw0KQorCW1vdmwgJWVheCxFQVgoJWVzcCkJCSMgc3RvcmUgdGhlIHJldHVybiB2YWx1ZQorc3lzY2FsbF9leGl0OgorCWNsaQkJCQkjIG1ha2Ugc3VyZSB3ZSBkb24ndCBtaXNzIGFuIGludGVycnVwdAorCQkJCQkjIHNldHRpbmcgbmVlZF9yZXNjaGVkIG9yIHNpZ3BlbmRpbmcKKwkJCQkJIyBiZXR3ZWVuIHNhbXBsaW5nIGFuZCB0aGUgaXJldAorCW1vdmwgVElfZmxhZ3MoJWVicCksICVlY3gKKwl0ZXN0dyAkX1RJRl9BTExXT1JLX01BU0ssICVjeAkjIGN1cnJlbnQtPndvcmsKKwlqbmUgc3lzY2FsbF9leGl0X3dvcmsKKworcmVzdG9yZV9hbGw6CisJbW92bCBFRkxBR1MoJWVzcCksICVlYXgJCSMgbWl4IEVGTEFHUywgU1MgYW5kIENTCisJbW92YiBPTERTUyglZXNwKSwgJWFoCisJbW92YiBDUyglZXNwKSwgJWFsCisJYW5kbCAkKFZNX01BU0sgfCAoNCA8PCA4KSB8IDMpLCAlZWF4CisJY21wbCAkKCg0IDw8IDgpIHwgMyksICVlYXgKKwlqZSBsZHRfc3MJCQkjIHJldHVybmluZyB0byB1c2VyLXNwYWNlIHdpdGggTERUIFNTCityZXN0b3JlX25vY2hlY2s6CisJUkVTVE9SRV9SRUdTCisJYWRkbCAkNCwgJWVzcAorMToJaXJldAorLnNlY3Rpb24gLmZpeHVwLCJheCIKK2lyZXRfZXhjOgorCXN0aQorCW1vdmwgJF9fVVNFUl9EUywgJWVkeAorCW1vdmwgJWVkeCwgJWRzCisJbW92bCAlZWR4LCAlZXMKKwltb3ZsICQxMSwlZWF4CisJY2FsbCBkb19leGl0CisucHJldmlvdXMKKy5zZWN0aW9uIF9fZXhfdGFibGUsImEiCisJLmFsaWduIDQKKwkubG9uZyAxYixpcmV0X2V4YworLnByZXZpb3VzCisKK2xkdF9zczoKKwlsYXJsIE9MRFNTKCVlc3ApLCAlZWF4CisJam56IHJlc3RvcmVfbm9jaGVjaworCXRlc3RsICQweDAwNDAwMDAwLCAlZWF4CQkjIHJldHVybmluZyB0byAzMmJpdCBzdGFjaz8KKwlqbnogcmVzdG9yZV9ub2NoZWNrCQkjIGFsbHJpZ2h0LCBub3JtYWwgcmV0dXJuCisJLyogSWYgcmV0dXJuaW5nIHRvIHVzZXJzcGFjZSB3aXRoIDE2Yml0IHN0YWNrLAorCSAqIHRyeSB0byBmaXggdGhlIGhpZ2hlciB3b3JkIG9mIEVTUCwgYXMgdGhlIENQVQorCSAqIHdvbid0IHJlc3RvcmUgaXQuCisJICogVGhpcyBpcyBhbiAib2ZmaWNpYWwiIGJ1ZyBvZiBhbGwgdGhlIHg4Ni1jb21wYXRpYmxlCisJICogQ1BVcywgd2hpY2ggd2UgY2FuIHRyeSB0byB3b3JrIGFyb3VuZCB0byBtYWtlCisJICogZG9zZW11IGFuZCB3aW5lIGhhcHB5LiAqLworCXN1YmwgJDgsICVlc3AJCSMgcmVzZXJ2ZSBzcGFjZSBmb3Igc3dpdGNoMTYgcG9pbnRlcgorCWNsaQorCW1vdmwgJWVzcCwgJWVheAorCS8qIFNldCB1cCB0aGUgMTZiaXQgc3RhY2sgZnJhbWUgd2l0aCBzd2l0Y2gzMiBwb2ludGVyIG9uIHRvcCwKKwkgKiBhbmQgYSBzd2l0Y2gxNiBwb2ludGVyIG9uIHRvcCBvZiB0aGUgY3VycmVudCBmcmFtZS4gKi8KKwljYWxsIHNldHVwX3g4Nl9ib2d1c19zdGFjaworCVJFU1RPUkVfUkVHUworCWxzcyAyMCs0KCVlc3ApLCAlZXNwCSMgc3dpdGNoIHRvIDE2Yml0IHN0YWNrCisxOglpcmV0Cisuc2VjdGlvbiBfX2V4X3RhYmxlLCJhIgorCS5hbGlnbiA0CisJLmxvbmcgMWIsaXJldF9leGMKKy5wcmV2aW91cworCisJIyBwZXJmb3JtIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIGltbWVkaWF0ZWx5IGJlZm9yZSByZXN1bXB0aW9uCisJQUxJR04KK3dvcmtfcGVuZGluZzoKKwl0ZXN0YiAkX1RJRl9ORUVEX1JFU0NIRUQsICVjbAorCWp6IHdvcmtfbm90aWZ5c2lnCit3b3JrX3Jlc2NoZWQ6CisJY2FsbCBzY2hlZHVsZQorCWNsaQkJCQkjIG1ha2Ugc3VyZSB3ZSBkb24ndCBtaXNzIGFuIGludGVycnVwdAorCQkJCQkjIHNldHRpbmcgbmVlZF9yZXNjaGVkIG9yIHNpZ3BlbmRpbmcKKwkJCQkJIyBiZXR3ZWVuIHNhbXBsaW5nIGFuZCB0aGUgaXJldAorCW1vdmwgVElfZmxhZ3MoJWVicCksICVlY3gKKwlhbmRsICRfVElGX1dPUktfTUFTSywgJWVjeAkjIGlzIHRoZXJlIGFueSB3b3JrIHRvIGJlIGRvbmUgb3RoZXIKKwkJCQkJIyB0aGFuIHN5c2NhbGwgdHJhY2luZz8KKwlqeiByZXN0b3JlX2FsbAorCXRlc3RiICRfVElGX05FRURfUkVTQ0hFRCwgJWNsCisJam56IHdvcmtfcmVzY2hlZAorCit3b3JrX25vdGlmeXNpZzoJCQkJIyBkZWFsIHdpdGggcGVuZGluZyBzaWduYWxzIGFuZAorCQkJCQkjIG5vdGlmeS1yZXN1bWUgcmVxdWVzdHMKKwl0ZXN0bCAkVk1fTUFTSywgRUZMQUdTKCVlc3ApCisJbW92bCAlZXNwLCAlZWF4CisJam5lIHdvcmtfbm90aWZ5c2lnX3Y4NgkJIyByZXR1cm5pbmcgdG8ga2VybmVsLXNwYWNlIG9yCisJCQkJCSMgdm04Ni1zcGFjZQorCXhvcmwgJWVkeCwgJWVkeAorCWNhbGwgZG9fbm90aWZ5X3Jlc3VtZQorCWptcCByZXN0b3JlX2FsbAorCisJQUxJR04KK3dvcmtfbm90aWZ5c2lnX3Y4NjoKKwlwdXNobCAlZWN4CQkJIyBzYXZlIHRpX2ZsYWdzIGZvciBkb19ub3RpZnlfcmVzdW1lCisJY2FsbCBzYXZlX3Y4Nl9zdGF0ZQkJIyAlZWF4IGNvbnRhaW5zIHB0X3JlZ3MgcG9pbnRlcgorCXBvcGwgJWVjeAorCW1vdmwgJWVheCwgJWVzcAorCXhvcmwgJWVkeCwgJWVkeAorCWNhbGwgZG9fbm90aWZ5X3Jlc3VtZQorCWptcCByZXN0b3JlX2FsbAorCisJIyBwZXJmb3JtIHN5c2NhbGwgZXhpdCB0cmFjaW5nCisJQUxJR04KK3N5c2NhbGxfdHJhY2VfZW50cnk6CisJbW92bCAkLUVOT1NZUyxFQVgoJWVzcCkKKwltb3ZsICVlc3AsICVlYXgKKwl4b3JsICVlZHgsJWVkeAorCWNhbGwgZG9fc3lzY2FsbF90cmFjZQorCW1vdmwgT1JJR19FQVgoJWVzcCksICVlYXgKKwljbXBsICQobnJfc3lzY2FsbHMpLCAlZWF4CisJam5hZSBzeXNjYWxsX2NhbGwKKwlqbXAgc3lzY2FsbF9leGl0CisKKwkjIHBlcmZvcm0gc3lzY2FsbCBleGl0IHRyYWNpbmcKKwlBTElHTgorc3lzY2FsbF9leGl0X3dvcms6CisJdGVzdGIgJChfVElGX1NZU0NBTExfVFJBQ0V8X1RJRl9TWVNDQUxMX0FVRElUfF9USUZfU0lOR0xFU1RFUCksICVjbAorCWp6IHdvcmtfcGVuZGluZworCXN0aQkJCQkjIGNvdWxkIGxldCBkb19zeXNjYWxsX3RyYWNlKCkgY2FsbAorCQkJCQkjIHNjaGVkdWxlKCkgaW5zdGVhZAorCW1vdmwgJWVzcCwgJWVheAorCW1vdmwgJDEsICVlZHgKKwljYWxsIGRvX3N5c2NhbGxfdHJhY2UKKwlqbXAgcmVzdW1lX3VzZXJzcGFjZQorCisJQUxJR04KK3N5c2NhbGxfZmF1bHQ6CisJcHVzaGwgJWVheAkJCSMgc2F2ZSBvcmlnX2VheAorCVNBVkVfQUxMCisJR0VUX1RIUkVBRF9JTkZPKCVlYnApCisJbW92bCAkLUVGQVVMVCxFQVgoJWVzcCkKKwlqbXAgcmVzdW1lX3VzZXJzcGFjZQorCisJQUxJR04KK3N5c2NhbGxfYmFkc3lzOgorCW1vdmwgJC1FTk9TWVMsRUFYKCVlc3ApCisJam1wIHJlc3VtZV91c2Vyc3BhY2UKKworI2RlZmluZSBGSVhVUF9FU1BGSVhfU1RBQ0sgXAorCW1vdmwgJWVzcCwgJWVheDsgXAorCS8qIHN3aXRjaCB0byAzMmJpdCBzdGFjayB1c2luZyB0aGUgcG9pbnRlciBvbiB0b3Agb2YgMTZiaXQgc3RhY2sgKi8gXAorCWxzcyAlc3M6Q1BVXzE2QklUX1NUQUNLX1NJWkUtOCwgJWVzcDsgXAorCS8qIGNvcHkgZGF0YSBmcm9tIDE2Yml0IHN0YWNrIHRvIDMyYml0IHN0YWNrICovIFwKKwljYWxsIGZpeHVwX3g4Nl9ib2d1c19zdGFjazsgXAorCS8qIHB1dCBFU1AgdG8gdGhlIHByb3BlciBsb2NhdGlvbiAqLyBcCisJbW92bCAlZWF4LCAlZXNwOworI2RlZmluZSBVTldJTkRfRVNQRklYX1NUQUNLIFwKKwlwdXNobCAlZWF4OyBcCisJbW92bCAlc3MsICVlYXg7IFwKKwkvKiBzZWUgaWYgb24gMTZiaXQgc3RhY2sgKi8gXAorCWNtcHcgJF9fRVNQRklYX1NTLCAlYXg7IFwKKwlqbmUgMjhmOyBcCisJbW92bCAkX19LRVJORUxfRFMsICVlZHg7IFwKKwltb3ZsICVlZHgsICVkczsgXAorCW1vdmwgJWVkeCwgJWVzOyBcCisJLyogc3dpdGNoIHRvIDMyYml0IHN0YWNrICovIFwKKwlGSVhVUF9FU1BGSVhfU1RBQ0sgXAorMjg6CXBvcGwgJWVheDsKKworLyoKKyAqIEJ1aWxkIHRoZSBlbnRyeSBzdHVicyBhbmQgcG9pbnRlciB0YWJsZSB3aXRoCisgKiBzb21lIGFzc2VtYmxlciBtYWdpYy4KKyAqLworLmRhdGEKK0VOVFJZKGludGVycnVwdCkKKy50ZXh0CisKK3ZlY3Rvcj0wCitFTlRSWShpcnFfZW50cmllc19zdGFydCkKKy5yZXB0IE5SX0lSUVMKKwlBTElHTgorMToJcHVzaGwgJHZlY3Rvci0yNTYKKwlqbXAgY29tbW9uX2ludGVycnVwdAorLmRhdGEKKwkubG9uZyAxYgorLnRleHQKK3ZlY3Rvcj12ZWN0b3IrMQorLmVuZHIKKworCUFMSUdOCitjb21tb25faW50ZXJydXB0OgorCVNBVkVfQUxMCisJbW92bCAlZXNwLCVlYXgKKwljYWxsIGRvX0lSUQorCWptcCByZXRfZnJvbV9pbnRyCisKKyNkZWZpbmUgQlVJTERfSU5URVJSVVBUKG5hbWUsIG5yKQlcCitFTlRSWShuYW1lKQkJCQlcCisJcHVzaGwgJG5yLTI1NjsJCQlcCisJU0FWRV9BTEwJCQlcCisJbW92bCAlZXNwLCVlYXg7CQkJXAorCWNhbGwgc21wXy8qKi9uYW1lOwkJXAorCWptcCByZXRfZnJvbV9pbnRyOworCisvKiBUaGUgaW5jbHVkZSBpcyB3aGVyZSBhbGwgb2YgdGhlIFNNUCBldGMuIGludGVycnVwdHMgY29tZSBmcm9tICovCisjaW5jbHVkZSAiZW50cnlfYXJjaC5oIgorCitFTlRSWShkaXZpZGVfZXJyb3IpCisJcHVzaGwgJDAJCQkjIG5vIGVycm9yIGNvZGUKKwlwdXNobCAkZG9fZGl2aWRlX2Vycm9yCisJQUxJR04KK2Vycm9yX2NvZGU6CisJcHVzaGwgJWRzCisJcHVzaGwgJWVheAorCXhvcmwgJWVheCwgJWVheAorCXB1c2hsICVlYnAKKwlwdXNobCAlZWRpCisJcHVzaGwgJWVzaQorCXB1c2hsICVlZHgKKwlkZWNsICVlYXgJCQkjIGVheCA9IC0xCisJcHVzaGwgJWVjeAorCXB1c2hsICVlYngKKwljbGQKKwlwdXNobCAlZXMKKwlVTldJTkRfRVNQRklYX1NUQUNLCisJcG9wbCAlZWN4CisJbW92bCBFUyglZXNwKSwgJWVkaQkJIyBnZXQgdGhlIGZ1bmN0aW9uIGFkZHJlc3MKKwltb3ZsIE9SSUdfRUFYKCVlc3ApLCAlZWR4CSMgZ2V0IHRoZSBlcnJvciBjb2RlCisJbW92bCAlZWF4LCBPUklHX0VBWCglZXNwKQorCW1vdmwgJWVjeCwgRVMoJWVzcCkKKwltb3ZsICQoX19VU0VSX0RTKSwgJWVjeAorCW1vdmwgJWVjeCwgJWRzCisJbW92bCAlZWN4LCAlZXMKKwltb3ZsICVlc3AsJWVheAkJCSMgcHRfcmVncyBwb2ludGVyCisJY2FsbCAqJWVkaQorCWptcCByZXRfZnJvbV9leGNlcHRpb24KKworRU5UUlkoY29wcm9jZXNzb3JfZXJyb3IpCisJcHVzaGwgJDAKKwlwdXNobCAkZG9fY29wcm9jZXNzb3JfZXJyb3IKKwlqbXAgZXJyb3JfY29kZQorCitFTlRSWShzaW1kX2NvcHJvY2Vzc29yX2Vycm9yKQorCXB1c2hsICQwCisJcHVzaGwgJGRvX3NpbWRfY29wcm9jZXNzb3JfZXJyb3IKKwlqbXAgZXJyb3JfY29kZQorCitFTlRSWShkZXZpY2Vfbm90X2F2YWlsYWJsZSkKKwlwdXNobCAkLTEJCQkjIG1hcmsgdGhpcyBhcyBhbiBpbnQKKwlTQVZFX0FMTAorCW1vdmwgJWNyMCwgJWVheAorCXRlc3RsICQweDQsICVlYXgJCSMgRU0gKG1hdGggZW11bGF0aW9uIGJpdCkKKwlqbmUgZGV2aWNlX25vdF9hdmFpbGFibGVfZW11bGF0ZQorCXByZWVtcHRfc3RvcAorCWNhbGwgbWF0aF9zdGF0ZV9yZXN0b3JlCisJam1wIHJldF9mcm9tX2V4Y2VwdGlvbgorZGV2aWNlX25vdF9hdmFpbGFibGVfZW11bGF0ZToKKwlwdXNobCAkMAkJCSMgdGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIE9SSUdfRUlQCisJY2FsbCBtYXRoX2VtdWxhdGUKKwlhZGRsICQ0LCAlZXNwCisJam1wIHJldF9mcm9tX2V4Y2VwdGlvbgorCisvKgorICogRGVidWcgdHJhcHMgYW5kIE5NSSBjYW4gaGFwcGVuIGF0IHRoZSBvbmUgU1lTRU5URVIgaW5zdHJ1Y3Rpb24KKyAqIHRoYXQgc2V0cyB1cCB0aGUgcmVhbCBrZXJuZWwgc3RhY2suIENoZWNrIGhlcmUsIHNpbmNlIHdlIGNhbid0CisgKiBhbGxvdyB0aGUgd3Jvbmcgc3RhY2sgdG8gYmUgdXNlZC4KKyAqCisgKiAiVFNTX3N5c2VudGVyX2VzcDArMTIiIGlzIGJlY2F1c2UgdGhlIE5NSS9kZWJ1ZyBoYW5kbGVyIHdpbGwgaGF2ZQorICogYWxyZWFkeSBwdXNoZWQgMyB3b3JkcyBpZiBpdCBoaXRzIG9uIHRoZSBzeXNlbnRlciBpbnN0cnVjdGlvbjoKKyAqIGVmbGFncywgY3MgYW5kIGVpcC4KKyAqCisgKiBXZSBqdXN0IGxvYWQgdGhlIHJpZ2h0IHN0YWNrLCBhbmQgcHVzaCB0aGUgdGhyZWUgKGtub3duKSB2YWx1ZXMKKyAqIGJ5IGhhbmQgb250byB0aGUgbmV3IHN0YWNrIC0gd2hpbGUgdXBkYXRpbmcgdGhlIHJldHVybiBlaXAgcGFzdAorICogdGhlIGluc3RydWN0aW9uIHRoYXQgd291bGQgaGF2ZSBkb25lIGl0IGZvciBzeXNlbnRlci4KKyAqLworI2RlZmluZSBGSVhfU1RBQ0sob2Zmc2V0LCBvaywgbGFiZWwpCQlcCisJY21wdyAkX19LRVJORUxfQ1MsNCglZXNwKTsJCVwKKwlqbmUgb2s7CQkJCQlcCitsYWJlbDoJCQkJCQlcCisJbW92bCBUU1Nfc3lzZW50ZXJfZXNwMCtvZmZzZXQoJWVzcCksJWVzcDsJXAorCXB1c2hmbDsJCQkJCVwKKwlwdXNobCAkX19LRVJORUxfQ1M7CQkJXAorCXB1c2hsICRzeXNlbnRlcl9wYXN0X2VzcAorCitFTlRSWShkZWJ1ZykKKwljbXBsICRzeXNlbnRlcl9lbnRyeSwoJWVzcCkKKwlqbmUgZGVidWdfc3RhY2tfY29ycmVjdAorCUZJWF9TVEFDSygxMiwgZGVidWdfc3RhY2tfY29ycmVjdCwgZGVidWdfZXNwX2ZpeF9pbnNuKQorZGVidWdfc3RhY2tfY29ycmVjdDoKKwlwdXNobCAkLTEJCQkjIG1hcmsgdGhpcyBhcyBhbiBpbnQKKwlTQVZFX0FMTAorCXhvcmwgJWVkeCwlZWR4CQkJIyBlcnJvciBjb2RlIDAKKwltb3ZsICVlc3AsJWVheAkJCSMgcHRfcmVncyBwb2ludGVyCisJY2FsbCBkb19kZWJ1ZworCXRlc3RsICVlYXgsJWVheAorCWpueiByZXN0b3JlX2FsbAorCWptcCByZXRfZnJvbV9leGNlcHRpb24KKworLyoKKyAqIE5NSSBpcyBkb3VibHkgbmFzdHkuIEl0IGNhbiBoYXBwZW4gX3doaWxlXyB3ZSdyZSBoYW5kbGluZworICogYSBkZWJ1ZyBmYXVsdCwgYW5kIHRoZSBkZWJ1ZyBmYXVsdCBoYXNuJ3QgeWV0IGJlZW4gYWJsZSB0bworICogY2xlYXIgdXAgdGhlIHN0YWNrLiBTbyB3ZSBmaXJzdCBjaGVjayB3aGV0aGVyIHdlIGdvdCAgYW4KKyAqIE5NSSBvbiB0aGUgc3lzZW50ZXIgZW50cnkgcGF0aCwgYnV0IGFmdGVyIHRoYXQgd2UgbmVlZCB0bworICogY2hlY2sgd2hldGhlciB3ZSBnb3QgYW4gTk1JIG9uIHRoZSBkZWJ1ZyBwYXRoIHdoZXJlIHRoZSBkZWJ1ZworICogZmF1bHQgaGFwcGVuZWQgb24gdGhlIHN5c2VudGVyIHBhdGguCisgKi8KK0VOVFJZKG5taSkKKwlwdXNobCAlZWF4CisJbW92bCAlc3MsICVlYXgKKwljbXB3ICRfX0VTUEZJWF9TUywgJWF4CisJcG9wbCAlZWF4CisJamUgbm1pXzE2Yml0X3N0YWNrCisJY21wbCAkc3lzZW50ZXJfZW50cnksKCVlc3ApCisJamUgbm1pX3N0YWNrX2ZpeHVwCisJcHVzaGwgJWVheAorCW1vdmwgJWVzcCwlZWF4CisJLyogRG8gbm90IGFjY2VzcyBtZW1vcnkgYWJvdmUgdGhlIGVuZCBvZiBvdXIgc3RhY2sgcGFnZSwKKwkgKiBpdCBtaWdodCBub3QgZXhpc3QuCisJICovCisJYW5kbCAkKFRIUkVBRF9TSVpFLTEpLCVlYXgKKwljbXBsICQoVEhSRUFEX1NJWkUtMjApLCVlYXgKKwlwb3BsICVlYXgKKwlqYWUgbm1pX3N0YWNrX2NvcnJlY3QKKwljbXBsICRzeXNlbnRlcl9lbnRyeSwxMiglZXNwKQorCWplIG5taV9kZWJ1Z19zdGFja19jaGVjaworbm1pX3N0YWNrX2NvcnJlY3Q6CisJcHVzaGwgJWVheAorCVNBVkVfQUxMCisJeG9ybCAlZWR4LCVlZHgJCSMgemVybyBlcnJvciBjb2RlCisJbW92bCAlZXNwLCVlYXgJCSMgcHRfcmVncyBwb2ludGVyCisJY2FsbCBkb19ubWkKKwlqbXAgcmVzdG9yZV9hbGwKKworbm1pX3N0YWNrX2ZpeHVwOgorCUZJWF9TVEFDSygxMixubWlfc3RhY2tfY29ycmVjdCwgMSkKKwlqbXAgbm1pX3N0YWNrX2NvcnJlY3QKK25taV9kZWJ1Z19zdGFja19jaGVjazoKKwljbXB3ICRfX0tFUk5FTF9DUywxNiglZXNwKQorCWpuZSBubWlfc3RhY2tfY29ycmVjdAorCWNtcGwgJGRlYnVnIC0gMSwoJWVzcCkKKwlqbGUgbm1pX3N0YWNrX2NvcnJlY3QKKwljbXBsICRkZWJ1Z19lc3BfZml4X2luc24sKCVlc3ApCisJamxlIG5taV9kZWJ1Z19zdGFja19maXh1cAorbm1pX2RlYnVnX3N0YWNrX2ZpeHVwOgorCUZJWF9TVEFDSygyNCxubWlfc3RhY2tfY29ycmVjdCwgMSkKKwlqbXAgbm1pX3N0YWNrX2NvcnJlY3QKKworbm1pXzE2Yml0X3N0YWNrOgorCS8qIGNyZWF0ZSB0aGUgcG9pbnRlciB0byBsc3MgYmFjayAqLworCXB1c2hsICVzcworCXB1c2hsICVlc3AKKwltb3Z6d2wgJXNwLCAlZXNwCisJYWRkdyAkNCwgKCVlc3ApCisJLyogY29weSB0aGUgaXJldCBmcmFtZSBvZiAxMiBieXRlcyAqLworCS5yZXB0IDMKKwlwdXNobCAxNiglZXNwKQorCS5lbmRyCisJcHVzaGwgJWVheAorCVNBVkVfQUxMCisJRklYVVBfRVNQRklYX1NUQUNLCQkjICVlYXggPT0gJWVzcAorCXhvcmwgJWVkeCwlZWR4CQkJIyB6ZXJvIGVycm9yIGNvZGUKKwljYWxsIGRvX25taQorCVJFU1RPUkVfUkVHUworCWxzcyAxMis0KCVlc3ApLCAlZXNwCQkjIGJhY2sgdG8gMTZiaXQgc3RhY2sKKzE6CWlyZXQKKy5zZWN0aW9uIF9fZXhfdGFibGUsImEiCisJLmFsaWduIDQKKwkubG9uZyAxYixpcmV0X2V4YworLnByZXZpb3VzCisKK0VOVFJZKGludDMpCisJcHVzaGwgJC0xCQkJIyBtYXJrIHRoaXMgYXMgYW4gaW50CisJU0FWRV9BTEwKKwl4b3JsICVlZHgsJWVkeAkJIyB6ZXJvIGVycm9yIGNvZGUKKwltb3ZsICVlc3AsJWVheAkJIyBwdF9yZWdzIHBvaW50ZXIKKwljYWxsIGRvX2ludDMKKwl0ZXN0bCAlZWF4LCVlYXgKKwlqbnogcmVzdG9yZV9hbGwKKwlqbXAgcmV0X2Zyb21fZXhjZXB0aW9uCisKK0VOVFJZKG92ZXJmbG93KQorCXB1c2hsICQwCisJcHVzaGwgJGRvX292ZXJmbG93CisJam1wIGVycm9yX2NvZGUKKworRU5UUlkoYm91bmRzKQorCXB1c2hsICQwCisJcHVzaGwgJGRvX2JvdW5kcworCWptcCBlcnJvcl9jb2RlCisKK0VOVFJZKGludmFsaWRfb3ApCisJcHVzaGwgJDAKKwlwdXNobCAkZG9faW52YWxpZF9vcAorCWptcCBlcnJvcl9jb2RlCisKK0VOVFJZKGNvcHJvY2Vzc29yX3NlZ21lbnRfb3ZlcnJ1bikKKwlwdXNobCAkMAorCXB1c2hsICRkb19jb3Byb2Nlc3Nvcl9zZWdtZW50X292ZXJydW4KKwlqbXAgZXJyb3JfY29kZQorCitFTlRSWShpbnZhbGlkX1RTUykKKwlwdXNobCAkZG9faW52YWxpZF9UU1MKKwlqbXAgZXJyb3JfY29kZQorCitFTlRSWShzZWdtZW50X25vdF9wcmVzZW50KQorCXB1c2hsICRkb19zZWdtZW50X25vdF9wcmVzZW50CisJam1wIGVycm9yX2NvZGUKKworRU5UUlkoc3RhY2tfc2VnbWVudCkKKwlwdXNobCAkZG9fc3RhY2tfc2VnbWVudAorCWptcCBlcnJvcl9jb2RlCisKK0VOVFJZKGdlbmVyYWxfcHJvdGVjdGlvbikKKwlwdXNobCAkZG9fZ2VuZXJhbF9wcm90ZWN0aW9uCisJam1wIGVycm9yX2NvZGUKKworRU5UUlkoYWxpZ25tZW50X2NoZWNrKQorCXB1c2hsICRkb19hbGlnbm1lbnRfY2hlY2sKKwlqbXAgZXJyb3JfY29kZQorCitFTlRSWShwYWdlX2ZhdWx0KQorCXB1c2hsICRkb19wYWdlX2ZhdWx0CisJam1wIGVycm9yX2NvZGUKKworI2lmZGVmIENPTkZJR19YODZfTUNFCitFTlRSWShtYWNoaW5lX2NoZWNrKQorCXB1c2hsICQwCisJcHVzaGwgbWFjaGluZV9jaGVja192ZWN0b3IKKwlqbXAgZXJyb3JfY29kZQorI2VuZGlmCisKK0VOVFJZKHNwdXJpb3VzX2ludGVycnVwdF9idWcpCisJcHVzaGwgJDAKKwlwdXNobCAkZG9fc3B1cmlvdXNfaW50ZXJydXB0X2J1ZworCWptcCBlcnJvcl9jb2RlCisKKy5kYXRhCitFTlRSWShzeXNfY2FsbF90YWJsZSkKKwkubG9uZyBzeXNfcmVzdGFydF9zeXNjYWxsCS8qIDAgLSBvbGQgInNldHVwKCkiIHN5c3RlbSBjYWxsLCB1c2VkIGZvciByZXN0YXJ0aW5nICovCisJLmxvbmcgc3lzX2V4aXQKKwkubG9uZyBzeXNfZm9yaworCS5sb25nIHN5c19yZWFkCisJLmxvbmcgc3lzX3dyaXRlCisJLmxvbmcgc3lzX29wZW4JCS8qIDUgKi8KKwkubG9uZyBzeXNfY2xvc2UKKwkubG9uZyBzeXNfd2FpdHBpZAorCS5sb25nIHN5c19jcmVhdAorCS5sb25nIHN5c19saW5rCisJLmxvbmcgc3lzX3VubGluawkvKiAxMCAqLworCS5sb25nIHN5c19leGVjdmUKKwkubG9uZyBzeXNfY2hkaXIKKwkubG9uZyBzeXNfdGltZQorCS5sb25nIHN5c19ta25vZAorCS5sb25nIHN5c19jaG1vZAkJLyogMTUgKi8KKwkubG9uZyBzeXNfbGNob3duMTYKKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBvbGQgYnJlYWsgc3lzY2FsbCBob2xkZXIgKi8KKwkubG9uZyBzeXNfc3RhdAorCS5sb25nIHN5c19sc2VlaworCS5sb25nIHN5c19nZXRwaWQJLyogMjAgKi8KKwkubG9uZyBzeXNfbW91bnQKKwkubG9uZyBzeXNfb2xkdW1vdW50CisJLmxvbmcgc3lzX3NldHVpZDE2CisJLmxvbmcgc3lzX2dldHVpZDE2CisJLmxvbmcgc3lzX3N0aW1lCQkvKiAyNSAqLworCS5sb25nIHN5c19wdHJhY2UKKwkubG9uZyBzeXNfYWxhcm0KKwkubG9uZyBzeXNfZnN0YXQKKwkubG9uZyBzeXNfcGF1c2UKKwkubG9uZyBzeXNfdXRpbWUJCS8qIDMwICovCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogb2xkIHN0dHkgc3lzY2FsbCBob2xkZXIgKi8KKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBvbGQgZ3R0eSBzeXNjYWxsIGhvbGRlciAqLworCS5sb25nIHN5c19hY2Nlc3MKKwkubG9uZyBzeXNfbmljZQorCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIDM1IC0gb2xkIGZ0aW1lIHN5c2NhbGwgaG9sZGVyICovCisJLmxvbmcgc3lzX3N5bmMKKwkubG9uZyBzeXNfa2lsbAorCS5sb25nIHN5c19yZW5hbWUKKwkubG9uZyBzeXNfbWtkaXIKKwkubG9uZyBzeXNfcm1kaXIJCS8qIDQwICovCisJLmxvbmcgc3lzX2R1cAorCS5sb25nIHN5c19waXBlCisJLmxvbmcgc3lzX3RpbWVzCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogb2xkIHByb2Ygc3lzY2FsbCBob2xkZXIgKi8KKwkubG9uZyBzeXNfYnJrCQkvKiA0NSAqLworCS5sb25nIHN5c19zZXRnaWQxNgorCS5sb25nIHN5c19nZXRnaWQxNgorCS5sb25nIHN5c19zaWduYWwKKwkubG9uZyBzeXNfZ2V0ZXVpZDE2CisJLmxvbmcgc3lzX2dldGVnaWQxNgkvKiA1MCAqLworCS5sb25nIHN5c19hY2N0CisJLmxvbmcgc3lzX3Vtb3VudAkvKiByZWN5Y2xlZCBuZXZlciB1c2VkIHBoeXMoKSAqLworCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIG9sZCBsb2NrIHN5c2NhbGwgaG9sZGVyICovCisJLmxvbmcgc3lzX2lvY3RsCisJLmxvbmcgc3lzX2ZjbnRsCQkvKiA1NSAqLworCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIG9sZCBtcHggc3lzY2FsbCBob2xkZXIgKi8KKwkubG9uZyBzeXNfc2V0cGdpZAorCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIG9sZCB1bGltaXQgc3lzY2FsbCBob2xkZXIgKi8KKwkubG9uZyBzeXNfb2xkdW5hbWUKKwkubG9uZyBzeXNfdW1hc2sJCS8qIDYwICovCisJLmxvbmcgc3lzX2Nocm9vdAorCS5sb25nIHN5c191c3RhdAorCS5sb25nIHN5c19kdXAyCisJLmxvbmcgc3lzX2dldHBwaWQKKwkubG9uZyBzeXNfZ2V0cGdycAkvKiA2NSAqLworCS5sb25nIHN5c19zZXRzaWQKKwkubG9uZyBzeXNfc2lnYWN0aW9uCisJLmxvbmcgc3lzX3NnZXRtYXNrCisJLmxvbmcgc3lzX3NzZXRtYXNrCisJLmxvbmcgc3lzX3NldHJldWlkMTYJLyogNzAgKi8KKwkubG9uZyBzeXNfc2V0cmVnaWQxNgorCS5sb25nIHN5c19zaWdzdXNwZW5kCisJLmxvbmcgc3lzX3NpZ3BlbmRpbmcKKwkubG9uZyBzeXNfc2V0aG9zdG5hbWUKKwkubG9uZyBzeXNfc2V0cmxpbWl0CS8qIDc1ICovCisJLmxvbmcgc3lzX29sZF9nZXRybGltaXQKKwkubG9uZyBzeXNfZ2V0cnVzYWdlCisJLmxvbmcgc3lzX2dldHRpbWVvZmRheQorCS5sb25nIHN5c19zZXR0aW1lb2ZkYXkKKwkubG9uZyBzeXNfZ2V0Z3JvdXBzMTYJLyogODAgKi8KKwkubG9uZyBzeXNfc2V0Z3JvdXBzMTYKKwkubG9uZyBvbGRfc2VsZWN0CisJLmxvbmcgc3lzX3N5bWxpbmsKKwkubG9uZyBzeXNfbHN0YXQKKwkubG9uZyBzeXNfcmVhZGxpbmsJLyogODUgKi8KKwkubG9uZyBzeXNfdXNlbGliCisJLmxvbmcgc3lzX3N3YXBvbgorCS5sb25nIHN5c19yZWJvb3QKKwkubG9uZyBvbGRfcmVhZGRpcgorCS5sb25nIG9sZF9tbWFwCQkvKiA5MCAqLworCS5sb25nIHN5c19tdW5tYXAKKwkubG9uZyBzeXNfdHJ1bmNhdGUKKwkubG9uZyBzeXNfZnRydW5jYXRlCisJLmxvbmcgc3lzX2ZjaG1vZAorCS5sb25nIHN5c19mY2hvd24xNgkvKiA5NSAqLworCS5sb25nIHN5c19nZXRwcmlvcml0eQorCS5sb25nIHN5c19zZXRwcmlvcml0eQorCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIG9sZCBwcm9maWwgc3lzY2FsbCBob2xkZXIgKi8KKwkubG9uZyBzeXNfc3RhdGZzCisJLmxvbmcgc3lzX2ZzdGF0ZnMJLyogMTAwICovCisJLmxvbmcgc3lzX2lvcGVybQorCS5sb25nIHN5c19zb2NrZXRjYWxsCisJLmxvbmcgc3lzX3N5c2xvZworCS5sb25nIHN5c19zZXRpdGltZXIKKwkubG9uZyBzeXNfZ2V0aXRpbWVyCS8qIDEwNSAqLworCS5sb25nIHN5c19uZXdzdGF0CisJLmxvbmcgc3lzX25ld2xzdGF0CisJLmxvbmcgc3lzX25ld2ZzdGF0CisJLmxvbmcgc3lzX3VuYW1lCisJLmxvbmcgc3lzX2lvcGwJCS8qIDExMCAqLworCS5sb25nIHN5c192aGFuZ3VwCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogb2xkICJpZGxlIiBzeXN0ZW0gY2FsbCAqLworCS5sb25nIHN5c192bTg2b2xkCisJLmxvbmcgc3lzX3dhaXQ0CisJLmxvbmcgc3lzX3N3YXBvZmYJLyogMTE1ICovCisJLmxvbmcgc3lzX3N5c2luZm8KKwkubG9uZyBzeXNfaXBjCisJLmxvbmcgc3lzX2ZzeW5jCisJLmxvbmcgc3lzX3NpZ3JldHVybgorCS5sb25nIHN5c19jbG9uZQkJLyogMTIwICovCisJLmxvbmcgc3lzX3NldGRvbWFpbm5hbWUKKwkubG9uZyBzeXNfbmV3dW5hbWUKKwkubG9uZyBzeXNfbW9kaWZ5X2xkdAorCS5sb25nIHN5c19hZGp0aW1leAorCS5sb25nIHN5c19tcHJvdGVjdAkvKiAxMjUgKi8KKwkubG9uZyBzeXNfc2lncHJvY21hc2sKKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBvbGQgImNyZWF0ZV9tb2R1bGUiICovIAorCS5sb25nIHN5c19pbml0X21vZHVsZQorCS5sb25nIHN5c19kZWxldGVfbW9kdWxlCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogMTMwOglvbGQgImdldF9rZXJuZWxfc3ltcyIgKi8KKwkubG9uZyBzeXNfcXVvdGFjdGwKKwkubG9uZyBzeXNfZ2V0cGdpZAorCS5sb25nIHN5c19mY2hkaXIKKwkubG9uZyBzeXNfYmRmbHVzaAorCS5sb25nIHN5c19zeXNmcwkJLyogMTM1ICovCisJLmxvbmcgc3lzX3BlcnNvbmFsaXR5CisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogcmVzZXJ2ZWQgZm9yIGFmc19zeXNjYWxsICovCisJLmxvbmcgc3lzX3NldGZzdWlkMTYKKwkubG9uZyBzeXNfc2V0ZnNnaWQxNgorCS5sb25nIHN5c19sbHNlZWsJLyogMTQwICovCisJLmxvbmcgc3lzX2dldGRlbnRzCisJLmxvbmcgc3lzX3NlbGVjdAorCS5sb25nIHN5c19mbG9jaworCS5sb25nIHN5c19tc3luYworCS5sb25nIHN5c19yZWFkdgkJLyogMTQ1ICovCisJLmxvbmcgc3lzX3dyaXRldgorCS5sb25nIHN5c19nZXRzaWQKKwkubG9uZyBzeXNfZmRhdGFzeW5jCisJLmxvbmcgc3lzX3N5c2N0bAorCS5sb25nIHN5c19tbG9jawkJLyogMTUwICovCisJLmxvbmcgc3lzX211bmxvY2sKKwkubG9uZyBzeXNfbWxvY2thbGwKKwkubG9uZyBzeXNfbXVubG9ja2FsbAorCS5sb25nIHN5c19zY2hlZF9zZXRwYXJhbQorCS5sb25nIHN5c19zY2hlZF9nZXRwYXJhbSAgIC8qIDE1NSAqLworCS5sb25nIHN5c19zY2hlZF9zZXRzY2hlZHVsZXIKKwkubG9uZyBzeXNfc2NoZWRfZ2V0c2NoZWR1bGVyCisJLmxvbmcgc3lzX3NjaGVkX3lpZWxkCisJLmxvbmcgc3lzX3NjaGVkX2dldF9wcmlvcml0eV9tYXgKKwkubG9uZyBzeXNfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbiAgLyogMTYwICovCisJLmxvbmcgc3lzX3NjaGVkX3JyX2dldF9pbnRlcnZhbAorCS5sb25nIHN5c19uYW5vc2xlZXAKKwkubG9uZyBzeXNfbXJlbWFwCisJLmxvbmcgc3lzX3NldHJlc3VpZDE2CisJLmxvbmcgc3lzX2dldHJlc3VpZDE2CS8qIDE2NSAqLworCS5sb25nIHN5c192bTg2CisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogT2xkIHN5c19xdWVyeV9tb2R1bGUgKi8KKwkubG9uZyBzeXNfcG9sbAorCS5sb25nIHN5c19uZnNzZXJ2Y3RsCisJLmxvbmcgc3lzX3NldHJlc2dpZDE2CS8qIDE3MCAqLworCS5sb25nIHN5c19nZXRyZXNnaWQxNgorCS5sb25nIHN5c19wcmN0bAorCS5sb25nIHN5c19ydF9zaWdyZXR1cm4KKwkubG9uZyBzeXNfcnRfc2lnYWN0aW9uCisJLmxvbmcgc3lzX3J0X3NpZ3Byb2NtYXNrCS8qIDE3NSAqLworCS5sb25nIHN5c19ydF9zaWdwZW5kaW5nCisJLmxvbmcgc3lzX3J0X3NpZ3RpbWVkd2FpdAorCS5sb25nIHN5c19ydF9zaWdxdWV1ZWluZm8KKwkubG9uZyBzeXNfcnRfc2lnc3VzcGVuZAorCS5sb25nIHN5c19wcmVhZDY0CS8qIDE4MCAqLworCS5sb25nIHN5c19wd3JpdGU2NAorCS5sb25nIHN5c19jaG93bjE2CisJLmxvbmcgc3lzX2dldGN3ZAorCS5sb25nIHN5c19jYXBnZXQKKwkubG9uZyBzeXNfY2Fwc2V0CS8qIDE4NSAqLworCS5sb25nIHN5c19zaWdhbHRzdGFjaworCS5sb25nIHN5c19zZW5kZmlsZQorCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIHJlc2VydmVkIGZvciBzdHJlYW1zMSAqLworCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIHJlc2VydmVkIGZvciBzdHJlYW1zMiAqLworCS5sb25nIHN5c192Zm9yawkJLyogMTkwICovCisJLmxvbmcgc3lzX2dldHJsaW1pdAorCS5sb25nIHN5c19tbWFwMgorCS5sb25nIHN5c190cnVuY2F0ZTY0CisJLmxvbmcgc3lzX2Z0cnVuY2F0ZTY0CisJLmxvbmcgc3lzX3N0YXQ2NAkvKiAxOTUgKi8KKwkubG9uZyBzeXNfbHN0YXQ2NAorCS5sb25nIHN5c19mc3RhdDY0CisJLmxvbmcgc3lzX2xjaG93bgorCS5sb25nIHN5c19nZXR1aWQKKwkubG9uZyBzeXNfZ2V0Z2lkCS8qIDIwMCAqLworCS5sb25nIHN5c19nZXRldWlkCisJLmxvbmcgc3lzX2dldGVnaWQKKwkubG9uZyBzeXNfc2V0cmV1aWQKKwkubG9uZyBzeXNfc2V0cmVnaWQKKwkubG9uZyBzeXNfZ2V0Z3JvdXBzCS8qIDIwNSAqLworCS5sb25nIHN5c19zZXRncm91cHMKKwkubG9uZyBzeXNfZmNob3duCisJLmxvbmcgc3lzX3NldHJlc3VpZAorCS5sb25nIHN5c19nZXRyZXN1aWQKKwkubG9uZyBzeXNfc2V0cmVzZ2lkCS8qIDIxMCAqLworCS5sb25nIHN5c19nZXRyZXNnaWQKKwkubG9uZyBzeXNfY2hvd24KKwkubG9uZyBzeXNfc2V0dWlkCisJLmxvbmcgc3lzX3NldGdpZAorCS5sb25nIHN5c19zZXRmc3VpZAkvKiAyMTUgKi8KKwkubG9uZyBzeXNfc2V0ZnNnaWQKKwkubG9uZyBzeXNfcGl2b3Rfcm9vdAorCS5sb25nIHN5c19taW5jb3JlCisJLmxvbmcgc3lzX21hZHZpc2UKKwkubG9uZyBzeXNfZ2V0ZGVudHM2NAkvKiAyMjAgKi8KKwkubG9uZyBzeXNfZmNudGw2NAorCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIHJlc2VydmVkIGZvciBUVVggKi8KKwkubG9uZyBzeXNfbmlfc3lzY2FsbAorCS5sb25nIHN5c19nZXR0aWQKKwkubG9uZyBzeXNfcmVhZGFoZWFkCS8qIDIyNSAqLworCS5sb25nIHN5c19zZXR4YXR0cgorCS5sb25nIHN5c19sc2V0eGF0dHIKKwkubG9uZyBzeXNfZnNldHhhdHRyCisJLmxvbmcgc3lzX2dldHhhdHRyCisJLmxvbmcgc3lzX2xnZXR4YXR0cgkvKiAyMzAgKi8KKwkubG9uZyBzeXNfZmdldHhhdHRyCisJLmxvbmcgc3lzX2xpc3R4YXR0cgorCS5sb25nIHN5c19sbGlzdHhhdHRyCisJLmxvbmcgc3lzX2ZsaXN0eGF0dHIKKwkubG9uZyBzeXNfcmVtb3ZleGF0dHIJLyogMjM1ICovCisJLmxvbmcgc3lzX2xyZW1vdmV4YXR0cgorCS5sb25nIHN5c19mcmVtb3ZleGF0dHIKKwkubG9uZyBzeXNfdGtpbGwKKwkubG9uZyBzeXNfc2VuZGZpbGU2NAorCS5sb25nIHN5c19mdXRleAkJLyogMjQwICovCisJLmxvbmcgc3lzX3NjaGVkX3NldGFmZmluaXR5CisJLmxvbmcgc3lzX3NjaGVkX2dldGFmZmluaXR5CisJLmxvbmcgc3lzX3NldF90aHJlYWRfYXJlYQorCS5sb25nIHN5c19nZXRfdGhyZWFkX2FyZWEKKwkubG9uZyBzeXNfaW9fc2V0dXAJLyogMjQ1ICovCisJLmxvbmcgc3lzX2lvX2Rlc3Ryb3kKKwkubG9uZyBzeXNfaW9fZ2V0ZXZlbnRzCisJLmxvbmcgc3lzX2lvX3N1Ym1pdAorCS5sb25nIHN5c19pb19jYW5jZWwKKwkubG9uZyBzeXNfZmFkdmlzZTY0CS8qIDI1MCAqLworCS5sb25nIHN5c19uaV9zeXNjYWxsCisJLmxvbmcgc3lzX2V4aXRfZ3JvdXAKKwkubG9uZyBzeXNfbG9va3VwX2Rjb29raWUKKwkubG9uZyBzeXNfZXBvbGxfY3JlYXRlCisJLmxvbmcgc3lzX2Vwb2xsX2N0bAkvKiAyNTUgKi8KKwkubG9uZyBzeXNfZXBvbGxfd2FpdAorIAkubG9uZyBzeXNfcmVtYXBfZmlsZV9wYWdlcworIAkubG9uZyBzeXNfc2V0X3RpZF9hZGRyZXNzCisgCS5sb25nIHN5c190aW1lcl9jcmVhdGUKKyAJLmxvbmcgc3lzX3RpbWVyX3NldHRpbWUJCS8qIDI2MCAqLworIAkubG9uZyBzeXNfdGltZXJfZ2V0dGltZQorIAkubG9uZyBzeXNfdGltZXJfZ2V0b3ZlcnJ1bgorIAkubG9uZyBzeXNfdGltZXJfZGVsZXRlCisgCS5sb25nIHN5c19jbG9ja19zZXR0aW1lCisgCS5sb25nIHN5c19jbG9ja19nZXR0aW1lCQkvKiAyNjUgKi8KKyAJLmxvbmcgc3lzX2Nsb2NrX2dldHJlcworIAkubG9uZyBzeXNfY2xvY2tfbmFub3NsZWVwCisJLmxvbmcgc3lzX3N0YXRmczY0CisJLmxvbmcgc3lzX2ZzdGF0ZnM2NAkKKwkubG9uZyBzeXNfdGdraWxsCS8qIDI3MCAqLworCS5sb25nIHN5c191dGltZXMKKyAJLmxvbmcgc3lzX2ZhZHZpc2U2NF82NAorCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIHN5c192c2VydmVyICovCisJLmxvbmcgc3lzX21iaW5kCisJLmxvbmcgc3lzX2dldF9tZW1wb2xpY3kKKwkubG9uZyBzeXNfc2V0X21lbXBvbGljeQorCS5sb25nIHN5c19tcV9vcGVuCisJLmxvbmcgc3lzX21xX3VubGluaworCS5sb25nIHN5c19tcV90aW1lZHNlbmQKKwkubG9uZyBzeXNfbXFfdGltZWRyZWNlaXZlCS8qIDI4MCAqLworCS5sb25nIHN5c19tcV9ub3RpZnkKKwkubG9uZyBzeXNfbXFfZ2V0c2V0YXR0cgorCS5sb25nIHN5c19uaV9zeXNjYWxsCQkvKiByZXNlcnZlZCBmb3Iga2V4ZWMgKi8KKwkubG9uZyBzeXNfd2FpdGlkCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJCS8qIDI4NSAqLyAvKiBhdmFpbGFibGUgKi8KKwkubG9uZyBzeXNfYWRkX2tleQorCS5sb25nIHN5c19yZXF1ZXN0X2tleQorCS5sb25nIHN5c19rZXljdGwKKworc3lzY2FsbF90YWJsZV9zaXplPSguLXN5c19jYWxsX3RhYmxlKQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9oZWFkLlMgYi9hcmNoL2kzODYva2VybmVsL2hlYWQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjczZmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9oZWFkLlMKQEAgLTAsMCArMSw1MjEgQEAKKy8qCisgKiAgbGludXgvYXJjaC9pMzg2L2tlcm5lbC9oZWFkLlMgLS0gdGhlIDMyLWJpdCBzdGFydHVwIGNvZGUuCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgRW5oYW5jZWQgQ1BVIGRldGVjdGlvbiBhbmQgZmVhdHVyZSBzZXR0aW5nIGNvZGUgYnkgTWlrZSBKYWdkaXMKKyAqICBhbmQgTWFydGluIE1hcmVzLCBOb3ZlbWJlciAxOTk3LgorICovCisKKy50ZXh0CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vZGVzYy5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9hc21fb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorCisvKgorICogUmVmZXJlbmNlcyB0byBtZW1iZXJzIG9mIHRoZSBuZXdfY3B1X2RhdGEgc3RydWN0dXJlLgorICovCisKKyNkZWZpbmUgWDg2CQluZXdfY3B1X2RhdGErQ1BVSU5GT194ODYKKyNkZWZpbmUgWDg2X1ZFTkRPUgluZXdfY3B1X2RhdGErQ1BVSU5GT194ODZfdmVuZG9yCisjZGVmaW5lIFg4Nl9NT0RFTAluZXdfY3B1X2RhdGErQ1BVSU5GT194ODZfbW9kZWwKKyNkZWZpbmUgWDg2X01BU0sJbmV3X2NwdV9kYXRhK0NQVUlORk9feDg2X21hc2sKKyNkZWZpbmUgWDg2X0hBUkRfTUFUSAluZXdfY3B1X2RhdGErQ1BVSU5GT19oYXJkX21hdGgKKyNkZWZpbmUgWDg2X0NQVUlECW5ld19jcHVfZGF0YStDUFVJTkZPX2NwdWlkX2xldmVsCisjZGVmaW5lIFg4Nl9DQVBBQklMSVRZCW5ld19jcHVfZGF0YStDUFVJTkZPX3g4Nl9jYXBhYmlsaXR5CisjZGVmaW5lIFg4Nl9WRU5ET1JfSUQJbmV3X2NwdV9kYXRhK0NQVUlORk9feDg2X3ZlbmRvcl9pZAorCisvKgorICogVGhpcyBpcyBob3cgbXVjaCBtZW1vcnkgKmluIGFkZGl0aW9uIHRvIHRoZSBtZW1vcnkgY292ZXJlZCB1cCB0bworICogYW5kIGluY2x1ZGluZyBfZW5kKiB3ZSBuZWVkIG1hcHBlZCBpbml0aWFsbHkuICBXZSBuZWVkIG9uZSBiaXQgZm9yCisgKiBlYWNoIHBvc3NpYmxlIHBhZ2UsIGJ1dCBvbmx5IGluIGxvdyBtZW1vcnksIHdoaWNoIG1lYW5zCisgKiAyXjMyLzQwOTYvOCA9IDEyOEsgd29yc3QgY2FzZSAoNEcvNEcgc3BsaXQuKQorICoKKyAqIE1vZHVsbyByb3VuZGluZywgZWFjaCBtZWdhYnl0ZSBhc3NpZ25lZCBoZXJlIHJlcXVpcmVzIGEga2lsb2J5dGUgb2YKKyAqIG1lbW9yeSwgd2hpY2ggaXMgY3VycmVudGx5IHVucmVjbGFpbWVkLgorICoKKyAqIFRoaXMgc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgYSBwYWdlLgorICovCisjZGVmaW5lIElOSVRfTUFQX0JFWU9ORF9FTkQJKDEyOCoxMDI0KQorCisKKy8qCisgKiAzMi1iaXQga2VybmVsIGVudHJ5cG9pbnQ7IG9ubHkgdXNlZCBieSB0aGUgYm9vdCBDUFUuICBPbiBlbnRyeSwKKyAqICVlc2kgcG9pbnRzIHRvIHRoZSByZWFsLW1vZGUgY29kZSBhcyBhIDMyLWJpdCBwb2ludGVyLgorICogQ1MgYW5kIERTIG11c3QgYmUgNCBHQiBmbGF0IHNlZ21lbnRzLCBidXQgd2UgZG9uJ3QgZGVwZW5kIG9uCisgKiBhbnkgcGFydGljdWxhciBHRFQgbGF5b3V0LCBiZWNhdXNlIHdlIGxvYWQgb3VyIG93biBhcyBzb29uIGFzIHdlCisgKiBjYW4uCisgKi8KK0VOVFJZKHN0YXJ0dXBfMzIpCisKKy8qCisgKiBTZXQgc2VnbWVudHMgdG8ga25vd24gdmFsdWVzLgorICovCisJY2xkCisJbGdkdCBib290X2dkdF9kZXNjciAtIF9fUEFHRV9PRkZTRVQKKwltb3ZsICQoX19CT09UX0RTKSwlZWF4CisJbW92bCAlZWF4LCVkcworCW1vdmwgJWVheCwlZXMKKwltb3ZsICVlYXgsJWZzCisJbW92bCAlZWF4LCVncworCisvKgorICogQ2xlYXIgQlNTIGZpcnN0IHNvIHRoYXQgdGhlcmUgYXJlIG5vIHN1cnByaXNlcy4uLgorICogTm8gbmVlZCB0byBjbGQgYXMgREYgaXMgYWxyZWFkeSBjbGVhciBmcm9tIGNsZCBhYm92ZS4uLgorICovCisJeG9ybCAlZWF4LCVlYXgKKwltb3ZsICRfX2Jzc19zdGFydCAtIF9fUEFHRV9PRkZTRVQsJWVkaQorCW1vdmwgJF9fYnNzX3N0b3AgLSBfX1BBR0VfT0ZGU0VULCVlY3gKKwlzdWJsICVlZGksJWVjeAorCXNocmwgJDIsJWVjeAorCXJlcCA7IHN0b3NsCisKKy8qCisgKiBJbml0aWFsaXplIHBhZ2UgdGFibGVzLiAgVGhpcyBjcmVhdGVzIGEgUERFIGFuZCBhIHNldCBvZiBwYWdlCisgKiB0YWJsZXMsIHdoaWNoIGFyZSBsb2NhdGVkIGltbWVkaWF0ZWx5IGJleW9uZCBfZW5kLiAgVGhlIHZhcmlhYmxlCisgKiBpbml0X3BnX3RhYmxlc19lbmQgaXMgc2V0IHVwIHRvIHBvaW50IHRvIHRoZSBmaXJzdCAic2FmZSIgbG9jYXRpb24uCisgKiBNYXBwaW5ncyBhcmUgY3JlYXRlZCBib3RoIGF0IHZpcnR1YWwgYWRkcmVzcyAwIChpZGVudGl0eSBtYXBwaW5nKQorICogYW5kIFBBR0VfT0ZGU0VUIGZvciB1cCB0byBfZW5kK3NpemVvZihwYWdlIHRhYmxlcykrSU5JVF9NQVBfQkVZT05EX0VORC4KKyAqCisgKiBXYXJuaW5nOiBkb24ndCB1c2UgJWVzaSBvciB0aGUgc3RhY2sgaW4gdGhpcyBjb2RlLiAgSG93ZXZlciwgJWVzcAorICogY2FuIGJlIHVzZWQgYXMgYSBHUFIgaWYgeW91IHJlYWxseSBuZWVkIGl0Li4uCisgKi8KK3BhZ2VfcGRlX29mZnNldCA9IChfX1BBR0VfT0ZGU0VUID4+IDIwKTsKKworCW1vdmwgJChwZzAgLSBfX1BBR0VfT0ZGU0VUKSwgJWVkaQorCW1vdmwgJChzd2FwcGVyX3BnX2RpciAtIF9fUEFHRV9PRkZTRVQpLCAlZWR4CisJbW92bCAkMHgwMDcsICVlYXgJCQkvKiAweDAwNyA9IFBSRVNFTlQrUlcrVVNFUiAqLworMTA6CisJbGVhbCAweDAwNyglZWRpKSwlZWN4CQkJLyogQ3JlYXRlIFBERSBlbnRyeSAqLworCW1vdmwgJWVjeCwoJWVkeCkJCQkvKiBTdG9yZSBpZGVudGl0eSBQREUgZW50cnkgKi8KKwltb3ZsICVlY3gscGFnZV9wZGVfb2Zmc2V0KCVlZHgpCQkvKiBTdG9yZSBrZXJuZWwgUERFIGVudHJ5ICovCisJYWRkbCAkNCwlZWR4CisJbW92bCAkMTAyNCwgJWVjeAorMTE6CisJc3Rvc2wKKwlhZGRsICQweDEwMDAsJWVheAorCWxvb3AgMTFiCisJLyogRW5kIGNvbmRpdGlvbjogd2UgbXVzdCBtYXAgdXAgdG8gYW5kIGluY2x1ZGluZyBJTklUX01BUF9CRVlPTkRfRU5EICovCisJLyogYnl0ZXMgYmV5b25kIHRoZSBlbmQgb2Ygb3VyIG93biBwYWdlIHRhYmxlczsgdGhlICsweDAwNyBpcyB0aGUgYXR0cmlidXRlIGJpdHMgKi8KKwlsZWFsIChJTklUX01BUF9CRVlPTkRfRU5EKzB4MDA3KSglZWRpKSwlZWJwCisJY21wbCAlZWJwLCVlYXgKKwlqYiAxMGIKKwltb3ZsICVlZGksKGluaXRfcGdfdGFibGVzX2VuZCAtIF9fUEFHRV9PRkZTRVQpCisKKyNpZmRlZiBDT05GSUdfU01QCisJeG9ybCAlZWJ4LCVlYngJCQkJLyogVGhpcyBpcyB0aGUgYm9vdCBDUFUgKEJTUCkgKi8KKwlqbXAgM2YKKworLyoKKyAqIE5vbi1ib290IENQVSBlbnRyeSBwb2ludDsgZW50ZXJlZCBmcm9tIHRyYW1wb2xpbmUuUworICogV2UgY2FuJ3QgbGdkdCBoZXJlLCBiZWNhdXNlIGxnZHQgaXRzZWxmIHVzZXMgYSBkYXRhIHNlZ21lbnQsIGJ1dAorICogd2Uga25vdyB0aGUgdHJhbXBvbGluZSBoYXMgYWxyZWFkeSBsb2FkZWQgdGhlIGJvb3RfZ2R0X3RhYmxlIEdEVAorICogZm9yIHVzLgorICovCitFTlRSWShzdGFydHVwXzMyX3NtcCkKKwljbGQKKwltb3ZsICQoX19CT09UX0RTKSwlZWF4CisJbW92bCAlZWF4LCVkcworCW1vdmwgJWVheCwlZXMKKwltb3ZsICVlYXgsJWZzCisJbW92bCAlZWF4LCVncworCisvKgorICoJTmV3IHBhZ2UgdGFibGVzIG1heSBiZSBpbiA0TWJ5dGUgcGFnZSBtb2RlIGFuZCBtYXkKKyAqCWJlIHVzaW5nIHRoZSBnbG9iYWwgcGFnZXMuIAorICoKKyAqCU5PVEUhIElmIHdlIGFyZSBvbiBhIDQ4NiB3ZSBtYXkgaGF2ZSBubyBjcjQgYXQgYWxsIQorICoJU28gd2UgZG8gbm90IHRyeSB0byB0b3VjaCBpdCB1bmxlc3Mgd2UgcmVhbGx5IGhhdmUKKyAqCXNvbWUgYml0cyBpbiBpdCB0byBzZXQuICBUaGlzIHdvbid0IHdvcmsgaWYgdGhlIEJTUAorICoJaW1wbGVtZW50cyBjcjQgYnV0IHRoaXMgQVAgZG9lcyBub3QgLS0gdmVyeSB1bmxpa2VseQorICoJYnV0IGJlIHdhcm5lZCEgIFRoZSBzYW1lIGFwcGxpZXMgdG8gdGhlIHBzZSBmZWF0dXJlCisgKglpZiBub3QgZXF1YWxseSBzdXBwb3J0ZWQuIC0tbWFjcm8KKyAqCisgKglOT1RFISBXZSBoYXZlIHRvIGNvcnJlY3QgZm9yIHRoZSBmYWN0IHRoYXQgd2UncmUKKyAqCW5vdCB5ZXQgb2Zmc2V0IFBBR0VfT0ZGU0VULi4KKyAqLworI2RlZmluZSBjcjRfYml0cyBtbXVfY3I0X2ZlYXR1cmVzLV9fUEFHRV9PRkZTRVQKKwltb3ZsIGNyNF9iaXRzLCVlZHgKKwlhbmRsICVlZHgsJWVkeAorCWp6IDZmCisJbW92bCAlY3I0LCVlYXgJCSMgVHVybiBvbiBwYWdpbmcgb3B0aW9ucyAoUFNFLFBBRSwuLikKKwlvcmwgJWVkeCwlZWF4CisJbW92bCAlZWF4LCVjcjQKKworCWJ0bCAkNSwgJWVheAkJIyBjaGVjayBpZiBQQUUgaXMgZW5hYmxlZAorCWpuYyA2ZgorCisJLyogQ2hlY2sgaWYgZXh0ZW5kZWQgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCAqLworCW1vdmwgJDB4ODAwMDAwMDAsICVlYXgKKwljcHVpZAorCWNtcGwgJDB4ODAwMDAwMDAsICVlYXgKKwlqYmUgNmYKKwltb3YgJDB4ODAwMDAwMDEsICVlYXgKKwljcHVpZAorCS8qIEV4ZWN1dGUgRGlzYWJsZSBiaXQgc3VwcG9ydGVkPyAqLworCWJ0bCAkMjAsICVlZHgKKwlqbmMgNmYKKworCS8qIFNldHVwIEVGRVIgKEV4dGVuZGVkIEZlYXR1cmUgRW5hYmxlIFJlZ2lzdGVyKSAqLworCW1vdmwgJDB4YzAwMDAwODAsICVlY3gKKwlyZG1zcgorCisJYnRzbCAkMTEsICVlYXgKKwkvKiBNYWtlIGNoYW5nZXMgZWZmZWN0aXZlICovCisJd3Jtc3IKKworNjoKKwkvKiBUaGlzIGlzIGEgc2Vjb25kYXJ5IHByb2Nlc3NvciAoQVApICovCisJeG9ybCAlZWJ4LCVlYngKKwlpbmNsICVlYngKKworMzoKKyNlbmRpZiAvKiBDT05GSUdfU01QICovCisKKy8qCisgKiBFbmFibGUgcGFnaW5nCisgKi8KKwltb3ZsICRzd2FwcGVyX3BnX2Rpci1fX1BBR0VfT0ZGU0VULCVlYXgKKwltb3ZsICVlYXgsJWNyMwkJLyogc2V0IHRoZSBwYWdlIHRhYmxlIHBvaW50ZXIuLiAqLworCW1vdmwgJWNyMCwlZWF4CisJb3JsICQweDgwMDAwMDAwLCVlYXgKKwltb3ZsICVlYXgsJWNyMAkJLyogLi5hbmQgc2V0IHBhZ2luZyAoUEcpIGJpdCAqLworCWxqbXAgJF9fQk9PVF9DUywkMWYJLyogQ2xlYXIgcHJlZmV0Y2ggYW5kIG5vcm1hbGl6ZSAlZWlwICovCisxOgorCS8qIFNldCB1cCB0aGUgc3RhY2sgcG9pbnRlciAqLworCWxzcyBzdGFja19zdGFydCwlZXNwCisKKy8qCisgKiBJbml0aWFsaXplIGVmbGFncy4gIFNvbWUgQklPUydzIGxlYXZlIGJpdHMgbGlrZSBOVCBzZXQuICBUaGlzIHdvdWxkCisgKiBjb25mdXNlIHRoZSBkZWJ1Z2dlciBpZiB0aGlzIGNvZGUgaXMgdHJhY2VkLgorICogWFhYIC0gYmVzdCB0byBpbml0aWFsaXplIGJlZm9yZSBzd2l0Y2hpbmcgdG8gcHJvdGVjdGVkIG1vZGUuCisgKi8KKwlwdXNobCAkMAorCXBvcGZsCisKKyNpZmRlZiBDT05GSUdfU01QCisJYW5kbCAlZWJ4LCVlYngKKwlqeiAgMWYJCQkJLyogSW5pdGlhbCBDUFUgY2xlYW5zIEJTUyAqLworCWptcCBjaGVja0NQVXR5cGUKKzE6CisjZW5kaWYgLyogQ09ORklHX1NNUCAqLworCisvKgorICogc3RhcnQgc3lzdGVtIDMyLWJpdCBzZXR1cC4gV2UgbmVlZCB0byByZS1kbyBzb21lIG9mIHRoZSB0aGluZ3MgZG9uZQorICogaW4gMTYtYml0IG1vZGUgZm9yIHRoZSAicmVhbCIgb3BlcmF0aW9ucy4KKyAqLworCWNhbGwgc2V0dXBfaWR0CisKKy8qCisgKiBDb3B5IGJvb3R1cCBwYXJhbWV0ZXJzIG91dCBvZiB0aGUgd2F5LgorICogTm90ZTogJWVzaSBzdGlsbCBoYXMgdGhlIHBvaW50ZXIgdG8gdGhlIHJlYWwtbW9kZSBkYXRhLgorICovCisJbW92bCAkYm9vdF9wYXJhbXMsJWVkaQorCW1vdmwgJChQQVJBTV9TSVpFLzQpLCVlY3gKKwljbGQKKwlyZXAKKwltb3ZzbAorCW1vdmwgYm9vdF9wYXJhbXMrTkVXX0NMX1BPSU5URVIsJWVzaQorCWFuZGwgJWVzaSwlZXNpCisJam56IDJmCQkJIyBOZXcgY29tbWFuZCBsaW5lIHByb3RvY29sCisJY21wdyAkKE9MRF9DTF9NQUdJQyksT0xEX0NMX01BR0lDX0FERFIKKwlqbmUgMWYKKwltb3Z6d2wgT0xEX0NMX09GRlNFVCwlZXNpCisJYWRkbCAkKE9MRF9DTF9CQVNFX0FERFIpLCVlc2kKKzI6CisJbW92bCAkc2F2ZWRfY29tbWFuZF9saW5lLCVlZGkKKwltb3ZsICQoQ09NTUFORF9MSU5FX1NJWkUvNCksJWVjeAorCXJlcAorCW1vdnNsCisxOgorY2hlY2tDUFV0eXBlOgorCisJbW92bCAkLTEsWDg2X0NQVUlECQkjICAtMSBmb3Igbm8gQ1BVSUQgaW5pdGlhbGx5CisKKy8qIGNoZWNrIGlmIGl0IGlzIDQ4NiBvciAzODYuICovCisvKgorICogWFhYIC0gdGhpcyBkb2VzIGEgbG90IG9mIHVubmVjZXNzYXJ5IHNldHVwLiAgQWxpZ25tZW50IGNoZWNrcyBkb24ndAorICogYXBwbHkgYXQgb3VyIGNwbCBvZiAwIGFuZCB0aGUgc3RhY2sgb3VnaHQgdG8gYmUgYWxpZ25lZCBhbHJlYWR5LCBhbmQKKyAqIHdlIGRvbid0IG5lZWQgdG8gcHJlc2VydmUgZWZsYWdzLgorICovCisKKwltb3ZiICQzLFg4NgkJIyBhdCBsZWFzdCAzODYKKwlwdXNoZmwJCQkjIHB1c2ggRUZMQUdTCisJcG9wbCAlZWF4CQkjIGdldCBFRkxBR1MKKwltb3ZsICVlYXgsJWVjeAkJIyBzYXZlIG9yaWdpbmFsIEVGTEFHUworCXhvcmwgJDB4MjQwMDAwLCVlYXgJIyBmbGlwIEFDIGFuZCBJRCBiaXRzIGluIEVGTEFHUworCXB1c2hsICVlYXgJCSMgY29weSB0byBFRkxBR1MKKwlwb3BmbAkJCSMgc2V0IEVGTEFHUworCXB1c2hmbAkJCSMgZ2V0IG5ldyBFRkxBR1MKKwlwb3BsICVlYXgJCSMgcHV0IGl0IGluIGVheAorCXhvcmwgJWVjeCwlZWF4CQkjIGNoYW5nZSBpbiBmbGFncworCXB1c2hsICVlY3gJCSMgcmVzdG9yZSBvcmlnaW5hbCBFRkxBR1MKKwlwb3BmbAorCXRlc3RsICQweDQwMDAwLCVlYXgJIyBjaGVjayBpZiBBQyBiaXQgY2hhbmdlZAorCWplIGlzMzg2CisKKwltb3ZiICQ0LFg4NgkJIyBhdCBsZWFzdCA0ODYKKwl0ZXN0bCAkMHgyMDAwMDAsJWVheAkjIGNoZWNrIGlmIElEIGJpdCBjaGFuZ2VkCisJamUgaXM0ODYKKworCS8qIGdldCB2ZW5kb3IgaW5mbyAqLworCXhvcmwgJWVheCwlZWF4CQkJIyBjYWxsIENQVUlEIHdpdGggMCAtPiByZXR1cm4gdmVuZG9yIElECisJY3B1aWQKKwltb3ZsICVlYXgsWDg2X0NQVUlECQkjIHNhdmUgQ1BVSUQgbGV2ZWwKKwltb3ZsICVlYngsWDg2X1ZFTkRPUl9JRAkJIyBsbyA0IGNoYXJzCisJbW92bCAlZWR4LFg4Nl9WRU5ET1JfSUQrNAkjIG5leHQgNCBjaGFycworCW1vdmwgJWVjeCxYODZfVkVORE9SX0lEKzgJIyBsYXN0IDQgY2hhcnMKKworCW9ybCAlZWF4LCVlYXgJCQkjIGRvIHdlIGhhdmUgcHJvY2Vzc29yIGluZm8gYXMgd2VsbD8KKwlqZSBpczQ4NgorCisJbW92bCAkMSwlZWF4CQkjIFVzZSB0aGUgQ1BVSUQgaW5zdHJ1Y3Rpb24gdG8gZ2V0IENQVSB0eXBlCisJY3B1aWQKKwltb3ZiICVhbCwlY2wJCSMgc2F2ZSByZWcgZm9yIGZ1dHVyZSB1c2UKKwlhbmRiICQweDBmLCVhaAkJIyBtYXNrIHByb2Nlc3NvciBmYW1pbHkKKwltb3ZiICVhaCxYODYKKwlhbmRiICQweGYwLCVhbAkJIyBtYXNrIG1vZGVsCisJc2hyYiAkNCwlYWwKKwltb3ZiICVhbCxYODZfTU9ERUwKKwlhbmRiICQweDBmLCVjbAkJIyBtYXNrIG1hc2sgcmV2aXNpb24KKwltb3ZiICVjbCxYODZfTUFTSworCW1vdmwgJWVkeCxYODZfQ0FQQUJJTElUWQorCitpczQ4NjoJbW92bCAkMHg1MDAyMiwlZWN4CSMgc2V0IEFNLCBXUCwgTkUgYW5kIE1QCisJam1wIDJmCisKK2lzMzg2Ogltb3ZsICQyLCVlY3gJCSMgc2V0IE1QCisyOgltb3ZsICVjcjAsJWVheAorCWFuZGwgJDB4ODAwMDAwMTEsJWVheAkjIFNhdmUgUEcsUEUsRVQKKwlvcmwgJWVjeCwlZWF4CisJbW92bCAlZWF4LCVjcjAKKworCWNhbGwgY2hlY2tfeDg3CisJaW5jYiByZWFkeQorCWxnZHQgY3B1X2dkdF9kZXNjcgorCWxpZHQgaWR0X2Rlc2NyCisJbGptcCAkKF9fS0VSTkVMX0NTKSwkMWYKKzE6CW1vdmwgJChfX0tFUk5FTF9EUyksJWVheAkjIHJlbG9hZCBhbGwgdGhlIHNlZ21lbnQgcmVnaXN0ZXJzCisJbW92bCAlZWF4LCVzcwkJCSMgYWZ0ZXIgY2hhbmdpbmcgZ2R0LgorCisJbW92bCAkKF9fVVNFUl9EUyksJWVheAkJIyBEUy9FUyBjb250YWlucyBkZWZhdWx0IFVTRVIgc2VnbWVudAorCW1vdmwgJWVheCwlZHMKKwltb3ZsICVlYXgsJWVzCisKKwl4b3JsICVlYXgsJWVheAkJCSMgQ2xlYXIgRlMvR1MgYW5kIExEVAorCW1vdmwgJWVheCwlZnMKKwltb3ZsICVlYXgsJWdzCisJbGxkdCAlYXgKKwljbGQJCQkjIGdjYzIgd2FudHMgdGhlIGRpcmVjdGlvbiBmbGFnIGNsZWFyZWQgYXQgYWxsIHRpbWVzCisjaWZkZWYgQ09ORklHX1NNUAorCW1vdmIgcmVhZHksICVjbAkKKwljbXBiICQxLCVjbAorCWplIDFmCQkJIyB0aGUgZmlyc3QgQ1BVIGNhbGxzIHN0YXJ0X2tlcm5lbAorCQkJCSMgYWxsIG90aGVyIENQVXMgY2FsbCBpbml0aWFsaXplX3NlY29uZGFyeQorCWNhbGwgaW5pdGlhbGl6ZV9zZWNvbmRhcnkKKwlqbXAgTDYKKzE6CisjZW5kaWYgLyogQ09ORklHX1NNUCAqLworCWNhbGwgc3RhcnRfa2VybmVsCitMNjoKKwlqbXAgTDYJCQkjIG1haW4gc2hvdWxkIG5ldmVyIHJldHVybiBoZXJlLCBidXQKKwkJCQkjIGp1c3QgaW4gY2FzZSwgd2Uga25vdyB3aGF0IGhhcHBlbnMuCisKKy8qCisgKiBXZSBkZXBlbmQgb24gRVQgdG8gYmUgY29ycmVjdC4gVGhpcyBjaGVja3MgZm9yIDI4Ny8zODcuCisgKi8KK2NoZWNrX3g4NzoKKwltb3ZiICQwLFg4Nl9IQVJEX01BVEgKKwljbHRzCisJZm5pbml0CisJZnN0c3cgJWF4CisJY21wYiAkMCwlYWwKKwlqZSAxZgorCW1vdmwgJWNyMCwlZWF4CQkvKiBubyBjb3Byb2Nlc3NvcjogaGF2ZSB0byBzZXQgYml0cyAqLworCXhvcmwgJDQsJWVheAkJLyogc2V0IEVNICovCisJbW92bCAlZWF4LCVjcjAKKwlyZXQKKwlBTElHTgorMToJbW92YiAkMSxYODZfSEFSRF9NQVRICisJLmJ5dGUgMHhEQiwweEU0CQkvKiBmc2V0cG0gZm9yIDI4NywgaWdub3JlZCBieSAzODcgKi8KKwlyZXQKKworLyoKKyAqICBzZXR1cF9pZHQKKyAqCisgKiAgc2V0cyB1cCBhIGlkdCB3aXRoIDI1NiBlbnRyaWVzIHBvaW50aW5nIHRvCisgKiAgaWdub3JlX2ludCwgaW50ZXJydXB0IGdhdGVzLiBJdCBkb2Vzbid0IGFjdHVhbGx5IGxvYWQKKyAqICBpZHQgLSB0aGF0IGNhbiBiZSBkb25lIG9ubHkgYWZ0ZXIgcGFnaW5nIGhhcyBiZWVuIGVuYWJsZWQKKyAqICBhbmQgdGhlIGtlcm5lbCBtb3ZlZCB0byBQQUdFX09GRlNFVC4gSW50ZXJydXB0cworICogIGFyZSBlbmFibGVkIGVsc2V3aGVyZSwgd2hlbiB3ZSBjYW4gYmUgcmVsYXRpdmVseQorICogIHN1cmUgZXZlcnl0aGluZyBpcyBvay4KKyAqCisgKiAgV2FybmluZzogJWVzaSBpcyBsaXZlIGFjcm9zcyB0aGlzIGZ1bmN0aW9uLgorICovCitzZXR1cF9pZHQ6CisJbGVhIGlnbm9yZV9pbnQsJWVkeAorCW1vdmwgJChfX0tFUk5FTF9DUyA8PCAxNiksJWVheAorCW1vdncgJWR4LCVheAkJLyogc2VsZWN0b3IgPSAweDAwMTAgPSBjcyAqLworCW1vdncgJDB4OEUwMCwlZHgJLyogaW50ZXJydXB0IGdhdGUgLSBkcGw9MCwgcHJlc2VudCAqLworCisJbGVhIGlkdF90YWJsZSwlZWRpCisJbW92ICQyNTYsJWVjeAorcnBfc2lkdDoKKwltb3ZsICVlYXgsKCVlZGkpCisJbW92bCAlZWR4LDQoJWVkaSkKKwlhZGRsICQ4LCVlZGkKKwlkZWMgJWVjeAorCWpuZSBycF9zaWR0CisJcmV0CisKKy8qIFRoaXMgaXMgdGhlIGRlZmF1bHQgaW50ZXJydXB0ICJoYW5kbGVyIiA6LSkgKi8KKwlBTElHTgoraWdub3JlX2ludDoKKwljbGQKKwlwdXNobCAlZWF4CisJcHVzaGwgJWVjeAorCXB1c2hsICVlZHgKKwlwdXNobCAlZXMKKwlwdXNobCAlZHMKKwltb3ZsICQoX19LRVJORUxfRFMpLCVlYXgKKwltb3ZsICVlYXgsJWRzCisJbW92bCAlZWF4LCVlcworCXB1c2hsIDE2KCVlc3ApCisJcHVzaGwgMjQoJWVzcCkKKwlwdXNobCAzMiglZXNwKQorCXB1c2hsIDQwKCVlc3ApCisJcHVzaGwgJGludF9tc2cKKwljYWxsIHByaW50aworCWFkZGwgJCg1KjQpLCVlc3AKKwlwb3BsICVkcworCXBvcGwgJWVzCisJcG9wbCAlZWR4CisJcG9wbCAlZWN4CisJcG9wbCAlZWF4CisJaXJldAorCisvKgorICogUmVhbCBiZWdpbm5pbmcgb2Ygbm9ybWFsICJ0ZXh0IiBzZWdtZW50CisgKi8KK0VOVFJZKHN0ZXh0KQorRU5UUlkoX3N0ZXh0KQorCisvKgorICogQlNTIHNlY3Rpb24KKyAqLworLnNlY3Rpb24gIi5ic3MucGFnZV9hbGlnbmVkIiwidyIKK0VOVFJZKHN3YXBwZXJfcGdfZGlyKQorCS5maWxsIDEwMjQsNCwwCitFTlRSWShlbXB0eV96ZXJvX3BhZ2UpCisJLmZpbGwgNDA5NiwxLDAKKworLyoKKyAqIFRoaXMgc3RhcnRzIHRoZSBkYXRhIHNlY3Rpb24uCisgKi8KKy5kYXRhCisKK0VOVFJZKHN0YWNrX3N0YXJ0KQorCS5sb25nIGluaXRfdGhyZWFkX3VuaW9uK1RIUkVBRF9TSVpFCisJLmxvbmcgX19CT09UX0RTCisKK3JlYWR5OgkuYnl0ZSAwCisKK2ludF9tc2c6CisJLmFzY2l6ICJVbmtub3duIGludGVycnVwdCBvciBmYXVsdCBhdCBFSVAgJXAgJXAgJXBcbiIKKworLyoKKyAqIFRoZSBJRFQgYW5kIEdEVCAnZGVzY3JpcHRvcnMnIGFyZSBhIHN0cmFuZ2UgNDgtYml0IG9iamVjdAorICogb25seSB1c2VkIGJ5IHRoZSBsaWR0IGFuZCBsZ2R0IGluc3RydWN0aW9ucy4gVGhleSBhcmUgbm90CisgKiBsaWtlIHVzdWFsIHNlZ21lbnQgZGVzY3JpcHRvcnMgLSB0aGV5IGNvbnNpc3Qgb2YgYSAxNi1iaXQKKyAqIHNlZ21lbnQgc2l6ZSwgYW5kIDMyLWJpdCBsaW5lYXIgYWRkcmVzcyB2YWx1ZToKKyAqLworCisuZ2xvYmwgYm9vdF9nZHRfZGVzY3IKKy5nbG9ibCBpZHRfZGVzY3IKKy5nbG9ibCBjcHVfZ2R0X2Rlc2NyCisKKwlBTElHTgorIyBlYXJseSBib290IEdEVCBkZXNjcmlwdG9yIChtdXN0IHVzZSAxOjEgYWRkcmVzcyBtYXBwaW5nKQorCS53b3JkIDAJCQkJIyAzMiBiaXQgYWxpZ24gZ2R0X2Rlc2MuYWRkcmVzcworYm9vdF9nZHRfZGVzY3I6CisJLndvcmQgX19CT09UX0RTKzcKKwkubG9uZyBib290X2dkdF90YWJsZSAtIF9fUEFHRV9PRkZTRVQKKworCS53b3JkIDAJCQkJIyAzMi1iaXQgYWxpZ24gaWR0X2Rlc2MuYWRkcmVzcworaWR0X2Rlc2NyOgorCS53b3JkIElEVF9FTlRSSUVTKjgtMQkJIyBpZHQgY29udGFpbnMgMjU2IGVudHJpZXMKKwkubG9uZyBpZHRfdGFibGUKKworIyBib290IEdEVCBkZXNjcmlwdG9yIChsYXRlciBvbiB1c2VkIGJ5IENQVSMwKToKKwkud29yZCAwCQkJCSMgMzIgYml0IGFsaWduIGdkdF9kZXNjLmFkZHJlc3MKK2NwdV9nZHRfZGVzY3I6CisJLndvcmQgR0RUX0VOVFJJRVMqOC0xCisJLmxvbmcgY3B1X2dkdF90YWJsZQorCisJLmZpbGwgTlJfQ1BVUy0xLDgsMAkJIyBzcGFjZSBmb3IgdGhlIG90aGVyIEdEVCBkZXNjcmlwdG9ycworCisvKgorICogVGhlIGJvb3RfZ2R0X3RhYmxlIG11c3QgbWlycm9yIHRoZSBlcXVpdmFsZW50IGluIHNldHVwLlMgYW5kIGlzCisgKiB1c2VkIG9ubHkgZm9yIGJvb3RpbmcuCisgKi8KKwkuYWxpZ24gTDFfQ0FDSEVfQllURVMKK0VOVFJZKGJvb3RfZ2R0X3RhYmxlKQorCS5maWxsIEdEVF9FTlRSWV9CT09UX0NTLDgsMAorCS5xdWFkIDB4MDBjZjlhMDAwMDAwZmZmZgkvKiBrZXJuZWwgNEdCIGNvZGUgYXQgMHgwMDAwMDAwMCAqLworCS5xdWFkIDB4MDBjZjkyMDAwMDAwZmZmZgkvKiBrZXJuZWwgNEdCIGRhdGEgYXQgMHgwMDAwMDAwMCAqLworCisvKgorICogVGhlIEdsb2JhbCBEZXNjcmlwdG9yIFRhYmxlIGNvbnRhaW5zIDI4IHF1YWR3b3JkcywgcGVyLUNQVS4KKyAqLworCS5hbGlnbiBQQUdFX1NJWkVfYXNtCitFTlRSWShjcHVfZ2R0X3RhYmxlKQorCS5xdWFkIDB4MDAwMDAwMDAwMDAwMDAwMAkvKiBOVUxMIGRlc2NyaXB0b3IgKi8KKwkucXVhZCAweDAwMDAwMDAwMDAwMDAwMDAJLyogMHgwYiByZXNlcnZlZCAqLworCS5xdWFkIDB4MDAwMDAwMDAwMDAwMDAwMAkvKiAweDEzIHJlc2VydmVkICovCisJLnF1YWQgMHgwMDAwMDAwMDAwMDAwMDAwCS8qIDB4MWIgcmVzZXJ2ZWQgKi8KKwkucXVhZCAweDAwMDAwMDAwMDAwMDAwMDAJLyogMHgyMCB1bnVzZWQgKi8KKwkucXVhZCAweDAwMDAwMDAwMDAwMDAwMDAJLyogMHgyOCB1bnVzZWQgKi8KKwkucXVhZCAweDAwMDAwMDAwMDAwMDAwMDAJLyogMHgzMyBUTFMgZW50cnkgMSAqLworCS5xdWFkIDB4MDAwMDAwMDAwMDAwMDAwMAkvKiAweDNiIFRMUyBlbnRyeSAyICovCisJLnF1YWQgMHgwMDAwMDAwMDAwMDAwMDAwCS8qIDB4NDMgVExTIGVudHJ5IDMgKi8KKwkucXVhZCAweDAwMDAwMDAwMDAwMDAwMDAJLyogMHg0YiByZXNlcnZlZCAqLworCS5xdWFkIDB4MDAwMDAwMDAwMDAwMDAwMAkvKiAweDUzIHJlc2VydmVkICovCisJLnF1YWQgMHgwMDAwMDAwMDAwMDAwMDAwCS8qIDB4NWIgcmVzZXJ2ZWQgKi8KKworCS5xdWFkIDB4MDBjZjlhMDAwMDAwZmZmZgkvKiAweDYwIGtlcm5lbCA0R0IgY29kZSBhdCAweDAwMDAwMDAwICovCisJLnF1YWQgMHgwMGNmOTIwMDAwMDBmZmZmCS8qIDB4Njgga2VybmVsIDRHQiBkYXRhIGF0IDB4MDAwMDAwMDAgKi8KKwkucXVhZCAweDAwY2ZmYTAwMDAwMGZmZmYJLyogMHg3MyB1c2VyIDRHQiBjb2RlIGF0IDB4MDAwMDAwMDAgKi8KKwkucXVhZCAweDAwY2ZmMjAwMDAwMGZmZmYJLyogMHg3YiB1c2VyIDRHQiBkYXRhIGF0IDB4MDAwMDAwMDAgKi8KKworCS5xdWFkIDB4MDAwMDAwMDAwMDAwMDAwMAkvKiAweDgwIFRTUyBkZXNjcmlwdG9yICovCisJLnF1YWQgMHgwMDAwMDAwMDAwMDAwMDAwCS8qIDB4ODggTERUIGRlc2NyaXB0b3IgKi8KKworCS8qIFNlZ21lbnRzIHVzZWQgZm9yIGNhbGxpbmcgUG5QIEJJT1MgKi8KKwkucXVhZCAweDAwYzA5YTAwMDAwMDAwMDAJLyogMHg5MCAzMi1iaXQgY29kZSAqLworCS5xdWFkIDB4MDA4MDlhMDAwMDAwMDAwMAkvKiAweDk4IDE2LWJpdCBjb2RlICovCisJLnF1YWQgMHgwMDgwOTIwMDAwMDAwMDAwCS8qIDB4YTAgMTYtYml0IGRhdGEgKi8KKwkucXVhZCAweDAwODA5MjAwMDAwMDAwMDAJLyogMHhhOCAxNi1iaXQgZGF0YSAqLworCS5xdWFkIDB4MDA4MDkyMDAwMDAwMDAwMAkvKiAweGIwIDE2LWJpdCBkYXRhICovCisJLyoKKwkgKiBUaGUgQVBNIHNlZ21lbnRzIGhhdmUgYnl0ZSBncmFudWxhcml0eSBhbmQgdGhlaXIgYmFzZXMKKwkgKiBhbmQgbGltaXRzIGFyZSBzZXQgYXQgcnVuIHRpbWUuCisJICovCisJLnF1YWQgMHgwMDQwOWEwMDAwMDAwMDAwCS8qIDB4YjggQVBNIENTICAgIGNvZGUgKi8KKwkucXVhZCAweDAwMDA5YTAwMDAwMDAwMDAJLyogMHhjMCBBUE0gQ1MgMTYgY29kZSAoMTYgYml0KSAqLworCS5xdWFkIDB4MDA0MDkyMDAwMDAwMDAwMAkvKiAweGM4IEFQTSBEUyAgICBkYXRhICovCisKKwkucXVhZCAweDAwMDA5MjAwMDAwMDAwMDAJLyogMHhkMCAtIEVTUEZJWCAxNi1iaXQgU1MgKi8KKwkucXVhZCAweDAwMDAwMDAwMDAwMDAwMDAJLyogMHhkOCAtIHVudXNlZCAqLworCS5xdWFkIDB4MDAwMDAwMDAwMDAwMDAwMAkvKiAweGUwIC0gdW51c2VkICovCisJLnF1YWQgMHgwMDAwMDAwMDAwMDAwMDAwCS8qIDB4ZTggLSB1bnVzZWQgKi8KKwkucXVhZCAweDAwMDAwMDAwMDAwMDAwMDAJLyogMHhmMCAtIHVudXNlZCAqLworCS5xdWFkIDB4MDAwMDAwMDAwMDAwMDAwMAkvKiAweGY4IC0gR0RUIGVudHJ5IDMxOiBkb3VibGUtZmF1bHQgVFNTICovCisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvaTM4Nl9rc3ltcy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9pMzg2X2tzeW1zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRlYzM1NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvaTM4Nl9rc3ltcy5jCkBAIC0wLDAgKzEsMTk1IEBACisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvdXNlci5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZmNvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tY2EuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9hcG1fYmlvcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisKKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9pMzg3Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vY2hlY2tzdW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL21teC5oPgorI2luY2x1ZGUgPGFzbS9kZXNjLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vbm1pLmg+CisjaW5jbHVkZSA8YXNtL2lzdC5oPgorI2luY2x1ZGUgPGFzbS9rZGVidWcuaD4KKworZXh0ZXJuIHZvaWQgZHVtcF90aHJlYWQoc3RydWN0IHB0X3JlZ3MgKiwgc3RydWN0IHVzZXIgKik7CitleHRlcm4gc3BpbmxvY2tfdCBydGNfbG9jazsKKworLyogVGhpcyBpcyBkZWZpbml0ZWx5IGEgR1BMLW9ubHkgc3ltYm9sICovCitFWFBPUlRfU1lNQk9MX0dQTChjcHVfZ2R0X3RhYmxlKTsKKworI2lmIGRlZmluZWQoQ09ORklHX0FQTV9NT0RVTEUpCitleHRlcm4gdm9pZCBtYWNoaW5lX3JlYWxfcmVzdGFydCh1bnNpZ25lZCBjaGFyICosIGludCk7CitFWFBPUlRfU1lNQk9MKG1hY2hpbmVfcmVhbF9yZXN0YXJ0KTsKK2V4dGVybiB2b2lkIGRlZmF1bHRfaWRsZSh2b2lkKTsKK0VYUE9SVF9TWU1CT0woZGVmYXVsdF9pZGxlKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NNUAorZXh0ZXJuIHZvaWQgRkFTVENBTEwoIF9fd3JpdGVfbG9ja19mYWlsZWQocndsb2NrX3QgKnJ3KSk7CitleHRlcm4gdm9pZCBGQVNUQ0FMTCggX19yZWFkX2xvY2tfZmFpbGVkKHJ3bG9ja190ICpydykpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19CTEtfREVWX0lERSkgfHwgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9IRCkgfHwgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9JREVfTU9EVUxFKSB8fCBkZWZpbmVkKENPTkZJR19CTEtfREVWX0hEX01PRFVMRSkKK2V4dGVybiBzdHJ1Y3QgZHJpdmVfaW5mb19zdHJ1Y3QgZHJpdmVfaW5mbzsKK0VYUE9SVF9TWU1CT0woZHJpdmVfaW5mbyk7CisjZW5kaWYKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgY3B1X2toejsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGdldF9jbW9zX3RpbWUodm9pZCk7CisKKy8qIHBsYXRmb3JtIGRlcGVuZGVudCBzdXBwb3J0ICovCitFWFBPUlRfU1lNQk9MKGJvb3RfY3B1X2RhdGEpOworI2lmZGVmIENPTkZJR19ESVNDT05USUdNRU0KK0VYUE9SVF9TWU1CT0wobm9kZV9kYXRhKTsKK0VYUE9SVF9TWU1CT0wocGh5c25vZGVfbWFwKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19YODZfTlVNQVEKK0VYUE9SVF9TWU1CT0woeHF1YWRfcG9ydGlvKTsKKyNlbmRpZgorRVhQT1JUX1NZTUJPTChkdW1wX3RocmVhZCk7CitFWFBPUlRfU1lNQk9MKGR1bXBfZnB1KTsKK0VYUE9SVF9TWU1CT0xfR1BMKGtlcm5lbF9mcHVfYmVnaW4pOworRVhQT1JUX1NZTUJPTChfX2lvcmVtYXApOworRVhQT1JUX1NZTUJPTChpb3JlbWFwX25vY2FjaGUpOworRVhQT1JUX1NZTUJPTChpb3VubWFwKTsKK0VYUE9SVF9TWU1CT0woa2VybmVsX3RocmVhZCk7CitFWFBPUlRfU1lNQk9MKHBtX2lkbGUpOworRVhQT1JUX1NZTUJPTChwbV9wb3dlcl9vZmYpOworRVhQT1JUX1NZTUJPTChnZXRfY21vc190aW1lKTsKK0VYUE9SVF9TWU1CT0woY3B1X2toeik7CitFWFBPUlRfU1lNQk9MKGFwbV9pbmZvKTsKKworRVhQT1JUX1NZTUJPTChfX2Rvd25fZmFpbGVkKTsKK0VYUE9SVF9TWU1CT0woX19kb3duX2ZhaWxlZF9pbnRlcnJ1cHRpYmxlKTsKK0VYUE9SVF9TWU1CT0woX19kb3duX2ZhaWxlZF90cnlsb2NrKTsKK0VYUE9SVF9TWU1CT0woX191cF93YWtldXApOworLyogTmV0d29ya2luZyBoZWxwZXIgcm91dGluZXMuICovCitFWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMpOworLyogRGVsYXkgbG9vcHMgKi8KK0VYUE9SVF9TWU1CT0woX19uZGVsYXkpOworRVhQT1JUX1NZTUJPTChfX3VkZWxheSk7CitFWFBPUlRfU1lNQk9MKF9fZGVsYXkpOworRVhQT1JUX1NZTUJPTChfX2NvbnN0X3VkZWxheSk7CisKK0VYUE9SVF9TWU1CT0woX19nZXRfdXNlcl8xKTsKK0VYUE9SVF9TWU1CT0woX19nZXRfdXNlcl8yKTsKK0VYUE9SVF9TWU1CT0woX19nZXRfdXNlcl80KTsKKworRVhQT1JUX1NZTUJPTChfX3B1dF91c2VyXzEpOworRVhQT1JUX1NZTUJPTChfX3B1dF91c2VyXzIpOworRVhQT1JUX1NZTUJPTChfX3B1dF91c2VyXzQpOworRVhQT1JUX1NZTUJPTChfX3B1dF91c2VyXzgpOworCitFWFBPUlRfU1lNQk9MKHN0cnBicmspOworRVhQT1JUX1NZTUJPTChzdHJzdHIpOworCitFWFBPUlRfU1lNQk9MKHN0cm5jcHlfZnJvbV91c2VyKTsKK0VYUE9SVF9TWU1CT0woX19zdHJuY3B5X2Zyb21fdXNlcik7CitFWFBPUlRfU1lNQk9MKGNsZWFyX3VzZXIpOworRVhQT1JUX1NZTUJPTChfX2NsZWFyX3VzZXIpOworRVhQT1JUX1NZTUJPTChfX2NvcHlfZnJvbV91c2VyX2xsKTsKK0VYUE9SVF9TWU1CT0woX19jb3B5X3RvX3VzZXJfbGwpOworRVhQT1JUX1NZTUJPTChzdHJubGVuX3VzZXIpOworCitFWFBPUlRfU1lNQk9MKGRtYV9hbGxvY19jb2hlcmVudCk7CitFWFBPUlRfU1lNQk9MKGRtYV9mcmVlX2NvaGVyZW50KTsKKworI2lmZGVmIENPTkZJR19QQ0kKK0VYUE9SVF9TWU1CT0wocGNpX21lbV9zdGFydCk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQ0lfQklPUworRVhQT1JUX1NZTUJPTChwY2liaW9zX3NldF9pcnFfcm91dGluZyk7CitFWFBPUlRfU1lNQk9MKHBjaWJpb3NfZ2V0X2lycV9yb3V0aW5nX3RhYmxlKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1g4Nl9VU0VfM0ROT1cKK0VYUE9SVF9TWU1CT0woX21teF9tZW1jcHkpOworRVhQT1JUX1NZTUJPTChtbXhfY2xlYXJfcGFnZSk7CitFWFBPUlRfU1lNQk9MKG1teF9jb3B5X3BhZ2UpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfWDg2X0hUCitFWFBPUlRfU1lNQk9MKHNtcF9udW1fc2libGluZ3MpOworRVhQT1JUX1NZTUJPTChjcHVfc2libGluZ19tYXApOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU01QCitFWFBPUlRfU1lNQk9MKGNwdV9kYXRhKTsKK0VYUE9SVF9TWU1CT0woY3B1X29ubGluZV9tYXApOworRVhQT1JUX1NZTUJPTChjcHVfY2FsbG91dF9tYXApOworRVhQT1JUX1NZTUJPTChfX3dyaXRlX2xvY2tfZmFpbGVkKTsKK0VYUE9SVF9TWU1CT0woX19yZWFkX2xvY2tfZmFpbGVkKTsKKworLyogR2xvYmFsIFNNUCBzdHVmZiAqLworRVhQT1JUX1NZTUJPTChzbXBfY2FsbF9mdW5jdGlvbik7CisKKy8qIFRMQiBmbHVzaGluZyAqLworRVhQT1JUX1NZTUJPTChmbHVzaF90bGJfcGFnZSk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQworRVhQT1JUX1NZTUJPTChJT19BUElDX2dldF9QQ0lfaXJxX3ZlY3Rvcik7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NQ0EKK0VYUE9SVF9TWU1CT0wobWFjaGluZV9pZCk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19WVAorRVhQT1JUX1NZTUJPTChzY3JlZW5faW5mbyk7CisjZW5kaWYKKworRVhQT1JUX1NZTUJPTChnZXRfd2NoYW4pOworCitFWFBPUlRfU1lNQk9MKHJ0Y19sb2NrKTsKKworRVhQT1JUX1NZTUJPTF9HUEwoc2V0X25taV9jYWxsYmFjayk7CitFWFBPUlRfU1lNQk9MX0dQTCh1bnNldF9ubWlfY2FsbGJhY2spOworCisjdW5kZWYgbWVtY21wCitleHRlcm4gaW50IG1lbWNtcChjb25zdCB2b2lkICosY29uc3Qgdm9pZCAqLF9fa2VybmVsX3NpemVfdCk7CitFWFBPUlRfU1lNQk9MKG1lbWNtcCk7CisKK0VYUE9SVF9TWU1CT0wocmVnaXN0ZXJfZGllX25vdGlmaWVyKTsKKyNpZmRlZiBDT05GSUdfSEFWRV9ERUNfTE9DSworRVhQT1JUX1NZTUJPTChfYXRvbWljX2RlY19hbmRfbG9jayk7CisjZW5kaWYKKworRVhQT1JUX1NZTUJPTChfX1BBR0VfS0VSTkVMKTsKKworI2lmZGVmIENPTkZJR19ISUdITUVNCitFWFBPUlRfU1lNQk9MKGttYXApOworRVhQT1JUX1NZTUJPTChrdW5tYXApOworRVhQT1JUX1NZTUJPTChrbWFwX2F0b21pYyk7CitFWFBPUlRfU1lNQk9MKGt1bm1hcF9hdG9taWMpOworRVhQT1JUX1NZTUJPTChrbWFwX2F0b21pY190b19wYWdlKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfWDg2X1NQRUVEU1RFUF9TTUkpIHx8IGRlZmluZWQoQ09ORklHX1g4Nl9TUEVFRFNURVBfU01JX01PRFVMRSkKK0VYUE9SVF9TWU1CT0woaXN0X2luZm8pOworI2VuZGlmCisKK0VYUE9SVF9TWU1CT0woY3N1bV9wYXJ0aWFsKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvaTM4Ny5jIGIvYXJjaC9pMzg2L2tlcm5lbC9pMzg3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU1ZTAzNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvaTM4Ny5jCkBAIC0wLDAgKzEsNTU1IEBACisvKgorICogIGxpbnV4L2FyY2gvaTM4Ni9rZXJuZWwvaTM4Ny5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NCBMaW51cyBUb3J2YWxkcworICoKKyAqICBQZW50aXVtIElJSSBGWFNSLCBTU0Ugc3VwcG9ydAorICogIEdlbmVyYWwgRlBVIHN0YXRlIGhhbmRsaW5nIGNsZWFudXBzCisgKglHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+LCBNYXkgMjAwMAorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vaTM4Ny5oPgorI2luY2x1ZGUgPGFzbS9tYXRoX2VtdS5oPgorI2luY2x1ZGUgPGFzbS9zaWdjb250ZXh0Lmg+CisjaW5jbHVkZSA8YXNtL3VzZXIuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2lmZGVmIENPTkZJR19NQVRIX0VNVUxBVElPTgorI2RlZmluZSBIQVZFX0hXRlAgKGJvb3RfY3B1X2RhdGEuaGFyZF9tYXRoKQorI2Vsc2UKKyNkZWZpbmUgSEFWRV9IV0ZQIDEKKyNlbmRpZgorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBteGNzcl9mZWF0dXJlX21hc2sgPSAweGZmZmZmZmZmOworCit2b2lkIG14Y3NyX2ZlYXR1cmVfbWFza19pbml0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBtYXNrID0gMDsKKwljbHRzKCk7CisJaWYgKGNwdV9oYXNfZnhzcikgeworCQltZW1zZXQoJmN1cnJlbnQtPnRocmVhZC5pMzg3LmZ4c2F2ZSwgMCwgc2l6ZW9mKHN0cnVjdCBpMzg3X2Z4c2F2ZV9zdHJ1Y3QpKTsKKwkJYXNtIHZvbGF0aWxlKCJmeHNhdmUgJTAiIDogOiAibSIgKGN1cnJlbnQtPnRocmVhZC5pMzg3LmZ4c2F2ZSkpOyAKKwkJbWFzayA9IGN1cnJlbnQtPnRocmVhZC5pMzg3LmZ4c2F2ZS5teGNzcl9tYXNrOworCQlpZiAobWFzayA9PSAwKSBtYXNrID0gMHgwMDAwZmZiZjsKKwl9IAorCW14Y3NyX2ZlYXR1cmVfbWFzayAmPSBtYXNrOworCXN0dHMoKTsKK30KKworLyoKKyAqIFRoZSBfY3VycmVudF8gdGFzayBpcyB1c2luZyB0aGUgRlBVIGZvciB0aGUgZmlyc3QgdGltZQorICogc28gaW5pdGlhbGl6ZSBpdCBhbmQgc2V0IHRoZSBteGNzciB0byBpdHMgZGVmYXVsdAorICogdmFsdWUgYXQgcmVzZXQgaWYgd2Ugc3VwcG9ydCBYTU0gaW5zdHJ1Y3Rpb25zIGFuZCB0aGVuCisgKiByZW1lYmVyIHRoZSBjdXJyZW50IHRhc2sgaGFzIHVzZWQgdGhlIEZQVS4KKyAqLwordm9pZCBpbml0X2ZwdShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKwlpZiAoY3B1X2hhc19meHNyKSB7CisJCW1lbXNldCgmdHNrLT50aHJlYWQuaTM4Ny5meHNhdmUsIDAsIHNpemVvZihzdHJ1Y3QgaTM4N19meHNhdmVfc3RydWN0KSk7CisJCXRzay0+dGhyZWFkLmkzODcuZnhzYXZlLmN3ZCA9IDB4MzdmOworCQlpZiAoY3B1X2hhc194bW0pCisJCQl0c2stPnRocmVhZC5pMzg3LmZ4c2F2ZS5teGNzciA9IDB4MWY4MDsKKwl9IGVsc2UgeworCQltZW1zZXQoJnRzay0+dGhyZWFkLmkzODcuZnNhdmUsIDAsIHNpemVvZihzdHJ1Y3QgaTM4N19mc2F2ZV9zdHJ1Y3QpKTsKKwkJdHNrLT50aHJlYWQuaTM4Ny5mc2F2ZS5jd2QgPSAweGZmZmYwMzdmdTsKKwkJdHNrLT50aHJlYWQuaTM4Ny5mc2F2ZS5zd2QgPSAweGZmZmYwMDAwdTsKKwkJdHNrLT50aHJlYWQuaTM4Ny5mc2F2ZS50d2QgPSAweGZmZmZmZmZmdTsKKwkJdHNrLT50aHJlYWQuaTM4Ny5mc2F2ZS5mb3MgPSAweGZmZmYwMDAwdTsKKwl9CisJLyogb25seSB0aGUgZGV2aWNlIG5vdCBhdmFpbGFibGUgZXhjZXB0aW9uIG9yIHB0cmFjZSBjYW4gY2FsbCBpbml0X2ZwdSAqLworCXNldF9zdG9wcGVkX2NoaWxkX3VzZWRfbWF0aCh0c2spOworfQorCisvKgorICogRlBVIGxhenkgc3RhdGUgc2F2ZSBoYW5kbGluZy4KKyAqLworCit2b2lkIGtlcm5lbF9mcHVfYmVnaW4odm9pZCkKK3sKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRocmVhZCA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKTsKKworCXByZWVtcHRfZGlzYWJsZSgpOworCWlmICh0aHJlYWQtPnN0YXR1cyAmIFRTX1VTRURGUFUpIHsKKwkJX19zYXZlX2luaXRfZnB1KHRocmVhZC0+dGFzayk7CisJCXJldHVybjsKKwl9CisJY2x0cygpOworfQorCit2b2lkIHJlc3RvcmVfZnB1KCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayApCit7CisJaWYgKCBjcHVfaGFzX2Z4c3IgKSB7CisJCWFzbSB2b2xhdGlsZSggImZ4cnN0b3IgJTAiCisJCQkgICAgICA6IDogIm0iICh0c2stPnRocmVhZC5pMzg3LmZ4c2F2ZSkgKTsKKwl9IGVsc2UgeworCQlhc20gdm9sYXRpbGUoICJmcnN0b3IgJTAiCisJCQkgICAgICA6IDogIm0iICh0c2stPnRocmVhZC5pMzg3LmZzYXZlKSApOworCX0KK30KKworLyoKKyAqIEZQVSB0YWcgd29yZCBjb252ZXJzaW9ucy4KKyAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IHR3ZF9pMzg3X3RvX2Z4c3IoIHVuc2lnbmVkIHNob3J0IHR3ZCApCit7CisJdW5zaWduZWQgaW50IHRtcDsgLyogdG8gYXZvaWQgMTYgYml0IHByZWZpeGVzIGluIHRoZSBjb2RlICovCisgCisJLyogVHJhbnNmb3JtIGVhY2ggcGFpciBvZiBiaXRzIGludG8gMDEgKHZhbGlkKSBvciAwMCAoZW1wdHkpICovCisgICAgICAgIHRtcCA9IH50d2Q7CisgICAgICAgIHRtcCA9ICh0bXAgfCAodG1wPj4xKSkgJiAweDU1NTU7IC8qIDBWMFYwVjBWMFYwVjBWMFYgKi8KKyAgICAgICAgLyogYW5kIG1vdmUgdGhlIHZhbGlkIGJpdHMgdG8gdGhlIGxvd2VyIGJ5dGUuICovCisgICAgICAgIHRtcCA9ICh0bXAgfCAodG1wID4+IDEpKSAmIDB4MzMzMzsgLyogMDBWVjAwVlYwMFZWMDBWViAqLworICAgICAgICB0bXAgPSAodG1wIHwgKHRtcCA+PiAyKSkgJiAweDBmMGY7IC8qIDAwMDBWVlZWMDAwMFZWVlYgKi8KKyAgICAgICAgdG1wID0gKHRtcCB8ICh0bXAgPj4gNCkpICYgMHgwMGZmOyAvKiAwMDAwMDAwMFZWVlZWVlZWICovCisgICAgICAgIHJldHVybiB0bXA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB0d2RfZnhzcl90b19pMzg3KCBzdHJ1Y3QgaTM4N19meHNhdmVfc3RydWN0ICpmeHNhdmUgKQoreworCXN0cnVjdCBfZnB4cmVnICpzdCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyB0b3MgPSAoZnhzYXZlLT5zd2QgPj4gMTEpICYgNzsKKwl1bnNpZ25lZCBsb25nIHR3ZCA9ICh1bnNpZ25lZCBsb25nKSBmeHNhdmUtPnR3ZDsKKwl1bnNpZ25lZCBsb25nIHRhZzsKKwl1bnNpZ25lZCBsb25nIHJldCA9IDB4ZmZmZjAwMDB1OworCWludCBpOworCisjZGVmaW5lIEZQUkVHX0FERFIoZiwgbikJKCh2b2lkICopJihmKS0+c3Rfc3BhY2UgKyAobikgKiAxNik7CisKKwlmb3IgKCBpID0gMCA7IGkgPCA4IDsgaSsrICkgeworCQlpZiAoIHR3ZCAmIDB4MSApIHsKKwkJCXN0ID0gRlBSRUdfQUREUiggZnhzYXZlLCAoaSAtIHRvcykgJiA3ICk7CisKKwkJCXN3aXRjaCAoIHN0LT5leHBvbmVudCAmIDB4N2ZmZiApIHsKKwkJCWNhc2UgMHg3ZmZmOgorCQkJCXRhZyA9IDI7CQkvKiBTcGVjaWFsICovCisJCQkJYnJlYWs7CisJCQljYXNlIDB4MDAwMDoKKwkJCQlpZiAoICFzdC0+c2lnbmlmaWNhbmRbMF0gJiYKKwkJCQkgICAgICFzdC0+c2lnbmlmaWNhbmRbMV0gJiYKKwkJCQkgICAgICFzdC0+c2lnbmlmaWNhbmRbMl0gJiYKKwkJCQkgICAgICFzdC0+c2lnbmlmaWNhbmRbM10gKSB7CisJCQkJCXRhZyA9IDE7CS8qIFplcm8gKi8KKwkJCQl9IGVsc2UgeworCQkJCQl0YWcgPSAyOwkvKiBTcGVjaWFsICovCisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlpZiAoIHN0LT5zaWduaWZpY2FuZFszXSAmIDB4ODAwMCApIHsKKwkJCQkJdGFnID0gMDsJLyogVmFsaWQgKi8KKwkJCQl9IGVsc2UgeworCQkJCQl0YWcgPSAyOwkvKiBTcGVjaWFsICovCisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJdGFnID0gMzsJCQkvKiBFbXB0eSAqLworCQl9CisJCXJldCB8PSAodGFnIDw8ICgyICogaSkpOworCQl0d2QgPSB0d2QgPj4gMTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZQVSBzdGF0ZSBpbnRlcmFjdGlvbi4KKyAqLworCit1bnNpZ25lZCBzaG9ydCBnZXRfZnB1X2N3ZCggc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgKQoreworCWlmICggY3B1X2hhc19meHNyICkgeworCQlyZXR1cm4gdHNrLT50aHJlYWQuaTM4Ny5meHNhdmUuY3dkOworCX0gZWxzZSB7CisJCXJldHVybiAodW5zaWduZWQgc2hvcnQpdHNrLT50aHJlYWQuaTM4Ny5mc2F2ZS5jd2Q7CisJfQorfQorCit1bnNpZ25lZCBzaG9ydCBnZXRfZnB1X3N3ZCggc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgKQoreworCWlmICggY3B1X2hhc19meHNyICkgeworCQlyZXR1cm4gdHNrLT50aHJlYWQuaTM4Ny5meHNhdmUuc3dkOworCX0gZWxzZSB7CisJCXJldHVybiAodW5zaWduZWQgc2hvcnQpdHNrLT50aHJlYWQuaTM4Ny5mc2F2ZS5zd2Q7CisJfQorfQorCisjaWYgMAordW5zaWduZWQgc2hvcnQgZ2V0X2ZwdV90d2QoIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrICkKK3sKKwlpZiAoIGNwdV9oYXNfZnhzciApIHsKKwkJcmV0dXJuIHRzay0+dGhyZWFkLmkzODcuZnhzYXZlLnR3ZDsKKwl9IGVsc2UgeworCQlyZXR1cm4gKHVuc2lnbmVkIHNob3J0KXRzay0+dGhyZWFkLmkzODcuZnNhdmUudHdkOworCX0KK30KKyNlbmRpZiAgLyogIDAgICovCisKK3Vuc2lnbmVkIHNob3J0IGdldF9mcHVfbXhjc3IoIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrICkKK3sKKwlpZiAoIGNwdV9oYXNfeG1tICkgeworCQlyZXR1cm4gdHNrLT50aHJlYWQuaTM4Ny5meHNhdmUubXhjc3I7CisJfSBlbHNlIHsKKwkJcmV0dXJuIDB4MWY4MDsKKwl9Cit9CisKKyNpZiAwCisKK3ZvaWQgc2V0X2ZwdV9jd2QoIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB1bnNpZ25lZCBzaG9ydCBjd2QgKQoreworCWlmICggY3B1X2hhc19meHNyICkgeworCQl0c2stPnRocmVhZC5pMzg3LmZ4c2F2ZS5jd2QgPSBjd2Q7CisJfSBlbHNlIHsKKwkJdHNrLT50aHJlYWQuaTM4Ny5mc2F2ZS5jd2QgPSAoKGxvbmcpY3dkIHwgMHhmZmZmMDAwMHUpOworCX0KK30KKwordm9pZCBzZXRfZnB1X3N3ZCggc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHVuc2lnbmVkIHNob3J0IHN3ZCApCit7CisJaWYgKCBjcHVfaGFzX2Z4c3IgKSB7CisJCXRzay0+dGhyZWFkLmkzODcuZnhzYXZlLnN3ZCA9IHN3ZDsKKwl9IGVsc2UgeworCQl0c2stPnRocmVhZC5pMzg3LmZzYXZlLnN3ZCA9ICgobG9uZylzd2QgfCAweGZmZmYwMDAwdSk7CisJfQorfQorCit2b2lkIHNldF9mcHVfdHdkKCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdW5zaWduZWQgc2hvcnQgdHdkICkKK3sKKwlpZiAoIGNwdV9oYXNfZnhzciApIHsKKwkJdHNrLT50aHJlYWQuaTM4Ny5meHNhdmUudHdkID0gdHdkX2kzODdfdG9fZnhzcih0d2QpOworCX0gZWxzZSB7CisJCXRzay0+dGhyZWFkLmkzODcuZnNhdmUudHdkID0gKChsb25nKXR3ZCB8IDB4ZmZmZjAwMDB1KTsKKwl9Cit9CisKKyNlbmRpZiAgLyogIDAgICovCisKKy8qCisgKiBGWFNSIGZsb2F0aW5nIHBvaW50IGVudmlyb25tZW50IGNvbnZlcnNpb25zLgorICovCisKK3N0YXRpYyBpbnQgY29udmVydF9meHNyX3RvX3VzZXIoIHN0cnVjdCBfZnBzdGF0ZSBfX3VzZXIgKmJ1ZiwKKwkJCQkJc3RydWN0IGkzODdfZnhzYXZlX3N0cnVjdCAqZnhzYXZlICkKK3sKKwl1bnNpZ25lZCBsb25nIGVudls3XTsKKwlzdHJ1Y3QgX2ZwcmVnIF9fdXNlciAqdG87CisJc3RydWN0IF9mcHhyZWcgKmZyb207CisJaW50IGk7CisKKwllbnZbMF0gPSAodW5zaWduZWQgbG9uZylmeHNhdmUtPmN3ZCB8IDB4ZmZmZjAwMDB1bDsKKwllbnZbMV0gPSAodW5zaWduZWQgbG9uZylmeHNhdmUtPnN3ZCB8IDB4ZmZmZjAwMDB1bDsKKwllbnZbMl0gPSB0d2RfZnhzcl90b19pMzg3KGZ4c2F2ZSk7CisJZW52WzNdID0gZnhzYXZlLT5maXA7CisJZW52WzRdID0gZnhzYXZlLT5mY3MgfCAoKHVuc2lnbmVkIGxvbmcpZnhzYXZlLT5mb3AgPDwgMTYpOworCWVudls1XSA9IGZ4c2F2ZS0+Zm9vOworCWVudls2XSA9IGZ4c2F2ZS0+Zm9zOworCisJaWYgKCBfX2NvcHlfdG9fdXNlciggYnVmLCBlbnYsIDcgKiBzaXplb2YodW5zaWduZWQgbG9uZykgKSApCisJCXJldHVybiAxOworCisJdG8gPSAmYnVmLT5fc3RbMF07CisJZnJvbSA9IChzdHJ1Y3QgX2ZweHJlZyAqKSAmZnhzYXZlLT5zdF9zcGFjZVswXTsKKwlmb3IgKCBpID0gMCA7IGkgPCA4IDsgaSsrLCB0bysrLCBmcm9tKysgKSB7CisJCXVuc2lnbmVkIGxvbmcgX191c2VyICp0ID0gKHVuc2lnbmVkIGxvbmcgX191c2VyICopdG87CisJCXVuc2lnbmVkIGxvbmcgKmYgPSAodW5zaWduZWQgbG9uZyAqKWZyb207CisKKwkJaWYgKF9fcHV0X3VzZXIoKmYsIHQpIHx8CisJCQkJX19wdXRfdXNlcigqKGYgKyAxKSwgdCArIDEpIHx8CisJCQkJX19wdXRfdXNlcihmcm9tLT5leHBvbmVudCwgJnRvLT5leHBvbmVudCkpCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29udmVydF9meHNyX2Zyb21fdXNlciggc3RydWN0IGkzODdfZnhzYXZlX3N0cnVjdCAqZnhzYXZlLAorCQkJCQkgIHN0cnVjdCBfZnBzdGF0ZSBfX3VzZXIgKmJ1ZiApCit7CisJdW5zaWduZWQgbG9uZyBlbnZbN107CisJc3RydWN0IF9mcHhyZWcgKnRvOworCXN0cnVjdCBfZnByZWcgX191c2VyICpmcm9tOworCWludCBpOworCisJaWYgKCBfX2NvcHlfZnJvbV91c2VyKCBlbnYsIGJ1ZiwgNyAqIHNpemVvZihsb25nKSApICkKKwkJcmV0dXJuIDE7CisKKwlmeHNhdmUtPmN3ZCA9ICh1bnNpZ25lZCBzaG9ydCkoZW52WzBdICYgMHhmZmZmKTsKKwlmeHNhdmUtPnN3ZCA9ICh1bnNpZ25lZCBzaG9ydCkoZW52WzFdICYgMHhmZmZmKTsKKwlmeHNhdmUtPnR3ZCA9IHR3ZF9pMzg3X3RvX2Z4c3IoKHVuc2lnbmVkIHNob3J0KShlbnZbMl0gJiAweGZmZmYpKTsKKwlmeHNhdmUtPmZpcCA9IGVudlszXTsKKwlmeHNhdmUtPmZvcCA9ICh1bnNpZ25lZCBzaG9ydCkoKGVudls0XSAmIDB4ZmZmZjAwMDB1bCkgPj4gMTYpOworCWZ4c2F2ZS0+ZmNzID0gKGVudls0XSAmIDB4ZmZmZik7CisJZnhzYXZlLT5mb28gPSBlbnZbNV07CisJZnhzYXZlLT5mb3MgPSBlbnZbNl07CisKKwl0byA9IChzdHJ1Y3QgX2ZweHJlZyAqKSAmZnhzYXZlLT5zdF9zcGFjZVswXTsKKwlmcm9tID0gJmJ1Zi0+X3N0WzBdOworCWZvciAoIGkgPSAwIDsgaSA8IDggOyBpKyssIHRvKyssIGZyb20rKyApIHsKKwkJdW5zaWduZWQgbG9uZyAqdCA9ICh1bnNpZ25lZCBsb25nICopdG87CisJCXVuc2lnbmVkIGxvbmcgX191c2VyICpmID0gKHVuc2lnbmVkIGxvbmcgX191c2VyICopZnJvbTsKKworCQlpZiAoX19nZXRfdXNlcigqdCwgZikgfHwKKwkJCQlfX2dldF91c2VyKCoodCArIDEpLCBmICsgMSkgfHwKKwkJCQlfX2dldF91c2VyKHRvLT5leHBvbmVudCwgJmZyb20tPmV4cG9uZW50KSkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNpZ25hbCBmcmFtZSBoYW5kbGVycy4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCBzYXZlX2kzODdfZnNhdmUoIHN0cnVjdCBfZnBzdGF0ZSBfX3VzZXIgKmJ1ZiApCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCisJdW5sYXp5X2ZwdSggdHNrICk7CisJdHNrLT50aHJlYWQuaTM4Ny5mc2F2ZS5zdGF0dXMgPSB0c2stPnRocmVhZC5pMzg3LmZzYXZlLnN3ZDsKKwlpZiAoIF9fY29weV90b191c2VyKCBidWYsICZ0c2stPnRocmVhZC5pMzg3LmZzYXZlLAorCQkJICAgICBzaXplb2Yoc3RydWN0IGkzODdfZnNhdmVfc3RydWN0KSApICkKKwkJcmV0dXJuIC0xOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHNhdmVfaTM4N19meHNhdmUoIHN0cnVjdCBfZnBzdGF0ZSBfX3VzZXIgKmJ1ZiApCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCWludCBlcnIgPSAwOworCisJdW5sYXp5X2ZwdSggdHNrICk7CisKKwlpZiAoIGNvbnZlcnRfZnhzcl90b191c2VyKCBidWYsICZ0c2stPnRocmVhZC5pMzg3LmZ4c2F2ZSApICkKKwkJcmV0dXJuIC0xOworCisJZXJyIHw9IF9fcHV0X3VzZXIoIHRzay0+dGhyZWFkLmkzODcuZnhzYXZlLnN3ZCwgJmJ1Zi0+c3RhdHVzICk7CisJZXJyIHw9IF9fcHV0X3VzZXIoIFg4Nl9GWFNSX01BR0lDLCAmYnVmLT5tYWdpYyApOworCWlmICggZXJyICkKKwkJcmV0dXJuIC0xOworCisJaWYgKCBfX2NvcHlfdG9fdXNlciggJmJ1Zi0+X2Z4c3JfZW52WzBdLCAmdHNrLT50aHJlYWQuaTM4Ny5meHNhdmUsCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgaTM4N19meHNhdmVfc3RydWN0KSApICkKKwkJcmV0dXJuIC0xOworCXJldHVybiAxOworfQorCitpbnQgc2F2ZV9pMzg3KCBzdHJ1Y3QgX2Zwc3RhdGUgX191c2VyICpidWYgKQoreworCWlmICggIXVzZWRfbWF0aCgpICkKKwkJcmV0dXJuIDA7CisKKwkvKiBUaGlzIHdpbGwgY2F1c2UgYSAiZmluaXQiIHRvIGJlIHRyaWdnZXJlZCBieSB0aGUgbmV4dAorCSAqIGF0dGVtcHRlZCBGUFUgb3BlcmF0aW9uIGJ5IHRoZSAnY3VycmVudCcgcHJvY2Vzcy4KKwkgKi8KKwljbGVhcl91c2VkX21hdGgoKTsKKworCWlmICggSEFWRV9IV0ZQICkgeworCQlpZiAoIGNwdV9oYXNfZnhzciApIHsKKwkJCXJldHVybiBzYXZlX2kzODdfZnhzYXZlKCBidWYgKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBzYXZlX2kzODdfZnNhdmUoIGJ1ZiApOworCQl9CisJfSBlbHNlIHsKKwkJcmV0dXJuIHNhdmVfaTM4N19zb2Z0KCAmY3VycmVudC0+dGhyZWFkLmkzODcuc29mdCwgYnVmICk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCByZXN0b3JlX2kzODdfZnNhdmUoIHN0cnVjdCBfZnBzdGF0ZSBfX3VzZXIgKmJ1ZiApCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCWNsZWFyX2ZwdSggdHNrICk7CisJcmV0dXJuIF9fY29weV9mcm9tX3VzZXIoICZ0c2stPnRocmVhZC5pMzg3LmZzYXZlLCBidWYsCisJCQkJIHNpemVvZihzdHJ1Y3QgaTM4N19mc2F2ZV9zdHJ1Y3QpICk7Cit9CisKK3N0YXRpYyBpbnQgcmVzdG9yZV9pMzg3X2Z4c2F2ZSggc3RydWN0IF9mcHN0YXRlIF9fdXNlciAqYnVmICkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKwljbGVhcl9mcHUoIHRzayApOworCWVyciA9IF9fY29weV9mcm9tX3VzZXIoICZ0c2stPnRocmVhZC5pMzg3LmZ4c2F2ZSwgJmJ1Zi0+X2Z4c3JfZW52WzBdLAorCQkJCXNpemVvZihzdHJ1Y3QgaTM4N19meHNhdmVfc3RydWN0KSApOworCS8qIG14Y3NyIHJlc2VydmVkIGJpdHMgbXVzdCBiZSBtYXNrZWQgdG8gemVybyBmb3Igc2VjdXJpdHkgcmVhc29ucyAqLworCXRzay0+dGhyZWFkLmkzODcuZnhzYXZlLm14Y3NyICY9IG14Y3NyX2ZlYXR1cmVfbWFzazsKKwlyZXR1cm4gZXJyID8gMSA6IGNvbnZlcnRfZnhzcl9mcm9tX3VzZXIoICZ0c2stPnRocmVhZC5pMzg3LmZ4c2F2ZSwgYnVmICk7Cit9CisKK2ludCByZXN0b3JlX2kzODcoIHN0cnVjdCBfZnBzdGF0ZSBfX3VzZXIgKmJ1ZiApCit7CisJaW50IGVycjsKKworCWlmICggSEFWRV9IV0ZQICkgeworCQlpZiAoIGNwdV9oYXNfZnhzciApIHsKKwkJCWVyciA9IHJlc3RvcmVfaTM4N19meHNhdmUoIGJ1ZiApOworCQl9IGVsc2UgeworCQkJZXJyID0gcmVzdG9yZV9pMzg3X2ZzYXZlKCBidWYgKTsKKwkJfQorCX0gZWxzZSB7CisJCWVyciA9IHJlc3RvcmVfaTM4N19zb2Z0KCAmY3VycmVudC0+dGhyZWFkLmkzODcuc29mdCwgYnVmICk7CisJfQorCXNldF91c2VkX21hdGgoKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogcHRyYWNlIHJlcXVlc3QgaGFuZGxlcnMuCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgZ2V0X2ZwcmVnc19mc2F2ZSggc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QgX191c2VyICpidWYsCisJCQkJICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrICkKK3sKKwlyZXR1cm4gX19jb3B5X3RvX3VzZXIoIGJ1ZiwgJnRzay0+dGhyZWFkLmkzODcuZnNhdmUsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB1c2VyX2kzODdfc3RydWN0KSApOworfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRfZnByZWdzX2Z4c2F2ZSggc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QgX191c2VyICpidWYsCisJCQkJICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayApCit7CisJcmV0dXJuIGNvbnZlcnRfZnhzcl90b191c2VyKCAoc3RydWN0IF9mcHN0YXRlIF9fdXNlciAqKWJ1ZiwKKwkJCQkgICAgICZ0c2stPnRocmVhZC5pMzg3LmZ4c2F2ZSApOworfQorCitpbnQgZ2V0X2ZwcmVncyggc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QgX191c2VyICpidWYsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrICkKK3sKKwlpZiAoIEhBVkVfSFdGUCApIHsKKwkJaWYgKCBjcHVfaGFzX2Z4c3IgKSB7CisJCQlyZXR1cm4gZ2V0X2ZwcmVnc19meHNhdmUoIGJ1ZiwgdHNrICk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gZ2V0X2ZwcmVnc19mc2F2ZSggYnVmLCB0c2sgKTsKKwkJfQorCX0gZWxzZSB7CisJCXJldHVybiBzYXZlX2kzODdfc29mdCggJnRzay0+dGhyZWFkLmkzODcuc29mdCwKKwkJCQkgICAgICAgKHN0cnVjdCBfZnBzdGF0ZSBfX3VzZXIgKilidWYgKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNldF9mcHJlZ3NfZnNhdmUoIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAorCQkJCSAgICBzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCBfX3VzZXIgKmJ1ZiApCit7CisJcmV0dXJuIF9fY29weV9mcm9tX3VzZXIoICZ0c2stPnRocmVhZC5pMzg3LmZzYXZlLCBidWYsCisJCQkJIHNpemVvZihzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCkgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2V0X2ZwcmVnc19meHNhdmUoIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAorCQkJCSAgICAgc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QgX191c2VyICpidWYgKQoreworCXJldHVybiBjb252ZXJ0X2Z4c3JfZnJvbV91c2VyKCAmdHNrLT50aHJlYWQuaTM4Ny5meHNhdmUsCisJCQkJICAgICAgIChzdHJ1Y3QgX2Zwc3RhdGUgX191c2VyICopYnVmICk7Cit9CisKK2ludCBzZXRfZnByZWdzKCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QgX191c2VyICpidWYgKQoreworCWlmICggSEFWRV9IV0ZQICkgeworCQlpZiAoIGNwdV9oYXNfZnhzciApIHsKKwkJCXJldHVybiBzZXRfZnByZWdzX2Z4c2F2ZSggdHNrLCBidWYgKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBzZXRfZnByZWdzX2ZzYXZlKCB0c2ssIGJ1ZiApOworCQl9CisJfSBlbHNlIHsKKwkJcmV0dXJuIHJlc3RvcmVfaTM4N19zb2Z0KCAmdHNrLT50aHJlYWQuaTM4Ny5zb2Z0LAorCQkJCQkgIChzdHJ1Y3QgX2Zwc3RhdGUgX191c2VyICopYnVmICk7CisJfQorfQorCitpbnQgZ2V0X2ZweHJlZ3MoIHN0cnVjdCB1c2VyX2Z4c3Jfc3RydWN0IF9fdXNlciAqYnVmLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayApCit7CisJaWYgKCBjcHVfaGFzX2Z4c3IgKSB7CisJCWlmIChfX2NvcHlfdG9fdXNlciggYnVmLCAmdHNrLT50aHJlYWQuaTM4Ny5meHNhdmUsCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgdXNlcl9meHNyX3N0cnVjdCkgKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlyZXR1cm4gLUVJTzsKKwl9Cit9CisKK2ludCBzZXRfZnB4cmVncyggc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCB1c2VyX2Z4c3Jfc3RydWN0IF9fdXNlciAqYnVmICkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICggY3B1X2hhc19meHNyICkgeworCQlpZiAoX19jb3B5X2Zyb21fdXNlciggJnRzay0+dGhyZWFkLmkzODcuZnhzYXZlLCBidWYsCisJCQkJICBzaXplb2Yoc3RydWN0IHVzZXJfZnhzcl9zdHJ1Y3QpICkpCisJCQlyZXQgPSAtRUZBVUxUOworCQkvKiBteGNzciByZXNlcnZlZCBiaXRzIG11c3QgYmUgbWFza2VkIHRvIHplcm8gZm9yIHNlY3VyaXR5IHJlYXNvbnMgKi8KKwkJdHNrLT50aHJlYWQuaTM4Ny5meHNhdmUubXhjc3IgJj0gbXhjc3JfZmVhdHVyZV9tYXNrOworCX0gZWxzZSB7CisJCXJldCA9IC1FSU87CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGUFUgc3RhdGUgZm9yIGNvcmUgZHVtcHMuCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGNvcHlfZnB1X2ZzYXZlKCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKKwkJCQkgICBzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCAqZnB1ICkKK3sKKwltZW1jcHkoIGZwdSwgJnRzay0+dGhyZWFkLmkzODcuZnNhdmUsCisJCXNpemVvZihzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCkgKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNvcHlfZnB1X2Z4c2F2ZSggc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCisJCQkJICAgc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QgKmZwdSApCit7CisJdW5zaWduZWQgc2hvcnQgKnRvOworCXVuc2lnbmVkIHNob3J0ICpmcm9tOworCWludCBpOworCisJbWVtY3B5KCBmcHUsICZ0c2stPnRocmVhZC5pMzg3LmZ4c2F2ZSwgNyAqIHNpemVvZihsb25nKSApOworCisJdG8gPSAodW5zaWduZWQgc2hvcnQgKikmZnB1LT5zdF9zcGFjZVswXTsKKwlmcm9tID0gKHVuc2lnbmVkIHNob3J0ICopJnRzay0+dGhyZWFkLmkzODcuZnhzYXZlLnN0X3NwYWNlWzBdOworCWZvciAoIGkgPSAwIDsgaSA8IDggOyBpKyssIHRvICs9IDUsIGZyb20gKz0gOCApIHsKKwkJbWVtY3B5KCB0bywgZnJvbSwgNSAqIHNpemVvZih1bnNpZ25lZCBzaG9ydCkgKTsKKwl9Cit9CisKK2ludCBkdW1wX2ZwdSggc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCB1c2VyX2kzODdfc3RydWN0ICpmcHUgKQoreworCWludCBmcHZhbGlkOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKworCWZwdmFsaWQgPSAhIXVzZWRfbWF0aCgpOworCWlmICggZnB2YWxpZCApIHsKKwkJdW5sYXp5X2ZwdSggdHNrICk7CisJCWlmICggY3B1X2hhc19meHNyICkgeworCQkJY29weV9mcHVfZnhzYXZlKCB0c2ssIGZwdSApOworCQl9IGVsc2UgeworCQkJY29weV9mcHVfZnNhdmUoIHRzaywgZnB1ICk7CisJCX0KKwl9CisKKwlyZXR1cm4gZnB2YWxpZDsKK30KKworaW50IGR1bXBfdGFza19mcHUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCB1c2VyX2kzODdfc3RydWN0ICpmcHUpCit7CisJaW50IGZwdmFsaWQgPSAhIXRza191c2VkX21hdGgodHNrKTsKKworCWlmIChmcHZhbGlkKSB7CisJCWlmICh0c2sgPT0gY3VycmVudCkKKwkJCXVubGF6eV9mcHUodHNrKTsKKwkJaWYgKGNwdV9oYXNfZnhzcikKKwkJCWNvcHlfZnB1X2Z4c2F2ZSh0c2ssIGZwdSk7CisJCWVsc2UKKwkJCWNvcHlfZnB1X2ZzYXZlKHRzaywgZnB1KTsKKwl9CisJcmV0dXJuIGZwdmFsaWQ7Cit9CisKK2ludCBkdW1wX3Rhc2tfZXh0ZW5kZWRfZnB1KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgdXNlcl9meHNyX3N0cnVjdCAqZnB1KQoreworCWludCBmcHZhbGlkID0gdHNrX3VzZWRfbWF0aCh0c2spICYmIGNwdV9oYXNfZnhzcjsKKworCWlmIChmcHZhbGlkKSB7CisJCWlmICh0c2sgPT0gY3VycmVudCkKKwkJICAgICAgIHVubGF6eV9mcHUodHNrKTsKKwkJbWVtY3B5KGZwdSwgJnRzay0+dGhyZWFkLmkzODcuZnhzYXZlLCBzaXplb2YoKmZwdSkpOworCX0KKwlyZXR1cm4gZnB2YWxpZDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvaTgyNTkuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvaTgyNTkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjBiZWYxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9pODI1OS5jCkBAIC0wLDAgKzEsNDI5IEBACisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtLzgyNTNwaXQuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vdGltZXIuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9kZXNjLmg+CisjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaF9ob29rcy5oPgorI2luY2x1ZGUgPGFzbS9pODI1OS5oPgorCisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisKKyNpbmNsdWRlIDxpb19wb3J0cy5oPgorCisvKgorICogVGhpcyBpcyB0aGUgJ2xlZ2FjeScgODI1OUEgUHJvZ3JhbW1hYmxlIEludGVycnVwdCBDb250cm9sbGVyLAorICogcHJlc2VudCBpbiB0aGUgbWFqb3JpdHkgb2YgUEMvQVQgYm94ZXMuCisgKiBwbHVzIHNvbWUgZ2VuZXJpYyB4ODYgc3BlY2lmaWMgdGhpbmdzIGlmIGdlbmVyaWMgc3BlY2lmaWNzIG1ha2VzCisgKiBhbnkgc2Vuc2UgYXQgYWxsLgorICogdGhpcyBmaWxlIHNob3VsZCBiZWNvbWUgYXJjaC9pMzg2L2tlcm5lbC9pcnEuYyB3aGVuIHRoZSBvbGQgaXJxLmMKKyAqIG1vdmVzIHRvIGFyY2ggaW5kZXBlbmRlbnQgbGFuZAorICovCisKK0RFRklORV9TUElOTE9DSyhpODI1OUFfbG9jayk7CisKK3N0YXRpYyB2b2lkIGVuZF84MjU5QV9pcnEgKHVuc2lnbmVkIGludCBpcnEpCit7CisJaWYgKCEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEfElSUV9JTlBST0dSRVNTKSkgJiYKKwkJCQkJCQlpcnFfZGVzY1tpcnFdLmFjdGlvbikKKwkJZW5hYmxlXzgyNTlBX2lycShpcnEpOworfQorCisjZGVmaW5lIHNodXRkb3duXzgyNTlBX2lycQlkaXNhYmxlXzgyNTlBX2lycQorCitzdGF0aWMgdm9pZCBtYXNrX2FuZF9hY2tfODI1OUEodW5zaWduZWQgaW50KTsKKwordW5zaWduZWQgaW50IHN0YXJ0dXBfODI1OUFfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7IAorCWVuYWJsZV84MjU5QV9pcnEoaXJxKTsKKwlyZXR1cm4gMDsgLyogbmV2ZXIgYW55dGhpbmcgcGVuZGluZyAqLworfQorCitzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGk4MjU5QV9pcnFfdHlwZSA9IHsKKwkudHlwZW5hbWUgPSAiWFQtUElDIiwKKwkuc3RhcnR1cCA9IHN0YXJ0dXBfODI1OUFfaXJxLAorCS5zaHV0ZG93biA9IHNodXRkb3duXzgyNTlBX2lycSwKKwkuZW5hYmxlID0gZW5hYmxlXzgyNTlBX2lycSwKKwkuZGlzYWJsZSA9IGRpc2FibGVfODI1OUFfaXJxLAorCS5hY2sgPSBtYXNrX2FuZF9hY2tfODI1OUEsCisJLmVuZCA9IGVuZF84MjU5QV9pcnEsCit9OworCisvKgorICogODI1OUEgUElDIGZ1bmN0aW9ucyB0byBoYW5kbGUgSVNBIGRldmljZXM6CisgKi8KKworLyoKKyAqIFRoaXMgY29udGFpbnMgdGhlIGlycSBtYXNrIGZvciBib3RoIDgyNTlBIGlycSBjb250cm9sbGVycywKKyAqLwordW5zaWduZWQgaW50IGNhY2hlZF9pcnFfbWFzayA9IDB4ZmZmZjsKKworLyoKKyAqIE5vdCBhbGwgSVJRcyBjYW4gYmUgcm91dGVkIHRocm91Z2ggdGhlIElPLUFQSUMsIGVnLiBvbiBjZXJ0YWluIChvbGRlcikKKyAqIGJvYXJkcyB0aGUgdGltZXIgaW50ZXJydXB0IGlzIG5vdCByZWFsbHkgY29ubmVjdGVkIHRvIGFueSBJTy1BUElDIHBpbiwKKyAqIGl0J3MgZmVkIHRvIHRoZSBtYXN0ZXIgODI1OUEncyBJUjAgbGluZSBvbmx5LgorICoKKyAqIEFueSAnMScgYml0IGluIHRoaXMgbWFzayBtZWFucyB0aGUgSVJRIGlzIHJvdXRlZCB0aHJvdWdoIHRoZSBJTy1BUElDLgorICogdGhpcyAnbWl4ZWQgbW9kZScgSVJRIGhhbmRsaW5nIGNvc3RzIG5vdGhpbmcgYmVjYXVzZSBpdCdzIG9ubHkgdXNlZAorICogYXQgSVJRIHNldHVwIHRpbWUuCisgKi8KK3Vuc2lnbmVkIGxvbmcgaW9fYXBpY19pcnFzOworCit2b2lkIGRpc2FibGVfODI1OUFfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5zaWduZWQgaW50IG1hc2sgPSAxIDw8IGlycTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmk4MjU5QV9sb2NrLCBmbGFncyk7CisJY2FjaGVkX2lycV9tYXNrIHw9IG1hc2s7CisJaWYgKGlycSAmIDgpCisJCW91dGIoY2FjaGVkX3NsYXZlX21hc2ssIFBJQ19TTEFWRV9JTVIpOworCWVsc2UKKwkJb3V0YihjYWNoZWRfbWFzdGVyX21hc2ssIFBJQ19NQVNURVJfSU1SKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpODI1OUFfbG9jaywgZmxhZ3MpOworfQorCit2b2lkIGVuYWJsZV84MjU5QV9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IH4oMSA8PCBpcnEpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTgyNTlBX2xvY2ssIGZsYWdzKTsKKwljYWNoZWRfaXJxX21hc2sgJj0gbWFzazsKKwlpZiAoaXJxICYgOCkKKwkJb3V0YihjYWNoZWRfc2xhdmVfbWFzaywgUElDX1NMQVZFX0lNUik7CisJZWxzZQorCQlvdXRiKGNhY2hlZF9tYXN0ZXJfbWFzaywgUElDX01BU1RFUl9JTVIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmk4MjU5QV9sb2NrLCBmbGFncyk7Cit9CisKK2ludCBpODI1OUFfaXJxX3BlbmRpbmcodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDE8PGlycTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTgyNTlBX2xvY2ssIGZsYWdzKTsKKwlpZiAoaXJxIDwgOCkKKwkJcmV0ID0gaW5iKFBJQ19NQVNURVJfQ01EKSAmIG1hc2s7CisJZWxzZQorCQlyZXQgPSBpbmIoUElDX1NMQVZFX0NNRCkgJiAobWFzayA+PiA4KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpODI1OUFfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBtYWtlXzgyNTlBX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWRpc2FibGVfaXJxX25vc3luYyhpcnEpOworCWlvX2FwaWNfaXJxcyAmPSB+KDE8PGlycSk7CisJaXJxX2Rlc2NbaXJxXS5oYW5kbGVyID0gJmk4MjU5QV9pcnFfdHlwZTsKKwllbmFibGVfaXJxKGlycSk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdG8gYmUgY2FsbGVkIHJhcmVseS4gU3dpdGNoaW5nIGJldHdlZW4KKyAqIDgyNTlBIHJlZ2lzdGVycyBpcyBzbG93LgorICogVGhpcyBoYXMgdG8gYmUgcHJvdGVjdGVkIGJ5IHRoZSBpcnEgY29udHJvbGxlciBzcGlubG9jaworICogYmVmb3JlIGJlaW5nIGNhbGxlZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgaTgyNTlBX2lycV9yZWFsKHVuc2lnbmVkIGludCBpcnEpCit7CisJaW50IHZhbHVlOworCWludCBpcnFtYXNrID0gMTw8aXJxOworCisJaWYgKGlycSA8IDgpIHsKKwkJb3V0YigweDBCLFBJQ19NQVNURVJfQ01EKTsJLyogSVNSIHJlZ2lzdGVyICovCisJCXZhbHVlID0gaW5iKFBJQ19NQVNURVJfQ01EKSAmIGlycW1hc2s7CisJCW91dGIoMHgwQSxQSUNfTUFTVEVSX0NNRCk7CS8qIGJhY2sgdG8gdGhlIElSUiByZWdpc3RlciAqLworCQlyZXR1cm4gdmFsdWU7CisJfQorCW91dGIoMHgwQixQSUNfU0xBVkVfQ01EKTsJLyogSVNSIHJlZ2lzdGVyICovCisJdmFsdWUgPSBpbmIoUElDX1NMQVZFX0NNRCkgJiAoaXJxbWFzayA+PiA4KTsKKwlvdXRiKDB4MEEsUElDX1NMQVZFX0NNRCk7CS8qIGJhY2sgdG8gdGhlIElSUiByZWdpc3RlciAqLworCXJldHVybiB2YWx1ZTsKK30KKworLyoKKyAqIENhcmVmdWwhIFRoZSA4MjU5QSBpcyBhIGZyYWdpbGUgYmVhc3QsIGl0IHByZXR0eQorICogbXVjaCBfaGFzXyB0byBiZSBkb25lIGV4YWN0bHkgbGlrZSB0aGlzIChtYXNrIGl0CisgKiBmaXJzdCwgX3RoZW5fIHNlbmQgdGhlIEVPSSwgYW5kIHRoZSBvcmRlciBvZiBFT0kKKyAqIHRvIHRoZSB0d28gODI1OXMgaXMgaW1wb3J0YW50IQorICovCitzdGF0aWMgdm9pZCBtYXNrX2FuZF9hY2tfODI1OUEodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBpbnQgaXJxbWFzayA9IDEgPDwgaXJxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTgyNTlBX2xvY2ssIGZsYWdzKTsKKwkvKgorCSAqIExpZ2h0d2VpZ2h0IHNwdXJpb3VzIElSUSBkZXRlY3Rpb24uIFdlIGRvIG5vdCB3YW50CisJICogdG8gb3ZlcmRvIHNwdXJpb3VzIElSUSBoYW5kbGluZyAtIGl0J3MgdXN1YWxseSBhIHNpZ24KKwkgKiBvZiBoYXJkd2FyZSBwcm9ibGVtcywgc28gd2Ugb25seSBkbyB0aGUgY2hlY2tzIHdlIGNhbgorCSAqIGRvIHdpdGhvdXQgc2xvd2luZyBkb3duIGdvb2QgaGFyZHdhcmUgdW5uZWNlc3NlcmlseS4KKwkgKgorCSAqIE5vdGUgdGhhdCBJUlE3IGFuZCBJUlExNSAodGhlIHR3byBzcHVyaW91cyBJUlFzCisJICogdXN1YWxseSByZXN1bHRpbmcgZnJvbSB0aGUgODI1OUEtMXwyIFBJQ3MpIG9jY3VyCisJICogZXZlbiBpZiB0aGUgSVJRIGlzIG1hc2tlZCBpbiB0aGUgODI1OUEuIFRodXMgd2UKKwkgKiBjYW4gY2hlY2sgc3B1cmlvdXMgODI1OUEgSVJRcyB3aXRob3V0IGRvaW5nIHRoZQorCSAqIHF1aXRlIHNsb3cgaTgyNTlBX2lycV9yZWFsKCkgY2FsbCBmb3IgZXZlcnkgSVJRLgorCSAqIFRoaXMgZG9lcyBub3QgY292ZXIgMTAwJSBvZiBzcHVyaW91cyBpbnRlcnJ1cHRzLAorCSAqIGJ1dCBzaG91bGQgYmUgZW5vdWdoIHRvIHdhcm4gdGhlIHVzZXIgdGhhdCB0aGVyZQorCSAqIGlzIHNvbWV0aGluZyBiYWQgZ29pbmcgb24gLi4uCisJICovCisJaWYgKGNhY2hlZF9pcnFfbWFzayAmIGlycW1hc2spCisJCWdvdG8gc3B1cmlvdXNfODI1OUFfaXJxOworCWNhY2hlZF9pcnFfbWFzayB8PSBpcnFtYXNrOworCitoYW5kbGVfcmVhbF9pcnE6CisJaWYgKGlycSAmIDgpIHsKKwkJaW5iKFBJQ19TTEFWRV9JTVIpOwkvKiBEVU1NWSAtIChkbyB3ZSBuZWVkIHRoaXM/KSAqLworCQlvdXRiKGNhY2hlZF9zbGF2ZV9tYXNrLCBQSUNfU0xBVkVfSU1SKTsKKwkJb3V0YigweDYwKyhpcnEmNyksUElDX1NMQVZFX0NNRCk7LyogJ1NwZWNpZmljIEVPSScgdG8gc2xhdmUgKi8KKwkJb3V0YigweDYwK1BJQ19DQVNDQURFX0lSLFBJQ19NQVNURVJfQ01EKTsgLyogJ1NwZWNpZmljIEVPSScgdG8gbWFzdGVyLUlSUTIgKi8KKwl9IGVsc2UgeworCQlpbmIoUElDX01BU1RFUl9JTVIpOwkvKiBEVU1NWSAtIChkbyB3ZSBuZWVkIHRoaXM/KSAqLworCQlvdXRiKGNhY2hlZF9tYXN0ZXJfbWFzaywgUElDX01BU1RFUl9JTVIpOworCQlvdXRiKDB4NjAraXJxLFBJQ19NQVNURVJfQ01EKTsJLyogJ1NwZWNpZmljIEVPSSB0byBtYXN0ZXIgKi8KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTgyNTlBX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm47CisKK3NwdXJpb3VzXzgyNTlBX2lycToKKwkvKgorCSAqIHRoaXMgaXMgdGhlIHNsb3cgcGF0aCAtIHNob3VsZCBoYXBwZW4gcmFyZWx5LgorCSAqLworCWlmIChpODI1OUFfaXJxX3JlYWwoaXJxKSkKKwkJLyoKKwkJICogb29wcywgdGhlIElSUSBfaXNfIGluIHNlcnZpY2UgYWNjb3JkaW5nIHRvIHRoZQorCQkgKiA4MjU5QSAtIG5vdCBzcHVyaW91cywgZ28gaGFuZGxlIGl0LgorCQkgKi8KKwkJZ290byBoYW5kbGVfcmVhbF9pcnE7CisKKwl7CisJCXN0YXRpYyBpbnQgc3B1cmlvdXNfaXJxX21hc2s7CisJCS8qCisJCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhlIElSUSBpcyBzcHVyaW91cywKKwkJICogbGV0cyBBQ0sgYW5kIHJlcG9ydCBpdC4gW29uY2UgcGVyIElSUV0KKwkJICovCisJCWlmICghKHNwdXJpb3VzX2lycV9tYXNrICYgaXJxbWFzaykpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJzcHVyaW91cyA4MjU5QSBpbnRlcnJ1cHQ6IElSUSVkLlxuIiwgaXJxKTsKKwkJCXNwdXJpb3VzX2lycV9tYXNrIHw9IGlycW1hc2s7CisJCX0KKwkJYXRvbWljX2luYygmaXJxX2Vycl9jb3VudCk7CisJCS8qCisJCSAqIFRoZW9yZXRpY2FsbHkgd2UgZG8gbm90IGhhdmUgdG8gaGFuZGxlIHRoaXMgSVJRLAorCQkgKiBidXQgaW4gTGludXggdGhpcyBkb2VzIG5vdCBjYXVzZSBwcm9ibGVtcyBhbmQgaXMKKwkJICogc2ltcGxlciBmb3IgdXMuCisJCSAqLworCQlnb3RvIGhhbmRsZV9yZWFsX2lycTsKKwl9Cit9CisKK3N0YXRpYyBjaGFyIGlycV90cmlnZ2VyWzJdOworLyoqCisgKiBFTENSIHJlZ2lzdGVycyAoMHg0ZDAsIDB4NGQxKSBjb250cm9sIGVkZ2UvbGV2ZWwgb2YgSVJRCisgKi8KK3N0YXRpYyB2b2lkIHJlc3RvcmVfRUxDUihjaGFyICp0cmlnZ2VyKQoreworCW91dGIodHJpZ2dlclswXSwgMHg0ZDApOworCW91dGIodHJpZ2dlclsxXSwgMHg0ZDEpOworfQorCitzdGF0aWMgdm9pZCBzYXZlX0VMQ1IoY2hhciAqdHJpZ2dlcikKK3sKKwkvKiBJUlEgMCwxLDIsOCwxMyBhcmUgbWFya2VkIGFzIHJlc2VydmVkICovCisJdHJpZ2dlclswXSA9IGluYigweDRkMCkgJiAweEY4OworCXRyaWdnZXJbMV0gPSBpbmIoMHg0ZDEpICYgMHhERTsKK30KKworc3RhdGljIGludCBpODI1OUFfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCit7CisJaW5pdF84MjU5QSgwKTsKKwlyZXN0b3JlX0VMQ1IoaXJxX3RyaWdnZXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGk4MjU5QV9zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIHUzMiBzdGF0ZSkKK3sKKwlzYXZlX0VMQ1IoaXJxX3RyaWdnZXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHN5c2Rldl9jbGFzcyBpODI1OV9zeXNkZXZfY2xhc3MgPSB7CisJc2V0X2tzZXRfbmFtZSgiaTgyNTkiKSwKKwkuc3VzcGVuZCA9IGk4MjU5QV9zdXNwZW5kLAorCS5yZXN1bWUgPSBpODI1OUFfcmVzdW1lLAorfTsKKworc3RhdGljIHN0cnVjdCBzeXNfZGV2aWNlIGRldmljZV9pODI1OUEgPSB7CisJLmlkCT0gMCwKKwkuY2xzCT0gJmk4MjU5X3N5c2Rldl9jbGFzcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGk4MjU5QV9pbml0X3N5c2ZzKHZvaWQpCit7CisJaW50IGVycm9yID0gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZpODI1OV9zeXNkZXZfY2xhc3MpOworCWlmICghZXJyb3IpCisJCWVycm9yID0gc3lzZGV2X3JlZ2lzdGVyKCZkZXZpY2VfaTgyNTlBKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2RldmljZV9pbml0Y2FsbChpODI1OUFfaW5pdF9zeXNmcyk7CisKK3ZvaWQgaW5pdF84MjU5QShpbnQgYXV0b19lb2kpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpODI1OUFfbG9jaywgZmxhZ3MpOworCisJb3V0YigweGZmLCBQSUNfTUFTVEVSX0lNUik7CS8qIG1hc2sgYWxsIG9mIDgyNTlBLTEgKi8KKwlvdXRiKDB4ZmYsIFBJQ19TTEFWRV9JTVIpOwkvKiBtYXNrIGFsbCBvZiA4MjU5QS0yICovCisKKwkvKgorCSAqIG91dGJfcCAtIHRoaXMgaGFzIHRvIHdvcmsgb24gYSB3aWRlIHJhbmdlIG9mIFBDIGhhcmR3YXJlLgorCSAqLworCW91dGJfcCgweDExLCBQSUNfTUFTVEVSX0NNRCk7CS8qIElDVzE6IHNlbGVjdCA4MjU5QS0xIGluaXQgKi8KKwlvdXRiX3AoMHgyMCArIDAsIFBJQ19NQVNURVJfSU1SKTsJLyogSUNXMjogODI1OUEtMSBJUjAtNyBtYXBwZWQgdG8gMHgyMC0weDI3ICovCisJb3V0Yl9wKDFVIDw8IFBJQ19DQVNDQURFX0lSLCBQSUNfTUFTVEVSX0lNUik7CS8qIDgyNTlBLTEgKHRoZSBtYXN0ZXIpIGhhcyBhIHNsYXZlIG9uIElSMiAqLworCWlmIChhdXRvX2VvaSkJLyogbWFzdGVyIGRvZXMgQXV0byBFT0kgKi8KKwkJb3V0Yl9wKE1BU1RFUl9JQ1c0X0RFRkFVTFQgfCBQSUNfSUNXNF9BRU9JLCBQSUNfTUFTVEVSX0lNUik7CisJZWxzZQkJLyogbWFzdGVyIGV4cGVjdHMgbm9ybWFsIEVPSSAqLworCQlvdXRiX3AoTUFTVEVSX0lDVzRfREVGQVVMVCwgUElDX01BU1RFUl9JTVIpOworCisJb3V0Yl9wKDB4MTEsIFBJQ19TTEFWRV9DTUQpOwkvKiBJQ1cxOiBzZWxlY3QgODI1OUEtMiBpbml0ICovCisJb3V0Yl9wKDB4MjAgKyA4LCBQSUNfU0xBVkVfSU1SKTsJLyogSUNXMjogODI1OUEtMiBJUjAtNyBtYXBwZWQgdG8gMHgyOC0weDJmICovCisJb3V0Yl9wKFBJQ19DQVNDQURFX0lSLCBQSUNfU0xBVkVfSU1SKTsJLyogODI1OUEtMiBpcyBhIHNsYXZlIG9uIG1hc3RlcidzIElSMiAqLworCW91dGJfcChTTEFWRV9JQ1c0X0RFRkFVTFQsIFBJQ19TTEFWRV9JTVIpOyAvKiAoc2xhdmUncyBzdXBwb3J0IGZvciBBRU9JIGluIGZsYXQgbW9kZSBpcyB0byBiZSBpbnZlc3RpZ2F0ZWQpICovCisJaWYgKGF1dG9fZW9pKQorCQkvKgorCQkgKiBpbiBBRU9JIG1vZGUgd2UganVzdCBoYXZlIHRvIG1hc2sgdGhlIGludGVycnVwdAorCQkgKiB3aGVuIGFja2luZy4KKwkJICovCisJCWk4MjU5QV9pcnFfdHlwZS5hY2sgPSBkaXNhYmxlXzgyNTlBX2lycTsKKwllbHNlCisJCWk4MjU5QV9pcnFfdHlwZS5hY2sgPSBtYXNrX2FuZF9hY2tfODI1OUE7CisKKwl1ZGVsYXkoMTAwKTsJCS8qIHdhaXQgZm9yIDgyNTlBIHRvIGluaXRpYWxpemUgKi8KKworCW91dGIoY2FjaGVkX21hc3Rlcl9tYXNrLCBQSUNfTUFTVEVSX0lNUik7IC8qIHJlc3RvcmUgbWFzdGVyIElSUSBtYXNrICovCisJb3V0YihjYWNoZWRfc2xhdmVfbWFzaywgUElDX1NMQVZFX0lNUik7CSAgLyogcmVzdG9yZSBzbGF2ZSBJUlEgbWFzayAqLworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTgyNTlBX2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIE5vdGUgdGhhdCBvbiBhIDQ4Niwgd2UgZG9uJ3Qgd2FudCB0byBkbyBhIFNJR0ZQRSBvbiBhbiBpcnExMworICogYXMgdGhlIGlycSBpcyB1bnJlbGlhYmxlLCBhbmQgZXhjZXB0aW9uIDE2IHdvcmtzIGNvcnJlY3RseQorICogKGllIGFzIGV4cGxhaW5lZCBpbiB0aGUgaW50ZWwgbGl0ZXJhdHVyZSkuIE9uIGEgMzg2LCB5b3UKKyAqIGNhbid0IHVzZSBleGNlcHRpb24gMTYgZHVlIHRvIGJhZCBJQk0gZGVzaWduLCBzbyB3ZSBoYXZlIHRvCisgKiByZWx5IG9uIHRoZSBsZXNzIGV4YWN0IGlycTEzLgorICoKKyAqIENhcmVmdWwuLiBOb3Qgb25seSBpcyBJUlExMyB1bnJlbGlhYmxlLCBidXQgaXQgaXMgYWxzbworICogbGVhZHMgdG8gcmFjZXMuIElCTSBkZXNpZ25lcnMgd2hvIGNhbWUgdXAgd2l0aCBpdCBzaG91bGQKKyAqIGJlIHNob3QuCisgKi8KKyAKKworc3RhdGljIGlycXJldHVybl90IG1hdGhfZXJyb3JfaXJxKGludCBjcGwsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJZXh0ZXJuIHZvaWQgbWF0aF9lcnJvcih2b2lkIF9fdXNlciAqKTsKKwlvdXRiKDAsMHhGMCk7CisJaWYgKGlnbm9yZV9mcHVfaXJxIHx8ICFib290X2NwdV9kYXRhLmhhcmRfbWF0aCkKKwkJcmV0dXJuIElSUV9OT05FOworCW1hdGhfZXJyb3IoKHZvaWQgX191c2VyICopcmVncy0+ZWlwKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBOZXcgbW90aGVyYm9hcmRzIHNvbWV0aW1lcyBtYWtlIElSUSAxMyBiZSBhIFBDSSBpbnRlcnJ1cHQsCisgKiBzbyBhbGxvdyBpbnRlcnJ1cHQgc2hhcmluZy4KKyAqLworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gZnB1X2lycSA9IHsgbWF0aF9lcnJvcl9pcnEsIDAsIENQVV9NQVNLX05PTkUsICJmcHUiLCBOVUxMLCBOVUxMIH07CisKK3ZvaWQgX19pbml0IGluaXRfSVNBX2lycXMgKHZvaWQpCit7CisJaW50IGk7CisKKyNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKKwlpbml0X2JzcF9BUElDKCk7CisjZW5kaWYKKwlpbml0XzgyNTlBKDApOworCisJZm9yIChpID0gMDsgaSA8IE5SX0lSUVM7IGkrKykgeworCQlpcnFfZGVzY1tpXS5zdGF0dXMgPSBJUlFfRElTQUJMRUQ7CisJCWlycV9kZXNjW2ldLmFjdGlvbiA9IE5VTEw7CisJCWlycV9kZXNjW2ldLmRlcHRoID0gMTsKKworCQlpZiAoaSA8IDE2KSB7CisJCQkvKgorCQkJICogMTYgb2xkLXN0eWxlIElOVEEtY3ljbGUgaW50ZXJydXB0czoKKwkJCSAqLworCQkJaXJxX2Rlc2NbaV0uaGFuZGxlciA9ICZpODI1OUFfaXJxX3R5cGU7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogJ2hpZ2gnIFBDSSBJUlFzIGZpbGxlZCBpbiBvbiBkZW1hbmQKKwkJCSAqLworCQkJaXJxX2Rlc2NbaV0uaGFuZGxlciA9ICZub19pcnFfdHlwZTsKKwkJfQorCX0KK30KKwordm9pZCBfX2luaXQgaW5pdF9JUlEodm9pZCkKK3sKKwlpbnQgaTsKKworCS8qIGFsbCB0aGUgc2V0IHVwIGJlZm9yZSB0aGUgY2FsbCBnYXRlcyBhcmUgaW5pdGlhbGlzZWQgKi8KKwlwcmVfaW50cl9pbml0X2hvb2soKTsKKworCS8qCisJICogQ292ZXIgdGhlIHdob2xlIHZlY3RvciBzcGFjZSwgbm8gdmVjdG9yIGNhbiBlc2NhcGUKKwkgKiB1cy4gKHNvbWUgb2YgdGhlc2Ugd2lsbCBiZSBvdmVycmlkZGVuIGFuZCBiZWNvbWUKKwkgKiAnc3BlY2lhbCcgU01QIGludGVycnVwdHMpCisJICovCisJZm9yIChpID0gMDsgaSA8IChOUl9WRUNUT1JTIC0gRklSU1RfRVhURVJOQUxfVkVDVE9SKTsgaSsrKSB7CisJCWludCB2ZWN0b3IgPSBGSVJTVF9FWFRFUk5BTF9WRUNUT1IgKyBpOworCQlpZiAoaSA+PSBOUl9JUlFTKQorCQkJYnJlYWs7CisJCWlmICh2ZWN0b3IgIT0gU1lTQ0FMTF9WRUNUT1IpIAorCQkJc2V0X2ludHJfZ2F0ZSh2ZWN0b3IsIGludGVycnVwdFtpXSk7CisJfQorCisJLyogc2V0dXAgYWZ0ZXIgY2FsbCBnYXRlcyBhcmUgaW5pdGlhbGlzZWQgKHVzdWFsbHkgYWRkIGluCisJICogdGhlIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBnYXRlcykKKwkgKi8KKwlpbnRyX2luaXRfaG9vaygpOworCisJLyoKKwkgKiBTZXQgdGhlIGNsb2NrIHRvIEhaIEh6LCB3ZSBhbHJlYWR5IGhhdmUgYSB2YWxpZAorCSAqIHZlY3RvciBub3c6CisJICovCisJc2V0dXBfcGl0X3RpbWVyKCk7CisKKwkvKgorCSAqIEV4dGVybmFsIEZQVT8gU2V0IHVwIGlycTEzIGlmIHNvLCBmb3IKKwkgKiBvcmlnaW5hbCBicmFpbmRhbWFnZWQgSUJNIEZFUlIgY291cGxpbmcuCisJICovCisJaWYgKGJvb3RfY3B1X2RhdGEuaGFyZF9tYXRoICYmICFjcHVfaGFzX2ZwdSkKKwkJc2V0dXBfaXJxKEZQVV9JUlEsICZmcHVfaXJxKTsKKworCWlycV9jdHhfaW5pdChzbXBfcHJvY2Vzc29yX2lkKCkpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9pbml0X3Rhc2suYyBiL2FyY2gvaTM4Ni9rZXJuZWwvaW5pdF90YXNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNhYThlOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvaW5pdF90YXNrLmMKQEAgLTAsMCArMSw0NiBAQAorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdF90YXNrLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tcXVldWUuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vZGVzYy5oPgorCitzdGF0aWMgc3RydWN0IGZzX3N0cnVjdCBpbml0X2ZzID0gSU5JVF9GUzsKK3N0YXRpYyBzdHJ1Y3QgZmlsZXNfc3RydWN0IGluaXRfZmlsZXMgPSBJTklUX0ZJTEVTOworc3RhdGljIHN0cnVjdCBzaWduYWxfc3RydWN0IGluaXRfc2lnbmFscyA9IElOSVRfU0lHTkFMUyhpbml0X3NpZ25hbHMpOworc3RhdGljIHN0cnVjdCBzaWdoYW5kX3N0cnVjdCBpbml0X3NpZ2hhbmQgPSBJTklUX1NJR0hBTkQoaW5pdF9zaWdoYW5kKTsKK3N0cnVjdCBtbV9zdHJ1Y3QgaW5pdF9tbSA9IElOSVRfTU0oaW5pdF9tbSk7CisKK0VYUE9SVF9TWU1CT0woaW5pdF9tbSk7CisKKy8qCisgKiBJbml0aWFsIHRocmVhZCBzdHJ1Y3R1cmUuCisgKgorICogV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGlzIGlzIFRIUkVBRF9TSVpFIGFsaWduZWQgZHVlIHRvIHRoZQorICogd2F5IHByb2Nlc3Mgc3RhY2tzIGFyZSBoYW5kbGVkLiBUaGlzIGlzIGRvbmUgYnkgaGF2aW5nIGEgc3BlY2lhbAorICogImluaXRfdGFzayIgbGlua2VyIG1hcCBlbnRyeS4uCisgKi8KK3VuaW9uIHRocmVhZF91bmlvbiBpbml0X3RocmVhZF91bmlvbiAKKwlfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXygiLmRhdGEuaW5pdF90YXNrIikpKSA9CisJCXsgSU5JVF9USFJFQURfSU5GTyhpbml0X3Rhc2spIH07CisKKy8qCisgKiBJbml0aWFsIHRhc2sgc3RydWN0dXJlLgorICoKKyAqIEFsbCBvdGhlciB0YXNrIHN0cnVjdHMgd2lsbCBiZSBhbGxvY2F0ZWQgb24gc2xhYnMgaW4gZm9yay5jCisgKi8KK3N0cnVjdCB0YXNrX3N0cnVjdCBpbml0X3Rhc2sgPSBJTklUX1RBU0soaW5pdF90YXNrKTsKKworRVhQT1JUX1NZTUJPTChpbml0X3Rhc2spOworCisvKgorICogcGVyLUNQVSBUU1Mgc2VnbWVudHMuIFRocmVhZHMgYXJlIGNvbXBsZXRlbHkgJ3NvZnQnIG9uIExpbnV4LAorICogbm8gbW9yZSBwZXItdGFzayBUU1Mncy4KKyAqLyAKK0RFRklORV9QRVJfQ1BVKHN0cnVjdCB0c3Nfc3RydWN0LCBpbml0X3RzcykgX19fX2NhY2hlbGluZV9tYXhhbGlnbmVkX2luX3NtcCA9IElOSVRfVFNTOworCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2lvX2FwaWMuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvaW9fYXBpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMTM1MGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2lvX2FwaWMuYwpAQCAtMCwwICsxLDI1NDUgQEAKKy8qCisgKglJbnRlbCBJTy1BUElDIHN1cHBvcnQgZm9yIG11bHRpLVBlbnRpdW0gaG9zdHMuCisgKgorICoJQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwIEluZ28gTW9sbmFyLCBIYWpuYWxrYSBTemFibworICoKKyAqCU1hbnkgdGhhbmtzIHRvIFN0aWcgVmVuYWFzIGZvciB0cnlpbmcgb3V0IGNvdW50bGVzcyBleHBlcmltZW50YWwKKyAqCXBhdGNoZXMgYW5kIHJlcG9ydGluZy9kZWJ1Z2dpbmcgcHJvYmxlbXMgcGF0aWVudGx5IQorICoKKyAqCShjKSAxOTk5LCBNdWx0aXBsZSBJTy1BUElDIHN1cHBvcnQsIGRldmVsb3BlZCBieQorICoJS2VuLWljaGkgWWFrdSA8eWFrdUBjc3MxLmtibmVzLm5lYy5jby5qcD4gYW5kCisgKiAgICAgIEhpZGVtaSBLaXNoaW1vdG8gPGtpc2ltb3RvQGNzczEua2JuZXMubmVjLmNvLmpwPiwKKyAqCWZ1cnRoZXIgdGVzdGVkIGFuZCBjbGVhbmVkIHVwIGJ5IFphY2ggQnJvd24gPHphYkByZWRoYXQuY29tPgorICoJYW5kIEluZ28gTW9sbmFyIDxtaW5nb0ByZWRoYXQuY29tPgorICoKKyAqCUZpeGVzCisgKglNYWNpZWogVy4gUm96eWNraQk6CUJpdHMgZm9yIGdlbnVpbmUgODI0ODlEWCBBUElDczsKKyAqCQkJCQl0aGFua3MgdG8gRXJpYyBHaWxtb3JlCisgKgkJCQkJYW5kIFJvbGYgRy4gVGV3cworICoJCQkJCWZvciB0ZXN0aW5nIHRoZXNlIGV4dGVuc2l2ZWx5CisgKglQYXVsIERpZWZlbmJhdWdoCToJQWRkZWQgZnVsbCBBQ1BJIHN1cHBvcnQKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKworI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zbXAuaD4KKyNpbmNsdWRlIDxhc20vZGVzYy5oPgorI2luY2x1ZGUgPGFzbS90aW1lci5oPgorCisjaW5jbHVkZSA8bWFjaF9hcGljLmg+CisKKyNpbmNsdWRlICJpb19wb3J0cy5oIgorCitpbnQgKCppb2FwaWNfcmVudW1iZXJfaXJxKShpbnQgaW9hcGljLCBpbnQgaXJxKTsKK2F0b21pY190IGlycV9taXNfY291bnQ7CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaW9hcGljX2xvY2spOworCisvKgorICoJSXMgdGhlIFNpUyBBUElDIHJtdyBidWcgcHJlc2VudCA/CisgKgktMSA9IGRvbid0IGtub3csIDAgPSBubywgMSA9IHllcworICovCitpbnQgc2lzX2FwaWNfYnVnID0gLTE7CisKKy8qCisgKiAjIG9mIElSUSByb3V0aW5nIHJlZ2lzdGVycworICovCitpbnQgbnJfaW9hcGljX3JlZ2lzdGVyc1tNQVhfSU9fQVBJQ1NdOworCisvKgorICogUm91Z2ggZXN0aW1hdGlvbiBvZiBob3cgbWFueSBzaGFyZWQgSVJRcyB0aGVyZSBhcmUsIGNhbgorICogYmUgY2hhbmdlZCBhbnl0aW1lLgorICovCisjZGVmaW5lIE1BWF9QTFVTX1NIQVJFRF9JUlFTIE5SX0lSUVMKKyNkZWZpbmUgUElOX01BUF9TSVpFIChNQVhfUExVU19TSEFSRURfSVJRUyArIE5SX0lSUVMpCisKKy8qCisgKiBUaGlzIGlzIHBlcmZvcm1hbmNlLWNyaXRpY2FsLCB3ZSB3YW50IHRvIGRvIGl0IE8oMSkKKyAqCisgKiB0aGUgaW5kZXhpbmcgb3JkZXIgb2YgdGhpcyBhcnJheSBmYXZvcnMgMToxIG1hcHBpbmdzCisgKiBiZXR3ZWVuIHBpbnMgYW5kIElSUXMuCisgKi8KKworc3RhdGljIHN0cnVjdCBpcnFfcGluX2xpc3QgeworCWludCBhcGljLCBwaW4sIG5leHQ7Cit9IGlycV8yX3BpbltQSU5fTUFQX1NJWkVdOworCitpbnQgdmVjdG9yX2lycVtOUl9WRUNUT1JTXSA9IHsgWzAgLi4uIE5SX1ZFQ1RPUlMgLSAxXSA9IC0xfTsKKyNpZmRlZiBDT05GSUdfUENJX01TSQorI2RlZmluZSB2ZWN0b3JfdG9faXJxKHZlY3RvcikgCVwKKwkocGxhdGZvcm1fbGVnYWN5X2lycSh2ZWN0b3IpID8gdmVjdG9yIDogdmVjdG9yX2lycVt2ZWN0b3JdKQorI2Vsc2UKKyNkZWZpbmUgdmVjdG9yX3RvX2lycSh2ZWN0b3IpCSh2ZWN0b3IpCisjZW5kaWYKKworLyoKKyAqIFRoZSBjb21tb24gY2FzZSBpcyAxOjEgSVJRPC0+cGluIG1hcHBpbmdzLiBTb21ldGltZXMgdGhlcmUgYXJlCisgKiBzaGFyZWQgSVNBLXNwYWNlIElSUXMsIHNvIHdlIGhhdmUgdG8gc3VwcG9ydCB0aGVtLiBXZSBhcmUgc3VwZXIKKyAqIGZhc3QgaW4gdGhlIGNvbW1vbiBjYXNlLCBhbmQgZmFzdCBmb3Igc2hhcmVkIElTQS1zcGFjZSBJUlFzLgorICovCitzdGF0aWMgdm9pZCBhZGRfcGluX3RvX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBpbnQgYXBpYywgaW50IHBpbikKK3sKKwlzdGF0aWMgaW50IGZpcnN0X2ZyZWVfZW50cnkgPSBOUl9JUlFTOworCXN0cnVjdCBpcnFfcGluX2xpc3QgKmVudHJ5ID0gaXJxXzJfcGluICsgaXJxOworCisJd2hpbGUgKGVudHJ5LT5uZXh0KQorCQllbnRyeSA9IGlycV8yX3BpbiArIGVudHJ5LT5uZXh0OworCisJaWYgKGVudHJ5LT5waW4gIT0gLTEpIHsKKwkJZW50cnktPm5leHQgPSBmaXJzdF9mcmVlX2VudHJ5OworCQllbnRyeSA9IGlycV8yX3BpbiArIGVudHJ5LT5uZXh0OworCQlpZiAoKytmaXJzdF9mcmVlX2VudHJ5ID49IFBJTl9NQVBfU0laRSkKKwkJCXBhbmljKCJpb19hcGljLmM6IHdob29wcyIpOworCX0KKwllbnRyeS0+YXBpYyA9IGFwaWM7CisJZW50cnktPnBpbiA9IHBpbjsKK30KKworLyoKKyAqIFJlcm91dGUgYW4gSVJRIHRvIGEgZGlmZmVyZW50IHBpbi4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IHJlcGxhY2VfcGluX2F0X2lycSh1bnNpZ25lZCBpbnQgaXJxLAorCQkJCSAgICAgIGludCBvbGRhcGljLCBpbnQgb2xkcGluLAorCQkJCSAgICAgIGludCBuZXdhcGljLCBpbnQgbmV3cGluKQoreworCXN0cnVjdCBpcnFfcGluX2xpc3QgKmVudHJ5ID0gaXJxXzJfcGluICsgaXJxOworCisJd2hpbGUgKDEpIHsKKwkJaWYgKGVudHJ5LT5hcGljID09IG9sZGFwaWMgJiYgZW50cnktPnBpbiA9PSBvbGRwaW4pIHsKKwkJCWVudHJ5LT5hcGljID0gbmV3YXBpYzsKKwkJCWVudHJ5LT5waW4gPSBuZXdwaW47CisJCX0KKwkJaWYgKCFlbnRyeS0+bmV4dCkKKwkJCWJyZWFrOworCQllbnRyeSA9IGlycV8yX3BpbiArIGVudHJ5LT5uZXh0OworCX0KK30KKworc3RhdGljIHZvaWQgX19tb2RpZnlfSU9fQVBJQ19pcnEgKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGxvbmcgZW5hYmxlLCB1bnNpZ25lZCBsb25nIGRpc2FibGUpCit7CisJc3RydWN0IGlycV9waW5fbGlzdCAqZW50cnkgPSBpcnFfMl9waW4gKyBpcnE7CisJdW5zaWduZWQgaW50IHBpbiwgcmVnOworCisJZm9yICg7OykgeworCQlwaW4gPSBlbnRyeS0+cGluOworCQlpZiAocGluID09IC0xKQorCQkJYnJlYWs7CisJCXJlZyA9IGlvX2FwaWNfcmVhZChlbnRyeS0+YXBpYywgMHgxMCArIHBpbioyKTsKKwkJcmVnICY9IH5kaXNhYmxlOworCQlyZWcgfD0gZW5hYmxlOworCQlpb19hcGljX21vZGlmeShlbnRyeS0+YXBpYywgMHgxMCArIHBpbioyLCByZWcpOworCQlpZiAoIWVudHJ5LT5uZXh0KQorCQkJYnJlYWs7CisJCWVudHJ5ID0gaXJxXzJfcGluICsgZW50cnktPm5leHQ7CisJfQorfQorCisvKiBtYXNrID0gMSAqLworc3RhdGljIHZvaWQgX19tYXNrX0lPX0FQSUNfaXJxICh1bnNpZ25lZCBpbnQgaXJxKQoreworCV9fbW9kaWZ5X0lPX0FQSUNfaXJxKGlycSwgMHgwMDAxMDAwMCwgMCk7Cit9CisKKy8qIG1hc2sgPSAwICovCitzdGF0aWMgdm9pZCBfX3VubWFza19JT19BUElDX2lycSAodW5zaWduZWQgaW50IGlycSkKK3sKKwlfX21vZGlmeV9JT19BUElDX2lycShpcnEsIDAsIDB4MDAwMTAwMDApOworfQorCisvKiBtYXNrID0gMSwgdHJpZ2dlciA9IDAgKi8KK3N0YXRpYyB2b2lkIF9fbWFza19hbmRfZWRnZV9JT19BUElDX2lycSAodW5zaWduZWQgaW50IGlycSkKK3sKKwlfX21vZGlmeV9JT19BUElDX2lycShpcnEsIDB4MDAwMTAwMDAsIDB4MDAwMDgwMDApOworfQorCisvKiBtYXNrID0gMCwgdHJpZ2dlciA9IDEgKi8KK3N0YXRpYyB2b2lkIF9fdW5tYXNrX2FuZF9sZXZlbF9JT19BUElDX2lycSAodW5zaWduZWQgaW50IGlycSkKK3sKKwlfX21vZGlmeV9JT19BUElDX2lycShpcnEsIDB4MDAwMDgwMDAsIDB4MDAwMTAwMDApOworfQorCitzdGF0aWMgdm9pZCBtYXNrX0lPX0FQSUNfaXJxICh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwlfX21hc2tfSU9fQVBJQ19pcnEoaXJxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCB1bm1hc2tfSU9fQVBJQ19pcnEgKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCV9fdW5tYXNrX0lPX0FQSUNfaXJxKGlycSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgY2xlYXJfSU9fQVBJQ19waW4odW5zaWduZWQgaW50IGFwaWMsIHVuc2lnbmVkIGludCBwaW4pCit7CisJc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkgZW50cnk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwkvKiBDaGVjayBkZWxpdmVyeV9tb2RlIHRvIGJlIHN1cmUgd2UncmUgbm90IGNsZWFyaW5nIGFuIFNNSSBwaW4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwkqKCgoaW50KikmZW50cnkpICsgMCkgPSBpb19hcGljX3JlYWQoYXBpYywgMHgxMCArIDIgKiBwaW4pOworCSooKChpbnQqKSZlbnRyeSkgKyAxKSA9IGlvX2FwaWNfcmVhZChhcGljLCAweDExICsgMiAqIHBpbik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwlpZiAoZW50cnkuZGVsaXZlcnlfbW9kZSA9PSBkZXN0X1NNSSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBEaXNhYmxlIGl0IGluIHRoZSBJTy1BUElDIGlycS1yb3V0aW5nIHRhYmxlOgorCSAqLworCW1lbXNldCgmZW50cnksIDAsIHNpemVvZihlbnRyeSkpOworCWVudHJ5Lm1hc2sgPSAxOworCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCWlvX2FwaWNfd3JpdGUoYXBpYywgMHgxMCArIDIgKiBwaW4sICooKChpbnQgKikmZW50cnkpICsgMCkpOworCWlvX2FwaWNfd3JpdGUoYXBpYywgMHgxMSArIDIgKiBwaW4sICooKChpbnQgKikmZW50cnkpICsgMSkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyX0lPX0FQSUMgKHZvaWQpCit7CisJaW50IGFwaWMsIHBpbjsKKworCWZvciAoYXBpYyA9IDA7IGFwaWMgPCBucl9pb2FwaWNzOyBhcGljKyspCisJCWZvciAocGluID0gMDsgcGluIDwgbnJfaW9hcGljX3JlZ2lzdGVyc1thcGljXTsgcGluKyspCisJCQljbGVhcl9JT19BUElDX3BpbihhcGljLCBwaW4pOworfQorCitzdGF0aWMgdm9pZCBzZXRfaW9hcGljX2FmZmluaXR5X2lycSh1bnNpZ25lZCBpbnQgaXJxLCBjcHVtYXNrX3QgY3B1bWFzaykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBwaW47CisJc3RydWN0IGlycV9waW5fbGlzdCAqZW50cnkgPSBpcnFfMl9waW4gKyBpcnE7CisJdW5zaWduZWQgaW50IGFwaWNpZF92YWx1ZTsKKwkKKwlhcGljaWRfdmFsdWUgPSBjcHVfbWFza190b19hcGljaWQoY3B1bWFzayk7CisJLyogUHJlcGFyZSB0byBkbyB0aGUgaW9fYXBpY193cml0ZSAqLworCWFwaWNpZF92YWx1ZSA9IGFwaWNpZF92YWx1ZSA8PCAyNDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwlmb3IgKDs7KSB7CisJCXBpbiA9IGVudHJ5LT5waW47CisJCWlmIChwaW4gPT0gLTEpCisJCQlicmVhazsKKwkJaW9fYXBpY193cml0ZShlbnRyeS0+YXBpYywgMHgxMCArIDEgKyBwaW4qMiwgYXBpY2lkX3ZhbHVlKTsKKwkJaWYgKCFlbnRyeS0+bmV4dCkKKwkJCWJyZWFrOworCQllbnRyeSA9IGlycV8yX3BpbiArIGVudHJ5LT5uZXh0OworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfSVJRQkFMQU5DRSkKKyMgaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgkvKiBrZXJuZWxfdGhyZWFkKCkgKi8KKyMgaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4JLyoga3N0YXQgKi8KKyMgaW5jbHVkZSA8bGludXgvc2xhYi5oPgkJLyoga21hbGxvYygpICovCisjIGluY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CS8qIHRpbWVfYWZ0ZXIoKSAqLworIAorIyBpZmRlZiBDT05GSUdfQkFMQU5DRURfSVJRX0RFQlVHCisjICBkZWZpbmUgVERwcmludGsoeC4uLikgZG8geyBwcmludGsoIjwlbGQ6JXM6JWQ+OiAiLCBqaWZmaWVzLCBfX0ZJTEVfXywgX19MSU5FX18pOyBwcmludGsoeCk7IH0gd2hpbGUgKDApCisjICBkZWZpbmUgRHByaW50ayh4Li4uKSBkbyB7IFREcHJpbnRrKHgpOyB9IHdoaWxlICgwKQorIyBlbHNlCisjICBkZWZpbmUgVERwcmludGsoeC4uLikgCisjICBkZWZpbmUgRHByaW50ayh4Li4uKSAKKyMgZW5kaWYKKworY3B1bWFza190IF9fY2FjaGVsaW5lX2FsaWduZWQgcGVuZGluZ19pcnFfYmFsYW5jZV9jcHVtYXNrW05SX0lSUVNdOworCisjZGVmaW5lIElSUUJBTEFOQ0VfQ0hFQ0tfQVJDSCAtOTk5CitzdGF0aWMgaW50IGlycWJhbGFuY2VfZGlzYWJsZWQgPSBJUlFCQUxBTkNFX0NIRUNLX0FSQ0g7CitzdGF0aWMgaW50IHBoeXNpY2FsX2JhbGFuY2UgPSAwOworCitzdGF0aWMgc3RydWN0IGlycV9jcHVfaW5mbyB7CisJdW5zaWduZWQgbG9uZyAqIGxhc3RfaXJxOworCXVuc2lnbmVkIGxvbmcgKiBpcnFfZGVsdGE7CisJdW5zaWduZWQgbG9uZyBpcnE7Cit9IGlycV9jcHVfZGF0YVtOUl9DUFVTXTsKKworI2RlZmluZSBDUFVfSVJRKGNwdSkJCShpcnFfY3B1X2RhdGFbY3B1XS5pcnEpCisjZGVmaW5lIExBU1RfQ1BVX0lSUShjcHUsaXJxKSAgIChpcnFfY3B1X2RhdGFbY3B1XS5sYXN0X2lycVtpcnFdKQorI2RlZmluZSBJUlFfREVMVEEoY3B1LGlycSkgCShpcnFfY3B1X2RhdGFbY3B1XS5pcnFfZGVsdGFbaXJxXSkKKworI2RlZmluZSBJRExFX0VOT1VHSChjcHUsbm93KSBcCisJKGlkbGVfY3B1KGNwdSkgJiYgKChub3cpIC0gcGVyX2NwdShpcnFfc3RhdCwgKGNwdSkpLmlkbGVfdGltZXN0YW1wID4gMSkpCisKKyNkZWZpbmUgSVJRX0FMTE9XRUQoY3B1LCBhbGxvd2VkX21hc2spCWNwdV9pc3NldChjcHUsIGFsbG93ZWRfbWFzaykKKworI2RlZmluZSBDUFVfVE9fUEFDS0FHRUlOREVYKGkpIChmaXJzdF9jcHUoY3B1X3NpYmxpbmdfbWFwW2ldKSkKKworI2RlZmluZSBNQVhfQkFMQU5DRURfSVJRX0lOVEVSVkFMCSg1KkhaKQorI2RlZmluZSBNSU5fQkFMQU5DRURfSVJRX0lOVEVSVkFMCShIWi8yKQorI2RlZmluZSBCQUxBTkNFRF9JUlFfTU9SRV9ERUxUQQkJKEhaLzEwKQorI2RlZmluZSBCQUxBTkNFRF9JUlFfTEVTU19ERUxUQQkJKEhaKQorCitzdGF0aWMgbG9uZyBiYWxhbmNlZF9pcnFfaW50ZXJ2YWwgPSBNQVhfQkFMQU5DRURfSVJRX0lOVEVSVkFMOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtb3ZlKGludCBjdXJyX2NwdSwgY3B1bWFza190IGFsbG93ZWRfbWFzaywKKwkJCXVuc2lnbmVkIGxvbmcgbm93LCBpbnQgZGlyZWN0aW9uKQoreworCWludCBzZWFyY2hfaWRsZSA9IDE7CisJaW50IGNwdSA9IGN1cnJfY3B1OworCisJZ290byBpbnNpZGU7CisKKwlkbyB7CisJCWlmICh1bmxpa2VseShjcHUgPT0gY3Vycl9jcHUpKQorCQkJc2VhcmNoX2lkbGUgPSAwOworaW5zaWRlOgorCQlpZiAoZGlyZWN0aW9uID09IDEpIHsKKwkJCWNwdSsrOworCQkJaWYgKGNwdSA+PSBOUl9DUFVTKQorCQkJCWNwdSA9IDA7CisJCX0gZWxzZSB7CisJCQljcHUtLTsKKwkJCWlmIChjcHUgPT0gLTEpCisJCQkJY3B1ID0gTlJfQ1BVUy0xOworCQl9CisJfSB3aGlsZSAoIWNwdV9vbmxpbmUoY3B1KSB8fCAhSVJRX0FMTE9XRUQoY3B1LGFsbG93ZWRfbWFzaykgfHwKKwkJCShzZWFyY2hfaWRsZSAmJiAhSURMRV9FTk9VR0goY3B1LG5vdykpKTsKKworCXJldHVybiBjcHU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiYWxhbmNlX2lycShpbnQgY3B1LCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKKwljcHVtYXNrX3QgYWxsb3dlZF9tYXNrOworCXVuc2lnbmVkIGludCBuZXdfY3B1OworCQkKKwlpZiAoaXJxYmFsYW5jZV9kaXNhYmxlZCkKKwkJcmV0dXJuOyAKKworCWNwdXNfYW5kKGFsbG93ZWRfbWFzaywgY3B1X29ubGluZV9tYXAsIGlycV9hZmZpbml0eVtpcnFdKTsKKwluZXdfY3B1ID0gbW92ZShjcHUsIGFsbG93ZWRfbWFzaywgbm93LCAxKTsKKwlpZiAoY3B1ICE9IG5ld19jcHUpIHsKKwkJaXJxX2Rlc2NfdCAqZGVzYyA9IGlycV9kZXNjICsgaXJxOworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXNjLT5sb2NrLCBmbGFncyk7CisJCXBlbmRpbmdfaXJxX2JhbGFuY2VfY3B1bWFza1tpcnFdID0gY3B1bWFza19vZl9jcHUobmV3X2NwdSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByb3RhdGVfaXJxc19hbW9uZ19jcHVzKHVuc2lnbmVkIGxvbmcgdXNlZnVsX2xvYWRfdGhyZXNob2xkKQoreworCWludCBpLCBqOworCURwcmludGsoIlJvdGF0aW5nIElSUXMgYW1vbmcgQ1BVcy5cbiIpOworCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspIHsKKwkJZm9yIChqID0gMDsgY3B1X29ubGluZShpKSAmJiAoaiA8IE5SX0lSUVMpOyBqKyspIHsKKwkJCWlmICghaXJxX2Rlc2Nbal0uYWN0aW9uKQorCQkJCWNvbnRpbnVlOworCQkJLyogSXMgaXQgYSBzaWduaWZpY2FudCBsb2FkID8gICovCisJCQlpZiAoSVJRX0RFTFRBKENQVV9UT19QQUNLQUdFSU5ERVgoaSksaikgPAorCQkJCQkJdXNlZnVsX2xvYWRfdGhyZXNob2xkKQorCQkJCWNvbnRpbnVlOworCQkJYmFsYW5jZV9pcnEoaSwgaik7CisJCX0KKwl9CisJYmFsYW5jZWRfaXJxX2ludGVydmFsID0gbWF4KChsb25nKU1JTl9CQUxBTkNFRF9JUlFfSU5URVJWQUwsCisJCWJhbGFuY2VkX2lycV9pbnRlcnZhbCAtIEJBTEFOQ0VEX0lSUV9MRVNTX0RFTFRBKTsJCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBkb19pcnFfYmFsYW5jZSh2b2lkKQoreworCWludCBpLCBqOworCXVuc2lnbmVkIGxvbmcgbWF4X2NwdV9pcnEgPSAwLCBtaW5fY3B1X2lycSA9ICh+MCk7CisJdW5zaWduZWQgbG9uZyBtb3ZlX3RoaXNfbG9hZCA9IDA7CisJaW50IG1heF9sb2FkZWQgPSAwLCBtaW5fbG9hZGVkID0gMDsKKwlpbnQgbG9hZDsKKwl1bnNpZ25lZCBsb25nIHVzZWZ1bF9sb2FkX3RocmVzaG9sZCA9IGJhbGFuY2VkX2lycV9pbnRlcnZhbCArIDEwOworCWludCBzZWxlY3RlZF9pcnE7CisJaW50IHRtcF9sb2FkZWQsIGZpcnN0X2F0dGVtcHQgPSAxOworCXVuc2lnbmVkIGxvbmcgdG1wX2NwdV9pcnE7CisJdW5zaWduZWQgbG9uZyBpbWJhbGFuY2UgPSAwOworCWNwdW1hc2tfdCBhbGxvd2VkX21hc2ssIHRhcmdldF9jcHVfbWFzaywgdG1wOworCisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgeworCQlpbnQgcGFja2FnZV9pbmRleDsKKwkJQ1BVX0lSUShpKSA9IDA7CisJCWlmICghY3B1X29ubGluZShpKSkKKwkJCWNvbnRpbnVlOworCQlwYWNrYWdlX2luZGV4ID0gQ1BVX1RPX1BBQ0tBR0VJTkRFWChpKTsKKwkJZm9yIChqID0gMDsgaiA8IE5SX0lSUVM7IGorKykgeworCQkJdW5zaWduZWQgbG9uZyB2YWx1ZV9ub3csIGRlbHRhOworCQkJLyogSXMgdGhpcyBhbiBhY3RpdmUgSVJRPyAqLworCQkJaWYgKCFpcnFfZGVzY1tqXS5hY3Rpb24pCisJCQkJY29udGludWU7CisJCQlpZiAoIHBhY2thZ2VfaW5kZXggPT0gaSApCisJCQkJSVJRX0RFTFRBKHBhY2thZ2VfaW5kZXgsaikgPSAwOworCQkJLyogRGV0ZXJtaW5lIHRoZSB0b3RhbCBjb3VudCBwZXIgcHJvY2Vzc29yIHBlciBJUlEgKi8KKwkJCXZhbHVlX25vdyA9ICh1bnNpZ25lZCBsb25nKSBrc3RhdF9jcHUoaSkuaXJxc1tqXTsKKworCQkJLyogRGV0ZXJtaW5lIHRoZSBhY3Rpdml0eSBwZXIgcHJvY2Vzc29yIHBlciBJUlEgKi8KKwkJCWRlbHRhID0gdmFsdWVfbm93IC0gTEFTVF9DUFVfSVJRKGksaik7CisKKwkJCS8qIFVwZGF0ZSBsYXN0X2NwdV9pcnFbXVtdIGZvciB0aGUgbmV4dCB0aW1lICovCisJCQlMQVNUX0NQVV9JUlEoaSxqKSA9IHZhbHVlX25vdzsKKworCQkJLyogSWdub3JlIElSUXMgd2hvc2UgcmF0ZSBpcyBsZXNzIHRoYW4gdGhlIGNsb2NrICovCisJCQlpZiAoZGVsdGEgPCB1c2VmdWxfbG9hZF90aHJlc2hvbGQpCisJCQkJY29udGludWU7CisJCQkvKiB1cGRhdGUgdGhlIGxvYWQgZm9yIHRoZSBwcm9jZXNzb3Igb3IgcGFja2FnZSB0b3RhbCAqLworCQkJSVJRX0RFTFRBKHBhY2thZ2VfaW5kZXgsaikgKz0gZGVsdGE7CisKKwkJCS8qIEtlZXAgdHJhY2sgb2YgdGhlIGhpZ2hlciBudW1iZXJlZCBzaWJsaW5nIGFzIHdlbGwgKi8KKwkJCWlmIChpICE9IHBhY2thZ2VfaW5kZXgpCisJCQkJQ1BVX0lSUShpKSArPSBkZWx0YTsKKwkJCS8qCisJCQkgKiBXZSBoYXZlIHNpYmxpbmcgQSBhbmQgc2libGluZyBCIGluIHRoZSBwYWNrYWdlCisJCQkgKgorCQkJICogY3B1X2lycVtBXSA9IGxvYWQgZm9yIGNwdSBBICsgbG9hZCBmb3IgY3B1IEIKKwkJCSAqIGNwdV9pcnFbQl0gPSBsb2FkIGZvciBjcHUgQgorCQkJICovCisJCQlDUFVfSVJRKHBhY2thZ2VfaW5kZXgpICs9IGRlbHRhOworCQl9CisJfQorCS8qIEZpbmQgdGhlIGxlYXN0IGxvYWRlZCBwcm9jZXNzb3IgcGFja2FnZSAqLworCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspIHsKKwkJaWYgKCFjcHVfb25saW5lKGkpKQorCQkJY29udGludWU7CisJCWlmIChpICE9IENQVV9UT19QQUNLQUdFSU5ERVgoaSkpCisJCQljb250aW51ZTsKKwkJaWYgKG1pbl9jcHVfaXJxID4gQ1BVX0lSUShpKSkgeworCQkJbWluX2NwdV9pcnEgPSBDUFVfSVJRKGkpOworCQkJbWluX2xvYWRlZCA9IGk7CisJCX0KKwl9CisJbWF4X2NwdV9pcnEgPSBVTE9OR19NQVg7CisKK3RyeWFub3RoZXJjcHU6CisJLyogTG9vayBmb3IgaGVhdmllc3QgbG9hZGVkIHByb2Nlc3Nvci4KKwkgKiBXZSBtYXkgY29tZSBiYWNrIHRvIGdldCB0aGUgbmV4dCBoZWF2aWVzdCBsb2FkZWQgcHJvY2Vzc29yLgorCSAqIFNraXAgcHJvY2Vzc29ycyB3aXRoIHRyaXZpYWwgbG9hZHMuCisJICovCisJdG1wX2NwdV9pcnEgPSAwOworCXRtcF9sb2FkZWQgPSAtMTsKKwlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKSB7CisJCWlmICghY3B1X29ubGluZShpKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoaSAhPSBDUFVfVE9fUEFDS0FHRUlOREVYKGkpKQorCQkJY29udGludWU7CisJCWlmIChtYXhfY3B1X2lycSA8PSBDUFVfSVJRKGkpKSAKKwkJCWNvbnRpbnVlOworCQlpZiAodG1wX2NwdV9pcnEgPCBDUFVfSVJRKGkpKSB7CisJCQl0bXBfY3B1X2lycSA9IENQVV9JUlEoaSk7CisJCQl0bXBfbG9hZGVkID0gaTsKKwkJfQorCX0KKworCWlmICh0bXBfbG9hZGVkID09IC0xKSB7CisgCSAvKiBJbiB0aGUgY2FzZSBvZiBzbWFsbCBudW1iZXIgb2YgaGVhdnkgaW50ZXJydXB0IHNvdXJjZXMsIAorCSAgKiBsb2FkaW5nIHNvbWUgb2YgdGhlIGNwdXMgdG9vIG11Y2guIFdlIHVzZSBJbmdvJ3Mgb3JpZ2luYWwgCisJICAqIGFwcHJvYWNoIHRvIHJvdGF0ZSB0aGVtIGFyb3VuZC4KKwkgICovCisJCWlmICghZmlyc3RfYXR0ZW1wdCAmJiBpbWJhbGFuY2UgPj0gdXNlZnVsX2xvYWRfdGhyZXNob2xkKSB7CisJCQlyb3RhdGVfaXJxc19hbW9uZ19jcHVzKHVzZWZ1bF9sb2FkX3RocmVzaG9sZCk7CisJCQlyZXR1cm47CisJCX0KKwkJZ290byBub3Rfd29ydGhfdGhlX2VmZm9ydDsKKwl9CisJCisJZmlyc3RfYXR0ZW1wdCA9IDA7CQkvKiBoZWF2aWVzdCBzZWFyY2ggKi8KKwltYXhfY3B1X2lycSA9IHRtcF9jcHVfaXJxOwkvKiBsb2FkICovCisJbWF4X2xvYWRlZCA9IHRtcF9sb2FkZWQ7CS8qIHByb2Nlc3NvciAqLworCWltYmFsYW5jZSA9IChtYXhfY3B1X2lycSAtIG1pbl9jcHVfaXJxKSAvIDI7CisJCisJRHByaW50aygibWF4X2xvYWRlZCBjcHUgPSAlZFxuIiwgbWF4X2xvYWRlZCk7CisJRHByaW50aygibWluX2xvYWRlZCBjcHUgPSAlZFxuIiwgbWluX2xvYWRlZCk7CisJRHByaW50aygibWF4X2NwdV9pcnEgbG9hZCA9ICVsZFxuIiwgbWF4X2NwdV9pcnEpOworCURwcmludGsoIm1pbl9jcHVfaXJxIGxvYWQgPSAlbGRcbiIsIG1pbl9jcHVfaXJxKTsKKwlEcHJpbnRrKCJsb2FkIGltYmFsYW5jZSA9ICVsdVxuIiwgaW1iYWxhbmNlKTsKKworCS8qIGlmIGltYmFsYW5jZSBpcyBsZXNzIHRoYW4gYXBwcm94IDEwJSBvZiBtYXggbG9hZCwgdGhlbgorCSAqIG9ic2VydmUgZGltaW5pc2hpbmcgcmV0dXJucyBhY3Rpb24uIC0gcXVpdAorCSAqLworCWlmIChpbWJhbGFuY2UgPCAobWF4X2NwdV9pcnEgPj4gMykpIHsKKwkJRHByaW50aygiSW1iYWxhbmNlIHRvbyB0cml2aWFsXG4iKTsKKwkJZ290byBub3Rfd29ydGhfdGhlX2VmZm9ydDsKKwl9CisKK3RyeWFub3RoZXJpcnE6CisJLyogaWYgd2Ugc2VsZWN0IGFuIElSUSB0byBtb3ZlIHRoYXQgY2FuJ3QgZ28gd2hlcmUgd2Ugd2FudCwgdGhlbgorCSAqIHNlZSBpZiB0aGVyZSBpcyBhbm90aGVyIG9uZSB0byB0cnkuCisJICovCisJbW92ZV90aGlzX2xvYWQgPSAwOworCXNlbGVjdGVkX2lycSA9IC0xOworCWZvciAoaiA9IDA7IGogPCBOUl9JUlFTOyBqKyspIHsKKwkJLyogSXMgdGhpcyBhbiBhY3RpdmUgSVJRPyAqLworCQlpZiAoIWlycV9kZXNjW2pdLmFjdGlvbikKKwkJCWNvbnRpbnVlOworCQlpZiAoaW1iYWxhbmNlIDw9IElSUV9ERUxUQShtYXhfbG9hZGVkLGopKQorCQkJY29udGludWU7CisJCS8qIFRyeSB0byBmaW5kIHRoZSBJUlEgdGhhdCBpcyBjbG9zZXN0IHRvIHRoZSBpbWJhbGFuY2UKKwkJICogd2l0aG91dCBnb2luZyBvdmVyLgorCQkgKi8KKwkJaWYgKG1vdmVfdGhpc19sb2FkIDwgSVJRX0RFTFRBKG1heF9sb2FkZWQsaikpIHsKKwkJCW1vdmVfdGhpc19sb2FkID0gSVJRX0RFTFRBKG1heF9sb2FkZWQsaik7CisJCQlzZWxlY3RlZF9pcnEgPSBqOworCQl9CisJfQorCWlmIChzZWxlY3RlZF9pcnEgPT0gLTEpIHsKKwkJZ290byB0cnlhbm90aGVyY3B1OworCX0KKworCWltYmFsYW5jZSA9IG1vdmVfdGhpc19sb2FkOworCQorCS8qIEZvciBwaHlzaWNhbF9iYWxhbmNlIGNhc2UsIHdlIGFjY3VtbGF0ZWQgYm90aCBsb2FkCisJICogdmFsdWVzIGluIHRoZSBvbmUgb2YgdGhlIHNpYmxpbmdzIGNwdV9pcnFbXSwKKwkgKiB0byB1c2UgdGhlIHNhbWUgY29kZSBmb3IgcGh5c2ljYWwgYW5kIGxvZ2ljYWwgcHJvY2Vzc29ycworCSAqIGFzIG11Y2ggYXMgcG9zc2libGUuIAorCSAqCisJICogTk9URTogdGhlIGNwdV9pcnFbXSBhcnJheSBob2xkcyB0aGUgc3VtIG9mIHRoZSBsb2FkIGZvcgorCSAqIHNpYmxpbmcgQSBhbmQgc2libGluZyBCIGluIHRoZSBzbG90IGZvciB0aGUgbG93ZXN0IG51bWJlcmVkCisJICogc2libGluZyAoQSksIF9BTkRfIHRoZSBsb2FkIGZvciBzaWJsaW5nIEIgaW4gdGhlIHNsb3QgZm9yCisJICogdGhlIGhpZ2hlciBudW1iZXJlZCBzaWJsaW5nLgorCSAqCisJICogV2Ugc2VlayB0aGUgbGVhc3QgbG9hZGVkIHNpYmxpbmcgYnkgbWFraW5nIHRoZSBjb21wYXJpc29uCisJICogKEErQikvMiB2cyBCCisJICovCisJbG9hZCA9IENQVV9JUlEobWluX2xvYWRlZCkgPj4gMTsKKwlmb3JfZWFjaF9jcHVfbWFzayhqLCBjcHVfc2libGluZ19tYXBbbWluX2xvYWRlZF0pIHsKKwkJaWYgKGxvYWQgPiBDUFVfSVJRKGopKSB7CisJCQkvKiBUaGlzIHdvbid0IGNoYW5nZSBjcHVfc2libGluZ19tYXBbbWluX2xvYWRlZF0gKi8KKwkJCWxvYWQgPSBDUFVfSVJRKGopOworCQkJbWluX2xvYWRlZCA9IGo7CisJCX0KKwl9CisKKwljcHVzX2FuZChhbGxvd2VkX21hc2ssIGNwdV9vbmxpbmVfbWFwLCBpcnFfYWZmaW5pdHlbc2VsZWN0ZWRfaXJxXSk7CisJdGFyZ2V0X2NwdV9tYXNrID0gY3B1bWFza19vZl9jcHUobWluX2xvYWRlZCk7CisJY3B1c19hbmQodG1wLCB0YXJnZXRfY3B1X21hc2ssIGFsbG93ZWRfbWFzayk7CisKKwlpZiAoIWNwdXNfZW1wdHkodG1wKSkgeworCQlpcnFfZGVzY190ICpkZXNjID0gaXJxX2Rlc2MgKyBzZWxlY3RlZF9pcnE7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJRHByaW50aygiaXJxID0gJWQgbW92ZWQgdG8gY3B1ID0gJWRcbiIsCisJCQkJc2VsZWN0ZWRfaXJxLCBtaW5fbG9hZGVkKTsKKwkJLyogbWFyayBmb3IgY2hhbmdlIGRlc3RpbmF0aW9uICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXNjLT5sb2NrLCBmbGFncyk7CisJCXBlbmRpbmdfaXJxX2JhbGFuY2VfY3B1bWFza1tzZWxlY3RlZF9pcnFdID0KKwkJCQkJY3B1bWFza19vZl9jcHUobWluX2xvYWRlZCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKKwkJLyogU2luY2Ugd2UgbWFkZSBhIGNoYW5nZSwgY29tZSBiYWNrIHNvb25lciB0byAKKwkJICogY2hlY2sgZm9yIG1vcmUgdmFyaWF0aW9uLgorCQkgKi8KKwkJYmFsYW5jZWRfaXJxX2ludGVydmFsID0gbWF4KChsb25nKU1JTl9CQUxBTkNFRF9JUlFfSU5URVJWQUwsCisJCQliYWxhbmNlZF9pcnFfaW50ZXJ2YWwgLSBCQUxBTkNFRF9JUlFfTEVTU19ERUxUQSk7CQorCQlyZXR1cm47CisJfQorCWdvdG8gdHJ5YW5vdGhlcmlycTsKKworbm90X3dvcnRoX3RoZV9lZmZvcnQ6CisJLyoKKwkgKiBpZiB3ZSBkaWQgbm90IGZpbmQgYW4gSVJRIHRvIG1vdmUsIHRoZW4gYWRqdXN0IHRoZSB0aW1lIGludGVydmFsCisJICogdXB3YXJkCisJICovCisJYmFsYW5jZWRfaXJxX2ludGVydmFsID0gbWluKChsb25nKU1BWF9CQUxBTkNFRF9JUlFfSU5URVJWQUwsCisJCWJhbGFuY2VkX2lycV9pbnRlcnZhbCArIEJBTEFOQ0VEX0lSUV9NT1JFX0RFTFRBKTsJCisJRHByaW50aygiSVJRIHdvcnRoIHJvdGF0aW5nIG5vdCBmb3VuZFxuIik7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IGJhbGFuY2VkX2lycSh2b2lkICp1bnVzZWQpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBwcmV2X2JhbGFuY2VfdGltZSA9IGppZmZpZXM7CisJbG9uZyB0aW1lX3JlbWFpbmluZyA9IGJhbGFuY2VkX2lycV9pbnRlcnZhbDsKKworCWRhZW1vbml6ZSgia2lycWQiKTsKKwkKKwkvKiBwdXNoIGV2ZXJ5dGhpbmcgdG8gQ1BVIDAgdG8gZ2l2ZSB1cyBhIHN0YXJ0aW5nIHBvaW50LiAgKi8KKwlmb3IgKGkgPSAwIDsgaSA8IE5SX0lSUVMgOyBpKyspIHsKKwkJcGVuZGluZ19pcnFfYmFsYW5jZV9jcHVtYXNrW2ldID0gY3B1bWFza19vZl9jcHUoMCk7CisJfQorCisJZm9yICggOyA7ICkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQl0aW1lX3JlbWFpbmluZyA9IHNjaGVkdWxlX3RpbWVvdXQodGltZV9yZW1haW5pbmcpOworCQl0cnlfdG9fZnJlZXplKFBGX0ZSRUVaRSk7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsCisJCQkJcHJldl9iYWxhbmNlX3RpbWUrYmFsYW5jZWRfaXJxX2ludGVydmFsKSkgeworCQkJZG9faXJxX2JhbGFuY2UoKTsKKwkJCXByZXZfYmFsYW5jZV90aW1lID0gamlmZmllczsKKwkJCXRpbWVfcmVtYWluaW5nID0gYmFsYW5jZWRfaXJxX2ludGVydmFsOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBiYWxhbmNlZF9pcnFfaW5pdCh2b2lkKQoreworCWludCBpOworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYzsKKwljcHVtYXNrX3QgdG1wOworCisJY3B1c19zaGlmdF9yaWdodCh0bXAsIGNwdV9vbmxpbmVfbWFwLCAyKTsKKyAgICAgICAgYyA9ICZib290X2NwdV9kYXRhOworCS8qIFdoZW4gbm90IG92ZXJ3cml0dGVuIGJ5IHRoZSBjb21tYW5kIGxpbmUgYXNrIHN1YmFyY2hpdGVjdHVyZS4gKi8KKwlpZiAoaXJxYmFsYW5jZV9kaXNhYmxlZCA9PSBJUlFCQUxBTkNFX0NIRUNLX0FSQ0gpCisJCWlycWJhbGFuY2VfZGlzYWJsZWQgPSBOT19CQUxBTkNFX0lSUTsKKwlpZiAoaXJxYmFsYW5jZV9kaXNhYmxlZCkKKwkJcmV0dXJuIDA7CisJCisJIC8qIGRpc2FibGUgaXJxYmFsYW5jZSBjb21wbGV0ZWx5IGlmIHRoZXJlIGlzIG9ubHkgb25lIHByb2Nlc3NvciBvbmxpbmUgKi8KKwlpZiAobnVtX29ubGluZV9jcHVzKCkgPCAyKSB7CisJCWlycWJhbGFuY2VfZGlzYWJsZWQgPSAxOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBFbmFibGUgcGh5c2ljYWwgYmFsYW5jZSBvbmx5IGlmIG1vcmUgdGhhbiAxIHBoeXNpY2FsIHByb2Nlc3NvcgorCSAqIGlzIHByZXNlbnQKKwkgKi8KKwlpZiAoc21wX251bV9zaWJsaW5ncyA+IDEgJiYgIWNwdXNfZW1wdHkodG1wKSkKKwkJcGh5c2ljYWxfYmFsYW5jZSA9IDE7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKSB7CisJCWlmICghY3B1X29ubGluZShpKSkKKwkJCWNvbnRpbnVlOworCQlpcnFfY3B1X2RhdGFbaV0uaXJxX2RlbHRhID0ga21hbGxvYyhzaXplb2YodW5zaWduZWQgbG9uZykgKiBOUl9JUlFTLCBHRlBfS0VSTkVMKTsKKwkJaXJxX2NwdV9kYXRhW2ldLmxhc3RfaXJxID0ga21hbGxvYyhzaXplb2YodW5zaWduZWQgbG9uZykgKiBOUl9JUlFTLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGlycV9jcHVfZGF0YVtpXS5pcnFfZGVsdGEgPT0gTlVMTCB8fCBpcnFfY3B1X2RhdGFbaV0ubGFzdF9pcnEgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJiYWxhbmNlZF9pcnFfaW5pdDogb3V0IG9mIG1lbW9yeSIpOworCQkJZ290byBmYWlsZWQ7CisJCX0KKwkJbWVtc2V0KGlycV9jcHVfZGF0YVtpXS5pcnFfZGVsdGEsMCxzaXplb2YodW5zaWduZWQgbG9uZykgKiBOUl9JUlFTKTsKKwkJbWVtc2V0KGlycV9jcHVfZGF0YVtpXS5sYXN0X2lycSwwLHNpemVvZih1bnNpZ25lZCBsb25nKSAqIE5SX0lSUVMpOworCX0KKwkKKwlwcmludGsoS0VSTl9JTkZPICJTdGFydGluZyBiYWxhbmNlZF9pcnFcbiIpOworCWlmIChrZXJuZWxfdGhyZWFkKGJhbGFuY2VkX2lycSwgTlVMTCwgQ0xPTkVfS0VSTkVMKSA+PSAwKSAKKwkJcmV0dXJuIDA7CisJZWxzZSAKKwkJcHJpbnRrKEtFUk5fRVJSICJiYWxhbmNlZF9pcnFfaW5pdDogZmFpbGVkIHRvIHNwYXduIGJhbGFuY2VkX2lycSIpOworZmFpbGVkOgorCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspIHsKKwkJaWYoaXJxX2NwdV9kYXRhW2ldLmlycV9kZWx0YSkKKwkJCWtmcmVlKGlycV9jcHVfZGF0YVtpXS5pcnFfZGVsdGEpOworCQlpZihpcnFfY3B1X2RhdGFbaV0ubGFzdF9pcnEpCisJCQlrZnJlZShpcnFfY3B1X2RhdGFbaV0ubGFzdF9pcnEpOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IF9faW5pdCBpcnFiYWxhbmNlX2Rpc2FibGUoY2hhciAqc3RyKQoreworCWlycWJhbGFuY2VfZGlzYWJsZWQgPSAxOworCXJldHVybiAwOworfQorCitfX3NldHVwKCJub2lycWJhbGFuY2UiLCBpcnFiYWxhbmNlX2Rpc2FibGUpOworCitzdGF0aWMgaW5saW5lIHZvaWQgbW92ZV9pcnEoaW50IGlycSkKK3sKKwkvKiBub3RlIC0gd2UgaG9sZCB0aGUgZGVzYy0+bG9jayAqLworCWlmICh1bmxpa2VseSghY3B1c19lbXB0eShwZW5kaW5nX2lycV9iYWxhbmNlX2NwdW1hc2tbaXJxXSkpKSB7CisJCXNldF9pb2FwaWNfYWZmaW5pdHlfaXJxKGlycSwgcGVuZGluZ19pcnFfYmFsYW5jZV9jcHVtYXNrW2lycV0pOworCQljcHVzX2NsZWFyKHBlbmRpbmdfaXJxX2JhbGFuY2VfY3B1bWFza1tpcnFdKTsKKwl9Cit9CisKK2xhdGVfaW5pdGNhbGwoYmFsYW5jZWRfaXJxX2luaXQpOworCisjZWxzZSAvKiAhQ09ORklHX0lSUUJBTEFOQ0UgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBtb3ZlX2lycShpbnQgaXJxKSB7IH0KKyNlbmRpZiAvKiBDT05GSUdfSVJRQkFMQU5DRSAqLworCisjaWZuZGVmIENPTkZJR19TTVAKK3ZvaWQgZmFzdGNhbGwgc2VuZF9JUElfc2VsZihpbnQgdmVjdG9yKQoreworCXVuc2lnbmVkIGludCBjZmc7CisKKwkvKgorCSAqIFdhaXQgZm9yIGlkbGUuCisJICovCisJYXBpY193YWl0X2ljcl9pZGxlKCk7CisJY2ZnID0gQVBJQ19ETV9GSVhFRCB8IEFQSUNfREVTVF9TRUxGIHwgdmVjdG9yIHwgQVBJQ19ERVNUX0xPR0lDQUw7CisJLyoKKwkgKiBTZW5kIHRoZSBJUEkuIFRoZSB3cml0ZSB0byBBUElDX0lDUiBmaXJlcyB0aGlzIG9mZi4KKwkgKi8KKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0lDUiwgY2ZnKTsKK30KKyNlbmRpZiAvKiAhQ09ORklHX1NNUCAqLworCisKKy8qCisgKiBzdXBwb3J0IGZvciBicm9rZW4gTVAgQklPU3MsIGVuYWJsZXMgaGFuZC1yZWRpcmVjdGlvbiBvZiBQSVJRMC03IHRvCisgKiBzcGVjaWZpYyBDUFUtc2lkZSBJUlFzLgorICovCisKKyNkZWZpbmUgTUFYX1BJUlFTIDgKK3N0YXRpYyBpbnQgcGlycV9lbnRyaWVzIFtNQVhfUElSUVNdOworc3RhdGljIGludCBwaXJxc19lbmFibGVkOworaW50IHNraXBfaW9hcGljX3NldHVwOworCitzdGF0aWMgaW50IF9faW5pdCBpb2FwaWNfc2V0dXAoY2hhciAqc3RyKQoreworCXNraXBfaW9hcGljX3NldHVwID0gMTsKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgibm9hcGljIiwgaW9hcGljX3NldHVwKTsKKworc3RhdGljIGludCBfX2luaXQgaW9hcGljX3BpcnFfc2V0dXAoY2hhciAqc3RyKQoreworCWludCBpLCBtYXg7CisJaW50IGludHNbTUFYX1BJUlFTKzFdOworCisJZ2V0X29wdGlvbnMoc3RyLCBBUlJBWV9TSVpFKGludHMpLCBpbnRzKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfUElSUVM7IGkrKykKKwkJcGlycV9lbnRyaWVzW2ldID0gLTE7CisKKwlwaXJxc19lbmFibGVkID0gMTsKKwlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsIEtFUk5fSU5GTworCQkJIlBJUlEgcmVkaXJlY3Rpb24sIHdvcmtpbmcgYXJvdW5kIGJyb2tlbiBNUC1CSU9TLlxuIik7CisJbWF4ID0gTUFYX1BJUlFTOworCWlmIChpbnRzWzBdIDwgTUFYX1BJUlFTKQorCQltYXggPSBpbnRzWzBdOworCisJZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKSB7CisJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgS0VSTl9ERUJVRworCQkJCSIuLi4gUElSUSVkIC0+IElSUSAlZFxuIiwgaSwgaW50c1tpKzFdKTsKKwkJLyoKKwkJICogUElSUXMgYXJlIG1hcHBlZCB1cHNpZGUgZG93biwgdXN1YWxseS4KKwkJICovCisJCXBpcnFfZW50cmllc1tNQVhfUElSUVMtaS0xXSA9IGludHNbaSsxXTsKKwl9CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoInBpcnE9IiwgaW9hcGljX3BpcnFfc2V0dXApOworCisvKgorICogRmluZCB0aGUgSVJRIGVudHJ5IG51bWJlciBvZiBhIGNlcnRhaW4gcGluLgorICovCitzdGF0aWMgaW50IGZpbmRfaXJxX2VudHJ5KGludCBhcGljLCBpbnQgcGluLCBpbnQgdHlwZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBtcF9pcnFfZW50cmllczsgaSsrKQorCQlpZiAobXBfaXJxc1tpXS5tcGNfaXJxdHlwZSA9PSB0eXBlICYmCisJCSAgICAobXBfaXJxc1tpXS5tcGNfZHN0YXBpYyA9PSBtcF9pb2FwaWNzW2FwaWNdLm1wY19hcGljaWQgfHwKKwkJICAgICBtcF9pcnFzW2ldLm1wY19kc3RhcGljID09IE1QX0FQSUNfQUxMKSAmJgorCQkgICAgbXBfaXJxc1tpXS5tcGNfZHN0aXJxID09IHBpbikKKwkJCXJldHVybiBpOworCisJcmV0dXJuIC0xOworfQorCisvKgorICogRmluZCB0aGUgcGluIHRvIHdoaWNoIElSUVtpcnFdIChJU0EpIGlzIGNvbm5lY3RlZAorICovCitzdGF0aWMgaW50IGZpbmRfaXNhX2lycV9waW4oaW50IGlycSwgaW50IHR5cGUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbXBfaXJxX2VudHJpZXM7IGkrKykgeworCQlpbnQgbGJ1cyA9IG1wX2lycXNbaV0ubXBjX3NyY2J1czsKKworCQlpZiAoKG1wX2J1c19pZF90b190eXBlW2xidXNdID09IE1QX0JVU19JU0EgfHwKKwkJICAgICBtcF9idXNfaWRfdG9fdHlwZVtsYnVzXSA9PSBNUF9CVVNfRUlTQSB8fAorCQkgICAgIG1wX2J1c19pZF90b190eXBlW2xidXNdID09IE1QX0JVU19NQ0EgfHwKKwkJICAgICBtcF9idXNfaWRfdG9fdHlwZVtsYnVzXSA9PSBNUF9CVVNfTkVDOTgKKwkJICAgICkgJiYKKwkJICAgIChtcF9pcnFzW2ldLm1wY19pcnF0eXBlID09IHR5cGUpICYmCisJCSAgICAobXBfaXJxc1tpXS5tcGNfc3JjYnVzaXJxID09IGlycSkpCisKKwkJCXJldHVybiBtcF9pcnFzW2ldLm1wY19kc3RpcnE7CisJfQorCXJldHVybiAtMTsKK30KKworLyoKKyAqIEZpbmQgYSBzcGVjaWZpYyBQQ0kgSVJRIGVudHJ5LgorICogTm90IGFuIF9faW5pdCwgcG9zc2libHkgbmVlZGVkIGJ5IG1vZHVsZXMKKyAqLworc3RhdGljIGludCBwaW5fMl9pcnEoaW50IGlkeCwgaW50IGFwaWMsIGludCBwaW4pOworCitpbnQgSU9fQVBJQ19nZXRfUENJX2lycV92ZWN0b3IoaW50IGJ1cywgaW50IHNsb3QsIGludCBwaW4pCit7CisJaW50IGFwaWMsIGksIGJlc3RfZ3Vlc3MgPSAtMTsKKworCWFwaWNfcHJpbnRrKEFQSUNfREVCVUcsICJxdWVyeWluZyBQQ0kgLT4gSVJRIG1hcHBpbmcgYnVzOiVkLCAiCisJCSJzbG90OiVkLCBwaW46JWQuXG4iLCBidXMsIHNsb3QsIHBpbik7CisJaWYgKG1wX2J1c19pZF90b19wY2lfYnVzW2J1c10gPT0gLTEpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiUENJIEJJT1MgcGFzc2VkIG5vbmV4aXN0ZW50IFBDSSBidXMgJWQhXG4iLCBidXMpOworCQlyZXR1cm4gLTE7CisJfQorCWZvciAoaSA9IDA7IGkgPCBtcF9pcnFfZW50cmllczsgaSsrKSB7CisJCWludCBsYnVzID0gbXBfaXJxc1tpXS5tcGNfc3JjYnVzOworCisJCWZvciAoYXBpYyA9IDA7IGFwaWMgPCBucl9pb2FwaWNzOyBhcGljKyspCisJCQlpZiAobXBfaW9hcGljc1thcGljXS5tcGNfYXBpY2lkID09IG1wX2lycXNbaV0ubXBjX2RzdGFwaWMgfHwKKwkJCSAgICBtcF9pcnFzW2ldLm1wY19kc3RhcGljID09IE1QX0FQSUNfQUxMKQorCQkJCWJyZWFrOworCisJCWlmICgobXBfYnVzX2lkX3RvX3R5cGVbbGJ1c10gPT0gTVBfQlVTX1BDSSkgJiYKKwkJICAgICFtcF9pcnFzW2ldLm1wY19pcnF0eXBlICYmCisJCSAgICAoYnVzID09IGxidXMpICYmCisJCSAgICAoc2xvdCA9PSAoKG1wX2lycXNbaV0ubXBjX3NyY2J1c2lycSA+PiAyKSAmIDB4MWYpKSkgeworCQkJaW50IGlycSA9IHBpbl8yX2lycShpLGFwaWMsbXBfaXJxc1tpXS5tcGNfZHN0aXJxKTsKKworCQkJaWYgKCEoYXBpYyB8fCBJT19BUElDX0lSUShpcnEpKSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKHBpbiA9PSAobXBfaXJxc1tpXS5tcGNfc3JjYnVzaXJxICYgMykpCisJCQkJcmV0dXJuIGlycTsKKwkJCS8qCisJCQkgKiBVc2UgdGhlIGZpcnN0IGFsbC1idXQtcGluIG1hdGNoaW5nIGVudHJ5IGFzIGEKKwkJCSAqIGJlc3QtZ3Vlc3MgZnV6enkgcmVzdWx0IGZvciBicm9rZW4gbXB0YWJsZXMuCisJCQkgKi8KKwkJCWlmIChiZXN0X2d1ZXNzIDwgMCkKKwkJCQliZXN0X2d1ZXNzID0gaXJxOworCQl9CisJfQorCXJldHVybiBiZXN0X2d1ZXNzOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBjdXJyZW50bHkgaXMgb25seSBhIGhlbHBlciBmb3IgdGhlIGkzODYgc21wIGJvb3QgcHJvY2VzcyB3aGVyZSAKKyAqIHdlIG5lZWQgdG8gcmVwcm9ncmFtIHRoZSBpb3JlZHRibHMgdG8gY2F0ZXIgZm9yIHRoZSBjcHVzIHdoaWNoIGhhdmUgY29tZSBvbmxpbmUKKyAqIHNvIG1hc2sgaW4gYWxsIGNhc2VzIHNob3VsZCBzaW1wbHkgYmUgVEFSR0VUX0NQVVMKKyAqLwordm9pZCBfX2luaXQgc2V0dXBfaW9hcGljX2Rlc3Qodm9pZCkKK3sKKwlpbnQgcGluLCBpb2FwaWMsIGlycSwgaXJxX2VudHJ5OworCisJaWYgKHNraXBfaW9hcGljX3NldHVwID09IDEpCisJCXJldHVybjsKKworCWZvciAoaW9hcGljID0gMDsgaW9hcGljIDwgbnJfaW9hcGljczsgaW9hcGljKyspIHsKKwkJZm9yIChwaW4gPSAwOyBwaW4gPCBucl9pb2FwaWNfcmVnaXN0ZXJzW2lvYXBpY107IHBpbisrKSB7CisJCQlpcnFfZW50cnkgPSBmaW5kX2lycV9lbnRyeShpb2FwaWMsIHBpbiwgbXBfSU5UKTsKKwkJCWlmIChpcnFfZW50cnkgPT0gLTEpCisJCQkJY29udGludWU7CisJCQlpcnEgPSBwaW5fMl9pcnEoaXJxX2VudHJ5LCBpb2FwaWMsIHBpbik7CisJCQlzZXRfaW9hcGljX2FmZmluaXR5X2lycShpcnEsIFRBUkdFVF9DUFVTKTsKKwkJfQorCisJfQorfQorCisvKgorICogRUlTQSBFZGdlL0xldmVsIGNvbnRyb2wgcmVnaXN0ZXIsIEVMQ1IKKyAqLworc3RhdGljIGludCBFSVNBX0VMQ1IodW5zaWduZWQgaW50IGlycSkKK3sKKwlpZiAoaXJxIDwgMTYpIHsKKwkJdW5zaWduZWQgaW50IHBvcnQgPSAweDRkMCArIChpcnEgPj4gMyk7CisJCXJldHVybiAoaW5iKHBvcnQpID4+IChpcnEgJiA3KSkgJiAxOworCX0KKwlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsIEtFUk5fSU5GTworCQkJIkJyb2tlbiBNUHRhYmxlIHJlcG9ydHMgSVNBIGlycSAlZFxuIiwgaXJxKTsKKwlyZXR1cm4gMDsKK30KKworLyogRUlTQSBpbnRlcnJ1cHRzIGFyZSBhbHdheXMgcG9sYXJpdHkgemVybyBhbmQgY2FuIGJlIGVkZ2Ugb3IgbGV2ZWwKKyAqIHRyaWdnZXIgZGVwZW5kaW5nIG9uIHRoZSBFTENSIHZhbHVlLiAgSWYgYW4gaW50ZXJydXB0IGlzIGxpc3RlZCBhcworICogRUlTQSBjb25mb3JtaW5nIGluIHRoZSBNUCB0YWJsZSwgdGhhdCBtZWFucyBpdHMgdHJpZ2dlciB0eXBlIG11c3QKKyAqIGJlIHJlYWQgaW4gZnJvbSB0aGUgRUxDUiAqLworCisjZGVmaW5lIGRlZmF1bHRfRUlTQV90cmlnZ2VyKGlkeCkJKEVJU0FfRUxDUihtcF9pcnFzW2lkeF0ubXBjX3NyY2J1c2lycSkpCisjZGVmaW5lIGRlZmF1bHRfRUlTQV9wb2xhcml0eShpZHgpCSgwKQorCisvKiBJU0EgaW50ZXJydXB0cyBhcmUgYWx3YXlzIHBvbGFyaXR5IHplcm8gZWRnZSB0cmlnZ2VyZWQsCisgKiB3aGVuIGxpc3RlZCBhcyBjb25mb3JtaW5nIGluIHRoZSBNUCB0YWJsZS4gKi8KKworI2RlZmluZSBkZWZhdWx0X0lTQV90cmlnZ2VyKGlkeCkJKDApCisjZGVmaW5lIGRlZmF1bHRfSVNBX3BvbGFyaXR5KGlkeCkJKDApCisKKy8qIFBDSSBpbnRlcnJ1cHRzIGFyZSBhbHdheXMgcG9sYXJpdHkgb25lIGxldmVsIHRyaWdnZXJlZCwKKyAqIHdoZW4gbGlzdGVkIGFzIGNvbmZvcm1pbmcgaW4gdGhlIE1QIHRhYmxlLiAqLworCisjZGVmaW5lIGRlZmF1bHRfUENJX3RyaWdnZXIoaWR4KQkoMSkKKyNkZWZpbmUgZGVmYXVsdF9QQ0lfcG9sYXJpdHkoaWR4KQkoMSkKKworLyogTUNBIGludGVycnVwdHMgYXJlIGFsd2F5cyBwb2xhcml0eSB6ZXJvIGxldmVsIHRyaWdnZXJlZCwKKyAqIHdoZW4gbGlzdGVkIGFzIGNvbmZvcm1pbmcgaW4gdGhlIE1QIHRhYmxlLiAqLworCisjZGVmaW5lIGRlZmF1bHRfTUNBX3RyaWdnZXIoaWR4KQkoMSkKKyNkZWZpbmUgZGVmYXVsdF9NQ0FfcG9sYXJpdHkoaWR4KQkoMCkKKworLyogTkVDOTggaW50ZXJydXB0cyBhcmUgYWx3YXlzIHBvbGFyaXR5IHplcm8gZWRnZSB0cmlnZ2VyZWQsCisgKiB3aGVuIGxpc3RlZCBhcyBjb25mb3JtaW5nIGluIHRoZSBNUCB0YWJsZS4gKi8KKworI2RlZmluZSBkZWZhdWx0X05FQzk4X3RyaWdnZXIoaWR4KSAgICAgKDApCisjZGVmaW5lIGRlZmF1bHRfTkVDOThfcG9sYXJpdHkoaWR4KSAgICAoMCkKKworc3RhdGljIGludCBfX2luaXQgTVBCSU9TX3BvbGFyaXR5KGludCBpZHgpCit7CisJaW50IGJ1cyA9IG1wX2lycXNbaWR4XS5tcGNfc3JjYnVzOworCWludCBwb2xhcml0eTsKKworCS8qCisJICogRGV0ZXJtaW5lIElSUSBsaW5lIHBvbGFyaXR5IChoaWdoIGFjdGl2ZSBvciBsb3cgYWN0aXZlKToKKwkgKi8KKwlzd2l0Y2ggKG1wX2lycXNbaWR4XS5tcGNfaXJxZmxhZyAmIDMpCisJeworCQljYXNlIDA6IC8qIGNvbmZvcm1zLCBpZS4gYnVzLXR5cGUgZGVwZW5kZW50IHBvbGFyaXR5ICovCisJCXsKKwkJCXN3aXRjaCAobXBfYnVzX2lkX3RvX3R5cGVbYnVzXSkKKwkJCXsKKwkJCQljYXNlIE1QX0JVU19JU0E6IC8qIElTQSBwaW4gKi8KKwkJCQl7CisJCQkJCXBvbGFyaXR5ID0gZGVmYXVsdF9JU0FfcG9sYXJpdHkoaWR4KTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNhc2UgTVBfQlVTX0VJU0E6IC8qIEVJU0EgcGluICovCisJCQkJeworCQkJCQlwb2xhcml0eSA9IGRlZmF1bHRfRUlTQV9wb2xhcml0eShpZHgpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSBNUF9CVVNfUENJOiAvKiBQQ0kgcGluICovCisJCQkJeworCQkJCQlwb2xhcml0eSA9IGRlZmF1bHRfUENJX3BvbGFyaXR5KGlkeCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljYXNlIE1QX0JVU19NQ0E6IC8qIE1DQSBwaW4gKi8KKwkJCQl7CisJCQkJCXBvbGFyaXR5ID0gZGVmYXVsdF9NQ0FfcG9sYXJpdHkoaWR4KTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNhc2UgTVBfQlVTX05FQzk4OiAvKiBORUMgOTggcGluICovCisJCQkJeworCQkJCQlwb2xhcml0eSA9IGRlZmF1bHRfTkVDOThfcG9sYXJpdHkoaWR4KTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJicm9rZW4gQklPUyEhXG4iKTsKKwkJCQkJcG9sYXJpdHkgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJfQorCQljYXNlIDE6IC8qIGhpZ2ggYWN0aXZlICovCisJCXsKKwkJCXBvbGFyaXR5ID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgMjogLyogcmVzZXJ2ZWQgKi8KKwkJeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnJva2VuIEJJT1MhIVxuIik7CisJCQlwb2xhcml0eSA9IDE7CisJCQlicmVhazsKKwkJfQorCQljYXNlIDM6IC8qIGxvdyBhY3RpdmUgKi8KKwkJeworCQkJcG9sYXJpdHkgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDogLyogaW52YWxpZCAqLworCQl7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJicm9rZW4gQklPUyEhXG4iKTsKKwkJCXBvbGFyaXR5ID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBwb2xhcml0eTsKK30KKworc3RhdGljIGludCBNUEJJT1NfdHJpZ2dlcihpbnQgaWR4KQoreworCWludCBidXMgPSBtcF9pcnFzW2lkeF0ubXBjX3NyY2J1czsKKwlpbnQgdHJpZ2dlcjsKKworCS8qCisJICogRGV0ZXJtaW5lIElSUSB0cmlnZ2VyIG1vZGUgKGVkZ2Ugb3IgbGV2ZWwgc2Vuc2l0aXZlKToKKwkgKi8KKwlzd2l0Y2ggKChtcF9pcnFzW2lkeF0ubXBjX2lycWZsYWc+PjIpICYgMykKKwl7CisJCWNhc2UgMDogLyogY29uZm9ybXMsIGllLiBidXMtdHlwZSBkZXBlbmRlbnQgKi8KKwkJeworCQkJc3dpdGNoIChtcF9idXNfaWRfdG9fdHlwZVtidXNdKQorCQkJeworCQkJCWNhc2UgTVBfQlVTX0lTQTogLyogSVNBIHBpbiAqLworCQkJCXsKKwkJCQkJdHJpZ2dlciA9IGRlZmF1bHRfSVNBX3RyaWdnZXIoaWR4KTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNhc2UgTVBfQlVTX0VJU0E6IC8qIEVJU0EgcGluICovCisJCQkJeworCQkJCQl0cmlnZ2VyID0gZGVmYXVsdF9FSVNBX3RyaWdnZXIoaWR4KTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNhc2UgTVBfQlVTX1BDSTogLyogUENJIHBpbiAqLworCQkJCXsKKwkJCQkJdHJpZ2dlciA9IGRlZmF1bHRfUENJX3RyaWdnZXIoaWR4KTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNhc2UgTVBfQlVTX01DQTogLyogTUNBIHBpbiAqLworCQkJCXsKKwkJCQkJdHJpZ2dlciA9IGRlZmF1bHRfTUNBX3RyaWdnZXIoaWR4KTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNhc2UgTVBfQlVTX05FQzk4OiAvKiBORUMgOTggcGluICovCisJCQkJeworCQkJCQl0cmlnZ2VyID0gZGVmYXVsdF9ORUM5OF90cmlnZ2VyKGlkeCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnJva2VuIEJJT1MhIVxuIik7CisJCQkJCXRyaWdnZXIgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJfQorCQljYXNlIDE6IC8qIGVkZ2UgKi8KKwkJeworCQkJdHJpZ2dlciA9IDA7CisJCQlicmVhazsKKwkJfQorCQljYXNlIDI6IC8qIHJlc2VydmVkICovCisJCXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImJyb2tlbiBCSU9TISFcbiIpOworCQkJdHJpZ2dlciA9IDE7CisJCQlicmVhazsKKwkJfQorCQljYXNlIDM6IC8qIGxldmVsICovCisJCXsKKwkJCXRyaWdnZXIgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDogLyogaW52YWxpZCAqLworCQl7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJicm9rZW4gQklPUyEhXG4iKTsKKwkJCXRyaWdnZXIgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHRyaWdnZXI7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlycV9wb2xhcml0eShpbnQgaWR4KQoreworCXJldHVybiBNUEJJT1NfcG9sYXJpdHkoaWR4KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXJxX3RyaWdnZXIoaW50IGlkeCkKK3sKKwlyZXR1cm4gTVBCSU9TX3RyaWdnZXIoaWR4KTsKK30KKworc3RhdGljIGludCBwaW5fMl9pcnEoaW50IGlkeCwgaW50IGFwaWMsIGludCBwaW4pCit7CisJaW50IGlycSwgaTsKKwlpbnQgYnVzID0gbXBfaXJxc1tpZHhdLm1wY19zcmNidXM7CisKKwkvKgorCSAqIERlYnVnZ2luZyBjaGVjaywgd2UgYXJlIGluIGJpZyB0cm91YmxlIGlmIHRoaXMgbWVzc2FnZSBwb3BzIHVwIQorCSAqLworCWlmIChtcF9pcnFzW2lkeF0ubXBjX2RzdGlycSAhPSBwaW4pCisJCXByaW50ayhLRVJOX0VSUiAiYnJva2VuIEJJT1Mgb3IgTVBUQUJMRSBwYXJzZXIsIGF5aWVlISFcbiIpOworCisJc3dpdGNoIChtcF9idXNfaWRfdG9fdHlwZVtidXNdKQorCXsKKwkJY2FzZSBNUF9CVVNfSVNBOiAvKiBJU0EgcGluICovCisJCWNhc2UgTVBfQlVTX0VJU0E6CisJCWNhc2UgTVBfQlVTX01DQToKKwkJY2FzZSBNUF9CVVNfTkVDOTg6CisJCXsKKwkJCWlycSA9IG1wX2lycXNbaWR4XS5tcGNfc3JjYnVzaXJxOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBNUF9CVVNfUENJOiAvKiBQQ0kgcGluICovCisJCXsKKwkJCS8qCisJCQkgKiBQQ0kgSVJRcyBhcmUgbWFwcGVkIGluIG9yZGVyCisJCQkgKi8KKwkJCWkgPSBpcnEgPSAwOworCQkJd2hpbGUgKGkgPCBhcGljKQorCQkJCWlycSArPSBucl9pb2FwaWNfcmVnaXN0ZXJzW2krK107CisJCQlpcnEgKz0gcGluOworCisJCQkvKgorCQkJICogRm9yIE1QUyBtb2RlLCBzbyBmYXIgb25seSBuZWVkZWQgYnkgRVM3MDAwIHBsYXRmb3JtCisJCQkgKi8KKwkJCWlmIChpb2FwaWNfcmVudW1iZXJfaXJxKQorCQkJCWlycSA9IGlvYXBpY19yZW51bWJlcl9pcnEoYXBpYywgaXJxKTsKKworCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDoKKwkJeworCQkJcHJpbnRrKEtFUk5fRVJSICJ1bmtub3duIGJ1cyB0eXBlICVkLlxuIixidXMpOyAKKwkJCWlycSA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qCisJICogUENJIElSUSBjb21tYW5kIGxpbmUgcmVkaXJlY3Rpb24uIFllcywgbGltaXRzIGFyZSBoYXJkY29kZWQuCisJICovCisJaWYgKChwaW4gPj0gMTYpICYmIChwaW4gPD0gMjMpKSB7CisJCWlmIChwaXJxX2VudHJpZXNbcGluLTE2XSAhPSAtMSkgeworCQkJaWYgKCFwaXJxX2VudHJpZXNbcGluLTE2XSkgeworCQkJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgS0VSTl9ERUJVRworCQkJCQkJImRpc2FibGluZyBQSVJRJWRcbiIsIHBpbi0xNik7CisJCQl9IGVsc2UgeworCQkJCWlycSA9IHBpcnFfZW50cmllc1twaW4tMTZdOworCQkJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgS0VSTl9ERUJVRworCQkJCQkJInVzaW5nIFBJUlElZCAtPiBJUlEgJWRcbiIsCisJCQkJCQlwaW4tMTYsIGlycSk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGlycTsKK30KKworc3RhdGljIGlubGluZSBpbnQgSU9fQVBJQ19pcnFfdHJpZ2dlcihpbnQgaXJxKQoreworCWludCBhcGljLCBpZHgsIHBpbjsKKworCWZvciAoYXBpYyA9IDA7IGFwaWMgPCBucl9pb2FwaWNzOyBhcGljKyspIHsKKwkJZm9yIChwaW4gPSAwOyBwaW4gPCBucl9pb2FwaWNfcmVnaXN0ZXJzW2FwaWNdOyBwaW4rKykgeworCQkJaWR4ID0gZmluZF9pcnFfZW50cnkoYXBpYyxwaW4sbXBfSU5UKTsKKwkJCWlmICgoaWR4ICE9IC0xKSAmJiAoaXJxID09IHBpbl8yX2lycShpZHgsYXBpYyxwaW4pKSkKKwkJCQlyZXR1cm4gaXJxX3RyaWdnZXIoaWR4KTsKKwkJfQorCX0KKwkvKgorCSAqIG5vbmV4aXN0ZW50IElSUXMgYXJlIGVkZ2UgZGVmYXVsdAorCSAqLworCXJldHVybiAwOworfQorCisvKiBpcnFfdmVjdG9ycyBpcyBpbmRleGVkIGJ5IHRoZSBzdW0gb2YgYWxsIFJURXMgaW4gYWxsIEkvTyBBUElDcy4gKi8KK3U4IGlycV92ZWN0b3JbTlJfSVJRX1ZFQ1RPUlNdID0geyBGSVJTVF9ERVZJQ0VfVkVDVE9SICwgMCB9OworCitpbnQgYXNzaWduX2lycV92ZWN0b3IoaW50IGlycSkKK3sKKwlzdGF0aWMgaW50IGN1cnJlbnRfdmVjdG9yID0gRklSU1RfREVWSUNFX1ZFQ1RPUiwgb2Zmc2V0ID0gMDsKKworCUJVR19PTihpcnEgPj0gTlJfSVJRX1ZFQ1RPUlMpOworCWlmIChpcnEgIT0gQVVUT19BU1NJR04gJiYgSU9fQVBJQ19WRUNUT1IoaXJxKSA+IDApCisJCXJldHVybiBJT19BUElDX1ZFQ1RPUihpcnEpOworbmV4dDoKKwljdXJyZW50X3ZlY3RvciArPSA4OworCWlmIChjdXJyZW50X3ZlY3RvciA9PSBTWVNDQUxMX1ZFQ1RPUikKKwkJZ290byBuZXh0OworCisJaWYgKGN1cnJlbnRfdmVjdG9yID49IEZJUlNUX1NZU1RFTV9WRUNUT1IpIHsKKwkJb2Zmc2V0Kys7CisJCWlmICghKG9mZnNldCU4KSkKKwkJCXJldHVybiAtRU5PU1BDOworCQljdXJyZW50X3ZlY3RvciA9IEZJUlNUX0RFVklDRV9WRUNUT1IgKyBvZmZzZXQ7CisJfQorCisJdmVjdG9yX2lycVtjdXJyZW50X3ZlY3Rvcl0gPSBpcnE7CisJaWYgKGlycSAhPSBBVVRPX0FTU0lHTikKKwkJSU9fQVBJQ19WRUNUT1IoaXJxKSA9IGN1cnJlbnRfdmVjdG9yOworCisJcmV0dXJuIGN1cnJlbnRfdmVjdG9yOworfQorCitzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGlvYXBpY19sZXZlbF90eXBlOworc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBpb2FwaWNfZWRnZV90eXBlOworCisjZGVmaW5lIElPQVBJQ19BVVRPCS0xCisjZGVmaW5lIElPQVBJQ19FREdFCTAKKyNkZWZpbmUgSU9BUElDX0xFVkVMCTEKKworc3RhdGljIGlubGluZSB2b2lkIGlvYXBpY19yZWdpc3Rlcl9pbnRyKGludCBpcnEsIGludCB2ZWN0b3IsIHVuc2lnbmVkIGxvbmcgdHJpZ2dlcikKK3sKKwlpZiAodXNlX3BjaV92ZWN0b3IoKSAmJiAhcGxhdGZvcm1fbGVnYWN5X2lycShpcnEpKSB7CisJCWlmICgodHJpZ2dlciA9PSBJT0FQSUNfQVVUTyAmJiBJT19BUElDX2lycV90cmlnZ2VyKGlycSkpIHx8CisJCQkJdHJpZ2dlciA9PSBJT0FQSUNfTEVWRUwpCisJCQlpcnFfZGVzY1t2ZWN0b3JdLmhhbmRsZXIgPSAmaW9hcGljX2xldmVsX3R5cGU7CisJCWVsc2UKKwkJCWlycV9kZXNjW3ZlY3Rvcl0uaGFuZGxlciA9ICZpb2FwaWNfZWRnZV90eXBlOworCQlzZXRfaW50cl9nYXRlKHZlY3RvciwgaW50ZXJydXB0W3ZlY3Rvcl0pOworCX0gZWxzZQl7CisJCWlmICgodHJpZ2dlciA9PSBJT0FQSUNfQVVUTyAmJiBJT19BUElDX2lycV90cmlnZ2VyKGlycSkpIHx8CisJCQkJdHJpZ2dlciA9PSBJT0FQSUNfTEVWRUwpCisJCQlpcnFfZGVzY1tpcnFdLmhhbmRsZXIgPSAmaW9hcGljX2xldmVsX3R5cGU7CisJCWVsc2UKKwkJCWlycV9kZXNjW2lycV0uaGFuZGxlciA9ICZpb2FwaWNfZWRnZV90eXBlOworCQlzZXRfaW50cl9nYXRlKHZlY3RvciwgaW50ZXJydXB0W2lycV0pOworCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0IHNldHVwX0lPX0FQSUNfaXJxcyh2b2lkKQoreworCXN0cnVjdCBJT19BUElDX3JvdXRlX2VudHJ5IGVudHJ5OworCWludCBhcGljLCBwaW4sIGlkeCwgaXJxLCBmaXJzdF9ub3Rjb24gPSAxLCB2ZWN0b3I7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgS0VSTl9ERUJVRyAiaW5pdCBJT19BUElDIElSUXNcbiIpOworCisJZm9yIChhcGljID0gMDsgYXBpYyA8IG5yX2lvYXBpY3M7IGFwaWMrKykgeworCWZvciAocGluID0gMDsgcGluIDwgbnJfaW9hcGljX3JlZ2lzdGVyc1thcGljXTsgcGluKyspIHsKKworCQkvKgorCQkgKiBhZGQgaXQgdG8gdGhlIElPLUFQSUMgaXJxLXJvdXRpbmcgdGFibGU6CisJCSAqLworCQltZW1zZXQoJmVudHJ5LDAsc2l6ZW9mKGVudHJ5KSk7CisKKwkJZW50cnkuZGVsaXZlcnlfbW9kZSA9IElOVF9ERUxJVkVSWV9NT0RFOworCQllbnRyeS5kZXN0X21vZGUgPSBJTlRfREVTVF9NT0RFOworCQllbnRyeS5tYXNrID0gMDsJCQkJLyogZW5hYmxlIElSUSAqLworCQllbnRyeS5kZXN0LmxvZ2ljYWwubG9naWNhbF9kZXN0ID0gCisJCQkJCWNwdV9tYXNrX3RvX2FwaWNpZChUQVJHRVRfQ1BVUyk7CisKKwkJaWR4ID0gZmluZF9pcnFfZW50cnkoYXBpYyxwaW4sbXBfSU5UKTsKKwkJaWYgKGlkeCA9PSAtMSkgeworCQkJaWYgKGZpcnN0X25vdGNvbikgeworCQkJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgS0VSTl9ERUJVRworCQkJCQkJIiBJTy1BUElDIChhcGljaWQtcGluKSAlZC0lZCIsCisJCQkJCQltcF9pb2FwaWNzW2FwaWNdLm1wY19hcGljaWQsCisJCQkJCQlwaW4pOworCQkJCWZpcnN0X25vdGNvbiA9IDA7CisJCQl9IGVsc2UKKwkJCQlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICIsICVkLSVkIiwKKwkJCQkJbXBfaW9hcGljc1thcGljXS5tcGNfYXBpY2lkLCBwaW4pOworCQkJY29udGludWU7CisJCX0KKworCQllbnRyeS50cmlnZ2VyID0gaXJxX3RyaWdnZXIoaWR4KTsKKwkJZW50cnkucG9sYXJpdHkgPSBpcnFfcG9sYXJpdHkoaWR4KTsKKworCQlpZiAoaXJxX3RyaWdnZXIoaWR4KSkgeworCQkJZW50cnkudHJpZ2dlciA9IDE7CisJCQllbnRyeS5tYXNrID0gMTsKKwkJfQorCisJCWlycSA9IHBpbl8yX2lycShpZHgsIGFwaWMsIHBpbik7CisJCS8qCisJCSAqIHNraXAgYWRkaW5nIHRoZSB0aW1lciBpbnQgb24gc2Vjb25kYXJ5IG5vZGVzLCB3aGljaCBjYXVzZXMKKwkJICogYSBzbWFsbCBidXQgcGFpbmZ1bCByaWZ0IGluIHRoZSB0aW1lLXNwYWNlIGNvbnRpbnV1bQorCQkgKi8KKwkJaWYgKG11bHRpX3RpbWVyX2NoZWNrKGFwaWMsIGlycSkpCisJCQljb250aW51ZTsKKwkJZWxzZQorCQkJYWRkX3Bpbl90b19pcnEoaXJxLCBhcGljLCBwaW4pOworCisJCWlmICghYXBpYyAmJiAhSU9fQVBJQ19JUlEoaXJxKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChJT19BUElDX0lSUShpcnEpKSB7CisJCQl2ZWN0b3IgPSBhc3NpZ25faXJxX3ZlY3RvcihpcnEpOworCQkJZW50cnkudmVjdG9yID0gdmVjdG9yOworCQkJaW9hcGljX3JlZ2lzdGVyX2ludHIoaXJxLCB2ZWN0b3IsIElPQVBJQ19BVVRPKTsKKwkJCisJCQlpZiAoIWFwaWMgJiYgKGlycSA8IDE2KSkKKwkJCQlkaXNhYmxlXzgyNTlBX2lycShpcnEpOworCQl9CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCQlpb19hcGljX3dyaXRlKGFwaWMsIDB4MTErMipwaW4sICooKChpbnQgKikmZW50cnkpKzEpKTsKKwkJaW9fYXBpY193cml0ZShhcGljLCAweDEwKzIqcGluLCAqKCgoaW50ICopJmVudHJ5KSswKSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJfQorCX0KKworCWlmICghZmlyc3Rfbm90Y29uKQorCQlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICIgbm90IGNvbm5lY3RlZC5cbiIpOworfQorCisvKgorICogU2V0IHVwIHRoZSA4MjU5QS1tYXN0ZXIgb3V0cHV0IHBpbjoKKyAqLworc3RhdGljIHZvaWQgX19pbml0IHNldHVwX0V4dElOVF9JUlEwX3Bpbih1bnNpZ25lZCBpbnQgcGluLCBpbnQgdmVjdG9yKQoreworCXN0cnVjdCBJT19BUElDX3JvdXRlX2VudHJ5IGVudHJ5OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwltZW1zZXQoJmVudHJ5LDAsc2l6ZW9mKGVudHJ5KSk7CisKKwlkaXNhYmxlXzgyNTlBX2lycSgwKTsKKworCS8qIG1hc2sgTFZUMCAqLworCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUMCwgQVBJQ19MVlRfTUFTS0VEIHwgQVBJQ19ETV9FWFRJTlQpOworCisJLyoKKwkgKiBXZSB1c2UgbG9naWNhbCBkZWxpdmVyeSB0byBnZXQgdGhlIHRpbWVyIElSUQorCSAqIHRvIHRoZSBmaXJzdCBDUFUuCisJICovCisJZW50cnkuZGVzdF9tb2RlID0gSU5UX0RFU1RfTU9ERTsKKwllbnRyeS5tYXNrID0gMDsJCQkJCS8qIHVubWFzayBJUlEgbm93ICovCisJZW50cnkuZGVzdC5sb2dpY2FsLmxvZ2ljYWxfZGVzdCA9IGNwdV9tYXNrX3RvX2FwaWNpZChUQVJHRVRfQ1BVUyk7CisJZW50cnkuZGVsaXZlcnlfbW9kZSA9IElOVF9ERUxJVkVSWV9NT0RFOworCWVudHJ5LnBvbGFyaXR5ID0gMDsKKwllbnRyeS50cmlnZ2VyID0gMDsKKwllbnRyeS52ZWN0b3IgPSB2ZWN0b3I7CisKKwkvKgorCSAqIFRoZSB0aW1lciBJUlEgZG9lc24ndCBoYXZlIHRvIGtub3cgdGhhdCBiZWhpbmQgdGhlCisJICogc2NlbmUgd2UgaGF2ZSBhIDgyNTlBLW1hc3RlciBpbiBBRU9JIG1vZGUgLi4uCisJICovCisJaXJxX2Rlc2NbMF0uaGFuZGxlciA9ICZpb2FwaWNfZWRnZV90eXBlOworCisJLyoKKwkgKiBBZGQgaXQgdG8gdGhlIElPLUFQSUMgaXJxLXJvdXRpbmcgdGFibGU6CisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJaW9fYXBpY193cml0ZSgwLCAweDExKzIqcGluLCAqKCgoaW50ICopJmVudHJ5KSsxKSk7CisJaW9fYXBpY193cml0ZSgwLCAweDEwKzIqcGluLCAqKCgoaW50ICopJmVudHJ5KSswKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKworCWVuYWJsZV84MjU5QV9pcnEoMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBVTkVYUEVDVEVEX0lPX0FQSUModm9pZCkKK3sKK30KKwordm9pZCBfX2luaXQgcHJpbnRfSU9fQVBJQyh2b2lkKQoreworCWludCBhcGljLCBpOworCXVuaW9uIElPX0FQSUNfcmVnXzAwIHJlZ18wMDsKKwl1bmlvbiBJT19BUElDX3JlZ18wMSByZWdfMDE7CisJdW5pb24gSU9fQVBJQ19yZWdfMDIgcmVnXzAyOworCXVuaW9uIElPX0FQSUNfcmVnXzAzIHJlZ18wMzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGFwaWNfdmVyYm9zaXR5ID09IEFQSUNfUVVJRVQpCisJCXJldHVybjsKKworIAlwcmludGsoS0VSTl9ERUJVRyAibnVtYmVyIG9mIE1QIElSUSBzb3VyY2VzOiAlZC5cbiIsIG1wX2lycV9lbnRyaWVzKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnJfaW9hcGljczsgaSsrKQorCQlwcmludGsoS0VSTl9ERUJVRyAibnVtYmVyIG9mIElPLUFQSUMgIyVkIHJlZ2lzdGVyczogJWQuXG4iLAorCQkgICAgICAgbXBfaW9hcGljc1tpXS5tcGNfYXBpY2lkLCBucl9pb2FwaWNfcmVnaXN0ZXJzW2ldKTsKKworCS8qCisJICogV2UgYXJlIGEgYml0IGNvbnNlcnZhdGl2ZSBhYm91dCB3aGF0IHdlIGV4cGVjdC4gIFdlIGhhdmUgdG8KKwkgKiBrbm93IGFib3V0IGV2ZXJ5IGhhcmR3YXJlIGNoYW5nZSBBU0FQLgorCSAqLworCXByaW50ayhLRVJOX0lORk8gInRlc3RpbmcgdGhlIElPIEFQSUMuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuIik7CisKKwlmb3IgKGFwaWMgPSAwOyBhcGljIDwgbnJfaW9hcGljczsgYXBpYysrKSB7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwlyZWdfMDAucmF3ID0gaW9fYXBpY19yZWFkKGFwaWMsIDApOworCXJlZ18wMS5yYXcgPSBpb19hcGljX3JlYWQoYXBpYywgMSk7CisJaWYgKHJlZ18wMS5iaXRzLnZlcnNpb24gPj0gMHgxMCkKKwkJcmVnXzAyLnJhdyA9IGlvX2FwaWNfcmVhZChhcGljLCAyKTsKKwlpZiAocmVnXzAxLmJpdHMudmVyc2lvbiA+PSAweDIwKQorCQlyZWdfMDMucmF3ID0gaW9fYXBpY19yZWFkKGFwaWMsIDMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiSU8gQVBJQyAjJWQuLi4uLi5cbiIsIG1wX2lvYXBpY3NbYXBpY10ubXBjX2FwaWNpZCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIi4uLi4gcmVnaXN0ZXIgIzAwOiAlMDhYXG4iLCByZWdfMDAucmF3KTsKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uLi4uLiAgICA6IHBoeXNpY2FsIEFQSUMgaWQ6ICUwMlhcbiIsIHJlZ18wMC5iaXRzLklEKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uLi4uLiAgICA6IERlbGl2ZXJ5IFR5cGU6ICVYXG4iLCByZWdfMDAuYml0cy5kZWxpdmVyeV90eXBlKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uLi4uLiAgICA6IExUUyAgICAgICAgICA6ICVYXG4iLCByZWdfMDAuYml0cy5MVFMpOworCWlmIChyZWdfMDAuYml0cy5JRCA+PSBnZXRfcGh5c2ljYWxfYnJvYWRjYXN0KCkpCisJCVVORVhQRUNURURfSU9fQVBJQygpOworCWlmIChyZWdfMDAuYml0cy5fX3Jlc2VydmVkXzEgfHwgcmVnXzAwLmJpdHMuX19yZXNlcnZlZF8yKQorCQlVTkVYUEVDVEVEX0lPX0FQSUMoKTsKKworCXByaW50ayhLRVJOX0RFQlVHICIuLi4uIHJlZ2lzdGVyICMwMTogJTA4WFxuIiwgcmVnXzAxLnJhdyk7CisJcHJpbnRrKEtFUk5fREVCVUcgIi4uLi4uLi4gICAgIDogbWF4IHJlZGlyZWN0aW9uIGVudHJpZXM6ICUwNFhcbiIsIHJlZ18wMS5iaXRzLmVudHJpZXMpOworCWlmICgJKHJlZ18wMS5iaXRzLmVudHJpZXMgIT0gMHgwZikgJiYgLyogb2xkZXIgKE5lcHR1bmUpIGJvYXJkcyAqLworCQkocmVnXzAxLmJpdHMuZW50cmllcyAhPSAweDE3KSAmJiAvKiB0eXBpY2FsIElTQStQQ0kgYm9hcmRzICovCisJCShyZWdfMDEuYml0cy5lbnRyaWVzICE9IDB4MWIpICYmIC8qIENvbXBhcSBQcm9saWFudCBib2FyZHMgKi8KKwkJKHJlZ18wMS5iaXRzLmVudHJpZXMgIT0gMHgxZikgJiYgLyogZHVhbCBYZW9uIGJvYXJkcyAqLworCQkocmVnXzAxLmJpdHMuZW50cmllcyAhPSAweDIyKSAmJiAvKiBiaWdnZXIgWGVvbiBib2FyZHMgKi8KKwkJKHJlZ18wMS5iaXRzLmVudHJpZXMgIT0gMHgyRSkgJiYKKwkJKHJlZ18wMS5iaXRzLmVudHJpZXMgIT0gMHgzRikKKwkpCisJCVVORVhQRUNURURfSU9fQVBJQygpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIi4uLi4uLi4gICAgIDogUFJRIGltcGxlbWVudGVkOiAlWFxuIiwgcmVnXzAxLmJpdHMuUFJRKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uLi4uLiAgICAgOiBJTyBBUElDIHZlcnNpb246ICUwNFhcbiIsIHJlZ18wMS5iaXRzLnZlcnNpb24pOworCWlmICgJKHJlZ18wMS5iaXRzLnZlcnNpb24gIT0gMHgwMSkgJiYgLyogODI0ODlEWCBJTy1BUElDcyAqLworCQkocmVnXzAxLmJpdHMudmVyc2lvbiAhPSAweDEwKSAmJiAvKiBvbGRlc3QgSU8tQVBJQ3MgKi8KKwkJKHJlZ18wMS5iaXRzLnZlcnNpb24gIT0gMHgxMSkgJiYgLyogUGVudGl1bS9Qcm8gSU8tQVBJQ3MgKi8KKwkJKHJlZ18wMS5iaXRzLnZlcnNpb24gIT0gMHgxMykgJiYgLyogWGVvbiBJTy1BUElDcyAqLworCQkocmVnXzAxLmJpdHMudmVyc2lvbiAhPSAweDIwKSAgICAvKiBJbnRlbCBQNjRIICg4MjgwNiBBQSkgKi8KKwkpCisJCVVORVhQRUNURURfSU9fQVBJQygpOworCWlmIChyZWdfMDEuYml0cy5fX3Jlc2VydmVkXzEgfHwgcmVnXzAxLmJpdHMuX19yZXNlcnZlZF8yKQorCQlVTkVYUEVDVEVEX0lPX0FQSUMoKTsKKworCS8qCisJICogU29tZSBJbnRlbCBjaGlwc2V0cyB3aXRoIElPIEFQSUMgVkVSU0lPTiBvZiAweDE/IGRvbid0IGhhdmUgcmVnXzAyLAorCSAqIGJ1dCB0aGUgdmFsdWUgb2YgcmVnXzAyIGlzIHJlYWQgYXMgdGhlIHByZXZpb3VzIHJlYWQgcmVnaXN0ZXIKKwkgKiB2YWx1ZSwgc28gaWdub3JlIGl0IGlmIHJlZ18wMiA9PSByZWdfMDEuCisJICovCisJaWYgKHJlZ18wMS5iaXRzLnZlcnNpb24gPj0gMHgxMCAmJiByZWdfMDIucmF3ICE9IHJlZ18wMS5yYXcpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIi4uLi4gcmVnaXN0ZXIgIzAyOiAlMDhYXG4iLCByZWdfMDIucmF3KTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIi4uLi4uLi4gICAgIDogYXJiaXRyYXRpb246ICUwMlhcbiIsIHJlZ18wMi5iaXRzLmFyYml0cmF0aW9uKTsKKwkJaWYgKHJlZ18wMi5iaXRzLl9fcmVzZXJ2ZWRfMSB8fCByZWdfMDIuYml0cy5fX3Jlc2VydmVkXzIpCisJCQlVTkVYUEVDVEVEX0lPX0FQSUMoKTsKKwl9CisKKwkvKgorCSAqIFNvbWUgSW50ZWwgY2hpcHNldHMgd2l0aCBJTyBBUElDIFZFUlNJT04gb2YgMHgyPyBkb24ndCBoYXZlIHJlZ18wMgorCSAqIG9yIHJlZ18wMywgYnV0IHRoZSB2YWx1ZSBvZiByZWdfMFsyM10gaXMgcmVhZCBhcyB0aGUgcHJldmlvdXMgcmVhZAorCSAqIHJlZ2lzdGVyIHZhbHVlLCBzbyBpZ25vcmUgaXQgaWYgcmVnXzAzID09IHJlZ18wWzEyXS4KKwkgKi8KKwlpZiAocmVnXzAxLmJpdHMudmVyc2lvbiA+PSAweDIwICYmIHJlZ18wMy5yYXcgIT0gcmVnXzAyLnJhdyAmJgorCSAgICByZWdfMDMucmF3ICE9IHJlZ18wMS5yYXcpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIi4uLi4gcmVnaXN0ZXIgIzAzOiAlMDhYXG4iLCByZWdfMDMucmF3KTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIi4uLi4uLi4gICAgIDogQm9vdCBEVCAgICA6ICVYXG4iLCByZWdfMDMuYml0cy5ib290X0RUKTsKKwkJaWYgKHJlZ18wMy5iaXRzLl9fcmVzZXJ2ZWRfMSkKKwkJCVVORVhQRUNURURfSU9fQVBJQygpOworCX0KKworCXByaW50ayhLRVJOX0RFQlVHICIuLi4uIElSUSByZWRpcmVjdGlvbiB0YWJsZTpcbiIpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiBOUiBMb2cgUGh5IE1hc2sgVHJpZyBJUlIgUG9sIgorCQkJICAiIFN0YXQgRGVzdCBEZWxpIFZlY3Q6ICAgXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPD0gcmVnXzAxLmJpdHMuZW50cmllczsgaSsrKSB7CisJCXN0cnVjdCBJT19BUElDX3JvdXRlX2VudHJ5IGVudHJ5OworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCQkqKCgoaW50ICopJmVudHJ5KSswKSA9IGlvX2FwaWNfcmVhZChhcGljLCAweDEwK2kqMik7CisJCSooKChpbnQgKikmZW50cnkpKzEpID0gaW9fYXBpY19yZWFkKGFwaWMsIDB4MTEraSoyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKworCQlwcmludGsoS0VSTl9ERUJVRyAiICUwMnggJTAzWCAlMDJYICAiLAorCQkJaSwKKwkJCWVudHJ5LmRlc3QubG9naWNhbC5sb2dpY2FsX2Rlc3QsCisJCQllbnRyeS5kZXN0LnBoeXNpY2FsLnBoeXNpY2FsX2Rlc3QKKwkJKTsKKworCQlwcmludGsoIiUxZCAgICAlMWQgICAgJTFkICAgJTFkICAgJTFkICAgICUxZCAgICAlMWQgICAgJTAyWFxuIiwKKwkJCWVudHJ5Lm1hc2ssCisJCQllbnRyeS50cmlnZ2VyLAorCQkJZW50cnkuaXJyLAorCQkJZW50cnkucG9sYXJpdHksCisJCQllbnRyeS5kZWxpdmVyeV9zdGF0dXMsCisJCQllbnRyeS5kZXN0X21vZGUsCisJCQllbnRyeS5kZWxpdmVyeV9tb2RlLAorCQkJZW50cnkudmVjdG9yCisJCSk7CisJfQorCX0KKwlpZiAodXNlX3BjaV92ZWN0b3IoKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiVXNpbmcgdmVjdG9yLWJhc2VkIGluZGV4aW5nXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiSVJRIHRvIHBpbiBtYXBwaW5nczpcbiIpOworCWZvciAoaSA9IDA7IGkgPCBOUl9JUlFTOyBpKyspIHsKKwkJc3RydWN0IGlycV9waW5fbGlzdCAqZW50cnkgPSBpcnFfMl9waW4gKyBpOworCQlpZiAoZW50cnktPnBpbiA8IDApCisJCQljb250aW51ZTsKKyAJCWlmICh1c2VfcGNpX3ZlY3RvcigpICYmICFwbGF0Zm9ybV9sZWdhY3lfaXJxKGkpKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIklSUSVkICIsIElPX0FQSUNfVkVDVE9SKGkpKTsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIklSUSVkICIsIGkpOworCQlmb3IgKDs7KSB7CisJCQlwcmludGsoIi0+ICVkOiVkIiwgZW50cnktPmFwaWMsIGVudHJ5LT5waW4pOworCQkJaWYgKCFlbnRyeS0+bmV4dCkKKwkJCQlicmVhazsKKwkJCWVudHJ5ID0gaXJxXzJfcGluICsgZW50cnktPm5leHQ7CisJCX0KKwkJcHJpbnRrKCJcbiIpOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiBkb25lLlxuIik7CisKKwlyZXR1cm47Cit9CisKKyNpZiAwCisKK3N0YXRpYyB2b2lkIHByaW50X0FQSUNfYml0ZmllbGQgKGludCBiYXNlKQoreworCXVuc2lnbmVkIGludCB2OworCWludCBpLCBqOworCisJaWYgKGFwaWNfdmVyYm9zaXR5ID09IEFQSUNfUVVJRVQpCisJCXJldHVybjsKKworCXByaW50ayhLRVJOX0RFQlVHICIwMTIzNDU2Nzg5YWJjZGVmMDEyMzQ1Njc4OWFiY2RlZlxuIiBLRVJOX0RFQlVHKTsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCXYgPSBhcGljX3JlYWQoYmFzZSArIGkqMHgxMCk7CisJCWZvciAoaiA9IDA7IGogPCAzMjsgaisrKSB7CisJCQlpZiAodiAmICgxPDxqKSkKKwkJCQlwcmludGsoIjEiKTsKKwkJCWVsc2UKKwkJCQlwcmludGsoIjAiKTsKKwkJfQorCQlwcmludGsoIlxuIik7CisJfQorfQorCit2b2lkIC8qX19pbml0Ki8gcHJpbnRfbG9jYWxfQVBJQyh2b2lkICogZHVtbXkpCit7CisJdW5zaWduZWQgaW50IHYsIHZlciwgbWF4bHZ0OworCisJaWYgKGFwaWNfdmVyYm9zaXR5ID09IEFQSUNfUVVJRVQpCisJCXJldHVybjsKKworCXByaW50aygiXG4iIEtFUk5fREVCVUcgInByaW50aW5nIGxvY2FsIEFQSUMgY29udGVudHMgb24gQ1BVIyVkLyVkOlxuIiwKKwkJc21wX3Byb2Nlc3Nvcl9pZCgpLCBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKSk7CisJdiA9IGFwaWNfcmVhZChBUElDX0lEKTsKKwlwcmludGsoS0VSTl9JTkZPICIuLi4gQVBJQyBJRDogICAgICAlMDh4ICglMDF4KVxuIiwgdiwgR0VUX0FQSUNfSUQodikpOworCXYgPSBhcGljX3JlYWQoQVBJQ19MVlIpOworCXByaW50ayhLRVJOX0lORk8gIi4uLiBBUElDIFZFUlNJT046ICUwOHhcbiIsIHYpOworCXZlciA9IEdFVF9BUElDX1ZFUlNJT04odik7CisJbWF4bHZ0ID0gZ2V0X21heGx2dCgpOworCisJdiA9IGFwaWNfcmVhZChBUElDX1RBU0tQUkkpOworCXByaW50ayhLRVJOX0RFQlVHICIuLi4gQVBJQyBUQVNLUFJJOiAlMDh4ICglMDJ4KVxuIiwgdiwgdiAmIEFQSUNfVFBSSV9NQVNLKTsKKworCWlmIChBUElDX0lOVEVHUkFURUQodmVyKSkgewkJCS8qICE4MjQ4OURYICovCisJCXYgPSBhcGljX3JlYWQoQVBJQ19BUkJQUkkpOworCQlwcmludGsoS0VSTl9ERUJVRyAiLi4uIEFQSUMgQVJCUFJJOiAlMDh4ICglMDJ4KVxuIiwgdiwKKwkJCXYgJiBBUElDX0FSQlBSSV9NQVNLKTsKKwkJdiA9IGFwaWNfcmVhZChBUElDX1BST0NQUkkpOworCQlwcmludGsoS0VSTl9ERUJVRyAiLi4uIEFQSUMgUFJPQ1BSSTogJTA4eFxuIiwgdik7CisJfQorCisJdiA9IGFwaWNfcmVhZChBUElDX0VPSSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIi4uLiBBUElDIEVPSTogJTA4eFxuIiwgdik7CisJdiA9IGFwaWNfcmVhZChBUElDX1JSUik7CisJcHJpbnRrKEtFUk5fREVCVUcgIi4uLiBBUElDIFJSUjogJTA4eFxuIiwgdik7CisJdiA9IGFwaWNfcmVhZChBUElDX0xEUik7CisJcHJpbnRrKEtFUk5fREVCVUcgIi4uLiBBUElDIExEUjogJTA4eFxuIiwgdik7CisJdiA9IGFwaWNfcmVhZChBUElDX0RGUik7CisJcHJpbnRrKEtFUk5fREVCVUcgIi4uLiBBUElDIERGUjogJTA4eFxuIiwgdik7CisJdiA9IGFwaWNfcmVhZChBUElDX1NQSVYpOworCXByaW50ayhLRVJOX0RFQlVHICIuLi4gQVBJQyBTUElWOiAlMDh4XG4iLCB2KTsKKworCXByaW50ayhLRVJOX0RFQlVHICIuLi4gQVBJQyBJU1IgZmllbGQ6XG4iKTsKKwlwcmludF9BUElDX2JpdGZpZWxkKEFQSUNfSVNSKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uIEFQSUMgVE1SIGZpZWxkOlxuIik7CisJcHJpbnRfQVBJQ19iaXRmaWVsZChBUElDX1RNUik7CisJcHJpbnRrKEtFUk5fREVCVUcgIi4uLiBBUElDIElSUiBmaWVsZDpcbiIpOworCXByaW50X0FQSUNfYml0ZmllbGQoQVBJQ19JUlIpOworCisJaWYgKEFQSUNfSU5URUdSQVRFRCh2ZXIpKSB7CQkvKiAhODI0ODlEWCAqLworCQlpZiAobWF4bHZ0ID4gMykJCS8qIER1ZSB0byB0aGUgUGVudGl1bSBlcnJhdHVtIDNBUC4gKi8KKwkJCWFwaWNfd3JpdGUoQVBJQ19FU1IsIDApOworCQl2ID0gYXBpY19yZWFkKEFQSUNfRVNSKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIi4uLiBBUElDIEVTUjogJTA4eFxuIiwgdik7CisJfQorCisJdiA9IGFwaWNfcmVhZChBUElDX0lDUik7CisJcHJpbnRrKEtFUk5fREVCVUcgIi4uLiBBUElDIElDUjogJTA4eFxuIiwgdik7CisJdiA9IGFwaWNfcmVhZChBUElDX0lDUjIpOworCXByaW50ayhLRVJOX0RFQlVHICIuLi4gQVBJQyBJQ1IyOiAlMDh4XG4iLCB2KTsKKworCXYgPSBhcGljX3JlYWQoQVBJQ19MVlRUKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uIEFQSUMgTFZUVDogJTA4eFxuIiwgdik7CisKKwlpZiAobWF4bHZ0ID4gMykgeyAgICAgICAgICAgICAgICAgICAgICAgLyogUEMgaXMgTFZUIzQuICovCisJCXYgPSBhcGljX3JlYWQoQVBJQ19MVlRQQyk7CisJCXByaW50ayhLRVJOX0RFQlVHICIuLi4gQVBJQyBMVlRQQzogJTA4eFxuIiwgdik7CisJfQorCXYgPSBhcGljX3JlYWQoQVBJQ19MVlQwKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uIEFQSUMgTFZUMDogJTA4eFxuIiwgdik7CisJdiA9IGFwaWNfcmVhZChBUElDX0xWVDEpOworCXByaW50ayhLRVJOX0RFQlVHICIuLi4gQVBJQyBMVlQxOiAlMDh4XG4iLCB2KTsKKworCWlmIChtYXhsdnQgPiAyKSB7CQkJLyogRVJSIGlzIExWVCMzLiAqLworCQl2ID0gYXBpY19yZWFkKEFQSUNfTFZURVJSKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIi4uLiBBUElDIExWVEVSUjogJTA4eFxuIiwgdik7CisJfQorCisJdiA9IGFwaWNfcmVhZChBUElDX1RNSUNUKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uIEFQSUMgVE1JQ1Q6ICUwOHhcbiIsIHYpOworCXYgPSBhcGljX3JlYWQoQVBJQ19UTUNDVCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIi4uLiBBUElDIFRNQ0NUOiAlMDh4XG4iLCB2KTsKKwl2ID0gYXBpY19yZWFkKEFQSUNfVERDUik7CisJcHJpbnRrKEtFUk5fREVCVUcgIi4uLiBBUElDIFREQ1I6ICUwOHhcbiIsIHYpOworCXByaW50aygiXG4iKTsKK30KKwordm9pZCBwcmludF9hbGxfbG9jYWxfQVBJQ3MgKHZvaWQpCit7CisJb25fZWFjaF9jcHUocHJpbnRfbG9jYWxfQVBJQywgTlVMTCwgMSwgMSk7Cit9CisKK3ZvaWQgLypfX2luaXQqLyBwcmludF9QSUModm9pZCkKK3sKKwlleHRlcm4gc3BpbmxvY2tfdCBpODI1OUFfbG9jazsKKwl1bnNpZ25lZCBpbnQgdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGFwaWNfdmVyYm9zaXR5ID09IEFQSUNfUVVJRVQpCisJCXJldHVybjsKKworCXByaW50ayhLRVJOX0RFQlVHICJcbnByaW50aW5nIFBJQyBjb250ZW50c1xuIik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTgyNTlBX2xvY2ssIGZsYWdzKTsKKworCXYgPSBpbmIoMHhhMSkgPDwgOCB8IGluYigweDIxKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uIFBJQyAgSU1SOiAlMDR4XG4iLCB2KTsKKworCXYgPSBpbmIoMHhhMCkgPDwgOCB8IGluYigweDIwKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uIFBJQyAgSVJSOiAlMDR4XG4iLCB2KTsKKworCW91dGIoMHgwYiwweGEwKTsKKwlvdXRiKDB4MGIsMHgyMCk7CisJdiA9IGluYigweGEwKSA8PCA4IHwgaW5iKDB4MjApOworCW91dGIoMHgwYSwweGEwKTsKKwlvdXRiKDB4MGEsMHgyMCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpODI1OUFfbG9jaywgZmxhZ3MpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIi4uLiBQSUMgIElTUjogJTA0eFxuIiwgdik7CisKKwl2ID0gaW5iKDB4NGQxKSA8PCA4IHwgaW5iKDB4NGQwKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uIFBJQyBFTENSOiAlMDR4XG4iLCB2KTsKK30KKworI2VuZGlmICAvKiAgMCAgKi8KKworc3RhdGljIHZvaWQgX19pbml0IGVuYWJsZV9JT19BUElDKHZvaWQpCit7CisJdW5pb24gSU9fQVBJQ19yZWdfMDEgcmVnXzAxOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlmb3IgKGkgPSAwOyBpIDwgUElOX01BUF9TSVpFOyBpKyspIHsKKwkJaXJxXzJfcGluW2ldLnBpbiA9IC0xOworCQlpcnFfMl9waW5baV0ubmV4dCA9IDA7CisJfQorCWlmICghcGlycXNfZW5hYmxlZCkKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9QSVJRUzsgaSsrKQorCQkJcGlycV9lbnRyaWVzW2ldID0gLTE7CisKKwkvKgorCSAqIFRoZSBudW1iZXIgb2YgSU8tQVBJQyBJUlEgcmVnaXN0ZXJzICg9PSAjcGlucyk6CisJICovCisJZm9yIChpID0gMDsgaSA8IG5yX2lvYXBpY3M7IGkrKykgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwkJcmVnXzAxLnJhdyA9IGlvX2FwaWNfcmVhZChpLCAxKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwkJbnJfaW9hcGljX3JlZ2lzdGVyc1tpXSA9IHJlZ18wMS5iaXRzLmVudHJpZXMrMTsKKwl9CisKKwkvKgorCSAqIERvIG5vdCB0cnVzdCB0aGUgSU8tQVBJQyBiZWluZyBlbXB0eSBhdCBib290dXAKKwkgKi8KKwljbGVhcl9JT19BUElDKCk7Cit9CisKKy8qCisgKiBOb3QgYW4gX19pbml0LCBuZWVkZWQgYnkgdGhlIHJlYm9vdCBjb2RlCisgKi8KK3ZvaWQgZGlzYWJsZV9JT19BUElDKHZvaWQpCit7CisJLyoKKwkgKiBDbGVhciB0aGUgSU8tQVBJQyBiZWZvcmUgcmVib290aW5nOgorCSAqLworCWNsZWFyX0lPX0FQSUMoKTsKKworCWRpc2Nvbm5lY3RfYnNwX0FQSUMoKTsKK30KKworLyoKKyAqIGZ1bmN0aW9uIHRvIHNldCB0aGUgSU8tQVBJQyBwaHlzaWNhbCBJRHMgYmFzZWQgb24gdGhlCisgKiB2YWx1ZXMgc3RvcmVkIGluIHRoZSBNUEMgdGFibGUuCisgKgorICogYnkgTWF0dCBEb21zY2ggPE1hdHRfRG9tc2NoQGRlbGwuY29tPiAgVHVlIERlYyAyMSAxMjoyNTowNSBDU1QgMTk5OQorICovCisKKyNpZm5kZWYgQ09ORklHX1g4Nl9OVU1BUQorc3RhdGljIHZvaWQgX19pbml0IHNldHVwX2lvYXBpY19pZHNfZnJvbV9tcGModm9pZCkKK3sKKwl1bmlvbiBJT19BUElDX3JlZ18wMCByZWdfMDA7CisJcGh5c2lkX21hc2tfdCBwaHlzX2lkX3ByZXNlbnRfbWFwOworCWludCBhcGljOworCWludCBpOworCXVuc2lnbmVkIGNoYXIgb2xkX2lkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKgorCSAqIFRoaXMgaXMgYnJva2VuOyBhbnl0aGluZyB3aXRoIGEgcmVhbCBjcHUgY291bnQgaGFzIHRvCisJICogY2lyY3VtdmVudCB0aGlzIGlkaW9jeSByZWdhcmRsZXNzLgorCSAqLworCXBoeXNfaWRfcHJlc2VudF9tYXAgPSBpb2FwaWNfcGh5c19pZF9tYXAocGh5c19jcHVfcHJlc2VudF9tYXApOworCisJLyoKKwkgKiBTZXQgdGhlIElPQVBJQyBJRCB0byB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBNUEMgdGFibGUuCisJICovCisJZm9yIChhcGljID0gMDsgYXBpYyA8IG5yX2lvYXBpY3M7IGFwaWMrKykgeworCisJCS8qIFJlYWQgdGhlIHJlZ2lzdGVyIDAgdmFsdWUgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJCXJlZ18wMC5yYXcgPSBpb19hcGljX3JlYWQoYXBpYywgMCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJCQorCQlvbGRfaWQgPSBtcF9pb2FwaWNzW2FwaWNdLm1wY19hcGljaWQ7CisKKwkJaWYgKG1wX2lvYXBpY3NbYXBpY10ubXBjX2FwaWNpZCA+PSBnZXRfcGh5c2ljYWxfYnJvYWRjYXN0KCkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiQklPUyBidWcsIElPLUFQSUMjJWQgSUQgaXMgJWQgaW4gdGhlIE1QQyB0YWJsZSEuLi5cbiIsCisJCQkJYXBpYywgbXBfaW9hcGljc1thcGljXS5tcGNfYXBpY2lkKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiLi4uIGZpeGluZyB1cCB0byAlZC4gKHRlbGwgeW91ciBodyB2ZW5kb3IpXG4iLAorCQkJCXJlZ18wMC5iaXRzLklEKTsKKwkJCW1wX2lvYXBpY3NbYXBpY10ubXBjX2FwaWNpZCA9IHJlZ18wMC5iaXRzLklEOworCQl9CisKKwkJLyogRG9uJ3QgY2hlY2sgSS9PIEFQSUMgSURzIGZvciBzb21lIHhBUElDIHN5c3RlbXMuICBUaGV5IGhhdmUKKwkJICogbm8gbWVhbmluZyB3aXRob3V0IHRoZSBzZXJpYWwgQVBJQyBidXMuICovCisJCWlmIChOT19JT0FQSUNfQ0hFQ0spCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogU2FuaXR5IGNoZWNrLCBpcyB0aGUgSUQgcmVhbGx5IGZyZWU/IEV2ZXJ5IEFQSUMgaW4gYQorCQkgKiBzeXN0ZW0gbXVzdCBoYXZlIGEgdW5pcXVlIElEIG9yIHdlIGdldCBsb3RzIG9mIG5pY2UKKwkJICogJ3N0dWNrIG9uIHNtcF9pbnZhbGlkYXRlX25lZWRlZCBJUEkgd2FpdCcgbWVzc2FnZXMuCisJCSAqLworCQlpZiAoY2hlY2tfYXBpY2lkX3VzZWQocGh5c19pZF9wcmVzZW50X21hcCwKKwkJCQkJbXBfaW9hcGljc1thcGljXS5tcGNfYXBpY2lkKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJCSU9TIGJ1ZywgSU8tQVBJQyMlZCBJRCAlZCBpcyBhbHJlYWR5IHVzZWQhLi4uXG4iLAorCQkJCWFwaWMsIG1wX2lvYXBpY3NbYXBpY10ubXBjX2FwaWNpZCk7CisJCQlmb3IgKGkgPSAwOyBpIDwgZ2V0X3BoeXNpY2FsX2Jyb2FkY2FzdCgpOyBpKyspCisJCQkJaWYgKCFwaHlzaWRfaXNzZXQoaSwgcGh5c19pZF9wcmVzZW50X21hcCkpCisJCQkJCWJyZWFrOworCQkJaWYgKGkgPj0gZ2V0X3BoeXNpY2FsX2Jyb2FkY2FzdCgpKQorCQkJCXBhbmljKCJNYXggQVBJQyBJRCBleGNlZWRlZCFcbiIpOworCQkJcHJpbnRrKEtFUk5fRVJSICIuLi4gZml4aW5nIHVwIHRvICVkLiAodGVsbCB5b3VyIGh3IHZlbmRvcilcbiIsCisJCQkJaSk7CisJCQlwaHlzaWRfc2V0KGksIHBoeXNfaWRfcHJlc2VudF9tYXApOworCQkJbXBfaW9hcGljc1thcGljXS5tcGNfYXBpY2lkID0gaTsKKwkJfSBlbHNlIHsKKwkJCXBoeXNpZF9tYXNrX3QgdG1wOworCQkJdG1wID0gYXBpY2lkX3RvX2NwdV9wcmVzZW50KG1wX2lvYXBpY3NbYXBpY10ubXBjX2FwaWNpZCk7CisJCQlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICJTZXR0aW5nICVkIGluIHRoZSAiCisJCQkJCSJwaHlzX2lkX3ByZXNlbnRfbWFwXG4iLAorCQkJCQltcF9pb2FwaWNzW2FwaWNdLm1wY19hcGljaWQpOworCQkJcGh5c2lkc19vcihwaHlzX2lkX3ByZXNlbnRfbWFwLCBwaHlzX2lkX3ByZXNlbnRfbWFwLCB0bXApOworCQl9CisKKworCQkvKgorCQkgKiBXZSBuZWVkIHRvIGFkanVzdCB0aGUgSVJRIHJvdXRpbmcgdGFibGUKKwkJICogaWYgdGhlIElEIGNoYW5nZWQuCisJCSAqLworCQlpZiAob2xkX2lkICE9IG1wX2lvYXBpY3NbYXBpY10ubXBjX2FwaWNpZCkKKwkJCWZvciAoaSA9IDA7IGkgPCBtcF9pcnFfZW50cmllczsgaSsrKQorCQkJCWlmIChtcF9pcnFzW2ldLm1wY19kc3RhcGljID09IG9sZF9pZCkKKwkJCQkJbXBfaXJxc1tpXS5tcGNfZHN0YXBpYworCQkJCQkJPSBtcF9pb2FwaWNzW2FwaWNdLm1wY19hcGljaWQ7CisKKwkJLyoKKwkJICogUmVhZCB0aGUgcmlnaHQgdmFsdWUgZnJvbSB0aGUgTVBDIHRhYmxlIGFuZAorCQkgKiB3cml0ZSBpdCBpbnRvIHRoZSBJRCByZWdpc3Rlci4KKwkgCSAqLworCQlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsIEtFUk5fSU5GTworCQkJIi4uLmNoYW5naW5nIElPLUFQSUMgcGh5c2ljYWwgQVBJQyBJRCB0byAlZCAuLi4iLAorCQkJbXBfaW9hcGljc1thcGljXS5tcGNfYXBpY2lkKTsKKworCQlyZWdfMDAuYml0cy5JRCA9IG1wX2lvYXBpY3NbYXBpY10ubXBjX2FwaWNpZDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJCWlvX2FwaWNfd3JpdGUoYXBpYywgMCwgcmVnXzAwLnJhdyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisKKwkJLyoKKwkJICogU2FuaXR5IGNoZWNrCisJCSAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwkJcmVnXzAwLnJhdyA9IGlvX2FwaWNfcmVhZChhcGljLCAwKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwkJaWYgKHJlZ18wMC5iaXRzLklEICE9IG1wX2lvYXBpY3NbYXBpY10ubXBjX2FwaWNpZCkKKwkJCXByaW50aygiY291bGQgbm90IHNldCBJRCFcbiIpOworCQllbHNlCisJCQlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICIgb2suXG4iKTsKKwl9Cit9CisjZWxzZQorc3RhdGljIHZvaWQgX19pbml0IHNldHVwX2lvYXBpY19pZHNfZnJvbV9tcGModm9pZCkgeyB9CisjZW5kaWYKKworLyoKKyAqIFRoZXJlIGlzIGEgbmFzdHkgYnVnIGluIHNvbWUgb2xkZXIgU01QIGJvYXJkcywgdGhlaXIgbXB0YWJsZSBsaWVzCisgKiBhYm91dCB0aGUgdGltZXIgSVJRLiBXZSBkbyB0aGUgZm9sbG93aW5nIHRvIHdvcmsgYXJvdW5kIHRoZSBzaXR1YXRpb246CisgKgorICoJLSB0aW1lciBJUlEgZGVmYXVsdHMgdG8gSU8tQVBJQyBJUlEKKyAqCS0gaWYgdGhpcyBmdW5jdGlvbiBkZXRlY3RzIHRoYXQgdGltZXIgSVJRcyBhcmUgZGVmdW5jdCwgdGhlbiB3ZSBmYWxsCisgKgkgIGJhY2sgdG8gSVNBIHRpbWVyIElSUXMKKyAqLworc3RhdGljIGludCBfX2luaXQgdGltZXJfaXJxX3dvcmtzKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB0MSA9IGppZmZpZXM7CisKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisJLyogTGV0IHRlbiB0aWNrcyBwYXNzLi4uICovCisJbWRlbGF5KCgxMCAqIDEwMDApIC8gSFopOworCisJLyoKKwkgKiBFeHBlY3QgYSBmZXcgdGlja3MgYXQgbGVhc3QsIHRvIGJlIHN1cmUgc29tZSBwb3NzaWJsZQorCSAqIGdsdWUgbG9naWMgZG9lcyBub3QgbG9jayB1cCBhZnRlciBvbmUgb3IgdHdvIGZpcnN0CisJICogdGlja3MgaW4gYSBub24tRXh0SU5UIG1vZGUuICBBbHNvIHRoZSBsb2NhbCBBUElDCisJICogbWlnaHQgaGF2ZSBjYWNoZWQgb25lIEV4dElOVCBpbnRlcnJ1cHQuICBGaW5hbGx5LCBhdAorCSAqIGxlYXN0IG9uZSB0aWNrIG1heSBiZSBsb3N0IGR1ZSB0byBkZWxheXMuCisJICovCisJaWYgKGppZmZpZXMgLSB0MSA+IDQpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJbiB0aGUgU01QK0lPQVBJQyBjYXNlIGl0IG1pZ2h0IGhhcHBlbiB0aGF0IHRoZXJlIGFyZSBhbiB1bnNwZWNpZmllZAorICogbnVtYmVyIG9mIHBlbmRpbmcgSVJRIGV2ZW50cyB1bmhhbmRsZWQuIFRoZXNlIGNhc2VzIGFyZSB2ZXJ5IHJhcmUsCisgKiBzbyB3ZSAncmVzZW5kJyB0aGVzZSBJUlFzIHZpYSBJUElzLCB0byB0aGUgc2FtZSBDUFUuIEl0J3MgbXVjaAorICogYmV0dGVyIHRvIGRvIGl0IHRoaXMgd2F5IGFzIHRodXMgd2UgZG8gbm90IGhhdmUgdG8gYmUgYXdhcmUgb2YKKyAqICdwZW5kaW5nJyBpbnRlcnJ1cHRzIGluIHRoZSBJUlEgcGF0aCwgZXhjZXB0IGF0IHRoaXMgcG9pbnQuCisgKi8KKy8qCisgKiBFZGdlIHRyaWdnZXJlZCBuZWVkcyB0byByZXNlbmQgYW55IGludGVycnVwdAorICogdGhhdCB3YXMgZGVsYXllZCBidXQgdGhpcyBpcyBub3cgaGFuZGxlZCBpbiB0aGUgZGV2aWNlCisgKiBpbmRlcGVuZGVudCBjb2RlLgorICovCisKKy8qCisgKiBTdGFydGluZyB1cCBhIGVkZ2UtdHJpZ2dlcmVkIElPLUFQSUMgaW50ZXJydXB0IGlzCisgKiBuYXN0eSAtIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgd2UgZ2V0IHRoZSBlZGdlLgorICogSWYgaXQgaXMgYWxyZWFkeSBhc3NlcnRlZCBmb3Igc29tZSByZWFzb24sIHdlIG5lZWQKKyAqIHJldHVybiAxIHRvIGluZGljYXRlIHRoYXQgaXMgd2FzIHBlbmRpbmcuCisgKgorICogVGhpcyBpcyBub3QgY29tcGxldGUgLSB3ZSBzaG91bGQgYmUgYWJsZSB0byBmYWtlCisgKiBhbiBlZGdlIGV2ZW4gaWYgaXQgaXNuJ3Qgb24gdGhlIDgyNTlBLi4uCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9lZGdlX2lvYXBpY19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlpbnQgd2FzX3BlbmRpbmcgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwlpZiAoaXJxIDwgMTYpIHsKKwkJZGlzYWJsZV84MjU5QV9pcnEoaXJxKTsKKwkJaWYgKGk4MjU5QV9pcnFfcGVuZGluZyhpcnEpKQorCQkJd2FzX3BlbmRpbmcgPSAxOworCX0KKwlfX3VubWFza19JT19BUElDX2lycShpcnEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gd2FzX3BlbmRpbmc7Cit9CisKKy8qCisgKiBPbmNlIHdlIGhhdmUgcmVjb3JkZWQgSVJRX1BFTkRJTkcgYWxyZWFkeSwgd2UgY2FuIG1hc2sgdGhlCisgKiBpbnRlcnJ1cHQgZm9yIHJlYWwuIFRoaXMgcHJldmVudHMgSVJRIHN0b3JtcyBmcm9tIHVuaGFuZGxlZAorICogZGV2aWNlcy4KKyAqLworc3RhdGljIHZvaWQgYWNrX2VkZ2VfaW9hcGljX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCW1vdmVfaXJxKGlycSk7CisJaWYgKChpcnFfZGVzY1tpcnFdLnN0YXR1cyAmIChJUlFfUEVORElORyB8IElSUV9ESVNBQkxFRCkpCisJCQkJCT09IChJUlFfUEVORElORyB8IElSUV9ESVNBQkxFRCkpCisJCW1hc2tfSU9fQVBJQ19pcnEoaXJxKTsKKwlhY2tfQVBJQ19pcnEoKTsKK30KKworLyoKKyAqIExldmVsIHRyaWdnZXJlZCBpbnRlcnJ1cHRzIGNhbiBqdXN0IGJlIG1hc2tlZCwKKyAqIGFuZCBzaHV0dGluZyBkb3duIGFuZCBzdGFydGluZyB1cCB0aGUgaW50ZXJydXB0CisgKiBpcyB0aGUgc2FtZSBhcyBlbmFibGluZyBhbmQgZGlzYWJsaW5nIHRoZW0gLS0gZXhjZXB0CisgKiB3aXRoIGEgc3RhcnR1cCBuZWVkIHRvIHJldHVybiBhICJ3YXMgcGVuZGluZyIgdmFsdWUuCisgKgorICogTGV2ZWwgdHJpZ2dlcmVkIGludGVycnVwdHMgYXJlIHNwZWNpYWwgYmVjYXVzZSB3ZQorICogZG8gbm90IHRvdWNoIGFueSBJTy1BUElDIHJlZ2lzdGVyIHdoaWxlIGhhbmRsaW5nCisgKiB0aGVtLiBXZSBhY2sgdGhlIEFQSUMgaW4gdGhlIGVuZC1JUlEgaGFuZGxlciwgbm90CisgKiBpbiB0aGUgc3RhcnQtSVJRLWhhbmRsZXIuIFByb3RlY3Rpb24gYWdhaW5zdCByZWVudHJhbmNlCisgKiBmcm9tIHRoZSBzYW1lIGludGVycnVwdCBpcyBzdGlsbCBwcm92aWRlZCwgYm90aCBieSB0aGUKKyAqIGdlbmVyaWMgSVJRIGxheWVyIGFuZCBieSB0aGUgZmFjdCB0aGF0IGFuIHVuYWNrZWQgbG9jYWwKKyAqIEFQSUMgZG9lcyBub3QgYWNjZXB0IElSUXMuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9sZXZlbF9pb2FwaWNfaXJxICh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVubWFza19JT19BUElDX2lycShpcnEpOworCisJcmV0dXJuIDA7IC8qIGRvbid0IGNoZWNrIGZvciBwZW5kaW5nICovCit9CisKK3N0YXRpYyB2b2lkIGVuZF9sZXZlbF9pb2FwaWNfaXJxICh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGxvbmcgdjsKKwlpbnQgaTsKKworCW1vdmVfaXJxKGlycSk7CisvKgorICogSXQgYXBwZWFycyB0aGVyZSBpcyBhbiBlcnJhdHVtIHdoaWNoIGFmZmVjdHMgYXQgbGVhc3QgdmVyc2lvbiAweDExCisgKiBvZiBJL08gQVBJQyAodGhhdCdzIHRoZSA4MjA5M0FBIGFuZCBjb3JlcyBpbnRlZ3JhdGVkIGludG8gdmFyaW91cworICogY2hpcHNldHMpLiAgVW5kZXIgY2VydGFpbiBjb25kaXRpb25zIGEgbGV2ZWwtdHJpZ2dlcmVkIGludGVycnVwdCBpcworICogZXJyb25lb3VzbHkgZGVsaXZlcmVkIGFzIGVkZ2UtdHJpZ2dlcmVkIG9uZSBidXQgdGhlIHJlc3BlY3RpdmUgSVJSCisgKiBiaXQgZ2V0cyBzZXQgbmV2ZXJ0aGVsZXNzLiAgQXMgYSByZXN1bHQgdGhlIEkvTyB1bml0IGV4cGVjdHMgYW4gRU9JCisgKiBtZXNzYWdlIGJ1dCBpdCB3aWxsIG5ldmVyIGFycml2ZSBhbmQgZnVydGhlciBpbnRlcnJ1cHRzIGFyZSBibG9ja2VkCisgKiBmcm9tIHRoZSBzb3VyY2UuICBUaGUgZXhhY3QgcmVhc29uIGlzIHNvIGZhciB1bmtub3duLCBidXQgdGhlCisgKiBwaGVub21lbm9uIHdhcyBvYnNlcnZlZCB3aGVuIHR3byBjb25zZWN1dGl2ZSBpbnRlcnJ1cHQgcmVxdWVzdHMKKyAqIGZyb20gYSBnaXZlbiBzb3VyY2UgZ2V0IGRlbGl2ZXJlZCB0byB0aGUgc2FtZSBDUFUgYW5kIHRoZSBzb3VyY2UgaXMKKyAqIHRlbXBvcmFyaWx5IGRpc2FibGVkIGluIGJldHdlZW4uCisgKgorICogQSB3b3JrYXJvdW5kIGlzIHRvIHNpbXVsYXRlIGFuIEVPSSBtZXNzYWdlIG1hbnVhbGx5LiAgV2UgYWNoaWV2ZSBpdAorICogYnkgc2V0dGluZyB0aGUgdHJpZ2dlciBtb2RlIHRvIGVkZ2UgYW5kIHRoZW4gdG8gbGV2ZWwgd2hlbiB0aGUgZWRnZQorICogdHJpZ2dlciBtb2RlIGdldHMgZGV0ZWN0ZWQgaW4gdGhlIFRNUiBvZiBhIGxvY2FsIEFQSUMgZm9yIGEKKyAqIGxldmVsLXRyaWdnZXJlZCBpbnRlcnJ1cHQuICBXZSBtYXNrIHRoZSBzb3VyY2UgZm9yIHRoZSB0aW1lIG9mIHRoZQorICogb3BlcmF0aW9uIHRvIHByZXZlbnQgYW4gZWRnZS10cmlnZ2VyZWQgaW50ZXJydXB0IGVzY2FwaW5nIG1lYW53aGlsZS4KKyAqIFRoZSBpZGVhIGlzIGZyb20gTWFuZnJlZCBTcHJhdWwuICAtLW1hY3JvCisgKi8KKwlpID0gSU9fQVBJQ19WRUNUT1IoaXJxKTsKKworCXYgPSBhcGljX3JlYWQoQVBJQ19UTVIgKyAoKGkgJiB+MHgxZikgPj4gMSkpOworCisJYWNrX0FQSUNfaXJxKCk7CisKKwlpZiAoISh2ICYgKDEgPDwgKGkgJiAweDFmKSkpKSB7CisJCWF0b21pY19pbmMoJmlycV9taXNfY291bnQpOworCQlzcGluX2xvY2soJmlvYXBpY19sb2NrKTsKKwkJX19tYXNrX2FuZF9lZGdlX0lPX0FQSUNfaXJxKGlycSk7CisJCV9fdW5tYXNrX2FuZF9sZXZlbF9JT19BUElDX2lycShpcnEpOworCQlzcGluX3VubG9jaygmaW9hcGljX2xvY2spOworCX0KK30KKworI2lmZGVmIENPTkZJR19QQ0lfTVNJCitzdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0dXBfZWRnZV9pb2FwaWNfdmVjdG9yKHVuc2lnbmVkIGludCB2ZWN0b3IpCit7CisJaW50IGlycSA9IHZlY3Rvcl90b19pcnEodmVjdG9yKTsKKworCXJldHVybiBzdGFydHVwX2VkZ2VfaW9hcGljX2lycShpcnEpOworfQorCitzdGF0aWMgdm9pZCBhY2tfZWRnZV9pb2FwaWNfdmVjdG9yKHVuc2lnbmVkIGludCB2ZWN0b3IpCit7CisJaW50IGlycSA9IHZlY3Rvcl90b19pcnEodmVjdG9yKTsKKworCWFja19lZGdlX2lvYXBpY19pcnEoaXJxKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX2xldmVsX2lvYXBpY192ZWN0b3IgKHVuc2lnbmVkIGludCB2ZWN0b3IpCit7CisJaW50IGlycSA9IHZlY3Rvcl90b19pcnEodmVjdG9yKTsKKworCXJldHVybiBzdGFydHVwX2xldmVsX2lvYXBpY19pcnEgKGlycSk7Cit9CisKK3N0YXRpYyB2b2lkIGVuZF9sZXZlbF9pb2FwaWNfdmVjdG9yICh1bnNpZ25lZCBpbnQgdmVjdG9yKQoreworCWludCBpcnEgPSB2ZWN0b3JfdG9faXJxKHZlY3Rvcik7CisKKwllbmRfbGV2ZWxfaW9hcGljX2lycShpcnEpOworfQorCitzdGF0aWMgdm9pZCBtYXNrX0lPX0FQSUNfdmVjdG9yICh1bnNpZ25lZCBpbnQgdmVjdG9yKQoreworCWludCBpcnEgPSB2ZWN0b3JfdG9faXJxKHZlY3Rvcik7CisKKwltYXNrX0lPX0FQSUNfaXJxKGlycSk7Cit9CisKK3N0YXRpYyB2b2lkIHVubWFza19JT19BUElDX3ZlY3RvciAodW5zaWduZWQgaW50IHZlY3RvcikKK3sKKwlpbnQgaXJxID0gdmVjdG9yX3RvX2lycSh2ZWN0b3IpOworCisJdW5tYXNrX0lPX0FQSUNfaXJxKGlycSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9pb2FwaWNfYWZmaW5pdHlfdmVjdG9yICh1bnNpZ25lZCBpbnQgdmVjdG9yLAorCQkJCQljcHVtYXNrX3QgY3B1X21hc2spCit7CisJaW50IGlycSA9IHZlY3Rvcl90b19pcnEodmVjdG9yKTsKKworCXNldF9pb2FwaWNfYWZmaW5pdHlfaXJxKGlycSwgY3B1X21hc2spOworfQorI2VuZGlmCisKKy8qCisgKiBMZXZlbCBhbmQgZWRnZSB0cmlnZ2VyZWQgSU8tQVBJQyBpbnRlcnJ1cHRzIG5lZWQgZGlmZmVyZW50IGhhbmRsaW5nLAorICogc28gd2UgdXNlIHR3byBzZXBhcmF0ZSBJUlEgZGVzY3JpcHRvcnMuIEVkZ2UgdHJpZ2dlcmVkIElSUXMgY2FuIGJlCisgKiBoYW5kbGVkIHdpdGggdGhlIGxldmVsLXRyaWdnZXJlZCBkZXNjcmlwdG9yLCBidXQgdGhhdCBvbmUgaGFzIHNsaWdodGx5CisgKiBtb3JlIG92ZXJoZWFkLiBMZXZlbC10cmlnZ2VyZWQgaW50ZXJydXB0cyBjYW5ub3QgYmUgaGFuZGxlZCB3aXRoIHRoZQorICogZWRnZS10cmlnZ2VyZWQgaGFuZGxlciwgd2l0aG91dCByaXNraW5nIElSUSBzdG9ybXMgYW5kIG90aGVyIHVnbHkKKyAqIHJhY2VzLgorICovCitzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGlvYXBpY19lZGdlX3R5cGUgPSB7CisJLnR5cGVuYW1lIAk9ICJJTy1BUElDLWVkZ2UiLAorCS5zdGFydHVwIAk9IHN0YXJ0dXBfZWRnZV9pb2FwaWMsCisJLnNodXRkb3duIAk9IHNodXRkb3duX2VkZ2VfaW9hcGljLAorCS5lbmFibGUgCT0gZW5hYmxlX2VkZ2VfaW9hcGljLAorCS5kaXNhYmxlIAk9IGRpc2FibGVfZWRnZV9pb2FwaWMsCisJLmFjayAJCT0gYWNrX2VkZ2VfaW9hcGljLAorCS5lbmQgCQk9IGVuZF9lZGdlX2lvYXBpYywKKwkuc2V0X2FmZmluaXR5IAk9IHNldF9pb2FwaWNfYWZmaW5pdHksCit9OworCitzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGlvYXBpY19sZXZlbF90eXBlID0geworCS50eXBlbmFtZSAJPSAiSU8tQVBJQy1sZXZlbCIsCisJLnN0YXJ0dXAgCT0gc3RhcnR1cF9sZXZlbF9pb2FwaWMsCisJLnNodXRkb3duIAk9IHNodXRkb3duX2xldmVsX2lvYXBpYywKKwkuZW5hYmxlIAk9IGVuYWJsZV9sZXZlbF9pb2FwaWMsCisJLmRpc2FibGUgCT0gZGlzYWJsZV9sZXZlbF9pb2FwaWMsCisJLmFjayAJCT0gbWFza19hbmRfYWNrX2xldmVsX2lvYXBpYywKKwkuZW5kIAkJPSBlbmRfbGV2ZWxfaW9hcGljLAorCS5zZXRfYWZmaW5pdHkgCT0gc2V0X2lvYXBpY19hZmZpbml0eSwKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbml0X0lPX0FQSUNfdHJhcHModm9pZCkKK3sKKwlpbnQgaXJxOworCisJLyoKKwkgKiBOT1RFISBUaGUgbG9jYWwgQVBJQyBpc24ndCB2ZXJ5IGdvb2QgYXQgaGFuZGxpbmcKKwkgKiBtdWx0aXBsZSBpbnRlcnJ1cHRzIGF0IHRoZSBzYW1lIGludGVycnVwdCBsZXZlbC4KKwkgKiBBcyB0aGUgaW50ZXJydXB0IGxldmVsIGlzIGRldGVybWluZWQgYnkgdGFraW5nIHRoZQorCSAqIHZlY3RvciBudW1iZXIgYW5kIHNoaWZ0aW5nIHRoYXQgcmlnaHQgYnkgNCwgd2UKKwkgKiB3YW50IHRvIHNwcmVhZCB0aGVzZSBvdXQgYSBiaXQgc28gdGhhdCB0aGV5IGRvbid0CisJICogYWxsIGZhbGwgaW4gdGhlIHNhbWUgaW50ZXJydXB0IGxldmVsLgorCSAqCisJICogQWxzbywgd2UndmUgZ290IHRvIGJlIGNhcmVmdWwgbm90IHRvIHRyYXNoIGdhdGUKKwkgKiAweDgwLCBiZWNhdXNlIGludCAweDgwIGlzIGhtLCBraW5kIG9mIGltcG9ydGFudGlzaC4gOykKKwkgKi8KKwlmb3IgKGlycSA9IDA7IGlycSA8IE5SX0lSUVMgOyBpcnErKykgeworCQlpbnQgdG1wID0gaXJxOworCQlpZiAodXNlX3BjaV92ZWN0b3IoKSkgeworCQkJaWYgKCFwbGF0Zm9ybV9sZWdhY3lfaXJxKHRtcCkpCisJCQkJaWYgKCh0bXAgPSB2ZWN0b3JfdG9faXJxKHRtcCkpID09IC0xKQorCQkJCQljb250aW51ZTsKKwkJfQorCQlpZiAoSU9fQVBJQ19JUlEodG1wKSAmJiAhSU9fQVBJQ19WRUNUT1IodG1wKSkgeworCQkJLyoKKwkJCSAqIEhtbS4uIFdlIGRvbid0IGhhdmUgYW4gZW50cnkgZm9yIHRoaXMsCisJCQkgKiBzbyBkZWZhdWx0IHRvIGFuIG9sZC1mYXNoaW9uZWQgODI1OQorCQkJICogaW50ZXJydXB0IGlmIHdlIGNhbi4uCisJCQkgKi8KKwkJCWlmIChpcnEgPCAxNikKKwkJCQltYWtlXzgyNTlBX2lycShpcnEpOworCQkJZWxzZQorCQkJCS8qIFN0cmFuZ2UuIE9oLCB3ZWxsLi4gKi8KKwkJCQlpcnFfZGVzY1tpcnFdLmhhbmRsZXIgPSAmbm9faXJxX3R5cGU7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVuYWJsZV9sYXBpY19pcnEgKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5zaWduZWQgbG9uZyB2OworCisJdiA9IGFwaWNfcmVhZChBUElDX0xWVDApOworCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUMCwgdiAmIH5BUElDX0xWVF9NQVNLRUQpOworfQorCitzdGF0aWMgdm9pZCBkaXNhYmxlX2xhcGljX2lycSAodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBsb25nIHY7CisKKwl2ID0gYXBpY19yZWFkKEFQSUNfTFZUMCk7CisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQwLCB2IHwgQVBJQ19MVlRfTUFTS0VEKTsKK30KKworc3RhdGljIHZvaWQgYWNrX2xhcGljX2lycSAodW5zaWduZWQgaW50IGlycSkKK3sKKwlhY2tfQVBJQ19pcnEoKTsKK30KKworc3RhdGljIHZvaWQgZW5kX2xhcGljX2lycSAodW5zaWduZWQgaW50IGkpIHsgLyogbm90aGluZyAqLyB9CisKK3N0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgbGFwaWNfaXJxX3R5cGUgPSB7CisJLnR5cGVuYW1lIAk9ICJsb2NhbC1BUElDLWVkZ2UiLAorCS5zdGFydHVwIAk9IE5VTEwsIC8qIHN0YXJ0dXBfaXJxKCkgbm90IHVzZWQgZm9yIElSUTAgKi8KKwkuc2h1dGRvd24gCT0gTlVMTCwgLyogc2h1dGRvd25faXJxKCkgbm90IHVzZWQgZm9yIElSUTAgKi8KKwkuZW5hYmxlIAk9IGVuYWJsZV9sYXBpY19pcnEsCisJLmRpc2FibGUgCT0gZGlzYWJsZV9sYXBpY19pcnEsCisJLmFjayAJCT0gYWNrX2xhcGljX2lycSwKKwkuZW5kIAkJPSBlbmRfbGFwaWNfaXJxCit9OworCitzdGF0aWMgdm9pZCBzZXR1cF9ubWkgKHZvaWQpCit7CisJLyoKKyAJICogRGlydHkgdHJpY2sgdG8gZW5hYmxlIHRoZSBOTUkgd2F0Y2hkb2cgLi4uCisJICogV2UgcHV0IHRoZSA4MjU5QSBtYXN0ZXIgaW50byBBRU9JIG1vZGUgYW5kCisJICogdW5tYXNrIG9uIGFsbCBsb2NhbCBBUElDcyBMVlQwIGFzIE5NSS4KKwkgKgorCSAqIFRoZSBpZGVhIHRvIHVzZSB0aGUgODI1OUEgaW4gQUVPSSBtb2RlICgnODI1OUEgVmlydHVhbCBXaXJlJykKKwkgKiBpcyBmcm9tIE1hY2llaiBXLiBSb3p5Y2tpIC0gc28gd2UgZG8gbm90IGhhdmUgdG8gRU9JIGZyb20KKwkgKiB0aGUgTk1JIGhhbmRsZXIgb3IgdGhlIHRpbWVyIGludGVycnVwdC4KKwkgKi8gCisJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCBLRVJOX0lORk8gImFjdGl2YXRpbmcgTk1JIFdhdGNoZG9nIC4uLiIpOworCisJb25fZWFjaF9jcHUoZW5hYmxlX05NSV90aHJvdWdoX0xWVDAsIE5VTEwsIDEsIDEpOworCisJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiIGRvbmUuXG4iKTsKK30KKworLyoKKyAqIFRoaXMgbG9va3MgYSBiaXQgaGFja2lzaCBidXQgaXQncyBhYm91dCB0aGUgb25seSBvbmUgd2F5IG9mIHNlbmRpbmcKKyAqIGEgZmV3IElOVEEgY3ljbGVzIHRvIDgyNTlBcyBhbmQgYW55IGFzc29jaWF0ZWQgZ2x1ZSBsb2dpYy4gIElDUiBkb2VzCisgKiBub3Qgc3VwcG9ydCB0aGUgRXh0SU5UIG1vZGUsIHVuZm9ydHVuYXRlbHkuICBXZSBuZWVkIHRvIHNlbmQgdGhlc2UKKyAqIGN5Y2xlcyBhcyBzb21lIGk4MjQ4OURYLWJhc2VkIGJvYXJkcyBoYXZlIGdsdWUgbG9naWMgdGhhdCBrZWVwcyB0aGUKKyAqIDgyNTlBIGludGVycnVwdCBsaW5lIGFzc2VydGVkIHVudGlsIElOVEEuICAtLW1hY3JvCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB1bmxvY2tfRXh0SU5UX2xvZ2ljKHZvaWQpCit7CisJaW50IHBpbiwgaTsKKwlzdHJ1Y3QgSU9fQVBJQ19yb3V0ZV9lbnRyeSBlbnRyeTAsIGVudHJ5MTsKKwl1bnNpZ25lZCBjaGFyIHNhdmVfY29udHJvbCwgc2F2ZV9mcmVxX3NlbGVjdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcGluID0gZmluZF9pc2FfaXJxX3Bpbig4LCBtcF9JTlQpOworCWlmIChwaW4gPT0gLTEpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCSooKChpbnQgKikmZW50cnkwKSArIDEpID0gaW9fYXBpY19yZWFkKDAsIDB4MTEgKyAyICogcGluKTsKKwkqKCgoaW50ICopJmVudHJ5MCkgKyAwKSA9IGlvX2FwaWNfcmVhZCgwLCAweDEwICsgMiAqIHBpbik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwljbGVhcl9JT19BUElDX3BpbigwLCBwaW4pOworCisJbWVtc2V0KCZlbnRyeTEsIDAsIHNpemVvZihlbnRyeTEpKTsKKworCWVudHJ5MS5kZXN0X21vZGUgPSAwOwkJCS8qIHBoeXNpY2FsIGRlbGl2ZXJ5ICovCisJZW50cnkxLm1hc2sgPSAwOwkJCS8qIHVubWFzayBJUlEgbm93ICovCisJZW50cnkxLmRlc3QucGh5c2ljYWwucGh5c2ljYWxfZGVzdCA9IGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpOworCWVudHJ5MS5kZWxpdmVyeV9tb2RlID0gZGVzdF9FeHRJTlQ7CisJZW50cnkxLnBvbGFyaXR5ID0gZW50cnkwLnBvbGFyaXR5OworCWVudHJ5MS50cmlnZ2VyID0gMDsKKwllbnRyeTEudmVjdG9yID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCWlvX2FwaWNfd3JpdGUoMCwgMHgxMSArIDIgKiBwaW4sICooKChpbnQgKikmZW50cnkxKSArIDEpKTsKKwlpb19hcGljX3dyaXRlKDAsIDB4MTAgKyAyICogcGluLCAqKCgoaW50ICopJmVudHJ5MSkgKyAwKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKworCXNhdmVfY29udHJvbCA9IENNT1NfUkVBRChSVENfQ09OVFJPTCk7CisJc2F2ZV9mcmVxX3NlbGVjdCA9IENNT1NfUkVBRChSVENfRlJFUV9TRUxFQ1QpOworCUNNT1NfV1JJVEUoKHNhdmVfZnJlcV9zZWxlY3QgJiB+UlRDX1JBVEVfU0VMRUNUKSB8IDB4NiwKKwkJICAgUlRDX0ZSRVFfU0VMRUNUKTsKKwlDTU9TX1dSSVRFKHNhdmVfY29udHJvbCB8IFJUQ19QSUUsIFJUQ19DT05UUk9MKTsKKworCWkgPSAxMDA7CisJd2hpbGUgKGktLSA+IDApIHsKKwkJbWRlbGF5KDEwKTsKKwkJaWYgKChDTU9TX1JFQUQoUlRDX0lOVFJfRkxBR1MpICYgUlRDX1BGKSA9PSBSVENfUEYpCisJCQlpIC09IDEwOworCX0KKworCUNNT1NfV1JJVEUoc2F2ZV9jb250cm9sLCBSVENfQ09OVFJPTCk7CisJQ01PU19XUklURShzYXZlX2ZyZXFfc2VsZWN0LCBSVENfRlJFUV9TRUxFQ1QpOworCWNsZWFyX0lPX0FQSUNfcGluKDAsIHBpbik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwlpb19hcGljX3dyaXRlKDAsIDB4MTEgKyAyICogcGluLCAqKCgoaW50ICopJmVudHJ5MCkgKyAxKSk7CisJaW9fYXBpY193cml0ZSgwLCAweDEwICsgMiAqIHBpbiwgKigoKGludCAqKSZlbnRyeTApICsgMCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBUaGlzIGNvZGUgbWF5IGxvb2sgYSBiaXQgcGFyYW5vaWQsIGJ1dCBpdCdzIHN1cHBvc2VkIHRvIGNvb3BlcmF0ZSB3aXRoCisgKiBhIHdpZGUgcmFuZ2Ugb2YgYm9hcmRzIGFuZCBCSU9TIGJ1Z3MuICBGb3J0dW5hdGVseSBvbmx5IHRoZSB0aW1lciBJUlEKKyAqIGlzIHNvIHNjcmV3eS4gIFRoYW5rcyB0byBCcmlhbiBQZXJraW5zIGZvciB0ZXN0aW5nL2hhY2tpbmcgdGhpcyBiZWFzdAorICogZmFuYXRpY2FsbHkgb24gaGlzIHRydWx5IGJ1Z2d5IGJvYXJkLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2hlY2tfdGltZXIodm9pZCkKK3sKKwlpbnQgcGluMSwgcGluMjsKKwlpbnQgdmVjdG9yOworCisJLyoKKwkgKiBnZXQvc2V0IHRoZSB0aW1lciBJUlEgdmVjdG9yOgorCSAqLworCWRpc2FibGVfODI1OUFfaXJxKDApOworCXZlY3RvciA9IGFzc2lnbl9pcnFfdmVjdG9yKDApOworCXNldF9pbnRyX2dhdGUodmVjdG9yLCBpbnRlcnJ1cHRbMF0pOworCisJLyoKKwkgKiBTdWJ0bGUsIGNvZGUgaW4gZG9fdGltZXJfaW50ZXJydXB0KCkgZXhwZWN0cyBhbiBBRU9JCisJICogbW9kZSBmb3IgdGhlIDgyNTlBIHdoZW5ldmVyIGludGVycnVwdHMgYXJlIHJvdXRlZAorCSAqIHRocm91Z2ggSS9PIEFQSUNzLiAgQWxzbyBJUlEwIGhhcyB0byBiZSBlbmFibGVkIGluCisJICogdGhlIDgyNTlBIHdoaWNoIGltcGxpZXMgdGhlIHZpcnR1YWwgd2lyZSBoYXMgdG8gYmUKKwkgKiBkaXNhYmxlZCBpbiB0aGUgbG9jYWwgQVBJQy4KKwkgKi8KKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVDAsIEFQSUNfTFZUX01BU0tFRCB8IEFQSUNfRE1fRVhUSU5UKTsKKwlpbml0XzgyNTlBKDEpOworCXRpbWVyX2FjayA9IDE7CisJZW5hYmxlXzgyNTlBX2lycSgwKTsKKworCXBpbjEgPSBmaW5kX2lzYV9pcnFfcGluKDAsIG1wX0lOVCk7CisJcGluMiA9IGZpbmRfaXNhX2lycV9waW4oMCwgbXBfRXh0SU5UKTsKKworCXByaW50ayhLRVJOX0lORk8gIi4uVElNRVI6IHZlY3Rvcj0weCUwMlggcGluMT0lZCBwaW4yPSVkXG4iLCB2ZWN0b3IsIHBpbjEsIHBpbjIpOworCisJaWYgKHBpbjEgIT0gLTEpIHsKKwkJLyoKKwkJICogT2ssIGRvZXMgSVJRMCB0aHJvdWdoIHRoZSBJT0FQSUMgd29yaz8KKwkJICovCisJCXVubWFza19JT19BUElDX2lycSgwKTsKKwkJaWYgKHRpbWVyX2lycV93b3JrcygpKSB7CisJCQlpZiAobm1pX3dhdGNoZG9nID09IE5NSV9JT19BUElDKSB7CisJCQkJZGlzYWJsZV84MjU5QV9pcnEoMCk7CisJCQkJc2V0dXBfbm1pKCk7CisJCQkJZW5hYmxlXzgyNTlBX2lycSgwKTsKKwkJCQljaGVja19ubWlfd2F0Y2hkb2coKTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCQljbGVhcl9JT19BUElDX3BpbigwLCBwaW4xKTsKKwkJcHJpbnRrKEtFUk5fRVJSICIuLk1QLUJJT1MgYnVnOiA4MjU0IHRpbWVyIG5vdCBjb25uZWN0ZWQgdG8gSU8tQVBJQ1xuIik7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiLi4udHJ5aW5nIHRvIHNldCB1cCB0aW1lciAoSVJRMCkgdGhyb3VnaCB0aGUgODI1OUEgLi4uICIpOworCWlmIChwaW4yICE9IC0xKSB7CisJCXByaW50aygiXG4uLi4uLiAoZm91bmQgcGluICVkKSAuLi4iLCBwaW4yKTsKKwkJLyoKKwkJICogbGVnYWN5IGRldmljZXMgc2hvdWxkIGJlIGNvbm5lY3RlZCB0byBJTyBBUElDICMwCisJCSAqLworCQlzZXR1cF9FeHRJTlRfSVJRMF9waW4ocGluMiwgdmVjdG9yKTsKKwkJaWYgKHRpbWVyX2lycV93b3JrcygpKSB7CisJCQlwcmludGsoIndvcmtzLlxuIik7CisJCQlpZiAocGluMSAhPSAtMSkKKwkJCQlyZXBsYWNlX3Bpbl9hdF9pcnEoMCwgMCwgcGluMSwgMCwgcGluMik7CisJCQllbHNlCisJCQkJYWRkX3Bpbl90b19pcnEoMCwgMCwgcGluMik7CisJCQlpZiAobm1pX3dhdGNoZG9nID09IE5NSV9JT19BUElDKSB7CisJCQkJc2V0dXBfbm1pKCk7CisJCQkJY2hlY2tfbm1pX3dhdGNoZG9nKCk7CisJCQl9CisJCQlyZXR1cm47CisJCX0KKwkJLyoKKwkJICogQ2xlYW51cCwganVzdCBpbiBjYXNlIC4uLgorCQkgKi8KKwkJY2xlYXJfSU9fQVBJQ19waW4oMCwgcGluMik7CisJfQorCXByaW50aygiIGZhaWxlZC5cbiIpOworCisJaWYgKG5taV93YXRjaGRvZyA9PSBOTUlfSU9fQVBJQykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJ0aW1lciBkb2Vzbid0IHdvcmsgdGhyb3VnaCB0aGUgSU8tQVBJQyAtIGRpc2FibGluZyBOTUkgV2F0Y2hkb2chXG4iKTsKKwkJbm1pX3dhdGNoZG9nID0gMDsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIuLi50cnlpbmcgdG8gc2V0IHVwIHRpbWVyIGFzIFZpcnR1YWwgV2lyZSBJUlEuLi4iKTsKKworCWRpc2FibGVfODI1OUFfaXJxKDApOworCWlycV9kZXNjWzBdLmhhbmRsZXIgPSAmbGFwaWNfaXJxX3R5cGU7CisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQwLCBBUElDX0RNX0ZJWEVEIHwgdmVjdG9yKTsJLyogRml4ZWQgbW9kZSAqLworCWVuYWJsZV84MjU5QV9pcnEoMCk7CisKKwlpZiAodGltZXJfaXJxX3dvcmtzKCkpIHsKKwkJcHJpbnRrKCIgd29ya3MuXG4iKTsKKwkJcmV0dXJuOworCX0KKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVDAsIEFQSUNfTFZUX01BU0tFRCB8IEFQSUNfRE1fRklYRUQgfCB2ZWN0b3IpOworCXByaW50aygiIGZhaWxlZC5cbiIpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiLi4udHJ5aW5nIHRvIHNldCB1cCB0aW1lciBhcyBFeHRJTlQgSVJRLi4uIik7CisKKwl0aW1lcl9hY2sgPSAwOworCWluaXRfODI1OUEoMCk7CisJbWFrZV84MjU5QV9pcnEoMCk7CisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQwLCBBUElDX0RNX0VYVElOVCk7CisKKwl1bmxvY2tfRXh0SU5UX2xvZ2ljKCk7CisKKwlpZiAodGltZXJfaXJxX3dvcmtzKCkpIHsKKwkJcHJpbnRrKCIgd29ya3MuXG4iKTsKKwkJcmV0dXJuOworCX0KKwlwcmludGsoIiBmYWlsZWQgOiguXG4iKTsKKwlwYW5pYygiSU8tQVBJQyArIHRpbWVyIGRvZXNuJ3Qgd29yayEgIEJvb3Qgd2l0aCBhcGljPWRlYnVnIGFuZCBzZW5kIGEgIgorCQkicmVwb3J0LiAgVGhlbiB0cnkgYm9vdGluZyB3aXRoIHRoZSAnbm9hcGljJyBvcHRpb24iKTsKK30KKworLyoKKyAqCisgKiBJUlEncyB0aGF0IGFyZSBoYW5kbGVkIGJ5IHRoZSBQSUMgaW4gdGhlIE1QUyBJT0FQSUMgY2FzZS4KKyAqIC0gSVJRMiBpcyB0aGUgY2FzY2FkZSBJUlEsIGFuZCBjYW5ub3QgYmUgYSBpby1hcGljIElSUS4KKyAqICAgTGludXggZG9lc24ndCByZWFsbHkgY2FyZSwgYXMgaXQncyBub3QgYWN0dWFsbHkgdXNlZAorICogICBmb3IgYW55IGludGVycnVwdCBoYW5kbGluZyBhbnl3YXkuCisgKi8KKyNkZWZpbmUgUElDX0lSUVMJKDEgPDwgUElDX0NBU0NBREVfSVIpCisKK3ZvaWQgX19pbml0IHNldHVwX0lPX0FQSUModm9pZCkKK3sKKwllbmFibGVfSU9fQVBJQygpOworCisJaWYgKGFjcGlfaW9hcGljKQorCQlpb19hcGljX2lycXMgPSB+MDsJLyogYWxsIElSUXMgZ28gdGhyb3VnaCBJT0FQSUMgKi8KKwllbHNlCisJCWlvX2FwaWNfaXJxcyA9IH5QSUNfSVJRUzsKKworCXByaW50aygiRU5BQkxJTkcgSU8tQVBJQyBJUlFzXG4iKTsKKworCS8qCisJICogU2V0IHVwIElPLUFQSUMgSVJRIHJvdXRpbmcuCisJICovCisJaWYgKCFhY3BpX2lvYXBpYykKKwkJc2V0dXBfaW9hcGljX2lkc19mcm9tX21wYygpOworCXN5bmNfQXJiX0lEcygpOworCXNldHVwX0lPX0FQSUNfaXJxcygpOworCWluaXRfSU9fQVBJQ190cmFwcygpOworCWNoZWNrX3RpbWVyKCk7CisJaWYgKCFhY3BpX2lvYXBpYykKKwkJcHJpbnRfSU9fQVBJQygpOworfQorCisvKgorICoJQ2FsbGVkIGFmdGVyIGFsbCB0aGUgaW5pdGlhbGl6YXRpb24gaXMgZG9uZS4gSWYgd2UgZGlkbnQgZmluZCBhbnkKKyAqCUFQSUMgYnVncyB0aGVuIHdlIGNhbiBhbGxvdyB0aGUgbW9kaWZ5IGZhc3QgcGF0aAorICovCisgCitzdGF0aWMgaW50IF9faW5pdCBpb19hcGljX2J1Z19maW5hbGl6ZSh2b2lkKQoreworCWlmKHNpc19hcGljX2J1ZyA9PSAtMSkKKwkJc2lzX2FwaWNfYnVnID0gMDsKKwlyZXR1cm4gMDsKK30KKworbGF0ZV9pbml0Y2FsbChpb19hcGljX2J1Z19maW5hbGl6ZSk7CisKK3N0cnVjdCBzeXNmc19pb2FwaWNfZGF0YSB7CisJc3RydWN0IHN5c19kZXZpY2UgZGV2OworCXN0cnVjdCBJT19BUElDX3JvdXRlX2VudHJ5IGVudHJ5WzBdOworfTsKK3N0YXRpYyBzdHJ1Y3Qgc3lzZnNfaW9hcGljX2RhdGEgKiBtcF9pb2FwaWNfZGF0YVtNQVhfSU9fQVBJQ1NdOworCitzdGF0aWMgaW50IGlvYXBpY19zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIHUzMiBzdGF0ZSkKK3sKKwlzdHJ1Y3QgSU9fQVBJQ19yb3V0ZV9lbnRyeSAqZW50cnk7CisJc3RydWN0IHN5c2ZzX2lvYXBpY19kYXRhICpkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisJCisJZGF0YSA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBzeXNmc19pb2FwaWNfZGF0YSwgZGV2KTsKKwllbnRyeSA9IGRhdGEtPmVudHJ5OworCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBucl9pb2FwaWNfcmVnaXN0ZXJzW2Rldi0+aWRdOyBpICsrLCBlbnRyeSArKyApIHsKKwkJKigoKGludCAqKWVudHJ5KSArIDEpID0gaW9fYXBpY19yZWFkKGRldi0+aWQsIDB4MTEgKyAyICogaSk7CisJCSooKChpbnQgKillbnRyeSkgKyAwKSA9IGlvX2FwaWNfcmVhZChkZXYtPmlkLCAweDEwICsgMiAqIGkpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW9hcGljX3Jlc3VtZShzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBJT19BUElDX3JvdXRlX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3Qgc3lzZnNfaW9hcGljX2RhdGEgKmRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bmlvbiBJT19BUElDX3JlZ18wMCByZWdfMDA7CisJaW50IGk7CisJCisJZGF0YSA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBzeXNmc19pb2FwaWNfZGF0YSwgZGV2KTsKKwllbnRyeSA9IGRhdGEtPmVudHJ5OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJcmVnXzAwLnJhdyA9IGlvX2FwaWNfcmVhZChkZXYtPmlkLCAwKTsKKwlpZiAocmVnXzAwLmJpdHMuSUQgIT0gbXBfaW9hcGljc1tkZXYtPmlkXS5tcGNfYXBpY2lkKSB7CisJCXJlZ18wMC5iaXRzLklEID0gbXBfaW9hcGljc1tkZXYtPmlkXS5tcGNfYXBpY2lkOworCQlpb19hcGljX3dyaXRlKGRldi0+aWQsIDAsIHJlZ18wMC5yYXcpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgbnJfaW9hcGljX3JlZ2lzdGVyc1tkZXYtPmlkXTsgaSArKywgZW50cnkgKysgKSB7CisJCWlvX2FwaWNfd3JpdGUoZGV2LT5pZCwgMHgxMSsyKmksICooKChpbnQgKillbnRyeSkrMSkpOworCQlpb19hcGljX3dyaXRlKGRldi0+aWQsIDB4MTArMippLCAqKCgoaW50ICopZW50cnkpKzApKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHN5c2Rldl9jbGFzcyBpb2FwaWNfc3lzZGV2X2NsYXNzID0geworCXNldF9rc2V0X25hbWUoImlvYXBpYyIpLAorCS5zdXNwZW5kID0gaW9hcGljX3N1c3BlbmQsCisJLnJlc3VtZSA9IGlvYXBpY19yZXN1bWUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpb2FwaWNfaW5pdF9zeXNmcyh2b2lkKQoreworCXN0cnVjdCBzeXNfZGV2aWNlICogZGV2OworCWludCBpLCBzaXplLCBlcnJvciA9IDA7CisKKwllcnJvciA9IHN5c2Rldl9jbGFzc19yZWdpc3RlcigmaW9hcGljX3N5c2Rldl9jbGFzcyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfaW9hcGljczsgaSsrICkgeworCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBzeXNfZGV2aWNlKSArIG5yX2lvYXBpY19yZWdpc3RlcnNbaV0gCisJCQkqIHNpemVvZihzdHJ1Y3QgSU9fQVBJQ19yb3V0ZV9lbnRyeSk7CisJCW1wX2lvYXBpY19kYXRhW2ldID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFtcF9pb2FwaWNfZGF0YVtpXSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJDYW4ndCBzdXNwZW5kL3Jlc3VtZSBJT0FQSUMgJWRcbiIsIGkpOworCQkJY29udGludWU7CisJCX0KKwkJbWVtc2V0KG1wX2lvYXBpY19kYXRhW2ldLCAwLCBzaXplKTsKKwkJZGV2ID0gJm1wX2lvYXBpY19kYXRhW2ldLT5kZXY7CisJCWRldi0+aWQgPSBpOyAKKwkJZGV2LT5jbHMgPSAmaW9hcGljX3N5c2Rldl9jbGFzczsKKwkJZXJyb3IgPSBzeXNkZXZfcmVnaXN0ZXIoZGV2KTsKKwkJaWYgKGVycm9yKSB7CisJCQlrZnJlZShtcF9pb2FwaWNfZGF0YVtpXSk7CisJCQltcF9pb2FwaWNfZGF0YVtpXSA9IE5VTEw7CisJCQlwcmludGsoS0VSTl9FUlIgIkNhbid0IHN1c3BlbmQvcmVzdW1lIElPQVBJQyAlZFxuIiwgaSk7CisJCQljb250aW51ZTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitkZXZpY2VfaW5pdGNhbGwoaW9hcGljX2luaXRfc3lzZnMpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgICAgICBBQ1BJLWJhc2VkIElPQVBJQyBDb25maWd1cmF0aW9uCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgQ09ORklHX0FDUElfQk9PVAorCitpbnQgX19pbml0IGlvX2FwaWNfZ2V0X3VuaXF1ZV9pZCAoaW50IGlvYXBpYywgaW50IGFwaWNfaWQpCit7CisJdW5pb24gSU9fQVBJQ19yZWdfMDAgcmVnXzAwOworCXN0YXRpYyBwaHlzaWRfbWFza190IGFwaWNfaWRfbWFwID0gUEhZU0lEX01BU0tfTk9ORTsKKwlwaHlzaWRfbWFza190IHRtcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpID0gMDsKKworCS8qCisJICogVGhlIFA0IHBsYXRmb3JtIHN1cHBvcnRzIHVwIHRvIDI1NiBBUElDIElEcyBvbiB0d28gc2VwYXJhdGUgQVBJQyAKKwkgKiBidXNlcyAob25lIGZvciBMQVBJQ3MsIG9uZSBmb3IgSU9BUElDcyksIHdoZXJlIHByZWRlY2Vzc29ycyBvbmx5IAorCSAqIHN1cHBvcnRzIHVwIHRvIDE2IG9uIG9uZSBzaGFyZWQgQVBJQyBidXMuCisJICogCisJICogVEJEOiBFeHBhbmQgTEFQSUMvSU9BUElDIHN1cHBvcnQgb24gUDQtY2xhc3Mgc3lzdGVtcyB0byB0YWtlIGZ1bGwKKwkgKiAgICAgIGFkdmFudGFnZSBvZiBuZXcgQVBJQyBidXMgYXJjaGl0ZWN0dXJlLgorCSAqLworCisJaWYgKHBoeXNpZHNfZW1wdHkoYXBpY19pZF9tYXApKQorCQlhcGljX2lkX21hcCA9IGlvYXBpY19waHlzX2lkX21hcChwaHlzX2NwdV9wcmVzZW50X21hcCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwlyZWdfMDAucmF3ID0gaW9fYXBpY19yZWFkKGlvYXBpYywgMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKworCWlmIChhcGljX2lkID49IGdldF9waHlzaWNhbF9icm9hZGNhc3QoKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJJT0FQSUNbJWRdOiBJbnZhbGlkIGFwaWNfaWQgJWQsIHRyeWluZyAiCisJCQkiJWRcbiIsIGlvYXBpYywgYXBpY19pZCwgcmVnXzAwLmJpdHMuSUQpOworCQlhcGljX2lkID0gcmVnXzAwLmJpdHMuSUQ7CisJfQorCisJLyoKKwkgKiBFdmVyeSBBUElDIGluIGEgc3lzdGVtIG11c3QgaGF2ZSBhIHVuaXF1ZSBJRCBvciB3ZSBnZXQgbG90cyBvZiBuaWNlIAorCSAqICdzdHVjayBvbiBzbXBfaW52YWxpZGF0ZV9uZWVkZWQgSVBJIHdhaXQnIG1lc3NhZ2VzLgorCSAqLworCWlmIChjaGVja19hcGljaWRfdXNlZChhcGljX2lkX21hcCwgYXBpY19pZCkpIHsKKworCQlmb3IgKGkgPSAwOyBpIDwgZ2V0X3BoeXNpY2FsX2Jyb2FkY2FzdCgpOyBpKyspIHsKKwkJCWlmICghY2hlY2tfYXBpY2lkX3VzZWQoYXBpY19pZF9tYXAsIGkpKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKGkgPT0gZ2V0X3BoeXNpY2FsX2Jyb2FkY2FzdCgpKQorCQkJcGFuaWMoIk1heCBhcGljX2lkIGV4Y2VlZGVkIVxuIik7CisKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSU9BUElDWyVkXTogYXBpY19pZCAlZCBhbHJlYWR5IHVzZWQsICIKKwkJCSJ0cnlpbmcgJWRcbiIsIGlvYXBpYywgYXBpY19pZCwgaSk7CisKKwkJYXBpY19pZCA9IGk7CisJfSAKKworCXRtcCA9IGFwaWNpZF90b19jcHVfcHJlc2VudChhcGljX2lkKTsKKwlwaHlzaWRzX29yKGFwaWNfaWRfbWFwLCBhcGljX2lkX21hcCwgdG1wKTsKKworCWlmIChyZWdfMDAuYml0cy5JRCAhPSBhcGljX2lkKSB7CisJCXJlZ18wMC5iaXRzLklEID0gYXBpY19pZDsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwkJaW9fYXBpY193cml0ZShpb2FwaWMsIDAsIHJlZ18wMC5yYXcpOworCQlyZWdfMDAucmF3ID0gaW9fYXBpY19yZWFkKGlvYXBpYywgMCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisKKwkJLyogU2FuaXR5IGNoZWNrICovCisJCWlmIChyZWdfMDAuYml0cy5JRCAhPSBhcGljX2lkKQorCQkJcGFuaWMoIklPQVBJQ1slZF06IFVuYWJsZSBjaGFuZ2UgYXBpY19pZCFcbiIsIGlvYXBpYyk7CisJfQorCisJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCBLRVJOX0lORk8KKwkJCSJJT0FQSUNbJWRdOiBBc3NpZ25lZCBhcGljX2lkICVkXG4iLCBpb2FwaWMsIGFwaWNfaWQpOworCisJcmV0dXJuIGFwaWNfaWQ7Cit9CisKKworaW50IF9faW5pdCBpb19hcGljX2dldF92ZXJzaW9uIChpbnQgaW9hcGljKQoreworCXVuaW9uIElPX0FQSUNfcmVnXzAxCXJlZ18wMTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJcmVnXzAxLnJhdyA9IGlvX2FwaWNfcmVhZChpb2FwaWMsIDEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmVnXzAxLmJpdHMudmVyc2lvbjsKK30KKworCitpbnQgX19pbml0IGlvX2FwaWNfZ2V0X3JlZGlyX2VudHJpZXMgKGludCBpb2FwaWMpCit7CisJdW5pb24gSU9fQVBJQ19yZWdfMDEJcmVnXzAxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwlyZWdfMDEucmF3ID0gaW9fYXBpY19yZWFkKGlvYXBpYywgMSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZWdfMDEuYml0cy5lbnRyaWVzOworfQorCisKK2ludCBpb19hcGljX3NldF9wY2lfcm91dGluZyAoaW50IGlvYXBpYywgaW50IHBpbiwgaW50IGlycSwgaW50IGVkZ2VfbGV2ZWwsIGludCBhY3RpdmVfaGlnaF9sb3cpCit7CisJc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkgZW50cnk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghSU9fQVBJQ19JUlEoaXJxKSkgeworCQlwcmludGsoS0VSTl9FUlIgIklPQVBJQ1slZF06IEludmFsaWQgcmVmZXJlbmNlIHRvIElSUSAwXG4iLAorCQkJaW9hcGljKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBHZW5lcmF0ZSBhIFBDSSBJUlEgcm91dGluZyBlbnRyeSBhbmQgcHJvZ3JhbSB0aGUgSU9BUElDIGFjY29yZGluZ2x5LgorCSAqIE5vdGUgdGhhdCB3ZSBtYXNrIChkaXNhYmxlKSBJUlFzIG5vdyAtLSB0aGVzZSBnZXQgZW5hYmxlZCB3aGVuIHRoZQorCSAqIGNvcnJlc3BvbmRpbmcgZGV2aWNlIGRyaXZlciByZWdpc3RlcnMgZm9yIHRoaXMgSVJRLgorCSAqLworCisJbWVtc2V0KCZlbnRyeSwwLHNpemVvZihlbnRyeSkpOworCisJZW50cnkuZGVsaXZlcnlfbW9kZSA9IElOVF9ERUxJVkVSWV9NT0RFOworCWVudHJ5LmRlc3RfbW9kZSA9IElOVF9ERVNUX01PREU7CisJZW50cnkuZGVzdC5sb2dpY2FsLmxvZ2ljYWxfZGVzdCA9IGNwdV9tYXNrX3RvX2FwaWNpZChUQVJHRVRfQ1BVUyk7CisJZW50cnkudHJpZ2dlciA9IGVkZ2VfbGV2ZWw7CisJZW50cnkucG9sYXJpdHkgPSBhY3RpdmVfaGlnaF9sb3c7CisJZW50cnkubWFzayAgPSAxOworCisJLyoKKwkgKiBJUlFzIDwgMTYgYXJlIGFscmVhZHkgaW4gdGhlIGlycV8yX3BpbltdIG1hcAorCSAqLworCWlmIChpcnEgPj0gMTYpCisJCWFkZF9waW5fdG9faXJxKGlycSwgaW9hcGljLCBwaW4pOworCisJZW50cnkudmVjdG9yID0gYXNzaWduX2lycV92ZWN0b3IoaXJxKTsKKworCWFwaWNfcHJpbnRrKEFQSUNfREVCVUcsIEtFUk5fREVCVUcgIklPQVBJQ1slZF06IFNldCBQQ0kgcm91dGluZyBlbnRyeSAiCisJCSIoJWQtJWQgLT4gMHgleCAtPiBJUlEgJWQgTW9kZTolaSBBY3RpdmU6JWkpXG4iLCBpb2FwaWMsCisJCW1wX2lvYXBpY3NbaW9hcGljXS5tcGNfYXBpY2lkLCBwaW4sIGVudHJ5LnZlY3RvciwgaXJxLAorCQllZGdlX2xldmVsLCBhY3RpdmVfaGlnaF9sb3cpOworCisJaW9hcGljX3JlZ2lzdGVyX2ludHIoaXJxLCBlbnRyeS52ZWN0b3IsIGVkZ2VfbGV2ZWwpOworCisJaWYgKCFpb2FwaWMgJiYgKGlycSA8IDE2KSkKKwkJZGlzYWJsZV84MjU5QV9pcnEoaXJxKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCWlvX2FwaWNfd3JpdGUoaW9hcGljLCAweDExKzIqcGluLCAqKCgoaW50ICopJmVudHJ5KSsxKSk7CisJaW9fYXBpY193cml0ZShpb2FwaWMsIDB4MTArMipwaW4sICooKChpbnQgKikmZW50cnkpKzApKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKkNPTkZJR19BQ1BJX0JPT1QqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9pb3BvcnQuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvaW9wb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIyNTE2MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvaW9wb3J0LmMKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKglsaW51eC9hcmNoL2kzODYva2VybmVsL2lvcG9ydC5jCisgKgorICogVGhpcyBjb250YWlucyB0aGUgaW8tcGVybWlzc2lvbiBiaXRtYXAgY29kZSAtIHdyaXR0ZW4gYnkgb2J6LCB3aXRoIGNoYW5nZXMKKyAqIGJ5IExpbnVzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90aHJlYWRfaW5mby5oPgorCisvKiBTZXQgRVhURU5UIGJpdHMgc3RhcnRpbmcgYXQgQkFTRSBpbiBCSVRNQVAgdG8gdmFsdWUgVFVSTl9PTi4gKi8KK3N0YXRpYyB2b2lkIHNldF9iaXRtYXAodW5zaWduZWQgbG9uZyAqYml0bWFwLCB1bnNpZ25lZCBpbnQgYmFzZSwgdW5zaWduZWQgaW50IGV4dGVudCwgaW50IG5ld192YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIG1hc2s7CisJdW5zaWduZWQgbG9uZyAqYml0bWFwX2Jhc2UgPSBiaXRtYXAgKyAoYmFzZSAvIEJJVFNfUEVSX0xPTkcpOworCXVuc2lnbmVkIGludCBsb3dfaW5kZXggPSBiYXNlICYgKEJJVFNfUEVSX0xPTkctMSk7CisJaW50IGxlbmd0aCA9IGxvd19pbmRleCArIGV4dGVudDsKKworCWlmIChsb3dfaW5kZXggIT0gMCkgeworCQltYXNrID0gKH4wVUwgPDwgbG93X2luZGV4KTsKKwkJaWYgKGxlbmd0aCA8IEJJVFNfUEVSX0xPTkcpCisJCQltYXNrICY9IH4ofjBVTCA8PCBsZW5ndGgpOworCQlpZiAobmV3X3ZhbHVlKQorCQkJKmJpdG1hcF9iYXNlKysgfD0gbWFzazsKKwkJZWxzZQorCQkJKmJpdG1hcF9iYXNlKysgJj0gfm1hc2s7CisJCWxlbmd0aCAtPSBCSVRTX1BFUl9MT05HOworCX0KKworCW1hc2sgPSAobmV3X3ZhbHVlID8gfjBVTCA6IDBVTCk7CisJd2hpbGUgKGxlbmd0aCA+PSBCSVRTX1BFUl9MT05HKSB7CisJCSpiaXRtYXBfYmFzZSsrID0gbWFzazsKKwkJbGVuZ3RoIC09IEJJVFNfUEVSX0xPTkc7CisJfQorCisJaWYgKGxlbmd0aCA+IDApIHsKKwkJbWFzayA9IH4ofjBVTCA8PCBsZW5ndGgpOworCQlpZiAobmV3X3ZhbHVlKQorCQkJKmJpdG1hcF9iYXNlKysgfD0gbWFzazsKKwkJZWxzZQorCQkJKmJpdG1hcF9iYXNlKysgJj0gfm1hc2s7CisJfQorfQorCisKKy8qCisgKiB0aGlzIGNoYW5nZXMgdGhlIGlvIHBlcm1pc3Npb25zIGJpdG1hcCBpbiB0aGUgY3VycmVudCB0YXNrLgorICovCithc21saW5rYWdlIGxvbmcgc3lzX2lvcGVybSh1bnNpZ25lZCBsb25nIGZyb20sIHVuc2lnbmVkIGxvbmcgbnVtLCBpbnQgdHVybl9vbikKK3sKKwl1bnNpZ25lZCBsb25nIGksIG1heF9sb25nLCBieXRlcywgYnl0ZXNfdXBkYXRlZDsKKwlzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqIHQgPSAmY3VycmVudC0+dGhyZWFkOworCXN0cnVjdCB0c3Nfc3RydWN0ICogdHNzOworCXVuc2lnbmVkIGxvbmcgKmJpdG1hcDsKKworCWlmICgoZnJvbSArIG51bSA8PSBmcm9tKSB8fCAoZnJvbSArIG51bSA+IElPX0JJVE1BUF9CSVRTKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHR1cm5fb24gJiYgIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpCisJCXJldHVybiAtRVBFUk07CisKKwkvKgorCSAqIElmIGl0J3MgdGhlIGZpcnN0IGlvcGVybSgpIGNhbGwgaW4gdGhpcyB0aHJlYWQncyBsaWZldGltZSwgc2V0IHRoZQorCSAqIElPIGJpdG1hcCB1cC4gaW9wZXJtKCkgaXMgbXVjaCBsZXNzIHRpbWluZyBjcml0aWNhbCB0aGFuIGNsb25lKCksCisJICogdGhpcyBpcyB3aHkgd2UgZGVsYXkgdGhpcyBvcGVyYXRpb24gdW50aWwgbm93OgorCSAqLworCWlmICghdC0+aW9fYml0bWFwX3B0cikgeworCQliaXRtYXAgPSBrbWFsbG9jKElPX0JJVE1BUF9CWVRFUywgR0ZQX0tFUk5FTCk7CisJCWlmICghYml0bWFwKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJbWVtc2V0KGJpdG1hcCwgMHhmZiwgSU9fQklUTUFQX0JZVEVTKTsKKwkJdC0+aW9fYml0bWFwX3B0ciA9IGJpdG1hcDsKKwl9CisKKwkvKgorCSAqIGRvIGl0IGluIHRoZSBwZXItdGhyZWFkIGNvcHkgYW5kIGluIHRoZSBUU1MgLi4uCisJICoKKwkgKiBEaXNhYmxlIHByZWVtcHRpb24gdmlhIGdldF9jcHUoKSAtIHdlIG11c3Qgbm90IHN3aXRjaCBhd2F5CisJICogYmVjYXVzZSB0aGUgLT5pb19iaXRtYXBfbWF4IHZhbHVlIG11c3QgbWF0Y2ggdGhlIGJpdG1hcAorCSAqIGNvbnRlbnRzOgorCSAqLworCXRzcyA9ICZwZXJfY3B1KGluaXRfdHNzLCBnZXRfY3B1KCkpOworCisJc2V0X2JpdG1hcCh0LT5pb19iaXRtYXBfcHRyLCBmcm9tLCBudW0sICF0dXJuX29uKTsKKworCS8qCisJICogU2VhcmNoIGZvciBhIChwb3NzaWJseSBuZXcpIG1heGltdW0uIFRoaXMgaXMgc2ltcGxlIGFuZCBzdHVwaWQsCisJICogdG8ga2VlcCBpdCBvYnZpb3VzbHkgY29ycmVjdDoKKwkgKi8KKwltYXhfbG9uZyA9IDA7CisJZm9yIChpID0gMDsgaSA8IElPX0JJVE1BUF9MT05HUzsgaSsrKQorCQlpZiAodC0+aW9fYml0bWFwX3B0cltpXSAhPSB+MFVMKQorCQkJbWF4X2xvbmcgPSBpOworCisJYnl0ZXMgPSAobWF4X2xvbmcgKyAxKSAqIHNpemVvZihsb25nKTsKKwlieXRlc191cGRhdGVkID0gbWF4KGJ5dGVzLCB0LT5pb19iaXRtYXBfbWF4KTsKKworCXQtPmlvX2JpdG1hcF9tYXggPSBieXRlczsKKworCS8qCisJICogU2V0cyB0aGUgbGF6eSB0cmlnZ2VyIHNvIHRoYXQgdGhlIG5leHQgSS9PIG9wZXJhdGlvbiB3aWxsCisJICogcmVsb2FkIHRoZSBjb3JyZWN0IGJpdG1hcC4KKwkgKi8KKwl0c3MtPmlvX2JpdG1hcF9iYXNlID0gSU5WQUxJRF9JT19CSVRNQVBfT0ZGU0VUX0xBWlk7CisKKwlwdXRfY3B1KCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHN5c19pb3BsIGhhcyB0byBiZSB1c2VkIHdoZW4geW91IHdhbnQgdG8gYWNjZXNzIHRoZSBJTyBwb3J0cworICogYmV5b25kIHRoZSAweDNmZiByYW5nZTogdG8gZ2V0IHRoZSBmdWxsIDY1NTM2IHBvcnRzIGJpdG1hcHBlZAorICogeW91J2QgbmVlZCA4a0Igb2YgYml0bWFwcy9wcm9jZXNzLCB3aGljaCBpcyBhIGJpdCBleGNlc3NpdmUuCisgKgorICogSGVyZSB3ZSBqdXN0IGNoYW5nZSB0aGUgZWZsYWdzIHZhbHVlIG9uIHRoZSBzdGFjazogd2UgYWxsb3cKKyAqIG9ubHkgdGhlIHN1cGVyLXVzZXIgdG8gZG8gaXQuIFRoaXMgZGVwZW5kcyBvbiB0aGUgc3RhY2stbGF5b3V0CisgKiBvbiBzeXN0ZW0tY2FsbCBlbnRyeSAtIHNlZSBhbHNvIGZvcmsoKSBhbmQgdGhlIHNpZ25hbCBoYW5kbGluZworICogY29kZS4KKyAqLworCithc21saW5rYWdlIGxvbmcgc3lzX2lvcGwodW5zaWduZWQgbG9uZyB1bnVzZWQpCit7CisJdm9sYXRpbGUgc3RydWN0IHB0X3JlZ3MgKiByZWdzID0gKHN0cnVjdCBwdF9yZWdzICopICZ1bnVzZWQ7CisJdW5zaWduZWQgaW50IGxldmVsID0gcmVncy0+ZWJ4OworCXVuc2lnbmVkIGludCBvbGQgPSAocmVncy0+ZWZsYWdzID4+IDEyKSAmIDM7CisKKwlpZiAobGV2ZWwgPiAzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkvKiBUcnlpbmcgdG8gZ2FpbiBtb3JlIHByaXZpbGVnZXM/ICovCisJaWYgKGxldmVsID4gb2xkKSB7CisJCWlmICghY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKwkJCXJldHVybiAtRVBFUk07CisJfQorCXJlZ3MtPmVmbGFncyA9IChyZWdzLT5lZmxhZ3MgJn4gMHgzMDAwVUwpIHwgKGxldmVsIDw8IDEyKTsKKwkvKiBNYWtlIHN1cmUgd2UgcmV0dXJuIHRoZSBsb25nIHdheSAobm90IHN5c2VudGVyKSAqLworCXNldF90aHJlYWRfZmxhZyhUSUZfSVJFVCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2lycS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9pcnEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mzk0NWEzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9pcnEuYwpAQCAtMCwwICsxLDI2MSBAQAorLyoKKyAqCWxpbnV4L2FyY2gvaTM4Ni9rZXJuZWwvaXJxLmMKKyAqCisgKglDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTggTGludXMgVG9ydmFsZHMsIEluZ28gTW9sbmFyCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBsb3dlc3QgbGV2ZWwgeDg2LXNwZWNpZmljIGludGVycnVwdAorICogZW50cnksIGlycS1zdGFja3MgYW5kIGlycSBzdGF0aXN0aWNzIGNvZGUuIEFsbCB0aGUgcmVtYWluaW5nCisgKiBpcnEgbG9naWMgaXMgZG9uZSBieSB0aGUgZ2VuZXJpYyBrZXJuZWwvaXJxLyBjb2RlIGFuZAorICogYnkgdGhlIHg4Ni1zcGVjaWZpYyBpcnEgY29udHJvbGxlciBjb2RlLiAoZS5nLiBpODI1OS5jIGFuZAorICogaW9fYXBpYy5jLikKKyAqLworCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CisKK0RFRklORV9QRVJfQ1BVKGlycV9jcHVzdGF0X3QsIGlycV9zdGF0KSBfX19fY2FjaGVsaW5lX21heGFsaWduZWRfaW5fc21wOworRVhQT1JUX1BFUl9DUFVfU1lNQk9MKGlycV9zdGF0KTsKKworI2lmbmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKKy8qCisgKiAnd2hhdCBzaG91bGQgd2UgZG8gaWYgd2UgZ2V0IGEgaHcgaXJxIGV2ZW50IG9uIGFuIGlsbGVnYWwgdmVjdG9yJy4KKyAqIGVhY2ggYXJjaGl0ZWN0dXJlIGhhcyB0byBhbnN3ZXIgdGhpcyB0aGVtc2VsdmVzLgorICovCit2b2lkIGFja19iYWRfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJcHJpbnRrKCJ1bmV4cGVjdGVkIElSUSB0cmFwIGF0IHZlY3RvciAlMDJ4XG4iLCBpcnEpOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfNEtTVEFDS1MKKy8qCisgKiBwZXItQ1BVIElSUSBoYW5kbGluZyBjb250ZXh0cyAodGhyZWFkIGluZm9ybWF0aW9uIGFuZCBzdGFjaykKKyAqLwordW5pb24gaXJxX2N0eCB7CisJc3RydWN0IHRocmVhZF9pbmZvICAgICAgdGluZm87CisJdTMyICAgICAgICAgICAgICAgICAgICAgc3RhY2tbVEhSRUFEX1NJWkUvc2l6ZW9mKHUzMildOworfTsKKworc3RhdGljIHVuaW9uIGlycV9jdHggKmhhcmRpcnFfY3R4W05SX0NQVVNdOworc3RhdGljIHVuaW9uIGlycV9jdHggKnNvZnRpcnFfY3R4W05SX0NQVVNdOworI2VuZGlmCisKKy8qCisgKiBkb19JUlEgaGFuZGxlcyBhbGwgbm9ybWFsIGRldmljZSBJUlEncyAodGhlIHNwZWNpYWwKKyAqIFNNUCBjcm9zcy1DUFUgaW50ZXJydXB0cyBoYXZlIHRoZWlyIG93biBzcGVjaWZpYworICogaGFuZGxlcnMpLgorICovCitmYXN0Y2FsbCB1bnNpZ25lZCBpbnQgZG9fSVJRKHN0cnVjdCBwdF9yZWdzICpyZWdzKQorewkKKwkvKiBoaWdoIGJpdHMgdXNlZCBpbiByZXRfZnJvbV8gY29kZSAqLworCWludCBpcnEgPSByZWdzLT5vcmlnX2VheCAmIDB4ZmY7CisjaWZkZWYgQ09ORklHXzRLU1RBQ0tTCisJdW5pb24gaXJxX2N0eCAqY3VyY3R4LCAqaXJxY3R4OworCXUzMiAqaXNwOworI2VuZGlmCisKKwlpcnFfZW50ZXIoKTsKKyNpZmRlZiBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVworCS8qIERlYnVnZ2luZyBjaGVjayBmb3Igc3RhY2sgb3ZlcmZsb3c6IGlzIHRoZXJlIGxlc3MgdGhhbiAxS0IgZnJlZT8gKi8KKwl7CisJCWxvbmcgZXNwOworCisJCV9fYXNtX18gX192b2xhdGlsZV9fKCJhbmRsICUlZXNwLCUwIiA6CisJCQkJCSI9ciIgKGVzcCkgOiAiMCIgKFRIUkVBRF9TSVpFIC0gMSkpOworCQlpZiAodW5saWtlbHkoZXNwIDwgKHNpemVvZihzdHJ1Y3QgdGhyZWFkX2luZm8pICsgU1RBQ0tfV0FSTikpKSB7CisJCQlwcmludGsoImRvX0lSUTogc3RhY2sgb3ZlcmZsb3c6ICVsZFxuIiwKKwkJCQllc3AgLSBzaXplb2Yoc3RydWN0IHRocmVhZF9pbmZvKSk7CisJCQlkdW1wX3N0YWNrKCk7CisJCX0KKwl9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR180S1NUQUNLUworCisJY3VyY3R4ID0gKHVuaW9uIGlycV9jdHggKikgY3VycmVudF90aHJlYWRfaW5mbygpOworCWlycWN0eCA9IGhhcmRpcnFfY3R4W3NtcF9wcm9jZXNzb3JfaWQoKV07CisKKwkvKgorCSAqIHRoaXMgaXMgd2hlcmUgd2Ugc3dpdGNoIHRvIHRoZSBJUlEgc3RhY2suIEhvd2V2ZXIsIGlmIHdlIGFyZQorCSAqIGFscmVhZHkgdXNpbmcgdGhlIElSUSBzdGFjayAoYmVjYXVzZSB3ZSBpbnRlcnJ1cHRlZCBhIGhhcmRpcnEKKwkgKiBoYW5kbGVyKSB3ZSBjYW4ndCBkbyB0aGF0IGFuZCBqdXN0IGhhdmUgdG8ga2VlcCB1c2luZyB0aGUKKwkgKiBjdXJyZW50IHN0YWNrICh3aGljaCBpcyB0aGUgaXJxIHN0YWNrIGFscmVhZHkgYWZ0ZXIgYWxsKQorCSAqLworCWlmIChjdXJjdHggIT0gaXJxY3R4KSB7CisJCWludCBhcmcxLCBhcmcyLCBlYng7CisKKwkJLyogYnVpbGQgdGhlIHN0YWNrIGZyYW1lIG9uIHRoZSBJUlEgc3RhY2sgKi8KKwkJaXNwID0gKHUzMiopICgoY2hhciopaXJxY3R4ICsgc2l6ZW9mKCppcnFjdHgpKTsKKwkJaXJxY3R4LT50aW5mby50YXNrID0gY3VyY3R4LT50aW5mby50YXNrOworCQlpcnFjdHgtPnRpbmZvLnByZXZpb3VzX2VzcCA9IGN1cnJlbnRfc3RhY2tfcG9pbnRlcjsKKworCQlhc20gdm9sYXRpbGUoCisJCQkiICAgICAgIHhjaGdsICAgJSVlYngsJSVlc3AgICAgICBcbiIKKwkJCSIgICAgICAgY2FsbCAgICBfX2RvX0lSUSAgICAgICAgIFxuIgorCQkJIiAgICAgICBtb3ZsICAgJSVlYngsJSVlc3AgICAgICBcbiIKKwkJCTogIj1hIiAoYXJnMSksICI9ZCIgKGFyZzIpLCAiPWIiIChlYngpCisJCQk6ICAiMCIgKGlycSksICAgIjEiIChyZWdzKSwgICIyIiAoaXNwKQorCQkJOiAibWVtb3J5IiwgImNjIiwgImVjeCIKKwkJKTsKKwl9IGVsc2UKKyNlbmRpZgorCQlfX2RvX0lSUShpcnEsIHJlZ3MpOworCisJaXJxX2V4aXQoKTsKKworCXJldHVybiAxOworfQorCisjaWZkZWYgQ09ORklHXzRLU1RBQ0tTCisKKy8qCisgKiBUaGVzZSBzaG91bGQgcmVhbGx5IGJlIF9fc2VjdGlvbl9fKCIuYnNzLnBhZ2VfYWxpZ25lZCIpIGFzIHdlbGwsIGJ1dAorICogZ2NjJ3MgMy4wIGFuZCBlYXJsaWVyIGRvbid0IGhhbmRsZSB0aGF0IGNvcnJlY3RseS4KKyAqLworc3RhdGljIGNoYXIgc29mdGlycV9zdGFja1tOUl9DUFVTICogVEhSRUFEX1NJWkVdCisJCV9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKFRIUkVBRF9TSVpFKSkpOworCitzdGF0aWMgY2hhciBoYXJkaXJxX3N0YWNrW05SX0NQVVMgKiBUSFJFQURfU0laRV0KKwkJX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oVEhSRUFEX1NJWkUpKSk7CisKKy8qCisgKiBhbGxvY2F0ZSBwZXItY3B1IHN0YWNrcyBmb3IgaGFyZGlycSBhbmQgZm9yIHNvZnRpcnEgcHJvY2Vzc2luZworICovCit2b2lkIGlycV9jdHhfaW5pdChpbnQgY3B1KQoreworCXVuaW9uIGlycV9jdHggKmlycWN0eDsKKworCWlmIChoYXJkaXJxX2N0eFtjcHVdKQorCQlyZXR1cm47CisKKwlpcnFjdHggPSAodW5pb24gaXJxX2N0eCopICZoYXJkaXJxX3N0YWNrW2NwdSpUSFJFQURfU0laRV07CisJaXJxY3R4LT50aW5mby50YXNrICAgICAgICAgICAgICA9IE5VTEw7CisJaXJxY3R4LT50aW5mby5leGVjX2RvbWFpbiAgICAgICA9IE5VTEw7CisJaXJxY3R4LT50aW5mby5jcHUgICAgICAgICAgICAgICA9IGNwdTsKKwlpcnFjdHgtPnRpbmZvLnByZWVtcHRfY291bnQgICAgID0gSEFSRElSUV9PRkZTRVQ7CisJaXJxY3R4LT50aW5mby5hZGRyX2xpbWl0ICAgICAgICA9IE1BS0VfTU1fU0VHKDApOworCisJaGFyZGlycV9jdHhbY3B1XSA9IGlycWN0eDsKKworCWlycWN0eCA9ICh1bmlvbiBpcnFfY3R4KikgJnNvZnRpcnFfc3RhY2tbY3B1KlRIUkVBRF9TSVpFXTsKKwlpcnFjdHgtPnRpbmZvLnRhc2sgICAgICAgICAgICAgID0gTlVMTDsKKwlpcnFjdHgtPnRpbmZvLmV4ZWNfZG9tYWluICAgICAgID0gTlVMTDsKKwlpcnFjdHgtPnRpbmZvLmNwdSAgICAgICAgICAgICAgID0gY3B1OworCWlycWN0eC0+dGluZm8ucHJlZW1wdF9jb3VudCAgICAgPSBTT0ZUSVJRX09GRlNFVDsKKwlpcnFjdHgtPnRpbmZvLmFkZHJfbGltaXQgICAgICAgID0gTUFLRV9NTV9TRUcoMCk7CisKKwlzb2Z0aXJxX2N0eFtjcHVdID0gaXJxY3R4OworCisJcHJpbnRrKCJDUFUgJXUgaXJxc3RhY2tzLCBoYXJkPSVwIHNvZnQ9JXBcbiIsCisJCWNwdSxoYXJkaXJxX2N0eFtjcHVdLHNvZnRpcnFfY3R4W2NwdV0pOworfQorCitleHRlcm4gYXNtbGlua2FnZSB2b2lkIF9fZG9fc29mdGlycSh2b2lkKTsKKworYXNtbGlua2FnZSB2b2lkIGRvX3NvZnRpcnEodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB0aHJlYWRfaW5mbyAqY3VyY3R4OworCXVuaW9uIGlycV9jdHggKmlycWN0eDsKKwl1MzIgKmlzcDsKKworCWlmIChpbl9pbnRlcnJ1cHQoKSkKKwkJcmV0dXJuOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJaWYgKGxvY2FsX3NvZnRpcnFfcGVuZGluZygpKSB7CisJCWN1cmN0eCA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKTsKKwkJaXJxY3R4ID0gc29mdGlycV9jdHhbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKKwkJaXJxY3R4LT50aW5mby50YXNrID0gY3VyY3R4LT50YXNrOworCQlpcnFjdHgtPnRpbmZvLnByZXZpb3VzX2VzcCA9IGN1cnJlbnRfc3RhY2tfcG9pbnRlcjsKKworCQkvKiBidWlsZCB0aGUgc3RhY2sgZnJhbWUgb24gdGhlIHNvZnRpcnEgc3RhY2sgKi8KKwkJaXNwID0gKHUzMiopICgoY2hhciopaXJxY3R4ICsgc2l6ZW9mKCppcnFjdHgpKTsKKworCQlhc20gdm9sYXRpbGUoCisJCQkiICAgICAgIHhjaGdsICAgJSVlYngsJSVlc3AgICAgIFxuIgorCQkJIiAgICAgICBjYWxsICAgIF9fZG9fc29mdGlycSAgICBcbiIKKwkJCSIgICAgICAgbW92bCAgICAlJWVieCwlJWVzcCAgICAgXG4iCisJCQk6ICI9YiIoaXNwKQorCQkJOiAiMCIoaXNwKQorCQkJOiAibWVtb3J5IiwgImNjIiwgImVkeCIsICJlY3giLCAiZWF4IgorCQkpOworCX0KKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworRVhQT1JUX1NZTUJPTChkb19zb2Z0aXJxKTsKKyNlbmRpZgorCisvKgorICogSW50ZXJydXB0IHN0YXRpc3RpY3M6CisgKi8KKworYXRvbWljX3QgaXJxX2Vycl9jb3VudDsKKworLyoKKyAqIC9wcm9jL2ludGVycnVwdHMgcHJpbnRpbmc6CisgKi8KKworaW50IHNob3dfaW50ZXJydXB0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpCit7CisJaW50IGkgPSAqKGxvZmZfdCAqKSB2LCBqOworCXN0cnVjdCBpcnFhY3Rpb24gKiBhY3Rpb247CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChpID09IDApIHsKKwkJc2VxX3ByaW50ZihwLCAiICAgICAgICAgICAiKTsKKwkJZm9yIChqPTA7IGo8TlJfQ1BVUzsgaisrKQorCQkJaWYgKGNwdV9vbmxpbmUoaikpCisJCQkJc2VxX3ByaW50ZihwLCAiQ1BVJWQgICAgICAgIixqKTsKKwkJc2VxX3B1dGMocCwgJ1xuJyk7CisJfQorCisJaWYgKGkgPCBOUl9JUlFTKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpcnFfZGVzY1tpXS5sb2NrLCBmbGFncyk7CisJCWFjdGlvbiA9IGlycV9kZXNjW2ldLmFjdGlvbjsKKwkJaWYgKCFhY3Rpb24pCisJCQlnb3RvIHNraXA7CisJCXNlcV9wcmludGYocCwgIiUzZDogIixpKTsKKyNpZm5kZWYgQ09ORklHX1NNUAorCQlzZXFfcHJpbnRmKHAsICIlMTB1ICIsIGtzdGF0X2lycXMoaSkpOworI2Vsc2UKKwkJZm9yIChqID0gMDsgaiA8IE5SX0NQVVM7IGorKykKKwkJCWlmIChjcHVfb25saW5lKGopKQorCQkJCXNlcV9wcmludGYocCwgIiUxMHUgIiwga3N0YXRfY3B1KGopLmlycXNbaV0pOworI2VuZGlmCisJCXNlcV9wcmludGYocCwgIiAlMTRzIiwgaXJxX2Rlc2NbaV0uaGFuZGxlci0+dHlwZW5hbWUpOworCQlzZXFfcHJpbnRmKHAsICIgICVzIiwgYWN0aW9uLT5uYW1lKTsKKworCQlmb3IgKGFjdGlvbj1hY3Rpb24tPm5leHQ7IGFjdGlvbjsgYWN0aW9uID0gYWN0aW9uLT5uZXh0KQorCQkJc2VxX3ByaW50ZihwLCAiLCAlcyIsIGFjdGlvbi0+bmFtZSk7CisKKwkJc2VxX3B1dGMocCwgJ1xuJyk7Citza2lwOgorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFfZGVzY1tpXS5sb2NrLCBmbGFncyk7CisJfSBlbHNlIGlmIChpID09IE5SX0lSUVMpIHsKKwkJc2VxX3ByaW50ZihwLCAiTk1JOiAiKTsKKwkJZm9yIChqID0gMDsgaiA8IE5SX0NQVVM7IGorKykKKwkJCWlmIChjcHVfb25saW5lKGopKQorCQkJCXNlcV9wcmludGYocCwgIiUxMHUgIiwgbm1pX2NvdW50KGopKTsKKwkJc2VxX3B1dGMocCwgJ1xuJyk7CisjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCisJCXNlcV9wcmludGYocCwgIkxPQzogIik7CisJCWZvciAoaiA9IDA7IGogPCBOUl9DUFVTOyBqKyspCisJCQlpZiAoY3B1X29ubGluZShqKSkKKwkJCQlzZXFfcHJpbnRmKHAsICIlMTB1ICIsCisJCQkJCXBlcl9jcHUoaXJxX3N0YXQsaikuYXBpY190aW1lcl9pcnFzKTsKKwkJc2VxX3B1dGMocCwgJ1xuJyk7CisjZW5kaWYKKwkJc2VxX3ByaW50ZihwLCAiRVJSOiAlMTB1XG4iLCBhdG9taWNfcmVhZCgmaXJxX2Vycl9jb3VudCkpOworI2lmIGRlZmluZWQoQ09ORklHX1g4Nl9JT19BUElDKQorCQlzZXFfcHJpbnRmKHAsICJNSVM6ICUxMHVcbiIsIGF0b21pY19yZWFkKCZpcnFfbWlzX2NvdW50KSk7CisjZW5kaWYKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2twcm9iZXMuYyBiL2FyY2gvaTM4Ni9rZXJuZWwva3Byb2Jlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MTY4MTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2twcm9iZXMuYwpAQCAtMCwwICsxLDM4NSBAQAorLyoKKyAqICBLZXJuZWwgUHJvYmVzIChLUHJvYmVzKQorICogIGFyY2gvaTM4Ni9rZXJuZWwva3Byb2Jlcy5jCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwMiwgMjAwNAorICoKKyAqIDIwMDItT2N0CUNyZWF0ZWQgYnkgVmFtc2kgS3Jpc2huYSBTIDx2YW1zaV9rcmlzaG5hQGluLmlibS5jb20+IEtlcm5lbAorICoJCVByb2JlcyBpbml0aWFsIGltcGxlbWVudGF0aW9uICggaW5jbHVkZXMgY29udHJpYnV0aW9ucyBmcm9tCisgKgkJUnVzdHkgUnVzc2VsbCkuCisgKiAyMDA0LUp1bHkJU3VwYXJuYSBCaGF0dGFjaGFyeWEgPHN1cGFybmFAaW4uaWJtLmNvbT4gYWRkZWQganVtcGVyIHByb2JlcworICoJCWludGVyZmFjZSB0byBhY2Nlc3MgZnVuY3Rpb24gYXJndW1lbnRzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9wcmVlbXB0Lmg+CisjaW5jbHVkZSA8YXNtL2tkZWJ1Zy5oPgorI2luY2x1ZGUgPGFzbS9kZXNjLmg+CisKKy8qIGtwcm9iZV9zdGF0dXMgc2V0dGluZ3MgKi8KKyNkZWZpbmUgS1BST0JFX0hJVF9BQ1RJVkUJMHgwMDAwMDAwMQorI2RlZmluZSBLUFJPQkVfSElUX1NTCQkweDAwMDAwMDAyCisKK3N0YXRpYyBzdHJ1Y3Qga3Byb2JlICpjdXJyZW50X2twcm9iZTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGtwcm9iZV9zdGF0dXMsIGtwcm9iZV9vbGRfZWZsYWdzLCBrcHJvYmVfc2F2ZWRfZWZsYWdzOworc3RhdGljIHN0cnVjdCBwdF9yZWdzIGpwcm9iZV9zYXZlZF9yZWdzOworc3RhdGljIGxvbmcgKmpwcm9iZV9zYXZlZF9lc3A7CisvKiBjb3B5IG9mIHRoZSBrZXJuZWwgc3RhY2sgYXQgdGhlIHByb2JlIGZpcmUgdGltZSAqLworc3RhdGljIGtwcm9iZV9vcGNvZGVfdCBqcHJvYmVzX3N0YWNrW01BWF9TVEFDS19TSVpFXTsKK3ZvaWQganByb2JlX3JldHVybl9lbmQodm9pZCk7CisKKy8qCisgKiByZXR1cm5zIG5vbi16ZXJvIGlmIG9wY29kZSBtb2RpZmllcyB0aGUgaW50ZXJydXB0IGZsYWcuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlzX0lGX21vZGlmaWVyKGtwcm9iZV9vcGNvZGVfdCBvcGNvZGUpCit7CisJc3dpdGNoIChvcGNvZGUpIHsKKwljYXNlIDB4ZmE6CQkvKiBjbGkgKi8KKwljYXNlIDB4ZmI6CQkvKiBzdGkgKi8KKwljYXNlIDB4Y2Y6CQkvKiBpcmV0L2lyZXRkICovCisJY2FzZSAweDlkOgkJLyogcG9wZi9wb3BmZCAqLworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBhcmNoX3ByZXBhcmVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYXJjaF9jb3B5X2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQoreworCW1lbWNweShwLT5haW5zbi5pbnNuLCBwLT5hZGRyLCBNQVhfSU5TTl9TSVpFICogc2l6ZW9mKGtwcm9iZV9vcGNvZGVfdCkpOworfQorCit2b2lkIGFyY2hfcmVtb3ZlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGlzYXJtX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwkqcC0+YWRkciA9IHAtPm9wY29kZTsKKwlyZWdzLT5laXAgPSAodW5zaWduZWQgbG9uZylwLT5hZGRyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHJlcGFyZV9zaW5nbGVzdGVwKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXJlZ3MtPmVmbGFncyB8PSBURl9NQVNLOworCXJlZ3MtPmVmbGFncyAmPSB+SUZfTUFTSzsKKwkvKnNpbmdsZSBzdGVwIGlubGluZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgYW4gaW50MyovCisJaWYgKHAtPm9wY29kZSA9PSBCUkVBS1BPSU5UX0lOU1RSVUNUSU9OKQorCQlyZWdzLT5laXAgPSAodW5zaWduZWQgbG9uZylwLT5hZGRyOworCWVsc2UKKwkJcmVncy0+ZWlwID0gKHVuc2lnbmVkIGxvbmcpJnAtPmFpbnNuLmluc247Cit9CisKKy8qCisgKiBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBvbiBlbnRyeSBhcyB0cmFwMyBpcyBhbiBpbnRlcnJ1cHQgZ2F0ZSBhbmQgdGhleQorICogcmVtYWluIGRpc2FibGVkIHRob3JvdWdoIG91dCB0aGlzIGZ1bmN0aW9uLgorICovCitzdGF0aWMgaW50IGtwcm9iZV9oYW5kbGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBrcHJvYmUgKnA7CisJaW50IHJldCA9IDA7CisJa3Byb2JlX29wY29kZV90ICphZGRyID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nICpscDsKKworCS8qIFdlJ3JlIGluIGFuIGludGVycnVwdCwgYnV0IHRoaXMgaXMgY2xlYXIgYW5kIEJVRygpLXNhZmUuICovCisJcHJlZW1wdF9kaXNhYmxlKCk7CisJLyogQ2hlY2sgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIHVzaW5nIExEVCBlbnRyeSBmb3IgaXRzIGNvZGUgc2VnbWVudCBhbmQKKwkgKiBjYWxjdWxhdGUgdGhlIGFkZHJlc3MgYnkgcmVhZGluZyB0aGUgYmFzZSBhZGRyZXNzIGZyb20gdGhlIExEVCBlbnRyeS4KKwkgKi8KKwlpZiAoKHJlZ3MtPnhjcyAmIDQpICYmIChjdXJyZW50LT5tbSkpIHsKKwkJbHAgPSAodW5zaWduZWQgbG9uZyAqKSAoKHVuc2lnbmVkIGxvbmcpKChyZWdzLT54Y3MgPj4gMykgKiA4KQorCQkJCQkrIChjaGFyICopIGN1cnJlbnQtPm1tLT5jb250ZXh0LmxkdCk7CisJCWFkZHIgPSAoa3Byb2JlX29wY29kZV90ICopIChnZXRfZGVzY19iYXNlKGxwKSArIHJlZ3MtPmVpcCAtCisJCQkJCQlzaXplb2Yoa3Byb2JlX29wY29kZV90KSk7CisJfSBlbHNlIHsKKwkJYWRkciA9IChrcHJvYmVfb3Bjb2RlX3QgKikocmVncy0+ZWlwIC0gc2l6ZW9mKGtwcm9iZV9vcGNvZGVfdCkpOworCX0KKwkvKiBDaGVjayB3ZSdyZSBub3QgYWN0dWFsbHkgcmVjdXJzaW5nICovCisJaWYgKGtwcm9iZV9ydW5uaW5nKCkpIHsKKwkJLyogV2UgKmFyZSogaG9sZGluZyBsb2NrIGhlcmUsIHNvIHRoaXMgaXMgc2FmZS4KKwkJICAgRGlzYXJtIHRoZSBwcm9iZSB3ZSBqdXN0IGhpdCwgYW5kIGlnbm9yZSBpdC4gKi8KKwkJcCA9IGdldF9rcHJvYmUoYWRkcik7CisJCWlmIChwKSB7CisJCQlpZiAoa3Byb2JlX3N0YXR1cyA9PSBLUFJPQkVfSElUX1NTKSB7CisJCQkJcmVncy0+ZWZsYWdzICY9IH5URl9NQVNLOworCQkJCXJlZ3MtPmVmbGFncyB8PSBrcHJvYmVfc2F2ZWRfZWZsYWdzOworCQkJCXVubG9ja19rcHJvYmVzKCk7CisJCQkJZ290byBub19rcHJvYmU7CisJCQl9CisJCQlkaXNhcm1fa3Byb2JlKHAsIHJlZ3MpOworCQkJcmV0ID0gMTsKKwkJfSBlbHNlIHsKKwkJCXAgPSBjdXJyZW50X2twcm9iZTsKKwkJCWlmIChwLT5icmVha19oYW5kbGVyICYmIHAtPmJyZWFrX2hhbmRsZXIocCwgcmVncykpIHsKKwkJCQlnb3RvIHNzX3Byb2JlOworCQkJfQorCQl9CisJCS8qIElmIGl0J3Mgbm90IG91cnMsIGNhbid0IGJlIGRlbGV0ZSByYWNlLCAod2UgaG9sZCBsb2NrKS4gKi8KKwkJZ290byBub19rcHJvYmU7CisJfQorCisJbG9ja19rcHJvYmVzKCk7CisJcCA9IGdldF9rcHJvYmUoYWRkcik7CisJaWYgKCFwKSB7CisJCXVubG9ja19rcHJvYmVzKCk7CisJCWlmIChyZWdzLT5lZmxhZ3MgJiBWTV9NQVNLKSB7CisJCQkvKiBXZSBhcmUgaW4gdmlydHVhbC04MDg2IG1vZGUuIFJldHVybiAwICovCisJCQlnb3RvIG5vX2twcm9iZTsKKwkJfQorCisJCWlmICgqYWRkciAhPSBCUkVBS1BPSU5UX0lOU1RSVUNUSU9OKSB7CisJCQkvKgorCQkJICogVGhlIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24gd2FzIHJlbW92ZWQgcmlnaHQKKwkJCSAqIGFmdGVyIHdlIGhpdCBpdC4gIEFub3RoZXIgY3B1IGhhcyByZW1vdmVkCisJCQkgKiBlaXRoZXIgYSBwcm9iZXBvaW50IG9yIGEgZGVidWdnZXIgYnJlYWtwb2ludAorCQkJICogYXQgdGhpcyBhZGRyZXNzLiAgSW4gZWl0aGVyIGNhc2UsIG5vIGZ1cnRoZXIKKwkJCSAqIGhhbmRsaW5nIG9mIHRoaXMgaW50ZXJydXB0IGlzIGFwcHJvcHJpYXRlLgorCQkJICovCisJCQlyZXQgPSAxOworCQl9CisJCS8qIE5vdCBvbmUgb2Ygb3VyczogbGV0IGtlcm5lbCBoYW5kbGUgaXQgKi8KKwkJZ290byBub19rcHJvYmU7CisJfQorCisJa3Byb2JlX3N0YXR1cyA9IEtQUk9CRV9ISVRfQUNUSVZFOworCWN1cnJlbnRfa3Byb2JlID0gcDsKKwlrcHJvYmVfc2F2ZWRfZWZsYWdzID0ga3Byb2JlX29sZF9lZmxhZ3MKKwkgICAgPSAocmVncy0+ZWZsYWdzICYgKFRGX01BU0sgfCBJRl9NQVNLKSk7CisJaWYgKGlzX0lGX21vZGlmaWVyKHAtPm9wY29kZSkpCisJCWtwcm9iZV9zYXZlZF9lZmxhZ3MgJj0gfklGX01BU0s7CisKKwlpZiAocC0+cHJlX2hhbmRsZXIgJiYgcC0+cHJlX2hhbmRsZXIocCwgcmVncykpCisJCS8qIGhhbmRsZXIgaGFzIGFscmVhZHkgc2V0IHRoaW5ncyB1cCwgc28gc2tpcCBzcyBzZXR1cCAqLworCQlyZXR1cm4gMTsKKworc3NfcHJvYmU6CisJcHJlcGFyZV9zaW5nbGVzdGVwKHAsIHJlZ3MpOworCWtwcm9iZV9zdGF0dXMgPSBLUFJPQkVfSElUX1NTOworCXJldHVybiAxOworCitub19rcHJvYmU6CisJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBDYWxsZWQgYWZ0ZXIgc2luZ2xlLXN0ZXBwaW5nLiAgcC0+YWRkciBpcyB0aGUgYWRkcmVzcyBvZiB0aGUKKyAqIGluc3RydWN0aW9uIHdob3NlIGZpcnN0IGJ5dGUgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlICJpbnQgMyIKKyAqIGluc3RydWN0aW9uLiAgVG8gYXZvaWQgdGhlIFNNUCBwcm9ibGVtcyB0aGF0IGNhbiBvY2N1ciB3aGVuIHdlCisgKiB0ZW1wb3JhcmlseSBwdXQgYmFjayB0aGUgb3JpZ2luYWwgb3Bjb2RlIHRvIHNpbmdsZS1zdGVwLCB3ZQorICogc2luZ2xlLXN0ZXBwZWQgYSBjb3B5IG9mIHRoZSBpbnN0cnVjdGlvbi4gIFRoZSBhZGRyZXNzIG9mIHRoaXMKKyAqIGNvcHkgaXMgcC0+YWluc24uaW5zbi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHByZXBhcmVzIHRvIHJldHVybiBmcm9tIHRoZSBwb3N0LXNpbmdsZS1zdGVwCisgKiBpbnRlcnJ1cHQuICBXZSBoYXZlIHRvIGZpeCB1cCB0aGUgc3RhY2sgYXMgZm9sbG93czoKKyAqCisgKiAwKSBFeGNlcHQgaW4gdGhlIGNhc2Ugb2YgYWJzb2x1dGUgb3IgaW5kaXJlY3QganVtcCBvciBjYWxsIGluc3RydWN0aW9ucywKKyAqIHRoZSBuZXcgZWlwIGlzIHJlbGF0aXZlIHRvIHRoZSBjb3BpZWQgaW5zdHJ1Y3Rpb24uICBXZSBuZWVkIHRvIG1ha2UKKyAqIGl0IHJlbGF0aXZlIHRvIHRoZSBvcmlnaW5hbCBpbnN0cnVjdGlvbi4KKyAqCisgKiAxKSBJZiB0aGUgc2luZ2xlLXN0ZXBwZWQgaW5zdHJ1Y3Rpb24gd2FzIHB1c2hmbCwgdGhlbiB0aGUgVEYgYW5kIElGCisgKiBmbGFncyBhcmUgc2V0IGluIHRoZSBqdXN0LXB1c2hlZCBlZmxhZ3MsIGFuZCBtYXkgbmVlZCB0byBiZSBjbGVhcmVkLgorICoKKyAqIDIpIElmIHRoZSBzaW5nbGUtc3RlcHBlZCBpbnN0cnVjdGlvbiB3YXMgYSBjYWxsLCB0aGUgcmV0dXJuIGFkZHJlc3MKKyAqIHRoYXQgaXMgYXRvcCB0aGUgc3RhY2sgaXMgdGhlIGFkZHJlc3MgZm9sbG93aW5nIHRoZSBjb3BpZWQgaW5zdHJ1Y3Rpb24uCisgKiBXZSBuZWVkIHRvIG1ha2UgaXQgdGhlIGFkZHJlc3MgZm9sbG93aW5nIHRoZSBvcmlnaW5hbCBpbnN0cnVjdGlvbi4KKyAqLworc3RhdGljIHZvaWQgcmVzdW1lX2V4ZWN1dGlvbihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nICp0b3MgPSAodW5zaWduZWQgbG9uZyAqKSZyZWdzLT5lc3A7CisJdW5zaWduZWQgbG9uZyBuZXh0X2VpcCA9IDA7CisJdW5zaWduZWQgbG9uZyBjb3B5X2VpcCA9ICh1bnNpZ25lZCBsb25nKSZwLT5haW5zbi5pbnNuOworCXVuc2lnbmVkIGxvbmcgb3JpZ19laXAgPSAodW5zaWduZWQgbG9uZylwLT5hZGRyOworCisJc3dpdGNoIChwLT5haW5zbi5pbnNuWzBdKSB7CisJY2FzZSAweDljOgkJLyogcHVzaGZsICovCisJCSp0b3MgJj0gfihURl9NQVNLIHwgSUZfTUFTSyk7CisJCSp0b3MgfD0ga3Byb2JlX29sZF9lZmxhZ3M7CisJCWJyZWFrOworCWNhc2UgMHhlODoJCS8qIGNhbGwgcmVsYXRpdmUgLSBGaXggcmV0dXJuIGFkZHIgKi8KKwkJKnRvcyA9IG9yaWdfZWlwICsgKCp0b3MgLSBjb3B5X2VpcCk7CisJCWJyZWFrOworCWNhc2UgMHhmZjoKKwkJaWYgKChwLT5haW5zbi5pbnNuWzFdICYgMHgzMCkgPT0gMHgxMCkgeworCQkJLyogY2FsbCBhYnNvbHV0ZSwgaW5kaXJlY3QgKi8KKwkJCS8qIEZpeCByZXR1cm4gYWRkcjsgZWlwIGlzIGNvcnJlY3QuICovCisJCQluZXh0X2VpcCA9IHJlZ3MtPmVpcDsKKwkJCSp0b3MgPSBvcmlnX2VpcCArICgqdG9zIC0gY29weV9laXApOworCQl9IGVsc2UgaWYgKCgocC0+YWluc24uaW5zblsxXSAmIDB4MzEpID09IDB4MjApIHx8CS8qIGptcCBuZWFyLCBhYnNvbHV0ZSBpbmRpcmVjdCAqLworCQkJICAgKChwLT5haW5zbi5pbnNuWzFdICYgMHgzMSkgPT0gMHgyMSkpIHsJLyogam1wIGZhciwgYWJzb2x1dGUgaW5kaXJlY3QgKi8KKwkJCS8qIGVpcCBpcyBjb3JyZWN0LiAqLworCQkJbmV4dF9laXAgPSByZWdzLT5laXA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAweGVhOgkJLyogam1wIGFic29sdXRlIC0tIGVpcCBpcyBjb3JyZWN0ICovCisJCW5leHRfZWlwID0gcmVncy0+ZWlwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZWdzLT5lZmxhZ3MgJj0gflRGX01BU0s7CisJaWYgKG5leHRfZWlwKSB7CisJCXJlZ3MtPmVpcCA9IG5leHRfZWlwOworCX0gZWxzZSB7CisJCXJlZ3MtPmVpcCA9IG9yaWdfZWlwICsgKHJlZ3MtPmVpcCAtIGNvcHlfZWlwKTsKKwl9Cit9CisKKy8qCisgKiBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBvbiBlbnRyeSBhcyB0cmFwMSBpcyBhbiBpbnRlcnJ1cHQgZ2F0ZSBhbmQgdGhleQorICogcmVtYWluIGRpc2FibGVkIHRob3JvdWdob3V0IHRoaXMgZnVuY3Rpb24uICBBbmQgd2UgaG9sZCBrcHJvYmUgbG9jay4KKyAqLworc3RhdGljIGlubGluZSBpbnQgcG9zdF9rcHJvYmVfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpZiAoIWtwcm9iZV9ydW5uaW5nKCkpCisJCXJldHVybiAwOworCisJaWYgKGN1cnJlbnRfa3Byb2JlLT5wb3N0X2hhbmRsZXIpCisJCWN1cnJlbnRfa3Byb2JlLT5wb3N0X2hhbmRsZXIoY3VycmVudF9rcHJvYmUsIHJlZ3MsIDApOworCisJcmVzdW1lX2V4ZWN1dGlvbihjdXJyZW50X2twcm9iZSwgcmVncyk7CisJcmVncy0+ZWZsYWdzIHw9IGtwcm9iZV9zYXZlZF9lZmxhZ3M7CisKKwl1bmxvY2tfa3Byb2JlcygpOworCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKKworCS8qCisJICogaWYgc29tZWJvZHkgZWxzZSBpcyBzaW5nbGVzdGVwcGluZyBhY3Jvc3MgYSBwcm9iZSBwb2ludCwgZWZsYWdzCisJICogd2lsbCBoYXZlIFRGIHNldCwgaW4gd2hpY2ggY2FzZSwgY29udGludWUgdGhlIHJlbWFpbmluZyBwcm9jZXNzaW5nCisJICogb2YgZG9fZGVidWcsIGFzIGlmIHRoaXMgaXMgbm90IGEgcHJvYmUgaGl0LgorCSAqLworCWlmIChyZWdzLT5lZmxhZ3MgJiBURl9NQVNLKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCisvKiBJbnRlcnJ1cHRzIGRpc2FibGVkLCBrcHJvYmVfbG9jayBoZWxkLiAqLworc3RhdGljIGlubGluZSBpbnQga3Byb2JlX2ZhdWx0X2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCB0cmFwbnIpCit7CisJaWYgKGN1cnJlbnRfa3Byb2JlLT5mYXVsdF9oYW5kbGVyCisJICAgICYmIGN1cnJlbnRfa3Byb2JlLT5mYXVsdF9oYW5kbGVyKGN1cnJlbnRfa3Byb2JlLCByZWdzLCB0cmFwbnIpKQorCQlyZXR1cm4gMTsKKworCWlmIChrcHJvYmVfc3RhdHVzICYgS1BST0JFX0hJVF9TUykgeworCQlyZXN1bWVfZXhlY3V0aW9uKGN1cnJlbnRfa3Byb2JlLCByZWdzKTsKKwkJcmVncy0+ZWZsYWdzIHw9IGtwcm9iZV9vbGRfZWZsYWdzOworCisJCXVubG9ja19rcHJvYmVzKCk7CisJCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXcmFwcGVyIHJvdXRpbmUgdG8gZm9yIGhhbmRsaW5nIGV4Y2VwdGlvbnMuCisgKi8KK2ludCBrcHJvYmVfZXhjZXB0aW9uc19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLCB1bnNpZ25lZCBsb25nIHZhbCwKKwkJCSAgICAgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZGllX2FyZ3MgKmFyZ3MgPSAoc3RydWN0IGRpZV9hcmdzICopZGF0YTsKKwlzd2l0Y2ggKHZhbCkgeworCWNhc2UgRElFX0lOVDM6CisJCWlmIChrcHJvYmVfaGFuZGxlcihhcmdzLT5yZWdzKSkKKwkJCXJldHVybiBOT1RJRllfU1RPUDsKKwkJYnJlYWs7CisJY2FzZSBESUVfREVCVUc6CisJCWlmIChwb3N0X2twcm9iZV9oYW5kbGVyKGFyZ3MtPnJlZ3MpKQorCQkJcmV0dXJuIE5PVElGWV9TVE9QOworCQlicmVhazsKKwljYXNlIERJRV9HUEY6CisJCWlmIChrcHJvYmVfcnVubmluZygpICYmCisJCSAgICBrcHJvYmVfZmF1bHRfaGFuZGxlcihhcmdzLT5yZWdzLCBhcmdzLT50cmFwbnIpKQorCQkJcmV0dXJuIE5PVElGWV9TVE9QOworCQlicmVhazsKKwljYXNlIERJRV9QQUdFX0ZBVUxUOgorCQlpZiAoa3Byb2JlX3J1bm5pbmcoKSAmJgorCQkgICAga3Byb2JlX2ZhdWx0X2hhbmRsZXIoYXJncy0+cmVncywgYXJncy0+dHJhcG5yKSkKKwkJCXJldHVybiBOT1RJRllfU1RPUDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworaW50IHNldGptcF9wcmVfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QganByb2JlICpqcCA9IGNvbnRhaW5lcl9vZihwLCBzdHJ1Y3QganByb2JlLCBrcCk7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCisJanByb2JlX3NhdmVkX3JlZ3MgPSAqcmVnczsKKwlqcHJvYmVfc2F2ZWRfZXNwID0gJnJlZ3MtPmVzcDsKKwlhZGRyID0gKHVuc2lnbmVkIGxvbmcpanByb2JlX3NhdmVkX2VzcDsKKworCS8qCisJICogVEJEOiBBcyBMaW51cyBwb2ludGVkIG91dCwgZ2NjIGFzc3VtZXMgdGhhdCB0aGUgY2FsbGVlCisJICogb3ducyB0aGUgYXJndW1lbnQgc3BhY2UgYW5kIGNvdWxkIG92ZXJ3cml0ZSBpdCwgZS5nLgorCSAqIHRhaWxjYWxsIG9wdGltaXphdGlvbi4gU28sIHRvIGJlIGFic29sdXRlbHkgc2FmZQorCSAqIHdlIGFsc28gc2F2ZSBhbmQgcmVzdG9yZSBlbm91Z2ggc3RhY2sgYnl0ZXMgdG8gY292ZXIKKwkgKiB0aGUgYXJndW1lbnQgYXJlYS4KKwkgKi8KKwltZW1jcHkoanByb2Jlc19zdGFjaywgKGtwcm9iZV9vcGNvZGVfdCAqKSBhZGRyLCBNSU5fU1RBQ0tfU0laRShhZGRyKSk7CisJcmVncy0+ZWZsYWdzICY9IH5JRl9NQVNLOworCXJlZ3MtPmVpcCA9ICh1bnNpZ25lZCBsb25nKShqcC0+ZW50cnkpOworCXJldHVybiAxOworfQorCit2b2lkIGpwcm9iZV9yZXR1cm4odm9pZCkKK3sKKwlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CisJYXNtIHZvbGF0aWxlICgiICAgICAgIHhjaGdsICAgJSVlYngsJSVlc3AgICAgIFxuIgorCQkgICAgICAiICAgICAgIGludDMJCQlcbiIKKwkJICAgICAgIiAgICAgICAuZ2xvYmwganByb2JlX3JldHVybl9lbmQJXG4iCisJCSAgICAgICIgICAgICAganByb2JlX3JldHVybl9lbmQ6CVxuIgorCQkgICAgICAiICAgICAgIG5vcAkJCVxuIjo6ImIiCisJCSAgICAgIChqcHJvYmVfc2F2ZWRfZXNwKToibWVtb3J5Iik7Cit9CisKK2ludCBsb25nam1wX2JyZWFrX2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdTggKmFkZHIgPSAodTggKikgKHJlZ3MtPmVpcCAtIDEpOworCXVuc2lnbmVkIGxvbmcgc3RhY2tfYWRkciA9ICh1bnNpZ25lZCBsb25nKWpwcm9iZV9zYXZlZF9lc3A7CisJc3RydWN0IGpwcm9iZSAqanAgPSBjb250YWluZXJfb2YocCwgc3RydWN0IGpwcm9iZSwga3ApOworCisJaWYgKChhZGRyID4gKHU4ICopIGpwcm9iZV9yZXR1cm4pICYmIChhZGRyIDwgKHU4ICopIGpwcm9iZV9yZXR1cm5fZW5kKSkgeworCQlpZiAoJnJlZ3MtPmVzcCAhPSBqcHJvYmVfc2F2ZWRfZXNwKSB7CisJCQlzdHJ1Y3QgcHRfcmVncyAqc2F2ZWRfcmVncyA9CisJCQkgICAgY29udGFpbmVyX29mKGpwcm9iZV9zYXZlZF9lc3AsIHN0cnVjdCBwdF9yZWdzLCBlc3ApOworCQkJcHJpbnRrKCJjdXJyZW50IGVzcCAlcCBkb2VzIG5vdCBtYXRjaCBzYXZlZCBlc3AgJXBcbiIsCisJCQkgICAgICAgJnJlZ3MtPmVzcCwganByb2JlX3NhdmVkX2VzcCk7CisJCQlwcmludGsoIlNhdmVkIHJlZ2lzdGVycyBmb3IganByb2JlICVwXG4iLCBqcCk7CisJCQlzaG93X3JlZ2lzdGVycyhzYXZlZF9yZWdzKTsKKwkJCXByaW50aygiQ3VycmVudCByZWdpc3RlcnNcbiIpOworCQkJc2hvd19yZWdpc3RlcnMocmVncyk7CisJCQlCVUcoKTsKKwkJfQorCQkqcmVncyA9IGpwcm9iZV9zYXZlZF9yZWdzOworCQltZW1jcHkoKGtwcm9iZV9vcGNvZGVfdCAqKSBzdGFja19hZGRyLCBqcHJvYmVzX3N0YWNrLAorCQkgICAgICAgTUlOX1NUQUNLX1NJWkUoc3RhY2tfYWRkcikpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2xkdC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9sZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjUwYWZiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9sZHQuYwpAQCAtMCwwICsxLDI1NSBAQAorLyoKKyAqIGxpbnV4L2tlcm5lbC9sZHQuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MiBLcmlzaG5hIEJhbGFzdWJyYW1hbmlhbiBhbmQgTGludXMgVG9ydmFsZHMKKyAqIENvcHlyaWdodCAoQykgMTk5OSBJbmdvIE1vbG5hciA8bWluZ29AcmVkaGF0LmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2xkdC5oPgorI2luY2x1ZGUgPGFzbS9kZXNjLmg+CisKKyNpZmRlZiBDT05GSUdfU01QIC8qIGF2b2lkcyAiZGVmaW5lZCBidXQgbm90IHVzZWQiIHdhcm5pZyAqLworc3RhdGljIHZvaWQgZmx1c2hfbGR0KHZvaWQgKm51bGwpCit7CisJaWYgKGN1cnJlbnQtPmFjdGl2ZV9tbSkKKwkJbG9hZF9MRFQoJmN1cnJlbnQtPmFjdGl2ZV9tbS0+Y29udGV4dCk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBhbGxvY19sZHQobW1fY29udGV4dF90ICpwYywgaW50IG1pbmNvdW50LCBpbnQgcmVsb2FkKQoreworCXZvaWQgKm9sZGxkdDsKKwl2b2lkICpuZXdsZHQ7CisJaW50IG9sZHNpemU7CisKKwlpZiAobWluY291bnQgPD0gcGMtPnNpemUpCisJCXJldHVybiAwOworCW9sZHNpemUgPSBwYy0+c2l6ZTsKKwltaW5jb3VudCA9IChtaW5jb3VudCs1MTEpJih+NTExKTsKKwlpZiAobWluY291bnQqTERUX0VOVFJZX1NJWkUgPiBQQUdFX1NJWkUpCisJCW5ld2xkdCA9IHZtYWxsb2MobWluY291bnQqTERUX0VOVFJZX1NJWkUpOworCWVsc2UKKwkJbmV3bGR0ID0ga21hbGxvYyhtaW5jb3VudCpMRFRfRU5UUllfU0laRSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIW5ld2xkdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAob2xkc2l6ZSkKKwkJbWVtY3B5KG5ld2xkdCwgcGMtPmxkdCwgb2xkc2l6ZSpMRFRfRU5UUllfU0laRSk7CisJb2xkbGR0ID0gcGMtPmxkdDsKKwltZW1zZXQobmV3bGR0K29sZHNpemUqTERUX0VOVFJZX1NJWkUsIDAsIChtaW5jb3VudC1vbGRzaXplKSpMRFRfRU5UUllfU0laRSk7CisJcGMtPmxkdCA9IG5ld2xkdDsKKwl3bWIoKTsKKwlwYy0+c2l6ZSA9IG1pbmNvdW50OworCXdtYigpOworCisJaWYgKHJlbG9hZCkgeworI2lmZGVmIENPTkZJR19TTVAKKwkJY3B1bWFza190IG1hc2s7CisJCXByZWVtcHRfZGlzYWJsZSgpOworCQlsb2FkX0xEVChwYyk7CisJCW1hc2sgPSBjcHVtYXNrX29mX2NwdShzbXBfcHJvY2Vzc29yX2lkKCkpOworCQlpZiAoIWNwdXNfZXF1YWwoY3VycmVudC0+bW0tPmNwdV92bV9tYXNrLCBtYXNrKSkKKwkJCXNtcF9jYWxsX2Z1bmN0aW9uKGZsdXNoX2xkdCwgTlVMTCwgMSwgMSk7CisJCXByZWVtcHRfZW5hYmxlKCk7CisjZWxzZQorCQlsb2FkX0xEVChwYyk7CisjZW5kaWYKKwl9CisJaWYgKG9sZHNpemUpIHsKKwkJaWYgKG9sZHNpemUqTERUX0VOVFJZX1NJWkUgPiBQQUdFX1NJWkUpCisJCQl2ZnJlZShvbGRsZHQpOworCQllbHNlCisJCQlrZnJlZShvbGRsZHQpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgY29weV9sZHQobW1fY29udGV4dF90ICpuZXcsIG1tX2NvbnRleHRfdCAqb2xkKQoreworCWludCBlcnIgPSBhbGxvY19sZHQobmV3LCBvbGQtPnNpemUsIDApOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCW1lbWNweShuZXctPmxkdCwgb2xkLT5sZHQsIG9sZC0+c2l6ZSpMRFRfRU5UUllfU0laRSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB3ZSBkbyBub3QgaGF2ZSB0byBtdWNrIHdpdGggZGVzY3JpcHRvcnMgaGVyZSwgdGhhdCBpcworICogZG9uZSBpbiBzd2l0Y2hfbW0oKSBhcyBuZWVkZWQuCisgKi8KK2ludCBpbml0X25ld19jb250ZXh0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlzdHJ1Y3QgbW1fc3RydWN0ICogb2xkX21tOworCWludCByZXR2YWwgPSAwOworCisJaW5pdF9NVVRFWCgmbW0tPmNvbnRleHQuc2VtKTsKKwltbS0+Y29udGV4dC5zaXplID0gMDsKKwlvbGRfbW0gPSBjdXJyZW50LT5tbTsKKwlpZiAob2xkX21tICYmIG9sZF9tbS0+Y29udGV4dC5zaXplID4gMCkgeworCQlkb3duKCZvbGRfbW0tPmNvbnRleHQuc2VtKTsKKwkJcmV0dmFsID0gY29weV9sZHQoJm1tLT5jb250ZXh0LCAmb2xkX21tLT5jb250ZXh0KTsKKwkJdXAoJm9sZF9tbS0+Y29udGV4dC5zZW0pOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogTm8gbmVlZCB0byBsb2NrIHRoZSBNTSBhcyB3ZSBhcmUgdGhlIGxhc3QgdXNlcgorICovCit2b2lkIGRlc3Ryb3lfY29udGV4dChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlpZiAobW0tPmNvbnRleHQuc2l6ZSkgeworCQlpZiAobW0gPT0gY3VycmVudC0+YWN0aXZlX21tKQorCQkJY2xlYXJfTERUKCk7CisJCWlmIChtbS0+Y29udGV4dC5zaXplKkxEVF9FTlRSWV9TSVpFID4gUEFHRV9TSVpFKQorCQkJdmZyZWUobW0tPmNvbnRleHQubGR0KTsKKwkJZWxzZQorCQkJa2ZyZWUobW0tPmNvbnRleHQubGR0KTsKKwkJbW0tPmNvbnRleHQuc2l6ZSA9IDA7CisJfQorfQorCitzdGF0aWMgaW50IHJlYWRfbGR0KHZvaWQgX191c2VyICogcHRyLCB1bnNpZ25lZCBsb25nIGJ5dGVjb3VudCkKK3sKKwlpbnQgZXJyOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwlzdHJ1Y3QgbW1fc3RydWN0ICogbW0gPSBjdXJyZW50LT5tbTsKKworCWlmICghbW0tPmNvbnRleHQuc2l6ZSkKKwkJcmV0dXJuIDA7CisJaWYgKGJ5dGVjb3VudCA+IExEVF9FTlRSWV9TSVpFKkxEVF9FTlRSSUVTKQorCQlieXRlY291bnQgPSBMRFRfRU5UUllfU0laRSpMRFRfRU5UUklFUzsKKworCWRvd24oJm1tLT5jb250ZXh0LnNlbSk7CisJc2l6ZSA9IG1tLT5jb250ZXh0LnNpemUqTERUX0VOVFJZX1NJWkU7CisJaWYgKHNpemUgPiBieXRlY291bnQpCisJCXNpemUgPSBieXRlY291bnQ7CisKKwllcnIgPSAwOworCWlmIChjb3B5X3RvX3VzZXIocHRyLCBtbS0+Y29udGV4dC5sZHQsIHNpemUpKQorCQllcnIgPSAtRUZBVUxUOworCXVwKCZtbS0+Y29udGV4dC5zZW0pOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm9yX3JldHVybjsKKwlpZiAoc2l6ZSAhPSBieXRlY291bnQpIHsKKwkJLyogemVyby1maWxsIHRoZSByZXN0ICovCisJCWlmIChjbGVhcl91c2VyKHB0citzaXplLCBieXRlY291bnQtc2l6ZSkgIT0gMCkgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWdvdG8gZXJyb3JfcmV0dXJuOworCQl9CisJfQorCXJldHVybiBieXRlY291bnQ7CitlcnJvcl9yZXR1cm46CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCByZWFkX2RlZmF1bHRfbGR0KHZvaWQgX191c2VyICogcHRyLCB1bnNpZ25lZCBsb25nIGJ5dGVjb3VudCkKK3sKKwlpbnQgZXJyOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwl2b2lkICphZGRyZXNzOworCisJZXJyID0gMDsKKwlhZGRyZXNzID0gJmRlZmF1bHRfbGR0WzBdOworCXNpemUgPSA1KnNpemVvZihzdHJ1Y3QgZGVzY19zdHJ1Y3QpOworCWlmIChzaXplID4gYnl0ZWNvdW50KQorCQlzaXplID0gYnl0ZWNvdW50OworCisJZXJyID0gc2l6ZTsKKwlpZiAoY29weV90b191c2VyKHB0ciwgYWRkcmVzcywgc2l6ZSkpCisJCWVyciA9IC1FRkFVTFQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHdyaXRlX2xkdCh2b2lkIF9fdXNlciAqIHB0ciwgdW5zaWduZWQgbG9uZyBieXRlY291bnQsIGludCBvbGRtb2RlKQoreworCXN0cnVjdCBtbV9zdHJ1Y3QgKiBtbSA9IGN1cnJlbnQtPm1tOworCV9fdTMyIGVudHJ5XzEsIGVudHJ5XzIsICpscDsKKwlpbnQgZXJyb3I7CisJc3RydWN0IHVzZXJfZGVzYyBsZHRfaW5mbzsKKworCWVycm9yID0gLUVJTlZBTDsKKwlpZiAoYnl0ZWNvdW50ICE9IHNpemVvZihsZHRfaW5mbykpCisJCWdvdG8gb3V0OworCWVycm9yID0gLUVGQVVMVDsgCQorCWlmIChjb3B5X2Zyb21fdXNlcigmbGR0X2luZm8sIHB0ciwgc2l6ZW9mKGxkdF9pbmZvKSkpCisJCWdvdG8gb3V0OworCisJZXJyb3IgPSAtRUlOVkFMOworCWlmIChsZHRfaW5mby5lbnRyeV9udW1iZXIgPj0gTERUX0VOVFJJRVMpCisJCWdvdG8gb3V0OworCWlmIChsZHRfaW5mby5jb250ZW50cyA9PSAzKSB7CisJCWlmIChvbGRtb2RlKQorCQkJZ290byBvdXQ7CisJCWlmIChsZHRfaW5mby5zZWdfbm90X3ByZXNlbnQgPT0gMCkKKwkJCWdvdG8gb3V0OworCX0KKworCWRvd24oJm1tLT5jb250ZXh0LnNlbSk7CisJaWYgKGxkdF9pbmZvLmVudHJ5X251bWJlciA+PSBtbS0+Y29udGV4dC5zaXplKSB7CisJCWVycm9yID0gYWxsb2NfbGR0KCZjdXJyZW50LT5tbS0+Y29udGV4dCwgbGR0X2luZm8uZW50cnlfbnVtYmVyKzEsIDEpOworCQlpZiAoZXJyb3IgPCAwKQorCQkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWxwID0gKF9fdTMyICopICgobGR0X2luZm8uZW50cnlfbnVtYmVyIDw8IDMpICsgKGNoYXIgKikgbW0tPmNvbnRleHQubGR0KTsKKworICAgCS8qIEFsbG93IExEVHMgdG8gYmUgY2xlYXJlZCBieSB0aGUgdXNlci4gKi8KKyAgIAlpZiAobGR0X2luZm8uYmFzZV9hZGRyID09IDAgJiYgbGR0X2luZm8ubGltaXQgPT0gMCkgeworCQlpZiAob2xkbW9kZSB8fCBMRFRfZW1wdHkoJmxkdF9pbmZvKSkgeworCQkJZW50cnlfMSA9IDA7CisJCQllbnRyeV8yID0gMDsKKwkJCWdvdG8gaW5zdGFsbDsKKwkJfQorCX0KKworCWVudHJ5XzEgPSBMRFRfZW50cnlfYSgmbGR0X2luZm8pOworCWVudHJ5XzIgPSBMRFRfZW50cnlfYigmbGR0X2luZm8pOworCWlmIChvbGRtb2RlKQorCQllbnRyeV8yICY9IH4oMSA8PCAyMCk7CisKKwkvKiBJbnN0YWxsIHRoZSBuZXcgZW50cnkgLi4uICAqLworaW5zdGFsbDoKKwkqbHAJPSBlbnRyeV8xOworCSoobHArMSkJPSBlbnRyeV8yOworCWVycm9yID0gMDsKKworb3V0X3VubG9jazoKKwl1cCgmbW0tPmNvbnRleHQuc2VtKTsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2FzbWxpbmthZ2UgaW50IHN5c19tb2RpZnlfbGR0KGludCBmdW5jLCB2b2lkIF9fdXNlciAqcHRyLCB1bnNpZ25lZCBsb25nIGJ5dGVjb3VudCkKK3sKKwlpbnQgcmV0ID0gLUVOT1NZUzsKKworCXN3aXRjaCAoZnVuYykgeworCWNhc2UgMDoKKwkJcmV0ID0gcmVhZF9sZHQocHRyLCBieXRlY291bnQpOworCQlicmVhazsKKwljYXNlIDE6CisJCXJldCA9IHdyaXRlX2xkdChwdHIsIGJ5dGVjb3VudCwgMSk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJcmV0ID0gcmVhZF9kZWZhdWx0X2xkdChwdHIsIGJ5dGVjb3VudCk7CisJCWJyZWFrOworCWNhc2UgMHgxMToKKwkJcmV0ID0gd3JpdGVfbGR0KHB0ciwgYnl0ZWNvdW50LCAwKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL21jYS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9tY2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjAwZmFlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9tY2EuYwpAQCAtMCwwICsxLDQ3NCBAQAorLyoKKyAqICBsaW51eC9hcmNoL2kzODYva2VybmVsL21jYS5jCisgKiAgV3JpdHRlbiBieSBNYXJ0aW4gS29saW5laywgRmVicnVhcnkgMTk5NgorICoKKyAqIENoYW5nZXM6CisgKgorICoJQ2hyaXMgQmVhdXJlZ2FyZCBKdWx5IDI4dGgsIDE5OTYKKyAqCS0gRml4ZWQgdXAgaW50ZWdyYXRlZCBTQ1NJIGRldGVjdGlvbgorICoKKyAqCUNocmlzIEJlYXVyZWdhcmQgQXVndXN0IDNyZCwgMTk5NgorICoJLSBNYWRlIG1jYV9pbmZvIGxvY2FsCisgKgktIE1hZGUgaW50ZWdyYXRlZCByZWdpc3RlcnMgYWNjZXNzaWJsZSB0aHJvdWdoIHN0YW5kYXJkIGZ1bmN0aW9uIGNhbGxzCisgKgktIEFkZGVkIG5hbWUgZmllbGQKKyAqCS0gTW9yZSBzYW5pdHkgY2hlY2tpbmcKKyAqCisgKglDaHJpcyBCZWF1cmVnYXJkIEF1Z3VzdCA5dGgsIDE5OTYKKyAqCS0gUmV3cm90ZSAvcHJvYy9tY2EKKyAqCisgKglDaHJpcyBCZWF1cmVnYXJkIEphbnVhcnkgN3RoLCAxOTk3CisgKgktIEFkZGVkIGJhc2ljIE5NSS1wcm9jZXNzaW5nCisgKgktIEFkZGVkIG1vcmUgaW5mb3JtYXRpb24gdG8gbWNhX2luZm8gc3RydWN0dXJlCisgKgorICoJRGF2aWQgV2VpbmVoYWxsIE9jdG9iZXIgMTJ0aCwgMTk5OAorICoJLSBNYWRlIGEgbG90IG9mIGNsZWFuaW5nIHVwIGluIHRoZSBzb3VyY2UKKyAqCS0gQWRkZWQgdXNlIG9mIHNhdmVfZmxhZ3MgLyByZXN0b3JlX2ZsYWdzCisgKgktIEFkZGVkIHRoZSAnZHJpdmVyX2xvYWRlZCcgZmxhZyBpbiBNQ0FfYWRhcHRlcgorICoJLSBBZGRlZCBhbiBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRpb24gb2YgWlAgR3UncyBtY2FfZmluZF91bnVzZWRfYWRhcHRlcgorICoKKyAqCURhdmlkIFdlaW5laGFsbCBNYXJjaCAyNHRoLCAxOTk5CisgKgktIEZpeGVkIHRoZSBvdXRwdXQgb2YgJ0RyaXZlciBJbnN0YWxsZWQnIGluIC9wcm9jL21jYS9wb3MKKyAqCS0gTWFkZSB0aGUgSW50ZWdyYXRlZCBWaWRlbyAmIFNDU0kgc2hvdyB1cCBldmVuIGlmIHRoZXkgaGF2ZSBpZCAwMDAwCisgKgorICoJQWxleGFuZGVyIFZpcm8gTm92ZW1iZXIgOXRoLCAxOTk5CisgKgktIFN3aXRjaGVkIHRvIHJlZ3VsYXIgcHJvY2ZzIG1ldGhvZHMKKyAqCisgKglBbGZyZWQgQXJub2xkICYgRGF2aWQgV2VpbmVoYWxsIEF1Z3VzdCAyM3JkLCAyMDAwCisgKgktIEFkZGVkIHN1cHBvcnQgZm9yIFBsYW5hciBQT1MtcmVnaXN0ZXJzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tY2EuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vYXJjaF9ob29rcy5oPgorCitzdGF0aWMgdW5zaWduZWQgY2hhciB3aGljaF9zY3NpID0gMDsKKworaW50IE1DQV9idXMgPSAwOworRVhQT1JUX1NZTUJPTChNQ0FfYnVzKTsKKworLyoKKyAqIE1vdGhlcmJvYXJkIHJlZ2lzdGVyIHNwaW5sb2NrLiBVbnRlc3RlZCBvbiBTTVAgYXQgdGhlIG1vbWVudCwgYnV0CisgKiBhcmUgdGhlcmUgYW55IE1DQSBTTVAgYm94ZXM/CisgKgorICogWWVzIC0gQWxhbgorICovCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG1jYV9sb2NrKTsKKworLyogQnVpbGQgdGhlIHN0YXR1cyBpbmZvIGZvciB0aGUgYWRhcHRlciAqLworCitzdGF0aWMgdm9pZCBtY2FfY29uZmlndXJlX2FkYXB0ZXJfc3RhdHVzKHN0cnVjdCBtY2FfZGV2aWNlICptY2FfZGV2KSB7CisJbWNhX2Rldi0+c3RhdHVzID0gTUNBX0FEQVBURVJfTk9ORTsKKworCW1jYV9kZXYtPnBvc19pZCA9IG1jYV9kZXYtPnBvc1swXQorCQkrIChtY2FfZGV2LT5wb3NbMV0gPDwgOCk7CisKKwlpZighbWNhX2Rldi0+cG9zX2lkICYmIG1jYV9kZXYtPnNsb3QgPCBNQ0FfTUFYX1NMT1RfTlIpIHsKKworCQkvKiBpZCA9IDB4MDAwMCB1c3VhbGx5IGluZGljYXRlcyBoYXJkd2FyZSBmYWlsdXJlLAorCQkgKiBob3dldmVyLCBaUCBHdSAoenBnQGNhc3RsZS5uZXQ+IHJlcG9ydHMgdGhhdCBoaXMgOTU1NgorCQkgKiBoYXMgMHgwMDAwIGFzIGlkIGFuZCBldmVyeXRoaW5nIHN0aWxsIHdvcmtzLiBUaGVyZQorCQkgKiBhbHNvIHNlZW0gdG8gYmUgYW4gYWRhcHRlciB3aXRoIGlkID0gMHgwMDAwOyB0aGUKKwkJICogTkNSIFBhcmFsbGVsIEJ1cyBNZW1vcnkgQ2FyZC4gVW50aWwgdGhpcyBpcyBjb25maXJtZWQsCisJCSAqIGhvd2V2ZXIsIHRoaXMgY29kZSB3aWxsIHN0YXkuCisJCSAqLworCisJCW1jYV9kZXYtPnN0YXR1cyA9IE1DQV9BREFQVEVSX0VSUk9SOworCisJCXJldHVybjsKKwl9IGVsc2UgaWYobWNhX2Rldi0+cG9zX2lkICE9IDB4ZmZmZikgeworCisJCS8qIDB4ZmZmZiB1c3VhbGx5IGluZGljYXRlcyB0aGF0IHRoZXJlJ3Mgbm8gYWRhcHRlciwKKwkJICogaG93ZXZlciwgc29tZSBpbnRlZ3JhdGVkIGFkYXB0ZXJzIG1heSBoYXZlIDB4ZmZmZiBhcworCQkgKiB0aGVpciBpZCBhbmQgc3RpbGwgYmUgdmFsaWQuIEV4YW1wbGVzIGFyZSBvbi1ib2FyZAorCQkgKiBWR0Egb2YgdGhlIDU1c3gsIHRoZSBpbnRlZ3JhdGVkIFNDU0kgb2YgdGhlIDU2ICYgNTcsCisJCSAqIGFuZCBwb3NzaWJseSBhbHNvIHRoZSA5NSBVTFRJTUVESUEuCisJCSAqLworCisJCW1jYV9kZXYtPnN0YXR1cyA9IE1DQV9BREFQVEVSX05PUk1BTDsKKwl9CisKKwlpZigobWNhX2Rldi0+cG9zX2lkID09IDB4ZmZmZiB8fAorCSAgICBtY2FfZGV2LT5wb3NfaWQgPT0gMHgwMDAwKSAmJiBtY2FfZGV2LT5zbG90ID49IE1DQV9NQVhfU0xPVF9OUikgeworCQlpbnQgajsKKworCQlmb3IoaiA9IDI7IGogPCA4OyBqKyspIHsKKwkJCWlmKG1jYV9kZXYtPnBvc1tqXSAhPSAweGZmKSB7CisJCQkJbWNhX2Rldi0+c3RhdHVzID0gTUNBX0FEQVBURVJfTk9STUFMOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYoIShtY2FfZGV2LT5wb3NbMl0gJiBNQ0FfRU5BQkxFRCkpIHsKKworCQkvKiBlbmFibGVkIGJpdCBpcyBpbiBQT1MgMiAqLworCisJCW1jYV9kZXYtPnN0YXR1cyA9IE1DQV9BREFQVEVSX0RJU0FCTEVEOworCX0KK30gLyogbWNhX2NvbmZpZ3VyZV9hZGFwdGVyX3N0YXR1cyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBtY2Ffc3RhbmRhcmRfcmVzb3VyY2VzW10gPSB7CisJeyAuc3RhcnQgPSAweDYwLCAuZW5kID0gMHg2MCwgLm5hbWUgPSAic3lzdGVtIGNvbnRyb2wgcG9ydCBCIChNQ0EpIiB9LAorCXsgLnN0YXJ0ID0gMHg5MCwgLmVuZCA9IDB4OTAsIC5uYW1lID0gImFyYml0cmF0aW9uIChNQ0EpIiB9LAorCXsgLnN0YXJ0ID0gMHg5MSwgLmVuZCA9IDB4OTEsIC5uYW1lID0gImNhcmQgU2VsZWN0IEZlZWRiYWNrIChNQ0EpIiB9LAorCXsgLnN0YXJ0ID0gMHg5MiwgLmVuZCA9IDB4OTIsIC5uYW1lID0gInN5c3RlbSBDb250cm9sIHBvcnQgQSAoTUNBKSIgfSwKKwl7IC5zdGFydCA9IDB4OTQsIC5lbmQgPSAweDk0LCAubmFtZSA9ICJzeXN0ZW0gYm9hcmQgc2V0dXAgKE1DQSkiIH0sCisJeyAuc3RhcnQgPSAweDk2LCAuZW5kID0gMHg5NywgLm5hbWUgPSAiUE9TIChNQ0EpIiB9LAorCXsgLnN0YXJ0ID0gMHgxMDAsIC5lbmQgPSAweDEwNywgLm5hbWUgPSAiUE9TIChNQ0EpIiB9Cit9OworCisjZGVmaW5lIE1DQV9TVEFOREFSRF9SRVNPVVJDRVMJKHNpemVvZihtY2Ffc3RhbmRhcmRfcmVzb3VyY2VzKS9zaXplb2Yoc3RydWN0IHJlc291cmNlKSkKKworLyoqCisgKgltY2FfcmVhZF9hbmRfc3RvcmVfcG9zIC0gcmVhZCB0aGUgUE9TIHJlZ2lzdGVycyBpbnRvIGEgbWVtb3J5IGJ1ZmZlcgorICogICAgICBAcG9zOiBhIGNoYXIgcG9pbnRlciB0byA4IGJ5dGVzLCBjb250YWlucyB0aGUgUE9TIHJlZ2lzdGVyIHZhbHVlIG9uCisgKiAgICAgICAgICAgIHN1Y2Nlc3NmdWwgcmV0dXJuCisgKgorICoJUmV0dXJucyAxIGlmIGEgY2FyZCBhY3R1YWxseSBleGlzdHMgKGkuZS4gdGhlIHBvcyBpc24ndAorICoJYWxsIDB4ZmYpIG9yIDAgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgbWNhX3JlYWRfYW5kX3N0b3JlX3Bvcyh1bnNpZ25lZCBjaGFyICpwb3MpIHsKKwlpbnQgajsKKwlpbnQgZm91bmQgPSAwOworCisJZm9yKGo9MDsgajw4OyBqKyspIHsKKwkJaWYoKHBvc1tqXSA9IGluYl9wKE1DQV9QT1NfUkVHKGopKSkgIT0gMHhmZikgeworCQkJLyogMHhmZiBhbGwgYWNyb3NzIG1lYW5zIG5vIGRldmljZS4gMHgwMCBtZWFucworCQkJICogc29tZXRoaW5nJ3MgYnJva2VuLCBidXQgYSBkZXZpY2UgaXMKKwkJCSAqIHByb2JhYmx5IHRoZXJlLiAgSG93ZXZlciwgaWYgeW91IGdldCAweDAwCisJCQkgKiBmcm9tIGEgbW90aGVyYm9hcmQgcmVnaXN0ZXIgaXQgd29uJ3QgbWF0dGVyCisJCQkgKiB3aGF0IHdlIGZpbmQuICBGb3IgdGhlIHJlY29yZCwgb24gdGhlCisJCQkgKiA1N1NMQywgdGhlIGludGVncmF0ZWQgU0NTSSBhZGFwdGVyIGhhcworCQkJICogMHhmZmZmIGZvciB0aGUgYWRhcHRlciBJRCwgYnV0IG5vbnplcm8gZm9yCisJCQkgKiBvdGhlciByZWdpc3RlcnMuICAqLworCisJCQlmb3VuZCA9IDE7CisJCX0KKwl9CisJcmV0dXJuIGZvdW5kOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBtY2FfcGNfcmVhZF9wb3Moc3RydWN0IG1jYV9kZXZpY2UgKm1jYV9kZXYsIGludCByZWcpCit7CisJdW5zaWduZWQgY2hhciBieXRlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZihyZWcgPCAwIHx8IHJlZyA+PSA4KQorCQlyZXR1cm4gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtY2FfbG9jaywgZmxhZ3MpOworCWlmKG1jYV9kZXYtPnBvc19yZWdpc3RlcikgeworCQkvKiBEaXNhYmxlIGFkYXB0ZXIgc2V0dXAsIGVuYWJsZSBtb3RoZXJib2FyZCBzZXR1cCAqLworCisJCW91dGJfcCgwLCBNQ0FfQURBUFRFUl9TRVRVUF9SRUcpOworCQlvdXRiX3AobWNhX2Rldi0+cG9zX3JlZ2lzdGVyLCBNQ0FfTU9USEVSQk9BUkRfU0VUVVBfUkVHKTsKKworCQlieXRlID0gaW5iX3AoTUNBX1BPU19SRUcocmVnKSk7CisJCW91dGJfcCgweGZmLCBNQ0FfTU9USEVSQk9BUkRfU0VUVVBfUkVHKTsKKwl9IGVsc2UgeworCisJCS8qIE1ha2Ugc3VyZSBtb3RoZXJib2FyZCBzZXR1cCBpcyBvZmYgKi8KKworCQlvdXRiX3AoMHhmZiwgTUNBX01PVEhFUkJPQVJEX1NFVFVQX1JFRyk7CisKKwkJLyogUmVhZCB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXIgKi8KKworCQlvdXRiX3AoMHg4fChtY2FfZGV2LT5zbG90ICYgMHhmKSwgTUNBX0FEQVBURVJfU0VUVVBfUkVHKTsKKwkJYnl0ZSA9IGluYl9wKE1DQV9QT1NfUkVHKHJlZykpOworCQlvdXRiX3AoMCwgTUNBX0FEQVBURVJfU0VUVVBfUkVHKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWNhX2xvY2ssIGZsYWdzKTsKKworCW1jYV9kZXYtPnBvc1tyZWddID0gYnl0ZTsKKworCXJldHVybiBieXRlOworfQorCitzdGF0aWMgdm9pZCBtY2FfcGNfd3JpdGVfcG9zKHN0cnVjdCBtY2FfZGV2aWNlICptY2FfZGV2LCBpbnQgcmVnLAorCQkJICAgICB1bnNpZ25lZCBjaGFyIGJ5dGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmKHJlZyA8IDAgfHwgcmVnID49IDgpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtY2FfbG9jaywgZmxhZ3MpOworCisJLyogTWFrZSBzdXJlIG1vdGhlcmJvYXJkIHNldHVwIGlzIG9mZiAqLworCisJb3V0Yl9wKDB4ZmYsIE1DQV9NT1RIRVJCT0FSRF9TRVRVUF9SRUcpOworCisJLyogUmVhZCBpbiB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXIgKi8KKworCW91dGJfcCgweDh8KG1jYV9kZXYtPnNsb3QmMHhmKSwgTUNBX0FEQVBURVJfU0VUVVBfUkVHKTsKKwlvdXRiX3AoYnl0ZSwgTUNBX1BPU19SRUcocmVnKSk7CisJb3V0Yl9wKDAsIE1DQV9BREFQVEVSX1NFVFVQX1JFRyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtY2FfbG9jaywgZmxhZ3MpOworCisJLyogVXBkYXRlIHRoZSBnbG9iYWwgcmVnaXN0ZXIgbGlzdCwgd2hpbGUgd2UgaGF2ZSB0aGUgYnl0ZSAqLworCisJbWNhX2Rldi0+cG9zW3JlZ10gPSBieXRlOworCit9CisKKy8qIGZvciB0aGUgcHJpbWFyeSBNQ0EgYnVzLCB3ZSBoYXZlIGlkZW50aXR5IHRyYW5zZm9ybXMgKi8KK3N0YXRpYyBpbnQgbWNhX2R1bW15X3RyYW5zZm9ybV9pcnEoc3RydWN0IG1jYV9kZXZpY2UgKiBtY2FfZGV2LCBpbnQgaXJxKQoreworCXJldHVybiBpcnE7Cit9CisKK3N0YXRpYyBpbnQgbWNhX2R1bW15X3RyYW5zZm9ybV9pb3BvcnQoc3RydWN0IG1jYV9kZXZpY2UgKiBtY2FfZGV2LCBpbnQgcG9ydCkKK3sKKwlyZXR1cm4gcG9ydDsKK30KKworc3RhdGljIHZvaWQgKm1jYV9kdW1teV90cmFuc2Zvcm1fbWVtb3J5KHN0cnVjdCBtY2FfZGV2aWNlICogbWNhX2Rldiwgdm9pZCAqbWVtKQoreworCXJldHVybiBtZW07Cit9CisKKworc3RhdGljIGludCBfX2luaXQgbWNhX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgajsKKwlzdHJ1Y3QgbWNhX2RldmljZSAqbWNhX2RldjsKKwl1bnNpZ25lZCBjaGFyIHBvc1s4XTsKKwlzaG9ydCBtY2FfYnVpbHRpbl9zY3NpX3BvcnRzW10gPSB7MHhmNywgMHhmZCwgMHgwMH07CisJc3RydWN0IG1jYV9idXMgKmJ1czsKKworCS8qIFdBUk5JTkc6IEJlIGNhcmVmdWwgd2hlbiBtYWtpbmcgY2hhbmdlcyBoZXJlLiBQdXR0aW5nIGFuIGFkYXB0ZXIKKwkgKiBhbmQgdGhlIG1vdGhlcmJvYXJkIHNpbXVsdGFuZW91c2x5IGludG8gc2V0dXAgbW9kZSBtYXkgcmVzdWx0IGluCisJICogZGFtYWdlIHRvIGNoaXBzIChhY2NvcmRpbmcgdG8gVGhlIEluZGlzcGVuc2libGUgUEMgSGFyZHdhcmUgQm9vaworCSAqIGJ5IEhhbnMtUGV0ZXIgTWVzc21lcikuIEFsc28sIHdlIGRpc2FibGUgc3lzdGVtIGludGVycnVwdHMgKHNvCisJICogdGhhdCB3ZSBhcmUgbm90IGRpc3R1cmJlZCBpbiB0aGUgbWlkZGxlIG9mIHRoaXMpLgorCSAqLworCisJLyogTWFrZSBzdXJlIHRoZSBNQ0EgYnVzIGlzIHByZXNlbnQgKi8KKworCWlmIChtY2Ffc3lzdGVtX2luaXQoKSkgeworCQlwcmludGsoS0VSTl9FUlIgIk1DQSBidXMgc3lzdGVtIGluaXRpYWxpc2F0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICghTUNBX2J1cykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwcmludGsoS0VSTl9JTkZPICJNaWNybyBDaGFubmVsIGJ1cyBkZXRlY3RlZC5cbiIpOworCisJLyogQWxsIE1DQSBzeXN0ZW1zIGhhdmUgYXQgbGVhc3QgYSBwcmltYXJ5IGJ1cyAqLworCWJ1cyA9IG1jYV9hdHRhY2hfYnVzKE1DQV9QUklNQVJZX0JVUyk7CisJaWYgKCFidXMpCisJCWdvdG8gb3V0X25vbWVtOworCWJ1cy0+ZGVmYXVsdF9kbWFfbWFzayA9IDB4ZmZmZmZmZmZMTDsKKwlidXMtPmYubWNhX3dyaXRlX3BvcyA9IG1jYV9wY193cml0ZV9wb3M7CisJYnVzLT5mLm1jYV9yZWFkX3BvcyA9IG1jYV9wY19yZWFkX3BvczsKKwlidXMtPmYubWNhX3RyYW5zZm9ybV9pcnEgPSBtY2FfZHVtbXlfdHJhbnNmb3JtX2lycTsKKwlidXMtPmYubWNhX3RyYW5zZm9ybV9pb3BvcnQgPSBtY2FfZHVtbXlfdHJhbnNmb3JtX2lvcG9ydDsKKwlidXMtPmYubWNhX3RyYW5zZm9ybV9tZW1vcnkgPSBtY2FfZHVtbXlfdHJhbnNmb3JtX21lbW9yeTsKKworCS8qIGdldCB0aGUgbW90aGVyYm9hcmQgZGV2aWNlICovCisJbWNhX2RldiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtY2FfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYodW5saWtlbHkoIW1jYV9kZXYpKQorCQlnb3RvIG91dF9ub21lbTsKKwltZW1zZXQobWNhX2RldiwgMCwgc2l6ZW9mKHN0cnVjdCBtY2FfZGV2aWNlKSk7CisKKwkvKgorCSAqIFdlIGRvIG5vdCBleHBlY3QgbWFueSBNQ0EgaW50ZXJydXB0cyBkdXJpbmcgaW5pdGlhbGl6YXRpb24sCisJICogYnV0IGxldCB1cyBiZSBzYWZlOgorCSAqLworCXNwaW5fbG9ja19pcnEoJm1jYV9sb2NrKTsKKworCS8qIE1ha2Ugc3VyZSBhZGFwdGVyIHNldHVwIGlzIG9mZiAqLworCisJb3V0Yl9wKDAsIE1DQV9BREFQVEVSX1NFVFVQX1JFRyk7CisKKwkvKiBSZWFkIG1vdGhlcmJvYXJkIFBPUyByZWdpc3RlcnMgKi8KKworCW1jYV9kZXYtPnBvc19yZWdpc3RlciA9IDB4N2Y7CisJb3V0Yl9wKG1jYV9kZXYtPnBvc19yZWdpc3RlciwgTUNBX01PVEhFUkJPQVJEX1NFVFVQX1JFRyk7CisJbWNhX2Rldi0+bmFtZVswXSA9IDA7CisJbWNhX3JlYWRfYW5kX3N0b3JlX3BvcyhtY2FfZGV2LT5wb3MpOworCW1jYV9jb25maWd1cmVfYWRhcHRlcl9zdGF0dXMobWNhX2Rldik7CisJLyogZmFrZSBQT1MgYW5kIHNsb3QgZm9yIGEgbW90aGVyYm9hcmQgKi8KKwltY2FfZGV2LT5wb3NfaWQgPSBNQ0FfTU9USEVSQk9BUkRfUE9TOworCW1jYV9kZXYtPnNsb3QgPSBNQ0FfTU9USEVSQk9BUkQ7CisJbWNhX3JlZ2lzdGVyX2RldmljZShNQ0FfUFJJTUFSWV9CVVMsIG1jYV9kZXYpOworCisJbWNhX2RldiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtY2FfZGV2aWNlKSwgR0ZQX0FUT01JQyk7CisJaWYodW5saWtlbHkoIW1jYV9kZXYpKQorCQlnb3RvIG91dF91bmxvY2tfbm9tZW07CisJbWVtc2V0KG1jYV9kZXYsIDAsIHNpemVvZihzdHJ1Y3QgbWNhX2RldmljZSkpOworCisKKwkvKiBQdXQgbW90aGVyYm9hcmQgaW50byB2aWRlbyBzZXR1cCBtb2RlLCByZWFkIGludGVncmF0ZWQgdmlkZW8KKwkgKiBQT1MgcmVnaXN0ZXJzLCBhbmQgdHVybiBtb3RoZXJib2FyZCBzZXR1cCBvZmYuCisJICovCisKKwltY2FfZGV2LT5wb3NfcmVnaXN0ZXIgPSAweGRmOworCW91dGJfcChtY2FfZGV2LT5wb3NfcmVnaXN0ZXIsIE1DQV9NT1RIRVJCT0FSRF9TRVRVUF9SRUcpOworCW1jYV9kZXYtPm5hbWVbMF0gPSAwOworCW1jYV9yZWFkX2FuZF9zdG9yZV9wb3MobWNhX2Rldi0+cG9zKTsKKwltY2FfY29uZmlndXJlX2FkYXB0ZXJfc3RhdHVzKG1jYV9kZXYpOworCS8qIGZha2UgUE9TIGFuZCBzbG90IGZvciB0aGUgaW50ZWdyYXRlZCB2aWRlbyAqLworCW1jYV9kZXYtPnBvc19pZCA9IE1DQV9JTlRFR1ZJREVPX1BPUzsKKwltY2FfZGV2LT5zbG90ID0gTUNBX0lOVEVHVklERU87CisJbWNhX3JlZ2lzdGVyX2RldmljZShNQ0FfUFJJTUFSWV9CVVMsIG1jYV9kZXYpOworCisJLyogUHV0IG1vdGhlcmJvYXJkIGludG8gc2NzaSBzZXR1cCBtb2RlLCByZWFkIGludGVncmF0ZWQgc2NzaQorCSAqIFBPUyByZWdpc3RlcnMsIGFuZCB0dXJuIG1vdGhlcmJvYXJkIHNldHVwIG9mZi4KKwkgKgorCSAqIEl0IHNlZW1zIHRoZXJlIGFyZSB0d28gcG9zc2libGUgU0NTSSByZWdpc3RlcnMuIE1hcnRpbiBzYXlzIHRoYXQKKwkgKiBmb3IgdGhlIDU2LDU3LCAweGY3IGlzIHRoZSBvbmUsIGJ1dCBmYWlscyBvbiB0aGUgNzYuCisJICogQWxmcmVkbyAoYXBlbmFAdm5ldC5pYm0uY29tKSBzYXlzCisJICogMHhmZCB3b3JrcyBvbiBoaXMgbWFjaGluZS4gV2UnbGwgdHJ5IGJvdGggb2YgdGhlbS4gSSBmaWd1cmUgaXQncworCSAqIGEgZ29vZCBiZXQgdGhhdCBvbmx5IG9uZSBjb3VsZCBiZSB2YWxpZCBhdCBhIHRpbWUuIFRoaXMgY291bGQKKwkgKiBzY3JldyB1cCB0aG91Z2ggaWYgb25lIGlzIHVzZWQgZm9yIHNvbWV0aGluZyBlbHNlIG9uIHRoZSBvdGhlcgorCSAqIG1hY2hpbmUuCisJICovCisKKwlmb3IoaSA9IDA7ICh3aGljaF9zY3NpID0gbWNhX2J1aWx0aW5fc2NzaV9wb3J0c1tpXSkgIT0gMDsgaSsrKSB7CisJCW91dGJfcCh3aGljaF9zY3NpLCBNQ0FfTU9USEVSQk9BUkRfU0VUVVBfUkVHKTsKKwkJaWYobWNhX3JlYWRfYW5kX3N0b3JlX3Bvcyhwb3MpKQorCQkJYnJlYWs7CisJfQorCWlmKHdoaWNoX3Njc2kpIHsKKwkJLyogZm91bmQgYSBzY3NpIGNhcmQgKi8KKwkJbWNhX2RldiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtY2FfZGV2aWNlKSwgR0ZQX0FUT01JQyk7CisJCWlmKHVubGlrZWx5KCFtY2FfZGV2KSkKKwkJCWdvdG8gb3V0X3VubG9ja19ub21lbTsKKwkJbWVtc2V0KG1jYV9kZXYsIDAsIHNpemVvZihzdHJ1Y3QgbWNhX2RldmljZSkpOworCisJCWZvcihqID0gMDsgaiA8IDg7IGorKykKKwkJCW1jYV9kZXYtPnBvc1tqXSA9IHBvc1tqXTsKKworCQltY2FfY29uZmlndXJlX2FkYXB0ZXJfc3RhdHVzKG1jYV9kZXYpOworCQkvKiBmYWtlIFBPUyBhbmQgc2xvdCBmb3IgaW50ZWdyYXRlZCBTQ1NJIGNvbnRyb2xsZXIgKi8KKwkJbWNhX2Rldi0+cG9zX2lkID0gTUNBX0lOVEVHU0NTSV9QT1M7CisJCW1jYV9kZXYtPnNsb3QgPSBNQ0FfSU5URUdTQ1NJOworCQltY2FfZGV2LT5wb3NfcmVnaXN0ZXIgPSB3aGljaF9zY3NpOworCQltY2FfcmVnaXN0ZXJfZGV2aWNlKE1DQV9QUklNQVJZX0JVUywgbWNhX2Rldik7CisJfQorCisJLyogVHVybiBvZmYgbW90aGVyYm9hcmQgc2V0dXAgKi8KKworCW91dGJfcCgweGZmLCBNQ0FfTU9USEVSQk9BUkRfU0VUVVBfUkVHKTsKKworCS8qIE5vdyBsb29wIG92ZXIgTUNBIHNsb3RzOiBwdXQgZWFjaCBhZGFwdGVyIGludG8gc2V0dXAgbW9kZSwgYW5kCisJICogcmVhZCBpdHMgUE9TIHJlZ2lzdGVycy4gVGhlbiBwdXQgYWRhcHRlciBzZXR1cCBvZmYuCisJICovCisKKwlmb3IoaT0wOyBpPE1DQV9NQVhfU0xPVF9OUjsgaSsrKSB7CisJCW91dGJfcCgweDh8KGkmMHhmKSwgTUNBX0FEQVBURVJfU0VUVVBfUkVHKTsKKwkJaWYoIW1jYV9yZWFkX2FuZF9zdG9yZV9wb3MocG9zKSkKKwkJCWNvbnRpbnVlOworCisJCW1jYV9kZXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWNhX2RldmljZSksIEdGUF9BVE9NSUMpOworCQlpZih1bmxpa2VseSghbWNhX2RldikpCisJCQlnb3RvIG91dF91bmxvY2tfbm9tZW07CisJCW1lbXNldChtY2FfZGV2LCAwLCBzaXplb2Yoc3RydWN0IG1jYV9kZXZpY2UpKTsKKworCQlmb3Ioaj0wOyBqPDg7IGorKykKKwkJCW1jYV9kZXYtPnBvc1tqXT1wb3Nbal07CisKKwkJbWNhX2Rldi0+ZHJpdmVyX2xvYWRlZCA9IDA7CisJCW1jYV9kZXYtPnNsb3QgPSBpOworCQltY2FfZGV2LT5wb3NfcmVnaXN0ZXIgPSAwOworCQltY2FfY29uZmlndXJlX2FkYXB0ZXJfc3RhdHVzKG1jYV9kZXYpOworCQltY2FfcmVnaXN0ZXJfZGV2aWNlKE1DQV9QUklNQVJZX0JVUywgbWNhX2Rldik7CisJfQorCW91dGJfcCgwLCBNQ0FfQURBUFRFUl9TRVRVUF9SRUcpOworCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJldHVybiBtZW1vcnkgc3RhcnQgKi8KKwlzcGluX3VubG9ja19pcnEoJm1jYV9sb2NrKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQ0FfU1RBTkRBUkRfUkVTT1VSQ0VTOyBpKyspCisJCXJlcXVlc3RfcmVzb3VyY2UoJmlvcG9ydF9yZXNvdXJjZSwgbWNhX3N0YW5kYXJkX3Jlc291cmNlcyArIGkpOworCisJbWNhX2RvX3Byb2NfaW5pdCgpOworCisJcmV0dXJuIDA7CisKKyBvdXRfdW5sb2NrX25vbWVtOgorCXNwaW5fdW5sb2NrX2lycSgmbWNhX2xvY2spOworIG91dF9ub21lbToKKwlwcmludGsoS0VSTl9FTUVSRyAiRmFpbGVkIG1lbW9yeSBhbGxvY2F0aW9uIGluIE1DQSBzZXR1cCFcbiIpOworCXJldHVybiAtRU5PTUVNOworfQorCitzdWJzeXNfaW5pdGNhbGwobWNhX2luaXQpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgbWNhX2hhbmRsZV9ubWlfZGV2aWNlKHN0cnVjdCBtY2FfZGV2aWNlICptY2FfZGV2LCBpbnQgY2hlY2tfZmxhZykKK3sKKwlpbnQgc2xvdCA9IG1jYV9kZXYtPnNsb3Q7CisKKwlpZihzbG90ID09IE1DQV9JTlRFR1NDU0kpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiTk1JOiBjYXVzZWQgYnkgTUNBIGludGVncmF0ZWQgU0NTSSBhZGFwdGVyICglcylcbiIsCisJCQltY2FfZGV2LT5uYW1lKTsKKwl9IGVsc2UgaWYoc2xvdCA9PSBNQ0FfSU5URUdWSURFTykgeworCQlwcmludGsoS0VSTl9DUklUICJOTUk6IGNhdXNlZCBieSBNQ0EgaW50ZWdyYXRlZCB2aWRlbyBhZGFwdGVyICglcylcbiIsCisJCQltY2FfZGV2LT5uYW1lKTsKKwl9IGVsc2UgaWYoc2xvdCA9PSBNQ0FfTU9USEVSQk9BUkQpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiTk1JOiBjYXVzZWQgYnkgbW90aGVyYm9hcmQgKCVzKVxuIiwKKwkJCW1jYV9kZXYtPm5hbWUpOworCX0KKworCS8qIE1vcmUgaW5mbyBhdmFpbGFibGUgaW4gUE9TIDYgYW5kIDc/ICovCisKKwlpZihjaGVja19mbGFnKSB7CisJCXVuc2lnbmVkIGNoYXIgcG9zNiwgcG9zNzsKKworCQlwb3M2ID0gbWNhX2RldmljZV9yZWFkX3BvcyhtY2FfZGV2LCA2KTsKKwkJcG9zNyA9IG1jYV9kZXZpY2VfcmVhZF9wb3MobWNhX2RldiwgNyk7CisKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiTk1JOiBQT1MgNiA9IDB4JXgsIFBPUyA3ID0gMHgleFxuIiwgcG9zNiwgcG9zNyk7CisJfQorCit9IC8qIG1jYV9oYW5kbGVfbm1pX3Nsb3QgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgbWNhX2hhbmRsZV9ubWlfY2FsbGJhY2soc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBtY2FfZGV2aWNlICptY2FfZGV2ID0gdG9fbWNhX2RldmljZShkZXYpOworCXVuc2lnbmVkIGNoYXIgcG9zNTsKKworCXBvczUgPSBtY2FfZGV2aWNlX3JlYWRfcG9zKG1jYV9kZXYsIDUpOworCisJaWYoIShwb3M1ICYgMHg4MCkpIHsKKwkJLyogQml0IDcgb2YgUE9TIDUgaXMgcmVzZXQgd2hlbiB0aGlzIGFkYXB0ZXIgaGFzIGEgaGFyZHdhcmUKKwkJICogZXJyb3IuIEJpdCA3IGl0IHJlc2V0IGlmIHRoZXJlJ3MgZXJyb3IgaW5mb3JtYXRpb24KKwkJICogYXZhaWxhYmxlIGluIFBPUyA2IGFuZCA3LgorCQkgKi8KKwkJbWNhX2hhbmRsZV9ubWlfZGV2aWNlKG1jYV9kZXYsICEocG9zNSAmIDB4NDApKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCit2b2lkIG1jYV9oYW5kbGVfbm1pKHZvaWQpCit7CisJLyogRmlyc3QgdHJ5IC0gc2NhbiB0aGUgdmFyaW91cyBhZGFwdGVycyBhbmQgc2VlIGlmIGEgc3BlY2lmaWMKKwkgKiBhZGFwdGVyIHdhcyByZXNwb25zaWJsZSBmb3IgdGhlIGVycm9yLgorCSAqLworCWJ1c19mb3JfZWFjaF9kZXYoJm1jYV9idXNfdHlwZSwgTlVMTCwgTlVMTCwgbWNhX2hhbmRsZV9ubWlfY2FsbGJhY2spOworCisJbWNhX25taV9ob29rKCk7Cit9IC8qIG1jYV9oYW5kbGVfbm1pICovCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL21pY3JvY29kZS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9taWNyb2NvZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzdjNjEyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9taWNyb2NvZGUuYwpAQCAtMCwwICsxLDUxMiBAQAorLyoKKyAqCUludGVsIENQVSBNaWNyb2NvZGUgVXBkYXRlIERyaXZlciBmb3IgTGludXgKKyAqCisgKglDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBUaWdyYW4gQWl2YXppYW4KKyAqCisgKglUaGlzIGRyaXZlciBhbGxvd3MgdG8gdXBncmFkZSBtaWNyb2NvZGUgb24gSW50ZWwgcHJvY2Vzc29ycworICoJYmVsb25naW5nIHRvIElBLTMyIGZhbWlseSAtIFBlbnRpdW1Qcm8sIFBlbnRpdW0gSUksIAorICoJUGVudGl1bSBJSUksIFhlb24sIFBlbnRpdW0gNCwgZXRjLgorICoKKyAqCVJlZmVyZW5jZTogU2VjdGlvbiA4LjEwIG9mIFZvbHVtZSBJSUksIEludGVsIFBlbnRpdW0gNCBNYW51YWwsIAorICoJT3JkZXIgTnVtYmVyIDI0NTQ3MiBvciBmcmVlIGRvd25sb2FkIGZyb206CisgKgkJCisgKglodHRwOi8vZGV2ZWxvcGVyLmludGVsLmNvbS9kZXNpZ24vcGVudGl1bTQvbWFudWFscy8yNDU0NzIuaHRtCisgKgorICoJRm9yIG1vcmUgaW5mb3JtYXRpb24sIGdvIHRvIGh0dHA6Ly93d3cudXJiYW5teXRoLm9yZy9taWNyb2NvZGUKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCTEuMAkxNiBGZWIgMjAwMCwgVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5Ac2NvLmNvbT4KKyAqCQlJbml0aWFsIHJlbGVhc2UuCisgKgkxLjAxCTE4IEZlYiAyMDAwLCBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkBzY28uY29tPgorICoJCUFkZGVkIHJlYWQoKSBzdXBwb3J0ICsgY2xlYW51cHMuCisgKgkxLjAyCTIxIEZlYiAyMDAwLCBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkBzY28uY29tPgorICoJCUFkZGVkICdkZXZpY2UgdHJpbW1pbmcnIHN1cHBvcnQuIG9wZW4oT19XUk9OTFkpIHplcm9lcworICoJCWFuZCBmcmVlcyB0aGUgc2F2ZWQgY29weSBvZiBhcHBsaWVkIG1pY3JvY29kZS4KKyAqCTEuMDMJMjkgRmViIDIwMDAsIFRpZ3JhbiBBaXZhemlhbiA8dGlncmFuQHNjby5jb20+CisgKgkJTWFkZSB0byB1c2UgZGV2ZnMgKC9kZXYvY3B1L21pY3JvY29kZSkgKyBjbGVhbnVwcy4KKyAqCTEuMDQJMDYgSnVuIDIwMDAsIFNpbW9uIFRyaW1tZXIgPHNpbW9uQHZlcml0YXMuY29tPgorICoJCUFkZGVkIG1pc2MgZGV2aWNlIHN1cHBvcnQgKG5vdyB1c2VzIGJvdGggZGV2ZnMgYW5kIG1pc2MpLgorICoJCUFkZGVkIE1JQ1JPQ09ERV9JT0NGUkVFIGlvY3RsIHRvIGNsZWFyIG1lbW9yeS4KKyAqCTEuMDUJMDkgSnVuIDIwMDAsIFNpbW9uIFRyaW1tZXIgPHNpbW9uQHZlcml0YXMuY29tPgorICoJCU1lc3NhZ2VzIGZvciBlcnJvciBjYXNlcyAobm9uIEludGVsICYgbm8gc3VpdGFibGUgbWljcm9jb2RlKS4KKyAqCTEuMDYJMDMgQXVnIDIwMDAsIFRpZ3JhbiBBaXZhemlhbiA8dGlncmFuQHZlcml0YXMuY29tPgorICoJCVJlbW92ZWQgLT5yZWxlYXNlKCkuIFJlbW92ZWQgZXhjbHVzaXZlIG9wZW4gYW5kIHN0YXR1cyBiaXRtYXAuCisgKgkJQWRkZWQgbWljcm9jb2RlX3J3c2VtIHRvIHNlcmlhbGl6ZSByZWFkKCkvd3JpdGUoKS9pb2N0bCgpLgorICoJCVJlbW92ZWQgZ2xvYmFsIGtlcm5lbCBsb2NrIHVzYWdlLgorICoJMS4wNwkwNyBTZXAgMjAwMCwgVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5AdmVyaXRhcy5jb20+CisgKgkJV3JpdGUgMCB0byAweDhCIG1zciBhbmQgdGhlbiBjcHVpZCBiZWZvcmUgcmVhZGluZyByZXZpc2lvbiwKKyAqCQlzbyB0aGF0IGl0IHdvcmtzIGV2ZW4gaWYgdGhlcmUgd2VyZSBubyB1cGRhdGUgZG9uZSBieSB0aGUKKyAqCQlCSU9TLiBPdGhlcndpc2UsIHJlYWRpbmcgZnJvbSAweDhCIGdpdmVzIGp1bmsgKHdoaWNoIGhhcHBlbmVkCisgKgkJdG8gYmUgMCBvbiBteSBtYWNoaW5lIHdoaWNoIGlzIHdoeSBpdCB3b3JrZWQgZXZlbiB3aGVuIEkKKyAqCQlkaXNhYmxlZCB1cGRhdGUgYnkgdGhlIEJJT1MpCisgKgkJVGhhbmtzIHRvIEVyaWMgVy4gQmllZGVybWFuIDxlYmllZGVybWFuQGxueGkuY29tPiBmb3IgdGhlIGZpeC4KKyAqCTEuMDgJMTEgRGVjIDIwMDAsIFJpY2hhcmQgU2NoYWFsIDxyaWNoYXJkLnNjaGFhbEBpbnRlbC5jb20+IGFuZAorICoJCQkgICAgIFRpZ3JhbiBBaXZhemlhbiA8dGlncmFuQHZlcml0YXMuY29tPgorICoJCUludGVsIFBlbnRpdW0gNCBwcm9jZXNzb3Igc3VwcG9ydCBhbmQgYnVnZml4ZXMuCisgKgkxLjA5CTMwIE9jdCAyMDAxLCBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkB2ZXJpdGFzLmNvbT4KKyAqCQlCdWdmaXggZm9yIEhUIChIeXBlci1UaHJlYWRpbmcpIGVuYWJsZWQgcHJvY2Vzc29ycworICoJCXdoZXJlYnkgcHJvY2Vzc29yIHJlc291cmNlcyBhcmUgc2hhcmVkIGJ5IGFsbCBsb2dpY2FsIHByb2Nlc3NvcnMKKyAqCQlpbiBhIHNpbmdsZSBDUFUgcGFja2FnZS4KKyAqCTEuMTAJMjggRmViIDIwMDIgQXNpdCBLIE1hbGxpY2sgPGFzaXQuay5tYWxsaWNrQGludGVsLmNvbT4gYW5kCisgKgkJVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5AdmVyaXRhcy5jb20+LAorICoJCVNlcmlhbGl6ZSB1cGRhdGVzIGFzIHJlcXVpcmVkIG9uIEhUIHByb2Nlc3NvcnMgZHVlIHRvIHNwZWN1bGF0aXZlCisgKgkJbmF0dXJlIG9mIGltcGxlbWVudGF0aW9uLgorICoJMS4xMQkyMiBNYXIgMjAwMiBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkB2ZXJpdGFzLmNvbT4KKyAqCQlGaXggdGhlIHBhbmljIHdoZW4gd3JpdGluZyB6ZXJvLWxlbmd0aCBtaWNyb2NvZGUgY2h1bmsuCisgKgkxLjEyCTI5IFNlcCAyMDAzIE5pdGluIEthbWJsZSA8bml0aW4uYS5rYW1ibGVAaW50ZWwuY29tPiwgCisgKgkJSnVuIE5ha2FqaW1hIDxqdW4ubmFrYWppbWFAaW50ZWwuY29tPgorICoJCVN1cHBvcnQgZm9yIHRoZSBtaWNyb2NvZGUgdXBkYXRlcyBpbiB0aGUgbmV3IGZvcm1hdC4KKyAqCTEuMTMJMTAgT2N0IDIwMDMgVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5AdmVyaXRhcy5jb20+CisgKgkJUmVtb3ZlZCAtPnJlYWQoKSBtZXRob2QgYW5kIG9ic29sZXRlZCBNSUNST0NPREVfSU9DRlJFRSBpb2N0bAorICoJCWJlY2F1c2Ugd2Ugbm8gbG9uZ2VyIGhvbGQgYSBjb3B5IG9mIGFwcGxpZWQgbWljcm9jb2RlIAorICoJCWluIGtlcm5lbCBtZW1vcnkuCisgKgkxLjE0CTI1IEp1biAyMDA0IFRpZ3JhbiBBaXZhemlhbiA8dGlncmFuQHZlcml0YXMuY29tPgorICoJCUZpeCBzaWdtYXRjaCgpIG1hY3JvIHRvIGhhbmRsZSBvbGQgQ1BVcyB3aXRoIHBmID09IDAuCisgKgkJVGhhbmtzIHRvIFN0dWFydCBTd2FsZXMgZm9yIHBvaW50aW5nIG91dCB0aGlzIGJ1Zy4KKyAqLworCisvLyNkZWZpbmUgREVCVUcgLyogcHJfZGVidWcgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisKKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKK01PRFVMRV9ERVNDUklQVElPTigiSW50ZWwgQ1BVIChJQS0zMikgTWljcm9jb2RlIFVwZGF0ZSBEcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIlRpZ3JhbiBBaXZhemlhbiA8dGlncmFuQHZlcml0YXMuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZGVmaW5lIE1JQ1JPQ09ERV9WRVJTSU9OIAkiMS4xNCIKKworI2RlZmluZSBERUZBVUxUX1VDT0RFX0RBVEFTSVpFIAkoMjAwMCkgCSAgLyogMjAwMCBieXRlcyAqLworI2RlZmluZSBNQ19IRUFERVJfU0laRQkJKHNpemVvZiAobWljcm9jb2RlX2hlYWRlcl90KSkgIAkgIC8qIDQ4IGJ5dGVzICovCisjZGVmaW5lIERFRkFVTFRfVUNPREVfVE9UQUxTSVpFIChERUZBVUxUX1VDT0RFX0RBVEFTSVpFICsgTUNfSEVBREVSX1NJWkUpIC8qIDIwNDggYnl0ZXMgKi8KKyNkZWZpbmUgRVhUX0hFQURFUl9TSVpFCQkoc2l6ZW9mIChzdHJ1Y3QgZXh0ZW5kZWRfc2lndGFibGUpKSAvKiAyMCBieXRlcyAqLworI2RlZmluZSBFWFRfU0lHTkFUVVJFX1NJWkUJKHNpemVvZiAoc3RydWN0IGV4dGVuZGVkX3NpZ25hdHVyZSkpIC8qIDEyIGJ5dGVzICovCisjZGVmaW5lIERXU0laRQkJCShzaXplb2YgKHUzMikpCisjZGVmaW5lIGdldF90b3RhbHNpemUobWMpIFwKKwkoKChtaWNyb2NvZGVfdCAqKW1jKS0+aGRyLnRvdGFsc2l6ZSA/IFwKKwkgKChtaWNyb2NvZGVfdCAqKW1jKS0+aGRyLnRvdGFsc2l6ZSA6IERFRkFVTFRfVUNPREVfVE9UQUxTSVpFKQorI2RlZmluZSBnZXRfZGF0YXNpemUobWMpIFwKKwkoKChtaWNyb2NvZGVfdCAqKW1jKS0+aGRyLmRhdGFzaXplID8gXAorCSAoKG1pY3JvY29kZV90ICopbWMpLT5oZHIuZGF0YXNpemUgOiBERUZBVUxUX1VDT0RFX0RBVEFTSVpFKQorCisjZGVmaW5lIHNpZ21hdGNoKHMxLCBzMiwgcDEsIHAyKSBcCisJKCgoczEpID09IChzMikpICYmICgoKHAxKSAmIChwMikpIHx8ICgoKHAxKSA9PSAwKSAmJiAoKHAyKSA9PSAwKSkpKQorCisjZGVmaW5lIGV4dHRhYmxlX3NpemUoZXQpICgoZXQpLT5jb3VudCAqIEVYVF9TSUdOQVRVUkVfU0laRSArIEVYVF9IRUFERVJfU0laRSkKKworLyogc2VyaWFsaXplIGFjY2VzcyB0byB0aGUgcGh5c2ljYWwgd3JpdGUgdG8gTVNSIDB4NzkgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobWljcm9jb2RlX3VwZGF0ZV9sb2NrKTsKKworLyogbm8gY29uY3VycmVudCAtPndyaXRlKClzIGFyZSBhbGxvd2VkIG9uIC9kZXYvY3B1L21pY3JvY29kZSAqLworc3RhdGljIERFQ0xBUkVfTVVURVgobWljcm9jb2RlX3NlbSk7CisKK3N0YXRpYyB2b2lkIF9fdXNlciAqdXNlcl9idWZmZXI7CS8qIHVzZXIgYXJlYSBtaWNyb2NvZGUgZGF0YSBidWZmZXIgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdXNlcl9idWZmZXJfc2l6ZTsJLyogaXQncyBzaXplICovCisKK3R5cGVkZWYgZW51bSBtY19lcnJvcl9jb2RlIHsKKwlNQ19TVUNDRVNTIAk9IDAsCisJTUNfTk9URk9VTkQgCT0gMSwKKwlNQ19NQVJLRUQgCT0gMiwKKwlNQ19BTExPQ0FURUQgCT0gMywKK30gbWNfZXJyb3JfY29kZV90OworCitzdGF0aWMgc3RydWN0IHVjb2RlX2NwdV9pbmZvIHsKKwl1bnNpZ25lZCBpbnQgc2lnOworCXVuc2lnbmVkIGludCBwZjsKKwl1bnNpZ25lZCBpbnQgcmV2OworCXVuc2lnbmVkIGludCBja3N1bTsKKwltY19lcnJvcl9jb2RlX3QgZXJyOworCW1pY3JvY29kZV90ICptYzsKK30gdWNvZGVfY3B1X2luZm9bTlJfQ1BVU107CisJCQkJCitzdGF0aWMgaW50IG1pY3JvY29kZV9vcGVuIChzdHJ1Y3QgaW5vZGUgKnVudXNlZDEsIHN0cnVjdCBmaWxlICp1bnVzZWQyKQoreworCXJldHVybiBjYXBhYmxlKENBUF9TWVNfUkFXSU8pID8gMCA6IC1FUEVSTTsKK30KKworc3RhdGljIHZvaWQgY29sbGVjdF9jcHVfaW5mbyAodm9pZCAqdW51c2VkKQoreworCWludCBjcHVfbnVtID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9IGNwdV9kYXRhICsgY3B1X251bTsKKwlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1X251bTsKKwl1bnNpZ25lZCBpbnQgdmFsWzJdOworCisJdWNpLT5zaWcgPSB1Y2ktPnBmID0gdWNpLT5yZXYgPSB1Y2ktPmNrc3VtID0gMDsKKwl1Y2ktPmVyciA9IE1DX05PVEZPVU5EOyAKKwl1Y2ktPm1jID0gTlVMTDsKKworCWlmIChjLT54ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1JfSU5URUwgfHwgYy0+eDg2IDwgNiB8fAorCSAgICAJY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9JQTY0KSkgeworCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogQ1BVJWQgbm90IGEgY2FwYWJsZSBJbnRlbCBwcm9jZXNzb3JcbiIsIGNwdV9udW0pOworCQlyZXR1cm47CisJfSBlbHNlIHsKKwkJdWNpLT5zaWcgPSBjcHVpZF9lYXgoMHgwMDAwMDAwMSk7CisKKwkJaWYgKChjLT54ODZfbW9kZWwgPj0gNSkgfHwgKGMtPng4NiA+IDYpKSB7CisJCQkvKiBnZXQgcHJvY2Vzc29yIGZsYWdzIGZyb20gTVNSIDB4MTcgKi8KKwkJCXJkbXNyKE1TUl9JQTMyX1BMQVRGT1JNX0lELCB2YWxbMF0sIHZhbFsxXSk7CisJCQl1Y2ktPnBmID0gMSA8PCAoKHZhbFsxXSA+PiAxOCkgJiA3KTsKKwkJfQorCX0KKworCXdybXNyKE1TUl9JQTMyX1VDT0RFX1JFViwgMCwgMCk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjcHVpZCIgOiA6IDogImF4IiwgImJ4IiwgImN4IiwgImR4Iik7CisJLyogZ2V0IHRoZSBjdXJyZW50IHJldmlzaW9uIGZyb20gTVNSIDB4OEIgKi8KKwlyZG1zcihNU1JfSUEzMl9VQ09ERV9SRVYsIHZhbFswXSwgdWNpLT5yZXYpOworCXByX2RlYnVnKCJtaWNyb2NvZGU6IGNvbGxlY3RfY3B1X2luZm8gOiBzaWc9MHgleCwgcGY9MHgleCwgcmV2PTB4JXhcbiIsCisJCQl1Y2ktPnNpZywgdWNpLT5wZiwgdWNpLT5yZXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWFya19taWNyb2NvZGVfdXBkYXRlIChpbnQgY3B1X251bSwgbWljcm9jb2RlX2hlYWRlcl90ICptY19oZWFkZXIsIGludCBzaWcsIGludCBwZiwgaW50IGNrc3VtKQoreworCXN0cnVjdCB1Y29kZV9jcHVfaW5mbyAqdWNpID0gdWNvZGVfY3B1X2luZm8gKyBjcHVfbnVtOworCisJcHJfZGVidWcoIk1pY3JvY29kZSBGb3VuZC5cbiIpOworCXByX2RlYnVnKCIgICBIZWFkZXIgUmV2aXNpb24gMHgleFxuIiwgbWNfaGVhZGVyLT5oZHJ2ZXIpOworCXByX2RlYnVnKCIgICBMb2FkZXIgUmV2aXNpb24gMHgleFxuIiwgbWNfaGVhZGVyLT5sZHJ2ZXIpOworCXByX2RlYnVnKCIgICBSZXZpc2lvbiAweCV4IFxuIiwgbWNfaGVhZGVyLT5yZXYpOworCXByX2RlYnVnKCIgICBEYXRlICV4LyV4LyV4XG4iLAorCQkoKG1jX2hlYWRlci0+ZGF0ZSA+PiAyNCApICYgMHhmZiksCisJCSgobWNfaGVhZGVyLT5kYXRlID4+IDE2ICkgJiAweGZmKSwKKwkJKG1jX2hlYWRlci0+ZGF0ZSAmIDB4RkZGRikpOworCXByX2RlYnVnKCIgICBTaWduYXR1cmUgMHgleFxuIiwgc2lnKTsKKwlwcl9kZWJ1ZygiICAgVHlwZSAweCV4IEZhbWlseSAweCV4IE1vZGVsIDB4JXggU3RlcHBpbmcgMHgleFxuIiwKKwkJKChzaWcgPj4gMTIpICYgMHgzKSwKKwkJKChzaWcgPj4gOCkgJiAweGYpLAorCQkoKHNpZyA+PiA0KSAmIDB4ZiksCisJCSgoc2lnICYgMHhmKSkpOworCXByX2RlYnVnKCIgICBQcm9jZXNzb3IgRmxhZ3MgMHgleFxuIiwgcGYpOworCXByX2RlYnVnKCIgICBDaGVja3N1bSAweCV4XG4iLCBja3N1bSk7CisKKwlpZiAobWNfaGVhZGVyLT5yZXYgPCB1Y2ktPnJldikgeworCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogQ1BVJWQgbm90ICd1cGdyYWRpbmcnIHRvIGVhcmxpZXIgcmV2aXNpb24iCisJCSAgICAgICAiIDB4JXggKGN1cnJlbnQ9MHgleClcbiIsIGNwdV9udW0sIG1jX2hlYWRlci0+cmV2LCB1Y2ktPnJldik7CisJCWdvdG8gb3V0OworCX0gZWxzZSBpZiAobWNfaGVhZGVyLT5yZXYgPT0gdWNpLT5yZXYpIHsKKwkJLyogbm90aWZ5IHRoZSBjYWxsZXIgb2Ygc3VjY2VzcyBvbiB0aGlzIGNwdSAqLworCQl1Y2ktPmVyciA9IE1DX1NVQ0NFU1M7CisJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBDUFUlZCBhbHJlYWR5IGF0IHJldmlzaW9uIgorCQkJIiAweCV4IChjdXJyZW50PTB4JXgpXG4iLCBjcHVfbnVtLCBtY19oZWFkZXItPnJldiwgdWNpLT5yZXYpOworCQlnb3RvIG91dDsKKwl9CisKKwlwcl9kZWJ1ZygibWljcm9jb2RlOiBDUFUlZCBmb3VuZCBhIG1hdGNoaW5nIG1pY3JvY29kZSB1cGRhdGUgd2l0aCAiCisJCSIgcmV2aXNpb24gMHgleCAoY3VycmVudD0weCV4KVxuIiwgY3B1X251bSwgbWNfaGVhZGVyLT5yZXYsIHVjaS0+cmV2KTsKKwl1Y2ktPmNrc3VtID0gY2tzdW07CisJdWNpLT5wZiA9IHBmOyAvKiBrZWVwIHRoZSBvcmlnaW5hbCBtYyBwZiBmb3IgY2tzdW0gY2FsY3VsYXRpb24gKi8KKwl1Y2ktPmVyciA9IE1DX01BUktFRDsgLyogZm91bmQgdGhlIG1hdGNoICovCitvdXQ6CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IGZpbmRfbWF0Y2hpbmdfdWNvZGVzICh2b2lkKSAKK3sKKwlpbnQgY3Vyc29yID0gMDsKKwlpbnQgZXJyb3IgPSAwOworCisJd2hpbGUgKGN1cnNvciArIE1DX0hFQURFUl9TSVpFIDwgdXNlcl9idWZmZXJfc2l6ZSkgeworCQltaWNyb2NvZGVfaGVhZGVyX3QgbWNfaGVhZGVyOworCQl2b2lkICpuZXdtYyA9IE5VTEw7CisJCWludCBpLCBzdW0sIGNwdV9udW0sIGFsbG9jYXRlZF9mbGFnLCB0b3RhbF9zaXplLCBkYXRhX3NpemUsIGV4dF90YWJsZV9zaXplOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmbWNfaGVhZGVyLCB1c2VyX2J1ZmZlciArIGN1cnNvciwgTUNfSEVBREVSX1NJWkUpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogZXJyb3IhIENhbiBub3QgcmVhZCB1c2VyIGRhdGFcbiIpOworCQkJZXJyb3IgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKworCQl0b3RhbF9zaXplID0gZ2V0X3RvdGFsc2l6ZSgmbWNfaGVhZGVyKTsKKwkJaWYgKChjdXJzb3IgKyB0b3RhbF9zaXplID4gdXNlcl9idWZmZXJfc2l6ZSkgfHwgKHRvdGFsX3NpemUgPCBERUZBVUxUX1VDT0RFX1RPVEFMU0laRSkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBlcnJvciEgQmFkIGRhdGEgaW4gbWljcm9jb2RlIGRhdGEgZmlsZVxuIik7CisJCQllcnJvciA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWRhdGFfc2l6ZSA9IGdldF9kYXRhc2l6ZSgmbWNfaGVhZGVyKTsKKwkJaWYgKChkYXRhX3NpemUgKyBNQ19IRUFERVJfU0laRSA+IHRvdGFsX3NpemUpIHx8IChkYXRhX3NpemUgPCBERUZBVUxUX1VDT0RFX0RBVEFTSVpFKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IGVycm9yISBCYWQgZGF0YSBpbiBtaWNyb2NvZGUgZGF0YSBmaWxlXG4iKTsKKwkJCWVycm9yID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKG1jX2hlYWRlci5sZHJ2ZXIgIT0gMSB8fCBtY19oZWFkZXIuaGRydmVyICE9IDEpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBlcnJvciEgVW5rbm93biBtaWNyb2NvZGUgdXBkYXRlIGZvcm1hdFxuIik7CisJCQllcnJvciA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCQkKKwkJZm9yIChjcHVfbnVtID0gMDsgY3B1X251bSA8IG51bV9vbmxpbmVfY3B1cygpOyBjcHVfbnVtKyspIHsKKwkJCXN0cnVjdCB1Y29kZV9jcHVfaW5mbyAqdWNpID0gdWNvZGVfY3B1X2luZm8gKyBjcHVfbnVtOworCQkJaWYgKHVjaS0+ZXJyICE9IE1DX05PVEZPVU5EKSAvKiBhbHJlYWR5IGZvdW5kIGEgbWF0Y2ggb3Igbm90IGFuIG9ubGluZSBjcHUqLworCQkJCWNvbnRpbnVlOworCisJCQlpZiAoc2lnbWF0Y2gobWNfaGVhZGVyLnNpZywgdWNpLT5zaWcsIG1jX2hlYWRlci5wZiwgdWNpLT5wZikpCisJCQkJbWFya19taWNyb2NvZGVfdXBkYXRlKGNwdV9udW0sICZtY19oZWFkZXIsIG1jX2hlYWRlci5zaWcsIG1jX2hlYWRlci5wZiwgbWNfaGVhZGVyLmNrc3VtKTsKKwkJfQorCisJCWV4dF90YWJsZV9zaXplID0gdG90YWxfc2l6ZSAtIChNQ19IRUFERVJfU0laRSArIGRhdGFfc2l6ZSk7CisJCWlmIChleHRfdGFibGVfc2l6ZSkgeworCQkJc3RydWN0IGV4dGVuZGVkX3NpZ3RhYmxlIGV4dF9oZWFkZXI7CisJCQlzdHJ1Y3QgZXh0ZW5kZWRfc2lnbmF0dXJlIGV4dF9zaWc7CisJCQlpbnQgZXh0X3NpZ2NvdW50OworCisJCQlpZiAoKGV4dF90YWJsZV9zaXplIDwgRVhUX0hFQURFUl9TSVpFKSAKKwkJCQkJfHwgKChleHRfdGFibGVfc2l6ZSAtIEVYVF9IRUFERVJfU0laRSkgJSBFWFRfU0lHTkFUVVJFX1NJWkUpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IGVycm9yISBCYWQgZGF0YSBpbiBtaWNyb2NvZGUgZGF0YSBmaWxlXG4iKTsKKwkJCQllcnJvciA9IC1FSU5WQUw7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlpZiAoY29weV9mcm9tX3VzZXIoJmV4dF9oZWFkZXIsIHVzZXJfYnVmZmVyICsgY3Vyc29yIAorCQkJCQkrIE1DX0hFQURFUl9TSVpFICsgZGF0YV9zaXplLCBFWFRfSEVBREVSX1NJWkUpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IGVycm9yISBDYW4gbm90IHJlYWQgdXNlciBkYXRhXG4iKTsKKwkJCQllcnJvciA9IC1FRkFVTFQ7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlpZiAoZXh0X3RhYmxlX3NpemUgIT0gZXh0dGFibGVfc2l6ZSgmZXh0X2hlYWRlcikpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogZXJyb3IhIEJhZCBkYXRhIGluIG1pY3JvY29kZSBkYXRhIGZpbGVcbiIpOworCQkJCWVycm9yID0gLUVGQVVMVDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJZXh0X3NpZ2NvdW50ID0gZXh0X2hlYWRlci5jb3VudDsKKwkJCQorCQkJZm9yIChpID0gMDsgaSA8IGV4dF9zaWdjb3VudDsgaSsrKSB7CisJCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZleHRfc2lnLCB1c2VyX2J1ZmZlciArIGN1cnNvciArIE1DX0hFQURFUl9TSVpFICsgZGF0YV9zaXplICsgRVhUX0hFQURFUl9TSVpFIAorCQkJCQkJKyBFWFRfU0lHTkFUVVJFX1NJWkUgKiBpLCBFWFRfU0lHTkFUVVJFX1NJWkUpKSB7CisJCQkJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBlcnJvciEgQ2FuIG5vdCByZWFkIHVzZXIgZGF0YVxuIik7CisJCQkJCWVycm9yID0gLUVGQVVMVDsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCWZvciAoY3B1X251bSA9IDA7IGNwdV9udW0gPCBudW1fb25saW5lX2NwdXMoKTsgY3B1X251bSsrKSB7CisJCQkJCXN0cnVjdCB1Y29kZV9jcHVfaW5mbyAqdWNpID0gdWNvZGVfY3B1X2luZm8gKyBjcHVfbnVtOworCQkJCQlpZiAodWNpLT5lcnIgIT0gTUNfTk9URk9VTkQpIC8qIGFscmVhZHkgZm91bmQgYSBtYXRjaCBvciBub3QgYW4gb25saW5lIGNwdSovCisJCQkJCQljb250aW51ZTsKKwkJCQkJaWYgKHNpZ21hdGNoKGV4dF9zaWcuc2lnLCB1Y2ktPnNpZywgZXh0X3NpZy5wZiwgdWNpLT5wZikpIHsKKwkJCQkJCW1hcmtfbWljcm9jb2RlX3VwZGF0ZShjcHVfbnVtLCAmbWNfaGVhZGVyLCBleHRfc2lnLnNpZywgZXh0X3NpZy5wZiwgZXh0X3NpZy5ja3N1bSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJLyogbm93IGNoZWNrIGlmIGFueSBjcHUgaGFzIG1hdGNoZWQgKi8KKwkJZm9yIChjcHVfbnVtID0gMCwgYWxsb2NhdGVkX2ZsYWcgPSAwLCBzdW0gPSAwOyBjcHVfbnVtIDwgbnVtX29ubGluZV9jcHVzKCk7IGNwdV9udW0rKykgeworCQkJaWYgKHVjb2RlX2NwdV9pbmZvW2NwdV9udW1dLmVyciA9PSBNQ19NQVJLRUQpIHsgCisJCQkJc3RydWN0IHVjb2RlX2NwdV9pbmZvICp1Y2kgPSB1Y29kZV9jcHVfaW5mbyArIGNwdV9udW07CisJCQkJaWYgKCFhbGxvY2F0ZWRfZmxhZykgeworCQkJCQlhbGxvY2F0ZWRfZmxhZyA9IDE7CisJCQkJCW5ld21jID0gdm1hbGxvYyh0b3RhbF9zaXplKTsKKwkJCQkJaWYgKCFuZXdtYykgeworCQkJCQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IGVycm9yISBDYW4gbm90IGFsbG9jYXRlIG1lbW9yeVxuIik7CisJCQkJCQllcnJvciA9IC1FTk9NRU07CisJCQkJCQlnb3RvIG91dDsKKwkJCQkJfQorCQkJCQlpZiAoY29weV9mcm9tX3VzZXIobmV3bWMgKyBNQ19IRUFERVJfU0laRSwgCisJCQkJCQkJCXVzZXJfYnVmZmVyICsgY3Vyc29yICsgTUNfSEVBREVSX1NJWkUsIAorCQkJCQkJCQl0b3RhbF9zaXplIC0gTUNfSEVBREVSX1NJWkUpKSB7CisJCQkJCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogZXJyb3IhIENhbiBub3QgcmVhZCB1c2VyIGRhdGFcbiIpOworCQkJCQkJdmZyZWUobmV3bWMpOworCQkJCQkJZXJyb3IgPSAtRUZBVUxUOworCQkJCQkJZ290byBvdXQ7CisJCQkJCX0KKwkJCQkJbWVtY3B5KG5ld21jLCAmbWNfaGVhZGVyLCBNQ19IRUFERVJfU0laRSk7CisJCQkJCS8qIGNoZWNrIGV4dGVuZGVkIHRhYmxlIGNoZWNrc3VtICovCisJCQkJCWlmIChleHRfdGFibGVfc2l6ZSkgeworCQkJCQkJaW50IGV4dF90YWJsZV9zdW0gPSAwOworCQkJCQkJaW50ICogZXh0X3RhYmxlcCA9ICgoKHZvaWQgKikgbmV3bWMpICsgTUNfSEVBREVSX1NJWkUgKyBkYXRhX3NpemUpOworCQkJCQkJaSA9IGV4dF90YWJsZV9zaXplIC8gRFdTSVpFOworCQkJCQkJd2hpbGUgKGktLSkgZXh0X3RhYmxlX3N1bSArPSBleHRfdGFibGVwW2ldOworCQkJCQkJaWYgKGV4dF90YWJsZV9zdW0pIHsKKwkJCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtaWNyb2NvZGU6IGFib3J0aW5nLCBiYWQgZXh0ZW5kZWQgc2lnbmF0dXJlIHRhYmxlIGNoZWNrc3VtXG4iKTsKKwkJCQkJCQl2ZnJlZShuZXdtYyk7CisJCQkJCQkJZXJyb3IgPSAtRUlOVkFMOworCQkJCQkJCWdvdG8gb3V0OworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJLyogY2FsY3VsYXRlIHRoZSBjaGVja3N1bSAqLworCQkJCQlpID0gKE1DX0hFQURFUl9TSVpFICsgZGF0YV9zaXplKSAvIERXU0laRTsKKwkJCQkJd2hpbGUgKGktLSkgc3VtICs9ICgoaW50ICopbmV3bWMpW2ldOworCQkJCQlzdW0gLT0gKG1jX2hlYWRlci5zaWcgKyBtY19oZWFkZXIucGYgKyBtY19oZWFkZXIuY2tzdW0pOworCQkJCX0KKwkJCQl1Y29kZV9jcHVfaW5mb1tjcHVfbnVtXS5tYyA9IG5ld21jOworCQkJCXVjb2RlX2NwdV9pbmZvW2NwdV9udW1dLmVyciA9IE1DX0FMTE9DQVRFRDsgLyogbWMgdXBkYXRlZCAqLworCQkJCWlmIChzdW0gKyB1Y2ktPnNpZyArIHVjaS0+cGYgKyB1Y2ktPmNrc3VtICE9IDApIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IENQVSVkIGFib3J0aW5nLCBiYWQgY2hlY2tzdW1cbiIsIGNwdV9udW0pOworCQkJCQllcnJvciA9IC1FSU5WQUw7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCX0KKwkJfQorCQljdXJzb3IgKz0gdG90YWxfc2l6ZTsgLyogZ290byB0aGUgbmV4dCB1cGRhdGUgcGF0Y2ggKi8KKwl9IC8qIGVuZCBvZiB3aGlsZSAqLworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHZvaWQgZG9fdXBkYXRlX29uZSAodm9pZCAqIHVudXNlZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCB2YWxbMl07CisJaW50IGNwdV9udW0gPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJc3RydWN0IHVjb2RlX2NwdV9pbmZvICp1Y2kgPSB1Y29kZV9jcHVfaW5mbyArIGNwdV9udW07CisKKwlpZiAodWNpLT5tYyA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0lORk8gIm1pY3JvY29kZTogTm8gbmV3IG1pY3JvY29kZSBkYXRhIGZvciBDUFUlZFxuIiwgY3B1X251bSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBzZXJpYWxpemUgYWNjZXNzIHRvIHRoZSBwaHlzaWNhbCB3cml0ZSB0byBNU1IgMHg3OSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZtaWNyb2NvZGVfdXBkYXRlX2xvY2ssIGZsYWdzKTsgICAgICAgICAgCisKKwkvKiB3cml0ZSBtaWNyb2NvZGUgdmlhIE1TUiAweDc5ICovCisJd3Jtc3IoTVNSX0lBMzJfVUNPREVfV1JJVEUsCisJCSh1bnNpZ25lZCBsb25nKSB1Y2ktPm1jLT5iaXRzLCAKKwkJKHVuc2lnbmVkIGxvbmcpIHVjaS0+bWMtPmJpdHMgPj4gMTYgPj4gMTYpOworCXdybXNyKE1TUl9JQTMyX1VDT0RFX1JFViwgMCwgMCk7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImNwdWlkIiA6IDogOiAiYXgiLCAiYngiLCAiY3giLCAiZHgiKTsKKwkvKiBnZXQgdGhlIGN1cnJlbnQgcmV2aXNpb24gZnJvbSBNU1IgMHg4QiAqLworCXJkbXNyKE1TUl9JQTMyX1VDT0RFX1JFViwgdmFsWzBdLCB2YWxbMV0pOworCisJLyogbm90aWZ5IHRoZSBjYWxsZXIgb2Ygc3VjY2VzcyBvbiB0aGlzIGNwdSAqLworCXVjaS0+ZXJyID0gTUNfU1VDQ0VTUzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaWNyb2NvZGVfdXBkYXRlX2xvY2ssIGZsYWdzKTsKKwlwcmludGsoS0VSTl9JTkZPICJtaWNyb2NvZGU6IENQVSVkIHVwZGF0ZWQgZnJvbSByZXZpc2lvbiAiCisJICAgICAgICIweCV4IHRvIDB4JXgsIGRhdGUgPSAlMDh4IFxuIiwgCisJICAgICAgIGNwdV9udW0sIHVjaS0+cmV2LCB2YWxbMV0sIHVjaS0+bWMtPmhkci5kYXRlKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgZG9fbWljcm9jb2RlX3VwZGF0ZSAodm9pZCkKK3sKKwlpbnQgaSwgZXJyb3I7CisKKwlpZiAob25fZWFjaF9jcHUoY29sbGVjdF9jcHVfaW5mbywgTlVMTCwgMSwgMSkgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogRXJyb3IhIENvdWxkIG5vdCBydW4gb24gYWxsIHByb2Nlc3NvcnNcbiIpOworCQllcnJvciA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKworCWlmICgoZXJyb3IgPSBmaW5kX21hdGNoaW5nX3Vjb2RlcygpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogRXJyb3IgaW4gdGhlIG1pY3JvY29kZSBkYXRhXG4iKTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlpZiAob25fZWFjaF9jcHUoZG9fdXBkYXRlX29uZSwgTlVMTCwgMSwgMSkgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogRXJyb3IhIENvdWxkIG5vdCBydW4gb24gYWxsIHByb2Nlc3NvcnNcbiIpOworCQllcnJvciA9IC1FSU87CisJfQorCitvdXRfZnJlZToKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX29ubGluZV9jcHVzKCk7IGkrKykgeworCQlpZiAodWNvZGVfY3B1X2luZm9baV0ubWMpIHsKKwkJCWludCBqOworCQkJdm9pZCAqdG1wID0gdWNvZGVfY3B1X2luZm9baV0ubWM7CisJCQl2ZnJlZSh0bXApOworCQkJZm9yIChqID0gaTsgaiA8IG51bV9vbmxpbmVfY3B1cygpOyBqKyspIHsKKwkJCQlpZiAodWNvZGVfY3B1X2luZm9bal0ubWMgPT0gdG1wKQorCQkJCQl1Y29kZV9jcHVfaW5mb1tqXS5tYyA9IE5VTEw7CisJCQl9CisJCX0KKwl9CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgc3NpemVfdCBtaWNyb2NvZGVfd3JpdGUgKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJc3NpemVfdCByZXQ7CisKKwlpZiAobGVuIDwgREVGQVVMVF9VQ09ERV9UT1RBTFNJWkUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IG5vdCBlbm91Z2ggZGF0YVxuIik7IAorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoKGxlbiA+PiBQQUdFX1NISUZUKSA+IG51bV9waHlzcGFnZXMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IHRvbyBtdWNoIGRhdGEgKG1heCAlbGQgcGFnZXMpXG4iLCBudW1fcGh5c3BhZ2VzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZG93bigmbWljcm9jb2RlX3NlbSk7CisKKwl1c2VyX2J1ZmZlciA9ICh2b2lkIF9fdXNlciAqKSBidWY7CisJdXNlcl9idWZmZXJfc2l6ZSA9IChpbnQpIGxlbjsKKworCXJldCA9IGRvX21pY3JvY29kZV91cGRhdGUoKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gKHNzaXplX3QpbGVuOworCisJdXAoJm1pY3JvY29kZV9zZW0pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtaWNyb2NvZGVfaW9jdGwgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCAKKwkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3dpdGNoIChjbWQpIHsKKwkJLyogCisJCSAqICBYWFg6IHdpbGwgYmUgcmVtb3ZlZCBhZnRlciBtaWNyb2NvZGVfY3RsIAorCQkgKiAgaXMgdXBkYXRlZCB0byBpZ25vcmUgZmFpbHVyZSBvZiB0aGlzIGlvY3RsKCkKKwkJICovCisJCWNhc2UgTUlDUk9DT0RFX0lPQ0ZSRUU6CisJCQlyZXR1cm4gMDsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbWljcm9jb2RlX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS53cml0ZQkJPSBtaWNyb2NvZGVfd3JpdGUsCisJLmlvY3RsCQk9IG1pY3JvY29kZV9pb2N0bCwKKwkub3BlbgkJPSBtaWNyb2NvZGVfb3BlbiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBtaWNyb2NvZGVfZGV2ID0geworCS5taW5vcgkJPSBNSUNST0NPREVfTUlOT1IsCisJLm5hbWUJCT0gIm1pY3JvY29kZSIsCisJLmRldmZzX25hbWUJPSAiY3B1L21pY3JvY29kZSIsCisJLmZvcHMJCT0gJm1pY3JvY29kZV9mb3BzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbWljcm9jb2RlX2luaXQgKHZvaWQpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBtaXNjX3JlZ2lzdGVyKCZtaWNyb2NvZGVfZGV2KTsKKwlpZiAoZXJyb3IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkibWljcm9jb2RlOiBjYW4ndCBtaXNjX3JlZ2lzdGVyIG9uIG1pbm9yPSVkXG4iLAorCQkJTUlDUk9DT0RFX01JTk9SKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCXByaW50ayhLRVJOX0lORk8gCisJCSJJQS0zMiBNaWNyb2NvZGUgVXBkYXRlIERyaXZlcjogdiIgTUlDUk9DT0RFX1ZFUlNJT04gIiA8dGlncmFuQHZlcml0YXMuY29tPlxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtaWNyb2NvZGVfZXhpdCAodm9pZCkKK3sKKwltaXNjX2RlcmVnaXN0ZXIoJm1pY3JvY29kZV9kZXYpOworCXByaW50ayhLRVJOX0lORk8gIklBLTMyIE1pY3JvY29kZSBVcGRhdGUgRHJpdmVyIHYiIE1JQ1JPQ09ERV9WRVJTSU9OICIgdW5yZWdpc3RlcmVkXG4iKTsKK30KKworbW9kdWxlX2luaXQobWljcm9jb2RlX2luaXQpCittb2R1bGVfZXhpdChtaWNyb2NvZGVfZXhpdCkKK01PRFVMRV9BTElBU19NSVNDREVWKE1JQ1JPQ09ERV9NSU5PUik7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL21vZHVsZS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9tb2R1bGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTQ5YzhhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9tb2R1bGUuYwpAQCAtMCwwICsxLDEyOSBAQAorLyogIEtlcm5lbCBtb2R1bGUgaGVscCBmb3IgaTM4Ni4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDEgUnVzdHkgUnVzc2VsbC4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlbG9hZGVyLmg+CisjaW5jbHVkZSA8bGludXgvZWxmLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpZiAwCisjZGVmaW5lIERFQlVHUCBwcmludGsKKyNlbHNlCisjZGVmaW5lIERFQlVHUChmbXQuLi4pCisjZW5kaWYKKwordm9pZCAqbW9kdWxlX2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlpZiAoc2l6ZSA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gdm1hbGxvY19leGVjKHNpemUpOworfQorCisKKy8qIEZyZWUgbWVtb3J5IHJldHVybmVkIGZyb20gbW9kdWxlX2FsbG9jICovCit2b2lkIG1vZHVsZV9mcmVlKHN0cnVjdCBtb2R1bGUgKm1vZCwgdm9pZCAqbW9kdWxlX3JlZ2lvbikKK3sKKwl2ZnJlZShtb2R1bGVfcmVnaW9uKTsKKwkvKiBGSVhNRTogSWYgbW9kdWxlX3JlZ2lvbiA9PSBtb2QtPmluaXRfcmVnaW9uLCB0cmltIGV4Y2VwdGlvbgorICAgICAgICAgICB0YWJsZSBlbnRyaWVzLiAqLworfQorCisvKiBXZSBkb24ndCBuZWVkIGFueXRoaW5nIHNwZWNpYWwuICovCitpbnQgbW9kdWxlX2Zyb2JfYXJjaF9zZWN0aW9ucyhFbGZfRWhkciAqaGRyLAorCQkJICAgICAgRWxmX1NoZHIgKnNlY2hkcnMsCisJCQkgICAgICBjaGFyICpzZWNzdHJpbmdzLAorCQkJICAgICAgc3RydWN0IG1vZHVsZSAqbW9kKQoreworCXJldHVybiAwOworfQorCitpbnQgYXBwbHlfcmVsb2NhdGUoRWxmMzJfU2hkciAqc2VjaGRycywKKwkJICAgY29uc3QgY2hhciAqc3RydGFiLAorCQkgICB1bnNpZ25lZCBpbnQgc3ltaW5kZXgsCisJCSAgIHVuc2lnbmVkIGludCByZWxzZWMsCisJCSAgIHN0cnVjdCBtb2R1bGUgKm1lKQoreworCXVuc2lnbmVkIGludCBpOworCUVsZjMyX1JlbCAqcmVsID0gKHZvaWQgKilzZWNoZHJzW3JlbHNlY10uc2hfYWRkcjsKKwlFbGYzMl9TeW0gKnN5bTsKKwl1aW50MzJfdCAqbG9jYXRpb247CisKKwlERUJVR1AoIkFwcGx5aW5nIHJlbG9jYXRlIHNlY3Rpb24gJXUgdG8gJXVcbiIsIHJlbHNlYywKKwkgICAgICAgc2VjaGRyc1tyZWxzZWNdLnNoX2luZm8pOworCWZvciAoaSA9IDA7IGkgPCBzZWNoZHJzW3JlbHNlY10uc2hfc2l6ZSAvIHNpemVvZigqcmVsKTsgaSsrKSB7CisJCS8qIFRoaXMgaXMgd2hlcmUgdG8gbWFrZSB0aGUgY2hhbmdlICovCisJCWxvY2F0aW9uID0gKHZvaWQgKilzZWNoZHJzW3NlY2hkcnNbcmVsc2VjXS5zaF9pbmZvXS5zaF9hZGRyCisJCQkrIHJlbFtpXS5yX29mZnNldDsKKwkJLyogVGhpcyBpcyB0aGUgc3ltYm9sIGl0IGlzIHJlZmVycmluZyB0by4gIE5vdGUgdGhhdCBhbGwKKwkJICAgdW5kZWZpbmVkIHN5bWJvbHMgaGF2ZSBiZWVuIHJlc29sdmVkLiAgKi8KKwkJc3ltID0gKEVsZjMyX1N5bSAqKXNlY2hkcnNbc3ltaW5kZXhdLnNoX2FkZHIKKwkJCSsgRUxGMzJfUl9TWU0ocmVsW2ldLnJfaW5mbyk7CisKKwkJc3dpdGNoIChFTEYzMl9SX1RZUEUocmVsW2ldLnJfaW5mbykpIHsKKwkJY2FzZSBSXzM4Nl8zMjoKKwkJCS8qIFdlIGFkZCB0aGUgdmFsdWUgaW50byB0aGUgbG9jYXRpb24gZ2l2ZW4gKi8KKwkJCSpsb2NhdGlvbiArPSBzeW0tPnN0X3ZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgUl8zODZfUEMzMjoKKwkJCS8qIEFkZCB0aGUgdmFsdWUsIHN1YnRyYWN0IGl0cyBwb3N0aXRpb24gKi8KKwkJCSpsb2NhdGlvbiArPSBzeW0tPnN0X3ZhbHVlIC0gKHVpbnQzMl90KWxvY2F0aW9uOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgIm1vZHVsZSAlczogVW5rbm93biByZWxvY2F0aW9uOiAldVxuIiwKKwkJCSAgICAgICBtZS0+bmFtZSwgRUxGMzJfUl9UWVBFKHJlbFtpXS5yX2luZm8pKTsKKwkJCXJldHVybiAtRU5PRVhFQzsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGFwcGx5X3JlbG9jYXRlX2FkZChFbGYzMl9TaGRyICpzZWNoZHJzLAorCQkgICAgICAgY29uc3QgY2hhciAqc3RydGFiLAorCQkgICAgICAgdW5zaWduZWQgaW50IHN5bWluZGV4LAorCQkgICAgICAgdW5zaWduZWQgaW50IHJlbHNlYywKKwkJICAgICAgIHN0cnVjdCBtb2R1bGUgKm1lKQoreworCXByaW50ayhLRVJOX0VSUiAibW9kdWxlICVzOiBBREQgUkVMT0NBVElPTiB1bnN1cHBvcnRlZFxuIiwKKwkgICAgICAgbWUtPm5hbWUpOworCXJldHVybiAtRU5PRVhFQzsKK30KKworZXh0ZXJuIHZvaWQgYXBwbHlfYWx0ZXJuYXRpdmVzKHZvaWQgKnN0YXJ0LCB2b2lkICplbmQpOyAKKworaW50IG1vZHVsZV9maW5hbGl6ZShjb25zdCBFbGZfRWhkciAqaGRyLAorCQkgICAgY29uc3QgRWxmX1NoZHIgKnNlY2hkcnMsCisJCSAgICBzdHJ1Y3QgbW9kdWxlICptZSkKK3sKKwljb25zdCBFbGZfU2hkciAqczsKKwljaGFyICpzZWNzdHJpbmdzID0gKHZvaWQgKiloZHIgKyBzZWNoZHJzW2hkci0+ZV9zaHN0cm5keF0uc2hfb2Zmc2V0OworCisJLyogbG9vayBmb3IgLmFsdGluc3RydWN0aW9ucyB0byBwYXRjaCAqLyAKKwlmb3IgKHMgPSBzZWNoZHJzOyBzIDwgc2VjaGRycyArIGhkci0+ZV9zaG51bTsgcysrKSB7IAorCQl2b2lkICpzZWc7IAkJCisJCWlmIChzdHJjbXAoIi5hbHRpbnN0cnVjdGlvbnMiLCBzZWNzdHJpbmdzICsgcy0+c2hfbmFtZSkpCisJCQljb250aW51ZTsKKwkJc2VnID0gKHZvaWQgKilzLT5zaF9hZGRyOyAKKwkJYXBwbHlfYWx0ZXJuYXRpdmVzKHNlZywgc2VnICsgcy0+c2hfc2l6ZSk7IAorCX0gCQorCXJldHVybiAwOworfQorCit2b2lkIG1vZHVsZV9hcmNoX2NsZWFudXAoc3RydWN0IG1vZHVsZSAqbW9kKQoreworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9tcHBhcnNlLmMgYi9hcmNoL2kzODYva2VybmVsL21wcGFyc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzQ3YWI0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9tcHBhcnNlLmMKQEAgLTAsMCArMSwxMTA5IEBACisvKgorICoJSW50ZWwgTXVsdGlwcm9jZXNzb3IgU3BlY2lmaWNhdGlvbiAxLjEgYW5kIDEuNAorICoJY29tcGxpYW50IE1QLXRhYmxlIHBhcnNpbmcgcm91dGluZXMuCisgKgorICoJKGMpIDE5OTUgQWxhbiBDb3gsIEJ1aWxkaW5nICMzIDxhbGFuQHJlZGhhdC5jb20+CisgKgkoYykgMTk5OCwgMTk5OSwgMjAwMCBJbmdvIE1vbG5hciA8bWluZ29AcmVkaGF0LmNvbT4KKyAqCisgKglGaXhlcworICoJCUVyaWNoIEJvbGV5bgk6CU1QIHYxLjQgYW5kIGFkZGl0aW9uYWwgY2hhbmdlcy4KKyAqCQlBbGFuIENveAk6CUFkZGVkIEVCREEgc2Nhbm5pbmcKKyAqCQlJbmdvIE1vbG5hcgk6CXZhcmlvdXMgY2xlYW51cHMgYW5kIHJld3JpdGVzCisgKgkJTWFjaWVqIFcuIFJvenlja2k6CUJpdHMgZm9yIGRlZmF1bHQgTVAgY29uZmlndXJhdGlvbnMKKyAqCQlQYXVsIERpZWZlbmJhdWdoOglBZGRlZCBmdWxsIEFDUEkgc3VwcG9ydAorICovCisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vc21wLmg+CisjaW5jbHVkZSA8YXNtL2FjcGkuaD4KKyNpbmNsdWRlIDxhc20vbXRyci5oPgorI2luY2x1ZGUgPGFzbS9tcHNwZWMuaD4KKyNpbmNsdWRlIDxhc20vaW9fYXBpYy5oPgorCisjaW5jbHVkZSA8bWFjaF9hcGljLmg+CisjaW5jbHVkZSA8bWFjaF9tcHBhcnNlLmg+CisjaW5jbHVkZSA8Ymlvc19lYmRhLmg+CisKKy8qIEhhdmUgd2UgZm91bmQgYW4gTVAgdGFibGUgKi8KK2ludCBzbXBfZm91bmRfY29uZmlnOwordW5zaWduZWQgaW50IF9faW5pdGRhdGEgbWF4Y3B1cyA9IE5SX0NQVVM7CisKKy8qCisgKiBWYXJpb3VzIExpbnV4LWludGVybmFsIGRhdGEgc3RydWN0dXJlcyBjcmVhdGVkIGZyb20gdGhlCisgKiBNUC10YWJsZS4KKyAqLworaW50IGFwaWNfdmVyc2lvbiBbTUFYX0FQSUNTXTsKK2ludCBtcF9idXNfaWRfdG9fdHlwZSBbTUFYX01QX0JVU1NFU107CitpbnQgbXBfYnVzX2lkX3RvX25vZGUgW01BWF9NUF9CVVNTRVNdOworaW50IG1wX2J1c19pZF90b19sb2NhbCBbTUFYX01QX0JVU1NFU107CitpbnQgcXVhZF9sb2NhbF90b19tcF9idXNfaWQgW05SX0NQVVMvNF1bNF07CitpbnQgbXBfYnVzX2lkX3RvX3BjaV9idXMgW01BWF9NUF9CVVNTRVNdID0geyBbMCAuLi4gTUFYX01QX0JVU1NFUy0xXSA9IC0xIH07CitzdGF0aWMgaW50IG1wX2N1cnJlbnRfcGNpX2lkOworCisvKiBJL08gQVBJQyBlbnRyaWVzICovCitzdHJ1Y3QgbXBjX2NvbmZpZ19pb2FwaWMgbXBfaW9hcGljc1tNQVhfSU9fQVBJQ1NdOworCisvKiAjIG9mIE1QIElSUSBzb3VyY2UgZW50cmllcyAqLworc3RydWN0IG1wY19jb25maWdfaW50c3JjIG1wX2lycXNbTUFYX0lSUV9TT1VSQ0VTXTsKKworLyogTVAgSVJRIHNvdXJjZSBlbnRyaWVzICovCitpbnQgbXBfaXJxX2VudHJpZXM7CisKK2ludCBucl9pb2FwaWNzOworCitpbnQgcGljX21vZGU7Cit1bnNpZ25lZCBsb25nIG1wX2xhcGljX2FkZHI7CisKKy8qIFByb2Nlc3NvciB0aGF0IGlzIGRvaW5nIHRoZSBib290IHVwICovCit1bnNpZ25lZCBpbnQgYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkID0gLTFVOwordW5zaWduZWQgaW50IGJvb3RfY3B1X2xvZ2ljYWxfYXBpY2lkID0gLTFVOworLyogSW50ZXJuYWwgcHJvY2Vzc29yIGNvdW50ICovCitzdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdGRhdGEgbnVtX3Byb2Nlc3NvcnM7CisKKy8qIEJpdG1hc2sgb2YgcGh5c2ljYWxseSBleGlzdGluZyBDUFVzICovCitwaHlzaWRfbWFza190IHBoeXNfY3B1X3ByZXNlbnRfbWFwOworCit1OCBiaW9zX2NwdV9hcGljaWRbTlJfQ1BVU10gPSB7IFswIC4uLiBOUl9DUFVTLTFdID0gQkFEX0FQSUNJRCB9OworCisvKgorICogSW50ZWwgTVAgQklPUyB0YWJsZSBwYXJzaW5nIHJvdXRpbmVzOgorICovCisKKworLyoKKyAqIENoZWNrc3VtIGFuIE1QIGNvbmZpZ3VyYXRpb24gYmxvY2suCisgKi8KKworc3RhdGljIGludCBfX2luaXQgbXBmX2NoZWNrc3VtKHVuc2lnbmVkIGNoYXIgKm1wLCBpbnQgbGVuKQoreworCWludCBzdW0gPSAwOworCisJd2hpbGUgKGxlbi0tKQorCQlzdW0gKz0gKm1wKys7CisKKwlyZXR1cm4gc3VtICYgMHhGRjsKK30KKworLyoKKyAqIEhhdmUgdG8gbWF0Y2ggdHJhbnNsYXRpb24gdGFibGUgZW50cmllcyB0byBtYWluIHRhYmxlIGVudHJpZXMgYnkgY291bnRlcgorICogaGVuY2UgdGhlIG1wY19yZWNvcmQgdmFyaWFibGUgLi4uLiBjYW4ndCBzZWUgYSBsZXNzIGRpc2d1c3Rpbmcgd2F5IG9mCisgKiBkb2luZyB0aGlzIC4uLi4KKyAqLworCitzdGF0aWMgaW50IG1wY19yZWNvcmQ7IAorc3RhdGljIHN0cnVjdCBtcGNfY29uZmlnX3RyYW5zbGF0aW9uICp0cmFuc2xhdGlvbl90YWJsZVtNQVhfTVBDX0VOVFJZXSBfX2luaXRkYXRhOworCisjaWZkZWYgQ09ORklHX1g4Nl9OVU1BUQorc3RhdGljIGludCBNUF92YWxpZF9hcGljaWQoaW50IGFwaWNpZCwgaW50IHZlcnNpb24pCit7CisJcmV0dXJuIGh3ZWlnaHRfbG9uZyhhcGljaWQgJiAweGYpID09IDEgJiYgKGFwaWNpZCA+PiA0KSAhPSAweGY7Cit9CisjZWxzZQorc3RhdGljIGludCBNUF92YWxpZF9hcGljaWQoaW50IGFwaWNpZCwgaW50IHZlcnNpb24pCit7CisJaWYgKHZlcnNpb24gPj0gMHgxNCkKKwkJcmV0dXJuIGFwaWNpZCA8IDB4ZmY7CisJZWxzZQorCQlyZXR1cm4gYXBpY2lkIDwgMHhmOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIF9faW5pdCBNUF9wcm9jZXNzb3JfaW5mbyAoc3RydWN0IG1wY19jb25maWdfcHJvY2Vzc29yICptKQoreworIAlpbnQgdmVyLCBhcGljaWQ7CisJcGh5c2lkX21hc2tfdCB0bXA7CisgCQorCWlmICghKG0tPm1wY19jcHVmbGFnICYgQ1BVX0VOQUJMRUQpKQorCQlyZXR1cm47CisKKwlhcGljaWQgPSBtcGNfYXBpY19pZChtLCB0cmFuc2xhdGlvbl90YWJsZVttcGNfcmVjb3JkXSk7CisKKwlpZiAobS0+bXBjX2ZlYXR1cmVmbGFnJigxPDwwKSkKKwkJRHByaW50aygiICAgIEZsb2F0aW5nIHBvaW50IHVuaXQgcHJlc2VudC5cbiIpOworCWlmIChtLT5tcGNfZmVhdHVyZWZsYWcmKDE8PDcpKQorCQlEcHJpbnRrKCIgICAgTWFjaGluZSBFeGNlcHRpb24gc3VwcG9ydGVkLlxuIik7CisJaWYgKG0tPm1wY19mZWF0dXJlZmxhZyYoMTw8OCkpCisJCURwcmludGsoIiAgICA2NCBiaXQgY29tcGFyZSAmIGV4Y2hhbmdlIHN1cHBvcnRlZC5cbiIpOworCWlmIChtLT5tcGNfZmVhdHVyZWZsYWcmKDE8PDkpKQorCQlEcHJpbnRrKCIgICAgSW50ZXJuYWwgQVBJQyBwcmVzZW50LlxuIik7CisJaWYgKG0tPm1wY19mZWF0dXJlZmxhZyYoMTw8MTEpKQorCQlEcHJpbnRrKCIgICAgU0VQIHByZXNlbnQuXG4iKTsKKwlpZiAobS0+bXBjX2ZlYXR1cmVmbGFnJigxPDwxMikpCisJCURwcmludGsoIiAgICBNVFJSICBwcmVzZW50LlxuIik7CisJaWYgKG0tPm1wY19mZWF0dXJlZmxhZyYoMTw8MTMpKQorCQlEcHJpbnRrKCIgICAgUEdFICBwcmVzZW50LlxuIik7CisJaWYgKG0tPm1wY19mZWF0dXJlZmxhZyYoMTw8MTQpKQorCQlEcHJpbnRrKCIgICAgTUNBICBwcmVzZW50LlxuIik7CisJaWYgKG0tPm1wY19mZWF0dXJlZmxhZyYoMTw8MTUpKQorCQlEcHJpbnRrKCIgICAgQ01PViAgcHJlc2VudC5cbiIpOworCWlmIChtLT5tcGNfZmVhdHVyZWZsYWcmKDE8PDE2KSkKKwkJRHByaW50aygiICAgIFBBVCAgcHJlc2VudC5cbiIpOworCWlmIChtLT5tcGNfZmVhdHVyZWZsYWcmKDE8PDE3KSkKKwkJRHByaW50aygiICAgIFBTRSAgcHJlc2VudC5cbiIpOworCWlmIChtLT5tcGNfZmVhdHVyZWZsYWcmKDE8PDE4KSkKKwkJRHByaW50aygiICAgIFBTTiAgcHJlc2VudC5cbiIpOworCWlmIChtLT5tcGNfZmVhdHVyZWZsYWcmKDE8PDE5KSkKKwkJRHByaW50aygiICAgIENhY2hlIExpbmUgRmx1c2ggSW5zdHJ1Y3Rpb24gcHJlc2VudC5cbiIpOworCS8qIDIwIFJlc2VydmVkICovCisJaWYgKG0tPm1wY19mZWF0dXJlZmxhZyYoMTw8MjEpKQorCQlEcHJpbnRrKCIgICAgRGVidWcgVHJhY2UgYW5kIEVNT04gU3RvcmUgcHJlc2VudC5cbiIpOworCWlmIChtLT5tcGNfZmVhdHVyZWZsYWcmKDE8PDIyKSkKKwkJRHByaW50aygiICAgIEFDUEkgVGhlcm1hbCBUaHJvdHRsZSBSZWdpc3RlcnMgIHByZXNlbnQuXG4iKTsKKwlpZiAobS0+bXBjX2ZlYXR1cmVmbGFnJigxPDwyMykpCisJCURwcmludGsoIiAgICBNTVggIHByZXNlbnQuXG4iKTsKKwlpZiAobS0+bXBjX2ZlYXR1cmVmbGFnJigxPDwyNCkpCisJCURwcmludGsoIiAgICBGWFNSICBwcmVzZW50LlxuIik7CisJaWYgKG0tPm1wY19mZWF0dXJlZmxhZyYoMTw8MjUpKQorCQlEcHJpbnRrKCIgICAgWE1NICBwcmVzZW50LlxuIik7CisJaWYgKG0tPm1wY19mZWF0dXJlZmxhZyYoMTw8MjYpKQorCQlEcHJpbnRrKCIgICAgV2lsbGFtZXR0ZSBOZXcgSW5zdHJ1Y3Rpb25zICBwcmVzZW50LlxuIik7CisJaWYgKG0tPm1wY19mZWF0dXJlZmxhZyYoMTw8MjcpKQorCQlEcHJpbnRrKCIgICAgU2VsZiBTbm9vcCAgcHJlc2VudC5cbiIpOworCWlmIChtLT5tcGNfZmVhdHVyZWZsYWcmKDE8PDI4KSkKKwkJRHByaW50aygiICAgIEhUICBwcmVzZW50LlxuIik7CisJaWYgKG0tPm1wY19mZWF0dXJlZmxhZyYoMTw8MjkpKQorCQlEcHJpbnRrKCIgICAgVGhlcm1hbCBNb25pdG9yIHByZXNlbnQuXG4iKTsKKwkvKiAzMCwgMzEgUmVzZXJ2ZWQgKi8KKworCisJaWYgKG0tPm1wY19jcHVmbGFnICYgQ1BVX0JPT1RQUk9DRVNTT1IpIHsKKwkJRHByaW50aygiICAgIEJvb3R1cCBDUFVcbiIpOworCQlib290X2NwdV9waHlzaWNhbF9hcGljaWQgPSBtLT5tcGNfYXBpY2lkOworCQlib290X2NwdV9sb2dpY2FsX2FwaWNpZCA9IGFwaWNpZDsKKwl9CisKKwlpZiAobnVtX3Byb2Nlc3NvcnMgPj0gTlJfQ1BVUykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJXQVJOSU5HOiBOUl9DUFVTIGxpbWl0IG9mICVpIHJlYWNoZWQuIgorCQkJIiAgUHJvY2Vzc29yIGlnbm9yZWQuXG4iLCBOUl9DUFVTKTsgCisJCXJldHVybjsKKwl9CisKKwlpZiAobnVtX3Byb2Nlc3NvcnMgPj0gbWF4Y3B1cykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJXQVJOSU5HOiBtYXhjcHVzIGxpbWl0IG9mICVpIHJlYWNoZWQuIgorCQkJIiBQcm9jZXNzb3IgaWdub3JlZC5cbiIsIG1heGNwdXMpOyAKKwkJcmV0dXJuOworCX0KKwludW1fcHJvY2Vzc29ycysrOworCXZlciA9IG0tPm1wY19hcGljdmVyOworCisJaWYgKCFNUF92YWxpZF9hcGljaWQoYXBpY2lkLCB2ZXIpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlByb2Nlc3NvciAjJWQgSU5WQUxJRC4gKE1heCBJRDogJWQpLlxuIiwKKwkJCW0tPm1wY19hcGljaWQsIE1BWF9BUElDUyk7CisJCS0tbnVtX3Byb2Nlc3NvcnM7CisJCXJldHVybjsKKwl9CisKKwl0bXAgPSBhcGljaWRfdG9fY3B1X3ByZXNlbnQoYXBpY2lkKTsKKwlwaHlzaWRzX29yKHBoeXNfY3B1X3ByZXNlbnRfbWFwLCBwaHlzX2NwdV9wcmVzZW50X21hcCwgdG1wKTsKKwkKKwkvKgorCSAqIFZhbGlkYXRlIHZlcnNpb24KKwkgKi8KKwlpZiAodmVyID09IDB4MCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJCSU9TIGJ1ZywgQVBJQyB2ZXJzaW9uIGlzIDAgZm9yIENQVSMlZCEgZml4aW5nIHVwIHRvIDB4MTAuICh0ZWxsIHlvdXIgaHcgdmVuZG9yKVxuIiwgbS0+bXBjX2FwaWNpZCk7CisJCXZlciA9IDB4MTA7CisJfQorCWFwaWNfdmVyc2lvblttLT5tcGNfYXBpY2lkXSA9IHZlcjsKKwliaW9zX2NwdV9hcGljaWRbbnVtX3Byb2Nlc3NvcnMgLSAxXSA9IG0tPm1wY19hcGljaWQ7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBNUF9idXNfaW5mbyAoc3RydWN0IG1wY19jb25maWdfYnVzICptKQoreworCWNoYXIgc3RyWzddOworCisJbWVtY3B5KHN0ciwgbS0+bXBjX2J1c3R5cGUsIDYpOworCXN0cls2XSA9IDA7CisKKwltcGNfb2VtX2J1c19pbmZvKG0sIHN0ciwgdHJhbnNsYXRpb25fdGFibGVbbXBjX3JlY29yZF0pOworCisJaWYgKHN0cm5jbXAoc3RyLCBCVVNUWVBFX0lTQSwgc2l6ZW9mKEJVU1RZUEVfSVNBKS0xKSA9PSAwKSB7CisJCW1wX2J1c19pZF90b190eXBlW20tPm1wY19idXNpZF0gPSBNUF9CVVNfSVNBOworCX0gZWxzZSBpZiAoc3RybmNtcChzdHIsIEJVU1RZUEVfRUlTQSwgc2l6ZW9mKEJVU1RZUEVfRUlTQSktMSkgPT0gMCkgeworCQltcF9idXNfaWRfdG9fdHlwZVttLT5tcGNfYnVzaWRdID0gTVBfQlVTX0VJU0E7CisJfSBlbHNlIGlmIChzdHJuY21wKHN0ciwgQlVTVFlQRV9QQ0ksIHNpemVvZihCVVNUWVBFX1BDSSktMSkgPT0gMCkgeworCQltcGNfb2VtX3BjaV9idXMobSwgdHJhbnNsYXRpb25fdGFibGVbbXBjX3JlY29yZF0pOworCQltcF9idXNfaWRfdG9fdHlwZVttLT5tcGNfYnVzaWRdID0gTVBfQlVTX1BDSTsKKwkJbXBfYnVzX2lkX3RvX3BjaV9idXNbbS0+bXBjX2J1c2lkXSA9IG1wX2N1cnJlbnRfcGNpX2lkOworCQltcF9jdXJyZW50X3BjaV9pZCsrOworCX0gZWxzZSBpZiAoc3RybmNtcChzdHIsIEJVU1RZUEVfTUNBLCBzaXplb2YoQlVTVFlQRV9NQ0EpLTEpID09IDApIHsKKwkJbXBfYnVzX2lkX3RvX3R5cGVbbS0+bXBjX2J1c2lkXSA9IE1QX0JVU19NQ0E7CisJfSBlbHNlIGlmIChzdHJuY21wKHN0ciwgQlVTVFlQRV9ORUM5OCwgc2l6ZW9mKEJVU1RZUEVfTkVDOTgpLTEpID09IDApIHsKKwkJbXBfYnVzX2lkX3RvX3R5cGVbbS0+bXBjX2J1c2lkXSA9IE1QX0JVU19ORUM5ODsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJVbmtub3duIGJ1c3R5cGUgJXMgLSBpZ25vcmluZ1xuIiwgc3RyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBNUF9pb2FwaWNfaW5mbyAoc3RydWN0IG1wY19jb25maWdfaW9hcGljICptKQoreworCWlmICghKG0tPm1wY19mbGFncyAmIE1QQ19BUElDX1VTQUJMRSkpCisJCXJldHVybjsKKworCXByaW50ayhLRVJOX0lORk8gIkkvTyBBUElDICMlZCBWZXJzaW9uICVkIGF0IDB4JWxYLlxuIiwKKwkJbS0+bXBjX2FwaWNpZCwgbS0+bXBjX2FwaWN2ZXIsIG0tPm1wY19hcGljYWRkcik7CisJaWYgKG5yX2lvYXBpY3MgPj0gTUFYX0lPX0FQSUNTKSB7CisJCXByaW50ayhLRVJOX0NSSVQgIk1heCAjIG9mIEkvTyBBUElDcyAoJWQpIGV4Y2VlZGVkIChmb3VuZCAlZCkuXG4iLAorCQkJTUFYX0lPX0FQSUNTLCBucl9pb2FwaWNzKTsKKwkJcGFuaWMoIlJlY29tcGlsZSBrZXJuZWwgd2l0aCBiaWdnZXIgTUFYX0lPX0FQSUNTIS5cbiIpOworCX0KKwlpZiAoIW0tPm1wY19hcGljYWRkcikgeworCQlwcmludGsoS0VSTl9FUlIgIldBUk5JTkc6IGJvZ3VzIHplcm8gSS9PIEFQSUMgYWRkcmVzcyIKKwkJCSIgZm91bmQgaW4gTVAgdGFibGUsIHNraXBwaW5nIVxuIik7CisJCXJldHVybjsKKwl9CisJbXBfaW9hcGljc1tucl9pb2FwaWNzXSA9ICptOworCW5yX2lvYXBpY3MrKzsKK30KKworc3RhdGljIHZvaWQgX19pbml0IE1QX2ludHNyY19pbmZvIChzdHJ1Y3QgbXBjX2NvbmZpZ19pbnRzcmMgKm0pCit7CisJbXBfaXJxcyBbbXBfaXJxX2VudHJpZXNdID0gKm07CisJRHByaW50aygiSW50OiB0eXBlICVkLCBwb2wgJWQsIHRyaWcgJWQsIGJ1cyAlZCwiCisJCSIgSVJRICUwMngsIEFQSUMgSUQgJXgsIEFQSUMgSU5UICUwMnhcbiIsCisJCQltLT5tcGNfaXJxdHlwZSwgbS0+bXBjX2lycWZsYWcgJiAzLAorCQkJKG0tPm1wY19pcnFmbGFnID4+IDIpICYgMywgbS0+bXBjX3NyY2J1cywKKwkJCW0tPm1wY19zcmNidXNpcnEsIG0tPm1wY19kc3RhcGljLCBtLT5tcGNfZHN0aXJxKTsKKwlpZiAoKyttcF9pcnFfZW50cmllcyA9PSBNQVhfSVJRX1NPVVJDRVMpCisJCXBhbmljKCJNYXggIyBvZiBpcnEgc291cmNlcyBleGNlZWRlZCEhXG4iKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IE1QX2xpbnRzcmNfaW5mbyAoc3RydWN0IG1wY19jb25maWdfbGludHNyYyAqbSkKK3sKKwlEcHJpbnRrKCJMaW50OiB0eXBlICVkLCBwb2wgJWQsIHRyaWcgJWQsIGJ1cyAlZCwiCisJCSIgSVJRICUwMngsIEFQSUMgSUQgJXgsIEFQSUMgTElOVCAlMDJ4XG4iLAorCQkJbS0+bXBjX2lycXR5cGUsIG0tPm1wY19pcnFmbGFnICYgMywKKwkJCShtLT5tcGNfaXJxZmxhZyA+PiAyKSAmMywgbS0+bXBjX3NyY2J1c2lkLAorCQkJbS0+bXBjX3NyY2J1c2lycSwgbS0+bXBjX2Rlc3RhcGljLCBtLT5tcGNfZGVzdGFwaWNsaW50KTsKKwkvKgorCSAqIFdlbGwgaXQgc2VlbXMgYWxsIFNNUCBib2FyZHMgaW4gZXhpc3RlbmNlCisJICogdXNlIEV4dElOVC9MVlQxID09IExJTlQwIGFuZAorCSAqIE5NSS9MVlQyID09IExJTlQxIC0gdGhlIGZvbGxvd2luZyBjaGVjaworCSAqIHdpbGwgc2hvdyB1cyBpZiB0aGlzIGFzc3VtcHRpb25zIGlzIGZhbHNlLgorCSAqIFVudGlsIHRoZW4gd2UgZG8gbm90IGhhdmUgdG8gYWRkIGJhZ2dhZ2UuCisJICovCisJaWYgKChtLT5tcGNfaXJxdHlwZSA9PSBtcF9FeHRJTlQpICYmCisJCShtLT5tcGNfZGVzdGFwaWNsaW50ICE9IDApKQorCQkJQlVHKCk7CisJaWYgKChtLT5tcGNfaXJxdHlwZSA9PSBtcF9OTUkpICYmCisJCShtLT5tcGNfZGVzdGFwaWNsaW50ICE9IDEpKQorCQkJQlVHKCk7Cit9CisKKyNpZmRlZiBDT05GSUdfWDg2X05VTUFRCitzdGF0aWMgdm9pZCBfX2luaXQgTVBfdHJhbnNsYXRpb25faW5mbyAoc3RydWN0IG1wY19jb25maWdfdHJhbnNsYXRpb24gKm0pCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiVHJhbnNsYXRpb246IHJlY29yZCAlZCwgdHlwZSAlZCwgcXVhZCAlZCwgZ2xvYmFsICVkLCBsb2NhbCAlZFxuIiwgbXBjX3JlY29yZCwgbS0+dHJhbnNfdHlwZSwgbS0+dHJhbnNfcXVhZCwgbS0+dHJhbnNfZ2xvYmFsLCBtLT50cmFuc19sb2NhbCk7CisKKwlpZiAobXBjX3JlY29yZCA+PSBNQVhfTVBDX0VOVFJZKSAKKwkJcHJpbnRrKEtFUk5fRVJSICJNQVhfTVBDX0VOVFJZIGV4Y2VlZGVkIVxuIik7CisJZWxzZQorCQl0cmFuc2xhdGlvbl90YWJsZVttcGNfcmVjb3JkXSA9IG07IC8qIHN0YXNoIHRoaXMgZm9yIGxhdGVyICovCisJaWYgKG0tPnRyYW5zX3F1YWQgPCBNQVhfTlVNTk9ERVMgJiYgIW5vZGVfb25saW5lKG0tPnRyYW5zX3F1YWQpKQorCQlub2RlX3NldF9vbmxpbmUobS0+dHJhbnNfcXVhZCk7Cit9CisKKy8qCisgKiBSZWFkL3BhcnNlIHRoZSBNUEMgb2VtIHRhYmxlcworICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBzbXBfcmVhZF9tcGNfb2VtKHN0cnVjdCBtcF9jb25maWdfb2VtdGFibGUgKm9lbXRhYmxlLCBcCisJdW5zaWduZWQgc2hvcnQgb2Vtc2l6ZSkKK3sKKwlpbnQgY291bnQgPSBzaXplb2YgKCpvZW10YWJsZSk7IC8qIHRoZSBoZWFkZXIgc2l6ZSAqLworCXVuc2lnbmVkIGNoYXIgKm9lbXB0ciA9ICgodW5zaWduZWQgY2hhciAqKW9lbXRhYmxlKStjb3VudDsKKwkKKwltcGNfcmVjb3JkID0gMDsKKwlwcmludGsoS0VSTl9JTkZPICJGb3VuZCBhbiBPRU0gTVBDIHRhYmxlIGF0ICU4cCAtIHBhcnNpbmcgaXQgLi4uIFxuIiwgb2VtdGFibGUpOworCWlmIChtZW1jbXAob2VtdGFibGUtPm9lbV9zaWduYXR1cmUsTVBDX09FTV9TSUdOQVRVUkUsNCkpCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJTTVAgbXBjIG9lbXRhYmxlOiBiYWQgc2lnbmF0dXJlIFslYyVjJWMlY10hXG4iLAorCQkJb2VtdGFibGUtPm9lbV9zaWduYXR1cmVbMF0sCisJCQlvZW10YWJsZS0+b2VtX3NpZ25hdHVyZVsxXSwKKwkJCW9lbXRhYmxlLT5vZW1fc2lnbmF0dXJlWzJdLAorCQkJb2VtdGFibGUtPm9lbV9zaWduYXR1cmVbM10pOworCQlyZXR1cm47CisJfQorCWlmIChtcGZfY2hlY2tzdW0oKHVuc2lnbmVkIGNoYXIgKilvZW10YWJsZSxvZW10YWJsZS0+b2VtX2xlbmd0aCkpCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJTTVAgb2VtIG1wdGFibGU6IGNoZWNrc3VtIGVycm9yIVxuIik7CisJCXJldHVybjsKKwl9CisJd2hpbGUgKGNvdW50IDwgb2VtdGFibGUtPm9lbV9sZW5ndGgpIHsKKwkJc3dpdGNoICgqb2VtcHRyKSB7CisJCQljYXNlIE1QX1RSQU5TTEFUSU9OOgorCQkJeworCQkJCXN0cnVjdCBtcGNfY29uZmlnX3RyYW5zbGF0aW9uICptPQorCQkJCQkoc3RydWN0IG1wY19jb25maWdfdHJhbnNsYXRpb24gKilvZW1wdHI7CisJCQkJTVBfdHJhbnNsYXRpb25faW5mbyhtKTsKKwkJCQlvZW1wdHIgKz0gc2l6ZW9mKCptKTsKKwkJCQljb3VudCArPSBzaXplb2YoKm0pOworCQkJCSsrbXBjX3JlY29yZDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVW5yZWNvZ25pc2VkIE9FTSB0YWJsZSBlbnRyeSB0eXBlISAtICVkXG4iLCAoaW50KSAqb2VtcHRyKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKyAgICAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtcHNfb2VtX2NoZWNrKHN0cnVjdCBtcF9jb25maWdfdGFibGUgKm1wYywgY2hhciAqb2VtLAorCQljaGFyICpwcm9kdWN0aWQpCit7CisJaWYgKHN0cm5jbXAob2VtLCAiSUJNIE5VTUEiLCA4KSkKKwkJcHJpbnRrKCJXYXJuaW5nISAgTWF5IG5vdCBiZSBhIE5VTUEtUSBzeXN0ZW0hXG4iKTsKKwlpZiAobXBjLT5tcGNfb2VtcHRyKQorCQlzbXBfcmVhZF9tcGNfb2VtKChzdHJ1Y3QgbXBfY29uZmlnX29lbXRhYmxlICopIG1wYy0+bXBjX29lbXB0ciwKKwkJCQltcGMtPm1wY19vZW1zaXplKTsKK30KKyNlbmRpZgkvKiBDT05GSUdfWDg2X05VTUFRICovCisKKy8qCisgKiBSZWFkL3BhcnNlIHRoZSBNUEMKKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBzbXBfcmVhZF9tcGMoc3RydWN0IG1wX2NvbmZpZ190YWJsZSAqbXBjKQoreworCWNoYXIgc3RyWzE2XTsKKwljaGFyIG9lbVsxMF07CisJaW50IGNvdW50PXNpemVvZigqbXBjKTsKKwl1bnNpZ25lZCBjaGFyICptcHQ9KCh1bnNpZ25lZCBjaGFyICopbXBjKStjb3VudDsKKworCWlmIChtZW1jbXAobXBjLT5tcGNfc2lnbmF0dXJlLE1QQ19TSUdOQVRVUkUsNCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTTVAgbXB0YWJsZTogYmFkIHNpZ25hdHVyZSBbMHgleF0hXG4iLAorCQkJKih1MzIgKiltcGMtPm1wY19zaWduYXR1cmUpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKG1wZl9jaGVja3N1bSgodW5zaWduZWQgY2hhciAqKW1wYyxtcGMtPm1wY19sZW5ndGgpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU01QIG1wdGFibGU6IGNoZWNrc3VtIGVycm9yIVxuIik7CisJCXJldHVybiAwOworCX0KKwlpZiAobXBjLT5tcGNfc3BlYyE9MHgwMSAmJiBtcGMtPm1wY19zcGVjIT0weDA0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiU01QIG1wdGFibGU6IGJhZCB0YWJsZSB2ZXJzaW9uICglZCkhIVxuIiwKKwkJCW1wYy0+bXBjX3NwZWMpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFtcGMtPm1wY19sYXBpYykgeworCQlwcmludGsoS0VSTl9FUlIgIlNNUCBtcHRhYmxlOiBudWxsIGxvY2FsIEFQSUMgYWRkcmVzcyFcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJbWVtY3B5KG9lbSxtcGMtPm1wY19vZW0sOCk7CisJb2VtWzhdPTA7CisJcHJpbnRrKEtFUk5fSU5GTyAiT0VNIElEOiAlcyAiLG9lbSk7CisKKwltZW1jcHkoc3RyLG1wYy0+bXBjX3Byb2R1Y3RpZCwxMik7CisJc3RyWzEyXT0wOworCXByaW50aygiUHJvZHVjdCBJRDogJXMgIixzdHIpOworCisJbXBzX29lbV9jaGVjayhtcGMsIG9lbSwgc3RyKTsKKworCXByaW50aygiQVBJQyBhdDogMHglbFhcbiIsbXBjLT5tcGNfbGFwaWMpOworCisJLyogCisJICogU2F2ZSB0aGUgbG9jYWwgQVBJQyBhZGRyZXNzIChpdCBtaWdodCBiZSBub24tZGVmYXVsdCkgLS0gYnV0IG9ubHkKKwkgKiBpZiB3ZSdyZSBub3QgdXNpbmcgQUNQSS4KKwkgKi8KKwlpZiAoIWFjcGlfbGFwaWMpCisJCW1wX2xhcGljX2FkZHIgPSBtcGMtPm1wY19sYXBpYzsKKworCS8qCisJICoJTm93IHByb2Nlc3MgdGhlIGNvbmZpZ3VyYXRpb24gYmxvY2tzLgorCSAqLworCW1wY19yZWNvcmQgPSAwOworCXdoaWxlIChjb3VudCA8IG1wYy0+bXBjX2xlbmd0aCkgeworCQlzd2l0Y2goKm1wdCkgeworCQkJY2FzZSBNUF9QUk9DRVNTT1I6CisJCQl7CisJCQkJc3RydWN0IG1wY19jb25maWdfcHJvY2Vzc29yICptPQorCQkJCQkoc3RydWN0IG1wY19jb25maWdfcHJvY2Vzc29yICopbXB0OworCQkJCS8qIEFDUEkgbWF5IGhhdmUgYWxyZWFkeSBwcm92aWRlZCB0aGlzIGRhdGEgKi8KKwkJCQlpZiAoIWFjcGlfbGFwaWMpCisJCQkJCU1QX3Byb2Nlc3Nvcl9pbmZvKG0pOworCQkJCW1wdCArPSBzaXplb2YoKm0pOworCQkJCWNvdW50ICs9IHNpemVvZigqbSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIE1QX0JVUzoKKwkJCXsKKwkJCQlzdHJ1Y3QgbXBjX2NvbmZpZ19idXMgKm09CisJCQkJCShzdHJ1Y3QgbXBjX2NvbmZpZ19idXMgKiltcHQ7CisJCQkJTVBfYnVzX2luZm8obSk7CisJCQkJbXB0ICs9IHNpemVvZigqbSk7CisJCQkJY291bnQgKz0gc2l6ZW9mKCptKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgTVBfSU9BUElDOgorCQkJeworCQkJCXN0cnVjdCBtcGNfY29uZmlnX2lvYXBpYyAqbT0KKwkJCQkJKHN0cnVjdCBtcGNfY29uZmlnX2lvYXBpYyAqKW1wdDsKKwkJCQlNUF9pb2FwaWNfaW5mbyhtKTsKKwkJCQltcHQrPXNpemVvZigqbSk7CisJCQkJY291bnQrPXNpemVvZigqbSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIE1QX0lOVFNSQzoKKwkJCXsKKwkJCQlzdHJ1Y3QgbXBjX2NvbmZpZ19pbnRzcmMgKm09CisJCQkJCShzdHJ1Y3QgbXBjX2NvbmZpZ19pbnRzcmMgKiltcHQ7CisKKwkJCQlNUF9pbnRzcmNfaW5mbyhtKTsKKwkJCQltcHQrPXNpemVvZigqbSk7CisJCQkJY291bnQrPXNpemVvZigqbSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIE1QX0xJTlRTUkM6CisJCQl7CisJCQkJc3RydWN0IG1wY19jb25maWdfbGludHNyYyAqbT0KKwkJCQkJKHN0cnVjdCBtcGNfY29uZmlnX2xpbnRzcmMgKiltcHQ7CisJCQkJTVBfbGludHNyY19pbmZvKG0pOworCQkJCW1wdCs9c2l6ZW9mKCptKTsKKwkJCQljb3VudCs9c2l6ZW9mKCptKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJY291bnQgPSBtcGMtPm1wY19sZW5ndGg7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJKyttcGNfcmVjb3JkOworCX0KKwljbHVzdGVyZWRfYXBpY19jaGVjaygpOworCWlmICghbnVtX3Byb2Nlc3NvcnMpCisJCXByaW50ayhLRVJOX0VSUiAiU01QIG1wdGFibGU6IG5vIHByb2Nlc3NvcnMgcmVnaXN0ZXJlZCFcbiIpOworCXJldHVybiBudW1fcHJvY2Vzc29yczsKK30KKworc3RhdGljIGludCBfX2luaXQgRUxDUl90cmlnZ2VyKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5zaWduZWQgaW50IHBvcnQ7CisKKwlwb3J0ID0gMHg0ZDAgKyAoaXJxID4+IDMpOworCXJldHVybiAoaW5iKHBvcnQpID4+IChpcnEgJiA3KSkgJiAxOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgY29uc3RydWN0X2RlZmF1bHRfaW9pcnFfbXB0YWJsZShpbnQgbXBjX2RlZmF1bHRfdHlwZSkKK3sKKwlzdHJ1Y3QgbXBjX2NvbmZpZ19pbnRzcmMgaW50c3JjOworCWludCBpOworCWludCBFTENSX2ZhbGxiYWNrID0gMDsKKworCWludHNyYy5tcGNfdHlwZSA9IE1QX0lOVFNSQzsKKwlpbnRzcmMubXBjX2lycWZsYWcgPSAwOwkJCS8qIGNvbmZvcm1pbmcgKi8KKwlpbnRzcmMubXBjX3NyY2J1cyA9IDA7CisJaW50c3JjLm1wY19kc3RhcGljID0gbXBfaW9hcGljc1swXS5tcGNfYXBpY2lkOworCisJaW50c3JjLm1wY19pcnF0eXBlID0gbXBfSU5UOworCisJLyoKKwkgKiAgSWYgdHJ1ZSwgd2UgaGF2ZSBhbiBJU0EvUENJIHN5c3RlbSB3aXRoIG5vIElSUSBlbnRyaWVzCisJICogIGluIHRoZSBNUCB0YWJsZS4gVG8gcHJldmVudCB0aGUgUENJIGludGVycnVwdHMgZnJvbSBiZWluZyBzZXQgdXAKKwkgKiAgaW5jb3JyZWN0bHksIHdlIHRyeSB0byB1c2UgdGhlIEVMQ1IuIFRoZSBzYW5pdHkgY2hlY2sgdG8gc2VlIGlmCisJICogIHRoZXJlIGlzIGdvb2QgRUxDUiBkYXRhIGlzIHZlcnkgc2ltcGxlIC0gSVJRMCwgMSwgMiBhbmQgMTMgY2FuCisJICogIG5ldmVyIGJlIGxldmVsIHNlbnNpdGl2ZSwgc28gd2Ugc2ltcGx5IHNlZSBpZiB0aGUgRUxDUiBhZ3JlZXMuCisJICogIElmIGl0IGRvZXMsIHdlIGFzc3VtZSBpdCdzIHZhbGlkLgorCSAqLworCWlmIChtcGNfZGVmYXVsdF90eXBlID09IDUpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiSVNBL1BDSSBidXMgdHlwZSB3aXRoIG5vIElSUSBpbmZvcm1hdGlvbi4uLiBmYWxsaW5nIGJhY2sgdG8gRUxDUlxuIik7CisKKwkJaWYgKEVMQ1JfdHJpZ2dlcigwKSB8fCBFTENSX3RyaWdnZXIoMSkgfHwgRUxDUl90cmlnZ2VyKDIpIHx8IEVMQ1JfdHJpZ2dlcigxMykpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJFTENSIGNvbnRhaW5zIGludmFsaWQgZGF0YS4uLiBub3QgdXNpbmcgRUxDUlxuIik7CisJCWVsc2UgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiVXNpbmcgRUxDUiB0byBpZGVudGlmeSBQQ0kgaW50ZXJydXB0c1xuIik7CisJCQlFTENSX2ZhbGxiYWNrID0gMTsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCXN3aXRjaCAobXBjX2RlZmF1bHRfdHlwZSkgeworCQljYXNlIDI6CisJCQlpZiAoaSA9PSAwIHx8IGkgPT0gMTMpCisJCQkJY29udGludWU7CS8qIElSUTAgJiBJUlExMyBub3QgY29ubmVjdGVkICovCisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJZGVmYXVsdDoKKwkJCWlmIChpID09IDIpCisJCQkJY29udGludWU7CS8qIElSUTIgaXMgbmV2ZXIgY29ubmVjdGVkICovCisJCX0KKworCQlpZiAoRUxDUl9mYWxsYmFjaykgeworCQkJLyoKKwkJCSAqICBJZiB0aGUgRUxDUiBpbmRpY2F0ZXMgYSBsZXZlbC1zZW5zaXRpdmUgaW50ZXJydXB0LCB3ZQorCQkJICogIGNvcHkgdGhhdCBpbmZvcm1hdGlvbiBvdmVyIHRvIHRoZSBNUCB0YWJsZSBpbiB0aGUKKwkJCSAqICBpcnFmbGFnIGZpZWxkIChsZXZlbCBzZW5zaXRpdmUsIGFjdGl2ZSBoaWdoIHBvbGFyaXR5KS4KKwkJCSAqLworCQkJaWYgKEVMQ1JfdHJpZ2dlcihpKSkKKwkJCQlpbnRzcmMubXBjX2lycWZsYWcgPSAxMzsKKwkJCWVsc2UKKwkJCQlpbnRzcmMubXBjX2lycWZsYWcgPSAwOworCQl9CisKKwkJaW50c3JjLm1wY19zcmNidXNpcnEgPSBpOworCQlpbnRzcmMubXBjX2RzdGlycSA9IGkgPyBpIDogMjsJCS8qIElSUTAgdG8gSU5USU4yICovCisJCU1QX2ludHNyY19pbmZvKCZpbnRzcmMpOworCX0KKworCWludHNyYy5tcGNfaXJxdHlwZSA9IG1wX0V4dElOVDsKKwlpbnRzcmMubXBjX3NyY2J1c2lycSA9IDA7CisJaW50c3JjLm1wY19kc3RpcnEgPSAwOwkJCQkvKiA4MjU5QSB0byBJTlRJTjAgKi8KKwlNUF9pbnRzcmNfaW5mbygmaW50c3JjKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9faW5pdCBjb25zdHJ1Y3RfZGVmYXVsdF9JU0FfbXB0YWJsZShpbnQgbXBjX2RlZmF1bHRfdHlwZSkKK3sKKwlzdHJ1Y3QgbXBjX2NvbmZpZ19wcm9jZXNzb3IgcHJvY2Vzc29yOworCXN0cnVjdCBtcGNfY29uZmlnX2J1cyBidXM7CisJc3RydWN0IG1wY19jb25maWdfaW9hcGljIGlvYXBpYzsKKwlzdHJ1Y3QgbXBjX2NvbmZpZ19saW50c3JjIGxpbnRzcmM7CisJaW50IGxpbnR0eXBlc1syXSA9IHsgbXBfRXh0SU5ULCBtcF9OTUkgfTsKKwlpbnQgaTsKKworCS8qCisJICogbG9jYWwgQVBJQyBoYXMgZGVmYXVsdCBhZGRyZXNzCisJICovCisJbXBfbGFwaWNfYWRkciA9IEFQSUNfREVGQVVMVF9QSFlTX0JBU0U7CisKKwkvKgorCSAqIDIgQ1BVcywgbnVtYmVyZWQgMCAmIDEuCisJICovCisJcHJvY2Vzc29yLm1wY190eXBlID0gTVBfUFJPQ0VTU09SOworCS8qIEVpdGhlciBhbiBpbnRlZ3JhdGVkIEFQSUMgb3IgYSBkaXNjcmV0ZSA4MjQ4OURYLiAqLworCXByb2Nlc3Nvci5tcGNfYXBpY3ZlciA9IG1wY19kZWZhdWx0X3R5cGUgPiA0ID8gMHgxMCA6IDB4MDE7CisJcHJvY2Vzc29yLm1wY19jcHVmbGFnID0gQ1BVX0VOQUJMRUQ7CisJcHJvY2Vzc29yLm1wY19jcHVmZWF0dXJlID0gKGJvb3RfY3B1X2RhdGEueDg2IDw8IDgpIHwKKwkJCQkgICAoYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPDwgNCkgfAorCQkJCSAgIGJvb3RfY3B1X2RhdGEueDg2X21hc2s7CisJcHJvY2Vzc29yLm1wY19mZWF0dXJlZmxhZyA9IGJvb3RfY3B1X2RhdGEueDg2X2NhcGFiaWxpdHlbMF07CisJcHJvY2Vzc29yLm1wY19yZXNlcnZlZFswXSA9IDA7CisJcHJvY2Vzc29yLm1wY19yZXNlcnZlZFsxXSA9IDA7CisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlwcm9jZXNzb3IubXBjX2FwaWNpZCA9IGk7CisJCU1QX3Byb2Nlc3Nvcl9pbmZvKCZwcm9jZXNzb3IpOworCX0KKworCWJ1cy5tcGNfdHlwZSA9IE1QX0JVUzsKKwlidXMubXBjX2J1c2lkID0gMDsKKwlzd2l0Y2ggKG1wY19kZWZhdWx0X3R5cGUpIHsKKwkJZGVmYXVsdDoKKwkJCXByaW50aygiPz8/XG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiVW5rbm93biBzdGFuZGFyZCBjb25maWd1cmF0aW9uICVkXG4iLAorCQkJCW1wY19kZWZhdWx0X3R5cGUpOworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgMToKKwkJY2FzZSA1OgorCQkJbWVtY3B5KGJ1cy5tcGNfYnVzdHlwZSwgIklTQSAgICIsIDYpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJY2FzZSA2OgorCQljYXNlIDM6CisJCQltZW1jcHkoYnVzLm1wY19idXN0eXBlLCAiRUlTQSAgIiwgNik7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQljYXNlIDc6CisJCQltZW1jcHkoYnVzLm1wY19idXN0eXBlLCAiTUNBICAgIiwgNik7CisJfQorCU1QX2J1c19pbmZvKCZidXMpOworCWlmIChtcGNfZGVmYXVsdF90eXBlID4gNCkgeworCQlidXMubXBjX2J1c2lkID0gMTsKKwkJbWVtY3B5KGJ1cy5tcGNfYnVzdHlwZSwgIlBDSSAgICIsIDYpOworCQlNUF9idXNfaW5mbygmYnVzKTsKKwl9CisKKwlpb2FwaWMubXBjX3R5cGUgPSBNUF9JT0FQSUM7CisJaW9hcGljLm1wY19hcGljaWQgPSAyOworCWlvYXBpYy5tcGNfYXBpY3ZlciA9IG1wY19kZWZhdWx0X3R5cGUgPiA0ID8gMHgxMCA6IDB4MDE7CisJaW9hcGljLm1wY19mbGFncyA9IE1QQ19BUElDX1VTQUJMRTsKKwlpb2FwaWMubXBjX2FwaWNhZGRyID0gMHhGRUMwMDAwMDsKKwlNUF9pb2FwaWNfaW5mbygmaW9hcGljKTsKKworCS8qCisJICogV2Ugc2V0IHVwIG1vc3Qgb2YgdGhlIGxvdyAxNiBJTy1BUElDIHBpbnMgYWNjb3JkaW5nIHRvIE1QUyBydWxlcy4KKwkgKi8KKwljb25zdHJ1Y3RfZGVmYXVsdF9pb2lycV9tcHRhYmxlKG1wY19kZWZhdWx0X3R5cGUpOworCisJbGludHNyYy5tcGNfdHlwZSA9IE1QX0xJTlRTUkM7CisJbGludHNyYy5tcGNfaXJxZmxhZyA9IDA7CQkvKiBjb25mb3JtaW5nICovCisJbGludHNyYy5tcGNfc3JjYnVzaWQgPSAwOworCWxpbnRzcmMubXBjX3NyY2J1c2lycSA9IDA7CisJbGludHNyYy5tcGNfZGVzdGFwaWMgPSBNUF9BUElDX0FMTDsKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCWxpbnRzcmMubXBjX2lycXR5cGUgPSBsaW50dHlwZXNbaV07CisJCWxpbnRzcmMubXBjX2Rlc3RhcGljbGludCA9IGk7CisJCU1QX2xpbnRzcmNfaW5mbygmbGludHNyYyk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGludGVsX21wX2Zsb2F0aW5nICptcGZfZm91bmQ7CisKKy8qCisgKiBTY2FuIHRoZSBtZW1vcnkgYmxvY2tzIGZvciBhbiBTTVAgY29uZmlndXJhdGlvbiBibG9jay4KKyAqLwordm9pZCBfX2luaXQgZ2V0X3NtcF9jb25maWcgKHZvaWQpCit7CisJc3RydWN0IGludGVsX21wX2Zsb2F0aW5nICptcGYgPSBtcGZfZm91bmQ7CisKKwkvKgorCSAqIEFDUEkgbWF5IGJlIHVzZWQgdG8gb2J0YWluIHRoZSBlbnRpcmUgU01QIGNvbmZpZ3VyYXRpb24gb3IganVzdCB0byAKKwkgKiBlbnVtZXJhdGUvY29uZmlndXJlIHByb2Nlc3NvcnMgKENPTkZJR19BQ1BJX0JPT1QpLiAgTm90ZSB0aGF0IAorCSAqIEFDUEkgc3VwcG9ydHMgYm90aCBsb2dpY2FsIChlLmcuIEh5cGVyLVRocmVhZGluZykgYW5kIHBoeXNpY2FsIAorCSAqIHByb2Nlc3NvcnMsIHdoZXJlIE1QUyBvbmx5IHN1cHBvcnRzIHBoeXNpY2FsLgorCSAqLworCWlmIChhY3BpX2xhcGljICYmIGFjcGlfaW9hcGljKSB7CisJCXByaW50ayhLRVJOX0lORk8gIlVzaW5nIEFDUEkgKE1BRFQpIGZvciBTTVAgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvblxuIik7CisJCXJldHVybjsKKwl9CisJZWxzZSBpZiAoYWNwaV9sYXBpYykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiVXNpbmcgQUNQSSBmb3IgcHJvY2Vzc29yIChMQVBJQykgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvblxuIik7CisKKwlwcmludGsoS0VSTl9JTkZPICJJbnRlbCBNdWx0aVByb2Nlc3NvciBTcGVjaWZpY2F0aW9uIHYxLiVkXG4iLCBtcGYtPm1wZl9zcGVjaWZpY2F0aW9uKTsKKwlpZiAobXBmLT5tcGZfZmVhdHVyZTIgJiAoMTw8NykpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiICAgIElNQ1IgYW5kIFBJQyBjb21wYXRpYmlsaXR5IG1vZGUuXG4iKTsKKwkJcGljX21vZGUgPSAxOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0lORk8gIiAgICBWaXJ0dWFsIFdpcmUgY29tcGF0aWJpbGl0eSBtb2RlLlxuIik7CisJCXBpY19tb2RlID0gMDsKKwl9CisKKwkvKgorCSAqIE5vdyBzZWUgaWYgd2UgbmVlZCB0byByZWFkIGZ1cnRoZXIuCisJICovCisJaWYgKG1wZi0+bXBmX2ZlYXR1cmUxICE9IDApIHsKKworCQlwcmludGsoS0VSTl9JTkZPICJEZWZhdWx0IE1QIGNvbmZpZ3VyYXRpb24gIyVkXG4iLCBtcGYtPm1wZl9mZWF0dXJlMSk7CisJCWNvbnN0cnVjdF9kZWZhdWx0X0lTQV9tcHRhYmxlKG1wZi0+bXBmX2ZlYXR1cmUxKTsKKworCX0gZWxzZSBpZiAobXBmLT5tcGZfcGh5c3B0cikgeworCisJCS8qCisJCSAqIFJlYWQgdGhlIHBoeXNpY2FsIGhhcmR3YXJlIHRhYmxlLiAgQW55dGhpbmcgaGVyZSB3aWxsCisJCSAqIG92ZXJyaWRlIHRoZSBkZWZhdWx0cy4KKwkJICovCisJCWlmICghc21wX3JlYWRfbXBjKCh2b2lkICopbXBmLT5tcGZfcGh5c3B0cikpIHsKKwkJCXNtcF9mb3VuZF9jb25maWcgPSAwOworCQkJcHJpbnRrKEtFUk5fRVJSICJCSU9TIGJ1ZywgTVAgdGFibGUgZXJyb3JzIGRldGVjdGVkIS4uLlxuIik7CisJCQlwcmludGsoS0VSTl9FUlIgIi4uLiBkaXNhYmxpbmcgU01QIHN1cHBvcnQuICh0ZWxsIHlvdXIgaHcgdmVuZG9yKVxuIik7CisJCQlyZXR1cm47CisJCX0KKwkJLyoKKwkJICogSWYgdGhlcmUgYXJlIG5vIGV4cGxpY2l0IE1QIElSUSBlbnRyaWVzLCB0aGVuIHdlIGFyZQorCQkgKiBicm9rZW4uICBXZSBzZXQgdXAgbW9zdCBvZiB0aGUgbG93IDE2IElPLUFQSUMgcGlucyB0bworCQkgKiBJU0EgZGVmYXVsdHMgYW5kIGhvcGUgaXQgd2lsbCB3b3JrLgorCQkgKi8KKwkJaWYgKCFtcF9pcnFfZW50cmllcykgeworCQkJc3RydWN0IG1wY19jb25maWdfYnVzIGJ1czsKKworCQkJcHJpbnRrKEtFUk5fRVJSICJCSU9TIGJ1Zywgbm8gZXhwbGljaXQgSVJRIGVudHJpZXMsIHVzaW5nIGRlZmF1bHQgbXB0YWJsZS4gKHRlbGwgeW91ciBodyB2ZW5kb3IpXG4iKTsKKworCQkJYnVzLm1wY190eXBlID0gTVBfQlVTOworCQkJYnVzLm1wY19idXNpZCA9IDA7CisJCQltZW1jcHkoYnVzLm1wY19idXN0eXBlLCAiSVNBICAgIiwgNik7CisJCQlNUF9idXNfaW5mbygmYnVzKTsKKworCQkJY29uc3RydWN0X2RlZmF1bHRfaW9pcnFfbXB0YWJsZSgwKTsKKwkJfQorCisJfSBlbHNlCisJCUJVRygpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiUHJvY2Vzc29yczogJWRcbiIsIG51bV9wcm9jZXNzb3JzKTsKKwkvKgorCSAqIE9ubHkgdXNlIHRoZSBmaXJzdCBjb25maWd1cmF0aW9uIGZvdW5kLgorCSAqLworfQorCitzdGF0aWMgaW50IF9faW5pdCBzbXBfc2Nhbl9jb25maWcgKHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyBsZW5ndGgpCit7CisJdW5zaWduZWQgbG9uZyAqYnAgPSBwaHlzX3RvX3ZpcnQoYmFzZSk7CisJc3RydWN0IGludGVsX21wX2Zsb2F0aW5nICptcGY7CisKKwlEcHJpbnRrKCJTY2FuIFNNUCBmcm9tICVwIGZvciAlbGQgYnl0ZXMuXG4iLCBicCxsZW5ndGgpOworCWlmIChzaXplb2YoKm1wZikgIT0gMTYpCisJCXByaW50aygiRXJyb3I6IE1QRiBzaXplXG4iKTsKKworCXdoaWxlIChsZW5ndGggPiAwKSB7CisJCW1wZiA9IChzdHJ1Y3QgaW50ZWxfbXBfZmxvYXRpbmcgKilicDsKKwkJaWYgKCgqYnAgPT0gU01QX01BR0lDX0lERU5UKSAmJgorCQkJKG1wZi0+bXBmX2xlbmd0aCA9PSAxKSAmJgorCQkJIW1wZl9jaGVja3N1bSgodW5zaWduZWQgY2hhciAqKWJwLCAxNikgJiYKKwkJCSgobXBmLT5tcGZfc3BlY2lmaWNhdGlvbiA9PSAxKQorCQkJCXx8IChtcGYtPm1wZl9zcGVjaWZpY2F0aW9uID09IDQpKSApIHsKKworCQkJc21wX2ZvdW5kX2NvbmZpZyA9IDE7CisJCQlwcmludGsoS0VSTl9JTkZPICJmb3VuZCBTTVAgTVAtdGFibGUgYXQgJTA4bHhcbiIsCisJCQkJCQl2aXJ0X3RvX3BoeXMobXBmKSk7CisJCQlyZXNlcnZlX2Jvb3RtZW0odmlydF90b19waHlzKG1wZiksIFBBR0VfU0laRSk7CisJCQlpZiAobXBmLT5tcGZfcGh5c3B0cikgeworCQkJCS8qCisJCQkJICogV2UgY2Fubm90IGFjY2VzcyB0byBNUEMgdGFibGUgdG8gY29tcHV0ZQorCQkJCSAqIHRhYmxlIHNpemUgeWV0LCBhcyBvbmx5IGZldyBtZWdhYnl0ZXMgZnJvbQorCQkJCSAqIHRoZSBib3R0b20gaXMgbWFwcGVkIG5vdy4KKwkJCQkgKiBQQy05ODAwJ3MgTVBDIHRhYmxlIHBsYWNlcyBvbiB0aGUgdmVyeSBsYXN0CisJCQkJICogb2YgcGh5c2ljYWwgbWVtb3J5OyBzbyB0aGF0IHNpbXBseSByZXNlcnZpbmcKKwkJCQkgKiBQQUdFX1NJWkUgZnJvbSBtcGctPm1wZl9waHlzcHRyIHlpZWxkcyBCVUcoKQorCQkJCSAqIGluIHJlc2VydmVfYm9vdG1lbS4KKwkJCQkgKi8KKwkJCQl1bnNpZ25lZCBsb25nIHNpemUgPSBQQUdFX1NJWkU7CisJCQkJdW5zaWduZWQgbG9uZyBlbmQgPSBtYXhfbG93X3BmbiAqIFBBR0VfU0laRTsKKwkJCQlpZiAobXBmLT5tcGZfcGh5c3B0ciArIHNpemUgPiBlbmQpCisJCQkJCXNpemUgPSBlbmQgLSBtcGYtPm1wZl9waHlzcHRyOworCQkJCXJlc2VydmVfYm9vdG1lbShtcGYtPm1wZl9waHlzcHRyLCBzaXplKTsKKwkJCX0KKworCQkJbXBmX2ZvdW5kID0gbXBmOworCQkJcmV0dXJuIDE7CisJCX0KKwkJYnAgKz0gNDsKKwkJbGVuZ3RoIC09IDE2OworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBfX2luaXQgZmluZF9zbXBfY29uZmlnICh2b2lkKQoreworCXVuc2lnbmVkIGludCBhZGRyZXNzOworCisJLyoKKwkgKiBGSVhNRTogTGludXggYXNzdW1lcyB5b3UgaGF2ZSA2NDBLIG9mIGJhc2UgcmFtLi4KKwkgKiB0aGlzIGNvbnRpbnVlcyB0aGUgZXJyb3IuLi4KKwkgKgorCSAqIDEpIFNjYW4gdGhlIGJvdHRvbSAxSyBmb3IgYSBzaWduYXR1cmUKKwkgKiAyKSBTY2FuIHRoZSB0b3AgMUsgb2YgYmFzZSBSQU0KKwkgKiAzKSBTY2FuIHRoZSA2NEsgb2YgYmlvcworCSAqLworCWlmIChzbXBfc2Nhbl9jb25maWcoMHgwLDB4NDAwKSB8fAorCQlzbXBfc2Nhbl9jb25maWcoNjM5KjB4NDAwLDB4NDAwKSB8fAorCQkJc21wX3NjYW5fY29uZmlnKDB4RjAwMDAsMHgxMDAwMCkpCisJCXJldHVybjsKKwkvKgorCSAqIElmIGl0IGlzIGFuIFNNUCBtYWNoaW5lIHdlIHNob3VsZCBrbm93IG5vdywgdW5sZXNzIHRoZQorCSAqIGNvbmZpZ3VyYXRpb24gaXMgaW4gYW4gRUlTQS9NQ0EgYnVzIG1hY2hpbmUgd2l0aCBhbgorCSAqIGV4dGVuZGVkIGJpb3MgZGF0YSBhcmVhLgorCSAqCisJICogdGhlcmUgaXMgYSByZWFsLW1vZGUgc2VnbWVudGVkIHBvaW50ZXIgcG9pbnRpbmcgdG8gdGhlCisJICogNEsgRUJEQSBhcmVhIGF0IDB4NDBFLCBjYWxjdWxhdGUgYW5kIHNjYW4gaXQgaGVyZS4KKwkgKgorCSAqIE5PVEUhIFRoZXJlIGFyZSBMaW51eCBsb2FkZXJzIHRoYXQgd2lsbCBjb3JydXB0IHRoZSBFQkRBCisJICogYXJlYSwgYW5kIGFzIHN1Y2ggdGhpcyBraW5kIG9mIFNNUCBjb25maWcgbWF5IGJlIGxlc3MKKwkgKiB0cnVzdHdvcnRoeSwgc2ltcGx5IGJlY2F1c2UgdGhlIFNNUCB0YWJsZSBtYXkgaGF2ZSBiZWVuCisJICogc3RvbXBlZCBvbiBkdXJpbmcgZWFybHkgYm9vdC4gVGhlc2UgbG9hZGVycyBhcmUgYnVnZ3kgYW5kCisJICogc2hvdWxkIGJlIGZpeGVkLgorCSAqCisJICogTVAxLjQgU1BFQyBzdGF0ZXMgdG8gb25seSBzY2FuIGZpcnN0IDFLIG9mIDRLIEVCREEuCisJICovCisKKwlhZGRyZXNzID0gZ2V0X2Jpb3NfZWJkYSgpOworCWlmIChhZGRyZXNzKQorCQlzbXBfc2Nhbl9jb25maWcoYWRkcmVzcywgMHg0MDApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDUEktYmFzZWQgTVAgQ29uZmlndXJhdGlvbgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIENPTkZJR19BQ1BJX0JPT1QKKwordm9pZCBfX2luaXQgbXBfcmVnaXN0ZXJfbGFwaWNfYWRkcmVzcyAoCisJdTY0CQkJYWRkcmVzcykKK3sKKwltcF9sYXBpY19hZGRyID0gKHVuc2lnbmVkIGxvbmcpIGFkZHJlc3M7CisKKwlzZXRfZml4bWFwX25vY2FjaGUoRklYX0FQSUNfQkFTRSwgbXBfbGFwaWNfYWRkcik7CisKKwlpZiAoYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkID09IC0xVSkKKwkJYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkID0gR0VUX0FQSUNfSUQoYXBpY19yZWFkKEFQSUNfSUQpKTsKKworCURwcmludGsoIkJvb3QgQ1BVID0gJWRcbiIsIGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCk7Cit9CisKKwordm9pZCBfX2luaXQgbXBfcmVnaXN0ZXJfbGFwaWMgKAorCXU4CQkJaWQsIAorCXU4CQkJZW5hYmxlZCkKK3sKKwlzdHJ1Y3QgbXBjX2NvbmZpZ19wcm9jZXNzb3IgcHJvY2Vzc29yOworCWludAkJCWJvb3RfY3B1ID0gMDsKKwkKKwlpZiAoTUFYX0FQSUNTIC0gaWQgPD0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJQcm9jZXNzb3IgIyVkIGludmFsaWQgKG1heCAlZClcbiIsCisJCQlpZCwgTUFYX0FQSUNTKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChpZCA9PSBib290X2NwdV9waHlzaWNhbF9hcGljaWQpCisJCWJvb3RfY3B1ID0gMTsKKworCXByb2Nlc3Nvci5tcGNfdHlwZSA9IE1QX1BST0NFU1NPUjsKKwlwcm9jZXNzb3IubXBjX2FwaWNpZCA9IGlkOworCXByb2Nlc3Nvci5tcGNfYXBpY3ZlciA9IEdFVF9BUElDX1ZFUlNJT04oYXBpY19yZWFkKEFQSUNfTFZSKSk7CisJcHJvY2Vzc29yLm1wY19jcHVmbGFnID0gKGVuYWJsZWQgPyBDUFVfRU5BQkxFRCA6IDApOworCXByb2Nlc3Nvci5tcGNfY3B1ZmxhZyB8PSAoYm9vdF9jcHUgPyBDUFVfQk9PVFBST0NFU1NPUiA6IDApOworCXByb2Nlc3Nvci5tcGNfY3B1ZmVhdHVyZSA9IChib290X2NwdV9kYXRhLng4NiA8PCA4KSB8IAorCQkoYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPDwgNCkgfCBib290X2NwdV9kYXRhLng4Nl9tYXNrOworCXByb2Nlc3Nvci5tcGNfZmVhdHVyZWZsYWcgPSBib290X2NwdV9kYXRhLng4Nl9jYXBhYmlsaXR5WzBdOworCXByb2Nlc3Nvci5tcGNfcmVzZXJ2ZWRbMF0gPSAwOworCXByb2Nlc3Nvci5tcGNfcmVzZXJ2ZWRbMV0gPSAwOworCisJTVBfcHJvY2Vzc29yX2luZm8oJnByb2Nlc3Nvcik7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19YODZfSU9fQVBJQykgJiYgKGRlZmluZWQoQ09ORklHX0FDUElfSU5URVJQUkVURVIpIHx8IGRlZmluZWQoQ09ORklHX0FDUElfQk9PVCkpCisKKyNkZWZpbmUgTVBfSVNBX0JVUwkJMAorI2RlZmluZSBNUF9NQVhfSU9BUElDX1BJTgkxMjcKKworc3RhdGljIHN0cnVjdCBtcF9pb2FwaWNfcm91dGluZyB7CisJaW50CQkJYXBpY19pZDsKKwlpbnQJCQlnc2lfYmFzZTsKKwlpbnQJCQlnc2lfZW5kOworCXUzMgkJCXBpbl9wcm9ncmFtbWVkWzRdOworfSBtcF9pb2FwaWNfcm91dGluZ1tNQVhfSU9fQVBJQ1NdOworCisKK3N0YXRpYyBpbnQgbXBfZmluZF9pb2FwaWMgKAorCWludAkJCWdzaSkKK3sKKwlpbnQJCQlpID0gMDsKKworCS8qIEZpbmQgdGhlIElPQVBJQyB0aGF0IG1hbmFnZXMgdGhpcyBHU0kuICovCisJZm9yIChpID0gMDsgaSA8IG5yX2lvYXBpY3M7IGkrKykgeworCQlpZiAoKGdzaSA+PSBtcF9pb2FwaWNfcm91dGluZ1tpXS5nc2lfYmFzZSkKKwkJCSYmIChnc2kgPD0gbXBfaW9hcGljX3JvdXRpbmdbaV0uZ3NpX2VuZCkpCisJCQlyZXR1cm4gaTsKKwl9CisKKwlwcmludGsoS0VSTl9FUlIgIkVSUk9SOiBVbmFibGUgdG8gbG9jYXRlIElPQVBJQyBmb3IgR1NJICVkXG4iLCBnc2kpOworCisJcmV0dXJuIC0xOworfQorCQorCit2b2lkIF9faW5pdCBtcF9yZWdpc3Rlcl9pb2FwaWMgKAorCXU4CQkJaWQsIAorCXUzMgkJCWFkZHJlc3MsCisJdTMyCQkJZ3NpX2Jhc2UpCit7CisJaW50CQkJaWR4ID0gMDsKKworCWlmIChucl9pb2FwaWNzID49IE1BWF9JT19BUElDUykgeworCQlwcmludGsoS0VSTl9FUlIgIkVSUk9SOiBNYXggIyBvZiBJL08gQVBJQ3MgKCVkKSBleGNlZWRlZCAiCisJCQkiKGZvdW5kICVkKVxuIiwgTUFYX0lPX0FQSUNTLCBucl9pb2FwaWNzKTsKKwkJcGFuaWMoIlJlY29tcGlsZSBrZXJuZWwgd2l0aCBiaWdnZXIgTUFYX0lPX0FQSUNTIVxuIik7CisJfQorCWlmICghYWRkcmVzcykgeworCQlwcmludGsoS0VSTl9FUlIgIldBUk5JTkc6IEJvZ3VzICh6ZXJvKSBJL08gQVBJQyBhZGRyZXNzIgorCQkJIiBmb3VuZCBpbiBNQURUIHRhYmxlLCBza2lwcGluZyFcbiIpOworCQlyZXR1cm47CisJfQorCisJaWR4ID0gbnJfaW9hcGljcysrOworCisJbXBfaW9hcGljc1tpZHhdLm1wY190eXBlID0gTVBfSU9BUElDOworCW1wX2lvYXBpY3NbaWR4XS5tcGNfZmxhZ3MgPSBNUENfQVBJQ19VU0FCTEU7CisJbXBfaW9hcGljc1tpZHhdLm1wY19hcGljYWRkciA9IGFkZHJlc3M7CisKKwlzZXRfZml4bWFwX25vY2FjaGUoRklYX0lPX0FQSUNfQkFTRV8wICsgaWR4LCBhZGRyZXNzKTsKKwltcF9pb2FwaWNzW2lkeF0ubXBjX2FwaWNpZCA9IGlvX2FwaWNfZ2V0X3VuaXF1ZV9pZChpZHgsIGlkKTsKKwltcF9pb2FwaWNzW2lkeF0ubXBjX2FwaWN2ZXIgPSBpb19hcGljX2dldF92ZXJzaW9uKGlkeCk7CisJCisJLyogCisJICogQnVpbGQgYmFzaWMgR1NJIGxvb2t1cCB0YWJsZSB0byBmYWNpbGl0YXRlIGdzaS0+aW9fYXBpYyBsb29rdXBzCisJICogYW5kIHRvIHByZXZlbnQgcmVwcm9ncmFtbWluZyBvZiBJT0FQSUMgcGlucyAoUENJIEdTSXMpLgorCSAqLworCW1wX2lvYXBpY19yb3V0aW5nW2lkeF0uYXBpY19pZCA9IG1wX2lvYXBpY3NbaWR4XS5tcGNfYXBpY2lkOworCW1wX2lvYXBpY19yb3V0aW5nW2lkeF0uZ3NpX2Jhc2UgPSBnc2lfYmFzZTsKKwltcF9pb2FwaWNfcm91dGluZ1tpZHhdLmdzaV9lbmQgPSBnc2lfYmFzZSArIAorCQlpb19hcGljX2dldF9yZWRpcl9lbnRyaWVzKGlkeCk7CisKKwlwcmludGsoIklPQVBJQ1slZF06IGFwaWNfaWQgJWQsIHZlcnNpb24gJWQsIGFkZHJlc3MgMHglbHgsICIKKwkJIkdTSSAlZC0lZFxuIiwgaWR4LCBtcF9pb2FwaWNzW2lkeF0ubXBjX2FwaWNpZCwgCisJCW1wX2lvYXBpY3NbaWR4XS5tcGNfYXBpY3ZlciwgbXBfaW9hcGljc1tpZHhdLm1wY19hcGljYWRkciwKKwkJbXBfaW9hcGljX3JvdXRpbmdbaWR4XS5nc2lfYmFzZSwKKwkJbXBfaW9hcGljX3JvdXRpbmdbaWR4XS5nc2lfZW5kKTsKKworCXJldHVybjsKK30KKworCit2b2lkIF9faW5pdCBtcF9vdmVycmlkZV9sZWdhY3lfaXJxICgKKwl1OAkJCWJ1c19pcnEsCisJdTgJCQlwb2xhcml0eSwgCisJdTgJCQl0cmlnZ2VyLCAKKwl1MzIJCQlnc2kpCit7CisJc3RydWN0IG1wY19jb25maWdfaW50c3JjIGludHNyYzsKKwlpbnQJCQlpb2FwaWMgPSAtMTsKKwlpbnQJCQlwaW4gPSAtMTsKKworCS8qIAorCSAqIENvbnZlcnQgJ2dzaScgdG8gJ2lvYXBpYy5waW4nLgorCSAqLworCWlvYXBpYyA9IG1wX2ZpbmRfaW9hcGljKGdzaSk7CisJaWYgKGlvYXBpYyA8IDApCisJCXJldHVybjsKKwlwaW4gPSBnc2kgLSBtcF9pb2FwaWNfcm91dGluZ1tpb2FwaWNdLmdzaV9iYXNlOworCisJLyoKKwkgKiBUQkQ6IFRoaXMgY2hlY2sgaXMgZm9yIGZhdWx0eSB0aW1lciBlbnRyaWVzLCB3aGVyZSB0aGUgb3ZlcnJpZGUKKwkgKiAgICAgIGVycm9uZW91c2x5IHNldHMgdGhlIHRyaWdnZXIgdG8gbGV2ZWwsIHJlc3VsdGluZyBpbiBhIEhVR0UgCisJICogICAgICBpbmNyZWFzZSBvZiB0aW1lciBpbnRlcnJ1cHRzIQorCSAqLworCWlmICgoYnVzX2lycSA9PSAwKSAmJiAodHJpZ2dlciA9PSAzKSkKKwkJdHJpZ2dlciA9IDE7CisKKwlpbnRzcmMubXBjX3R5cGUgPSBNUF9JTlRTUkM7CisJaW50c3JjLm1wY19pcnF0eXBlID0gbXBfSU5UOworCWludHNyYy5tcGNfaXJxZmxhZyA9ICh0cmlnZ2VyIDw8IDIpIHwgcG9sYXJpdHk7CisJaW50c3JjLm1wY19zcmNidXMgPSBNUF9JU0FfQlVTOworCWludHNyYy5tcGNfc3JjYnVzaXJxID0gYnVzX2lycTsJCQkJICAgICAgIC8qIElSUSAqLworCWludHNyYy5tcGNfZHN0YXBpYyA9IG1wX2lvYXBpY3NbaW9hcGljXS5tcGNfYXBpY2lkOwkgICAvKiBBUElDIElEICovCisJaW50c3JjLm1wY19kc3RpcnEgPSBwaW47CQkJCSAgICAvKiBJTlRJTiMgKi8KKworCURwcmludGsoIkludDogdHlwZSAlZCwgcG9sICVkLCB0cmlnICVkLCBidXMgJWQsIGlycSAlZCwgJWQtJWRcbiIsCisJCWludHNyYy5tcGNfaXJxdHlwZSwgaW50c3JjLm1wY19pcnFmbGFnICYgMywgCisJCShpbnRzcmMubXBjX2lycWZsYWcgPj4gMikgJiAzLCBpbnRzcmMubXBjX3NyY2J1cywgCisJCWludHNyYy5tcGNfc3JjYnVzaXJxLCBpbnRzcmMubXBjX2RzdGFwaWMsIGludHNyYy5tcGNfZHN0aXJxKTsKKworCW1wX2lycXNbbXBfaXJxX2VudHJpZXNdID0gaW50c3JjOworCWlmICgrK21wX2lycV9lbnRyaWVzID09IE1BWF9JUlFfU09VUkNFUykKKwkJcGFuaWMoIk1heCAjIG9mIGlycSBzb3VyY2VzIGV4Y2VlZGVkIVxuIik7CisKKwlyZXR1cm47Cit9CisKK2ludCBlczcwMDBfcGxhdDsKKwordm9pZCBfX2luaXQgbXBfY29uZmlnX2FjcGlfbGVnYWN5X2lycXMgKHZvaWQpCit7CisJc3RydWN0IG1wY19jb25maWdfaW50c3JjIGludHNyYzsKKwlpbnQJCQlpID0gMDsKKwlpbnQJCQlpb2FwaWMgPSAtMTsKKworCS8qIAorCSAqIEZhYnJpY2F0ZSB0aGUgbGVnYWN5IElTQSBidXMgKGJ1cyAjMzEpLgorCSAqLworCW1wX2J1c19pZF90b190eXBlW01QX0lTQV9CVVNdID0gTVBfQlVTX0lTQTsKKwlEcHJpbnRrKCJCdXMgIyVkIGlzIElTQVxuIiwgTVBfSVNBX0JVUyk7CisKKwkvKgorCSAqIE9sZGVyIGdlbmVyYXRpb25zIG9mIEVTNzAwMCBoYXZlIG5vIGxlZ2FjeSBpZGVudGl0eSBtYXBwaW5ncworCSAqLworCWlmIChlczcwMDBfcGxhdCA9PSAxKQorCQlyZXR1cm47CisKKwkvKiAKKwkgKiBMb2NhdGUgdGhlIElPQVBJQyB0aGF0IG1hbmFnZXMgdGhlIElTQSBJUlFzICgwLTE1KS4gCisJICovCisJaW9hcGljID0gbXBfZmluZF9pb2FwaWMoMCk7CisJaWYgKGlvYXBpYyA8IDApCisJCXJldHVybjsKKworCWludHNyYy5tcGNfdHlwZSA9IE1QX0lOVFNSQzsKKwlpbnRzcmMubXBjX2lycWZsYWcgPSAwOwkJCQkJLyogQ29uZm9ybWluZyAqLworCWludHNyYy5tcGNfc3JjYnVzID0gTVBfSVNBX0JVUzsKKwlpbnRzcmMubXBjX2RzdGFwaWMgPSBtcF9pb2FwaWNzW2lvYXBpY10ubXBjX2FwaWNpZDsKKworCS8qIAorCSAqIFVzZSB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciB0aGUgSVJRcyAwLTE1LiAgVW5sZXNzCisJICogb3ZlcnJpZGVuIGJ5IChNQURUKSBpbnRlcnJ1cHQgc291cmNlIG92ZXJyaWRlIGVudHJpZXMuCisJICovCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJaW50IGlkeDsKKworCQlmb3IgKGlkeCA9IDA7IGlkeCA8IG1wX2lycV9lbnRyaWVzOyBpZHgrKykgeworCQkJc3RydWN0IG1wY19jb25maWdfaW50c3JjICppcnEgPSBtcF9pcnFzICsgaWR4OworCisJCQkvKiBEbyB3ZSBhbHJlYWR5IGhhdmUgYSBtYXBwaW5nIGZvciB0aGlzIElTQSBJUlE/ICovCisJCQlpZiAoaXJxLT5tcGNfc3JjYnVzID09IE1QX0lTQV9CVVMgJiYgaXJxLT5tcGNfc3JjYnVzaXJxID09IGkpCisJCQkJYnJlYWs7CisKKwkJCS8qIERvIHdlIGFscmVhZHkgaGF2ZSBhIG1hcHBpbmcgZm9yIHRoaXMgSU9BUElDIHBpbiAqLworCQkJaWYgKChpcnEtPm1wY19kc3RhcGljID09IGludHNyYy5tcGNfZHN0YXBpYykgJiYKKwkJCQkoaXJxLT5tcGNfZHN0aXJxID09IGkpKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKGlkeCAhPSBtcF9pcnFfZW50cmllcykgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIkFDUEk6IElSUSVkIHVzZWQgYnkgb3ZlcnJpZGUuXG4iLCBpKTsKKwkJCWNvbnRpbnVlOwkJCS8qIElSUSBhbHJlYWR5IHVzZWQgKi8KKwkJfQorCisJCWludHNyYy5tcGNfaXJxdHlwZSA9IG1wX0lOVDsKKwkJaW50c3JjLm1wY19zcmNidXNpcnEgPSBpOwkJICAgLyogSWRlbnRpdHkgbWFwcGVkICovCisJCWludHNyYy5tcGNfZHN0aXJxID0gaTsKKworCQlEcHJpbnRrKCJJbnQ6IHR5cGUgJWQsIHBvbCAlZCwgdHJpZyAlZCwgYnVzICVkLCBpcnEgJWQsICIKKwkJCSIlZC0lZFxuIiwgaW50c3JjLm1wY19pcnF0eXBlLCBpbnRzcmMubXBjX2lycWZsYWcgJiAzLCAKKwkJCShpbnRzcmMubXBjX2lycWZsYWcgPj4gMikgJiAzLCBpbnRzcmMubXBjX3NyY2J1cywgCisJCQlpbnRzcmMubXBjX3NyY2J1c2lycSwgaW50c3JjLm1wY19kc3RhcGljLCAKKwkJCWludHNyYy5tcGNfZHN0aXJxKTsKKworCQltcF9pcnFzW21wX2lycV9lbnRyaWVzXSA9IGludHNyYzsKKwkJaWYgKCsrbXBfaXJxX2VudHJpZXMgPT0gTUFYX0lSUV9TT1VSQ0VTKQorCQkJcGFuaWMoIk1heCAjIG9mIGlycSBzb3VyY2VzIGV4Y2VlZGVkIVxuIik7CisJfQorfQorCitpbnQgbXBfcmVnaXN0ZXJfZ3NpICh1MzIgZ3NpLCBpbnQgZWRnZV9sZXZlbCwgaW50IGFjdGl2ZV9oaWdoX2xvdykKK3sKKwlpbnQJCQlpb2FwaWMgPSAtMTsKKwlpbnQJCQlpb2FwaWNfcGluID0gMDsKKwlpbnQJCQlpZHgsIGJpdCA9IDA7CisKKyNpZmRlZiBDT05GSUdfQUNQSV9CVVMKKwkvKiBEb24ndCBzZXQgdXAgdGhlIEFDUEkgU0NJIGJlY2F1c2UgaXQncyBhbHJlYWR5IHNldCB1cCAqLworCWlmIChhY3BpX2ZhZHQuc2NpX2ludCA9PSBnc2kpCisJCXJldHVybiBnc2k7CisjZW5kaWYKKworCWlvYXBpYyA9IG1wX2ZpbmRfaW9hcGljKGdzaSk7CisJaWYgKGlvYXBpYyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTm8gSU9BUElDIGZvciBHU0kgJXVcbiIsIGdzaSk7CisJCXJldHVybiBnc2k7CisJfQorCisJaW9hcGljX3BpbiA9IGdzaSAtIG1wX2lvYXBpY19yb3V0aW5nW2lvYXBpY10uZ3NpX2Jhc2U7CisKKwlpZiAoaW9hcGljX3JlbnVtYmVyX2lycSkKKwkJZ3NpID0gaW9hcGljX3JlbnVtYmVyX2lycShpb2FwaWMsIGdzaSk7CisKKwkvKiAKKwkgKiBBdm9pZCBwaW4gcmVwcm9ncmFtbWluZy4gIFBSVHMgdHlwaWNhbGx5IGluY2x1ZGUgZW50cmllcyAgCisJICogd2l0aCByZWR1bmRhbnQgcGluLT5nc2kgbWFwcGluZ3MgKGJ1dCB1bmlxdWUgUENJIGRldmljZXMpOworCSAqIHdlIG9ubHkgcHJvZ3JhbSB0aGUgSU9BUElDIG9uIHRoZSBmaXJzdC4KKwkgKi8KKwliaXQgPSBpb2FwaWNfcGluICUgMzI7CisJaWR4ID0gKGlvYXBpY19waW4gPCAzMikgPyAwIDogKGlvYXBpY19waW4gLyAzMik7CisJaWYgKGlkeCA+IDMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIHJlZmVyZW5jZSB0byBJT0FQSUMgcGluICIKKwkJCSIlZC0lZFxuIiwgbXBfaW9hcGljX3JvdXRpbmdbaW9hcGljXS5hcGljX2lkLCAKKwkJCWlvYXBpY19waW4pOworCQlyZXR1cm4gZ3NpOworCX0KKwlpZiAoKDE8PGJpdCkgJiBtcF9pb2FwaWNfcm91dGluZ1tpb2FwaWNdLnBpbl9wcm9ncmFtbWVkW2lkeF0pIHsKKwkJRHByaW50ayhLRVJOX0RFQlVHICJQaW4gJWQtJWQgYWxyZWFkeSBwcm9ncmFtbWVkXG4iLAorCQkJbXBfaW9hcGljX3JvdXRpbmdbaW9hcGljXS5hcGljX2lkLCBpb2FwaWNfcGluKTsKKwkJcmV0dXJuIGdzaTsKKwl9CisKKwltcF9pb2FwaWNfcm91dGluZ1tpb2FwaWNdLnBpbl9wcm9ncmFtbWVkW2lkeF0gfD0gKDE8PGJpdCk7CisKKwlpb19hcGljX3NldF9wY2lfcm91dGluZyhpb2FwaWMsIGlvYXBpY19waW4sIGdzaSwKKwkJICAgIGVkZ2VfbGV2ZWwgPT0gQUNQSV9FREdFX1NFTlNJVElWRSA/IDAgOiAxLAorCQkgICAgYWN0aXZlX2hpZ2hfbG93ID09IEFDUElfQUNUSVZFX0hJR0ggPyAwIDogMSk7CisJcmV0dXJuIGdzaTsKK30KKworI2VuZGlmIC8qQ09ORklHX1g4Nl9JT19BUElDICYmIChDT05GSUdfQUNQSV9JTlRFUlBSRVRFUiB8fCBDT05GSUdfQUNQSV9CT09UKSovCisjZW5kaWYgLypDT05GSUdfQUNQSV9CT09UKi8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvbXNyLmMgYi9hcmNoL2kzODYva2VybmVsL21zci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZDlmOGYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL21zci5jCkBAIC0wLDAgKzEsMzQ2IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKiAgIAorICogICBDb3B5cmlnaHQgMjAwMCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlIE1BIDAyMTM5LAorICogICBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisgKiAgIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBtc3IuYworICoKKyAqIHg4NiBNU1IgYWNjZXNzIGRldmljZQorICoKKyAqIFRoaXMgZGV2aWNlIGlzIGFjY2Vzc2VkIGJ5IGxzZWVrKCkgdG8gdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVyIG51bWJlcgorICogYW5kIHRoZW4gcmVhZC93cml0ZSBpbiBjaHVua3Mgb2YgOCBieXRlcy4gIEEgbGFyZ2VyIHNpemUgbWVhbnMgbXVsdGlwbGUKKyAqIHJlYWRzIG9yIHdyaXRlcyBvZiB0aGUgc2FtZSByZWdpc3Rlci4KKyAqCisgKiBUaGlzIGRyaXZlciB1c2VzIC9kZXYvY3B1LyVkL21zciB3aGVyZSAlZCBpcyB0aGUgbWlub3IgbnVtYmVyLCBhbmQgb24KKyAqIGFuIFNNUCBib3ggd2lsbCBkaXJlY3QgdGhlIGFjY2VzcyB0byBDUFUgJWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9tc3IuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworc3RhdGljIHN0cnVjdCBjbGFzc19zaW1wbGUgKm1zcl9jbGFzczsKKworLyogTm90ZTogImVyciIgaXMgaGFuZGxlZCBpbiBhIGZ1bm55IHdheSBiZWxvdy4gIE90aGVyd2lzZSBvbmUgdmVyc2lvbgorICAgb2YgZ2NjIG9yIGFub3RoZXIgYnJlYWtzLiAqLworCitzdGF0aWMgaW5saW5lIGludCB3cm1zcl9laW8odTMyIHJlZywgdTMyIGVheCwgdTMyIGVkeCkKK3sKKwlpbnQgZXJyOworCisJYXNtIHZvbGF0aWxlICgiMToJd3Jtc3JcbiIKKwkJICAgICAgIjI6XG4iCisJCSAgICAgICIuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCisJCSAgICAgICIzOgltb3ZsICU0LCUwXG4iCisJCSAgICAgICIJam1wIDJiXG4iCisJCSAgICAgICIucHJldmlvdXNcbiIKKwkJICAgICAgIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIKKwkJICAgICAgIgkuYWxpZ24gNFxuIiAiCS5sb25nIDFiLDNiXG4iICIucHJldmlvdXMiOiI9JmJEUyIgKGVycikKKwkJICAgICAgOiJhIihlYXgpLCAiZCIoZWR4KSwgImMiKHJlZyksICJpIigtRUlPKSwgIjAiKDApKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJkbXNyX2Vpbyh1MzIgcmVnLCB1MzIgKmVheCwgdTMyICplZHgpCit7CisJaW50IGVycjsKKworCWFzbSB2b2xhdGlsZSAoIjE6CXJkbXNyXG4iCisJCSAgICAgICIyOlxuIgorCQkgICAgICAiLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgorCQkgICAgICAiMzoJbW92bCAlNCwlMFxuIgorCQkgICAgICAiCWptcCAyYlxuIgorCQkgICAgICAiLnByZXZpb3VzXG4iCisJCSAgICAgICIuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCisJCSAgICAgICIJLmFsaWduIDRcbiIKKwkJICAgICAgIgkubG9uZyAxYiwzYlxuIgorCQkgICAgICAiLnByZXZpb3VzIjoiPSZiRFMiIChlcnIpLCAiPWEiKCplYXgpLCAiPWQiKCplZHgpCisJCSAgICAgIDoiYyIocmVnKSwgImkiKC1FSU8pLCAiMCIoMCkpOworCisJcmV0dXJuIGVycjsKK30KKworI2lmZGVmIENPTkZJR19TTVAKKworc3RydWN0IG1zcl9jb21tYW5kIHsKKwlpbnQgY3B1OworCWludCBlcnI7CisJdTMyIHJlZzsKKwl1MzIgZGF0YVsyXTsKK307CisKK3N0YXRpYyB2b2lkIG1zcl9zbXBfd3Jtc3Iodm9pZCAqY21kX2Jsb2NrKQoreworCXN0cnVjdCBtc3JfY29tbWFuZCAqY21kID0gKHN0cnVjdCBtc3JfY29tbWFuZCAqKWNtZF9ibG9jazsKKworCWlmIChjbWQtPmNwdSA9PSBzbXBfcHJvY2Vzc29yX2lkKCkpCisJCWNtZC0+ZXJyID0gd3Jtc3JfZWlvKGNtZC0+cmVnLCBjbWQtPmRhdGFbMF0sIGNtZC0+ZGF0YVsxXSk7Cit9CisKK3N0YXRpYyB2b2lkIG1zcl9zbXBfcmRtc3Iodm9pZCAqY21kX2Jsb2NrKQoreworCXN0cnVjdCBtc3JfY29tbWFuZCAqY21kID0gKHN0cnVjdCBtc3JfY29tbWFuZCAqKWNtZF9ibG9jazsKKworCWlmIChjbWQtPmNwdSA9PSBzbXBfcHJvY2Vzc29yX2lkKCkpCisJCWNtZC0+ZXJyID0gcmRtc3JfZWlvKGNtZC0+cmVnLCAmY21kLT5kYXRhWzBdLCAmY21kLT5kYXRhWzFdKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZG9fd3Jtc3IoaW50IGNwdSwgdTMyIHJlZywgdTMyIGVheCwgdTMyIGVkeCkKK3sKKwlzdHJ1Y3QgbXNyX2NvbW1hbmQgY21kOworCWludCByZXQ7CisKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKwlpZiAoY3B1ID09IHNtcF9wcm9jZXNzb3JfaWQoKSkgeworCQlyZXQgPSB3cm1zcl9laW8ocmVnLCBlYXgsIGVkeCk7CisJfSBlbHNlIHsKKwkJY21kLmNwdSA9IGNwdTsKKwkJY21kLnJlZyA9IHJlZzsKKwkJY21kLmRhdGFbMF0gPSBlYXg7CisJCWNtZC5kYXRhWzFdID0gZWR4OworCisJCXNtcF9jYWxsX2Z1bmN0aW9uKG1zcl9zbXBfd3Jtc3IsICZjbWQsIDEsIDEpOworCQlyZXQgPSBjbWQuZXJyOworCX0KKwlwcmVlbXB0X2VuYWJsZSgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRvX3JkbXNyKGludCBjcHUsIHUzMiByZWcsIHUzMiAqIGVheCwgdTMyICogZWR4KQoreworCXN0cnVjdCBtc3JfY29tbWFuZCBjbWQ7CisJaW50IHJldDsKKworCXByZWVtcHRfZGlzYWJsZSgpOworCWlmIChjcHUgPT0gc21wX3Byb2Nlc3Nvcl9pZCgpKSB7CisJCXJldCA9IHJkbXNyX2VpbyhyZWcsIGVheCwgZWR4KTsKKwl9IGVsc2UgeworCQljbWQuY3B1ID0gY3B1OworCQljbWQucmVnID0gcmVnOworCisJCXNtcF9jYWxsX2Z1bmN0aW9uKG1zcl9zbXBfcmRtc3IsICZjbWQsIDEsIDEpOworCisJCSplYXggPSBjbWQuZGF0YVswXTsKKwkJKmVkeCA9IGNtZC5kYXRhWzFdOworCisJCXJldCA9IGNtZC5lcnI7CisJfQorCXByZWVtcHRfZW5hYmxlKCk7CisJcmV0dXJuIHJldDsKK30KKworI2Vsc2UJCQkJLyogISBDT05GSUdfU01QICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGRvX3dybXNyKGludCBjcHUsIHUzMiByZWcsIHUzMiBlYXgsIHUzMiBlZHgpCit7CisJcmV0dXJuIHdybXNyX2VpbyhyZWcsIGVheCwgZWR4KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZG9fcmRtc3IoaW50IGNwdSwgdTMyIHJlZywgdTMyICplYXgsIHUzMiAqZWR4KQoreworCXJldHVybiByZG1zcl9laW8ocmVnLCBlYXgsIGVkeCk7Cit9CisKKyNlbmRpZgkJCQkvKiAhIENPTkZJR19TTVAgKi8KKworc3RhdGljIGxvZmZfdCBtc3Jfc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWcpCit7CisJbG9mZl90IHJldCA9IC1FSU5WQUw7CisKKwlsb2NrX2tlcm5lbCgpOworCXN3aXRjaCAob3JpZykgeworCWNhc2UgMDoKKwkJZmlsZS0+Zl9wb3MgPSBvZmZzZXQ7CisJCXJldCA9IGZpbGUtPmZfcG9zOworCQlicmVhazsKKwljYXNlIDE6CisJCWZpbGUtPmZfcG9zICs9IG9mZnNldDsKKwkJcmV0ID0gZmlsZS0+Zl9wb3M7CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBtc3JfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKiBidWYsCisJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCit7CisJdTMyIF9fdXNlciAqdG1wID0gKHUzMiBfX3VzZXIgKikgYnVmOworCXUzMiBkYXRhWzJdOworCXNpemVfdCBydjsKKwl1MzIgcmVnID0gKnBwb3M7CisJaW50IGNwdSA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJaW50IGVycjsKKworCWlmIChjb3VudCAlIDgpCisJCXJldHVybiAtRUlOVkFMOwkvKiBJbnZhbGlkIGNodW5rIHNpemUgKi8KKworCWZvciAocnYgPSAwOyBjb3VudDsgY291bnQgLT0gOCkgeworCQllcnIgPSBkb19yZG1zcihjcHUsIHJlZywgJmRhdGFbMF0sICZkYXRhWzFdKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCWlmIChjb3B5X3RvX3VzZXIodG1wLCAmZGF0YSwgOCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJdG1wICs9IDI7CisJfQorCisJcmV0dXJuICgoY2hhciBfX3VzZXIgKil0bXApIC0gYnVmOworfQorCitzdGF0aWMgc3NpemVfdCBtc3Jfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJY29uc3QgdTMyIF9fdXNlciAqdG1wID0gKGNvbnN0IHUzMiBfX3VzZXIgKilidWY7CisJdTMyIGRhdGFbMl07CisJc2l6ZV90IHJ2OworCXUzMiByZWcgPSAqcHBvczsKKwlpbnQgY3B1ID0gaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlpbnQgZXJyOworCisJaWYgKGNvdW50ICUgOCkKKwkJcmV0dXJuIC1FSU5WQUw7CS8qIEludmFsaWQgY2h1bmsgc2l6ZSAqLworCisJZm9yIChydiA9IDA7IGNvdW50OyBjb3VudCAtPSA4KSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmZGF0YSwgdG1wLCA4KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQllcnIgPSBkb193cm1zcihjcHUsIHJlZywgZGF0YVswXSwgZGF0YVsxXSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQl0bXAgKz0gMjsKKwl9CisKKwlyZXR1cm4gKChjaGFyIF9fdXNlciAqKXRtcCkgLSBidWY7Cit9CisKK3N0YXRpYyBpbnQgbXNyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJdW5zaWduZWQgaW50IGNwdSA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3RydWN0IGNwdWluZm9feDg2ICpjID0gJihjcHVfZGF0YSlbY3B1XTsKKworCWlmIChjcHUgPj0gTlJfQ1BVUyB8fCAhY3B1X29ubGluZShjcHUpKQorCQlyZXR1cm4gLUVOWElPOwkvKiBObyBzdWNoIENQVSAqLworCWlmICghY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9NU1IpKQorCQlyZXR1cm4gLUVJTzsJLyogTVNSIG5vdCBzdXBwb3J0ZWQgKi8KKworCXJldHVybiAwOworfQorCisvKgorICogRmlsZSBvcGVyYXRpb25zIHdlIHN1cHBvcnQKKyAqLworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbXNyX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmxsc2VlayA9IG1zcl9zZWVrLAorCS5yZWFkID0gbXNyX3JlYWQsCisJLndyaXRlID0gbXNyX3dyaXRlLAorCS5vcGVuID0gbXNyX29wZW4sCit9OworCitzdGF0aWMgaW50IG1zcl9jbGFzc19zaW1wbGVfZGV2aWNlX2FkZChpbnQgaSkKK3sKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19lcnI7CisKKwljbGFzc19lcnIgPSBjbGFzc19zaW1wbGVfZGV2aWNlX2FkZChtc3JfY2xhc3MsIE1LREVWKE1TUl9NQUpPUiwgaSksIE5VTEwsICJtc3IlZCIsaSk7CisJaWYgKElTX0VSUihjbGFzc19lcnIpKSAKKwkJZXJyID0gUFRSX0VSUihjbGFzc19lcnIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG1zcl9jbGFzc19jcHVfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQoreworCXVuc2lnbmVkIGludCBjcHUgPSAodW5zaWduZWQgbG9uZyloY3B1OworCisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIENQVV9PTkxJTkU6CisJCW1zcl9jbGFzc19zaW1wbGVfZGV2aWNlX2FkZChjcHUpOworCQlicmVhazsKKwljYXNlIENQVV9ERUFEOgorCQljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihNU1JfTUFKT1IsIGNwdSkpOwkKKwkJYnJlYWs7CisJfQorCXJldHVybiBOT1RJRllfT0s7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgbXNyX2NsYXNzX2NwdV9ub3RpZmllciA9Cit7CisJLm5vdGlmaWVyX2NhbGwgPSBtc3JfY2xhc3NfY3B1X2NhbGxiYWNrLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbXNyX2luaXQodm9pZCkKK3sKKwlpbnQgaSwgZXJyID0gMDsKKwlpID0gMDsKKworCWlmIChyZWdpc3Rlcl9jaHJkZXYoTVNSX01BSk9SLCAiY3B1L21zciIsICZtc3JfZm9wcykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtc3I6IHVuYWJsZSB0byBnZXQgbWFqb3IgJWQgZm9yIG1zclxuIiwKKwkJICAgICAgIE1TUl9NQUpPUik7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCW1zcl9jbGFzcyA9IGNsYXNzX3NpbXBsZV9jcmVhdGUoVEhJU19NT0RVTEUsICJtc3IiKTsKKwlpZiAoSVNfRVJSKG1zcl9jbGFzcykpIHsKKwkJZXJyID0gUFRSX0VSUihtc3JfY2xhc3MpOworCQlnb3RvIG91dF9jaHJkZXY7CisJfQorCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgeworCQllcnIgPSBtc3JfY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQoaSk7CisJCWlmIChlcnIgIT0gMCkKKwkJCWdvdG8gb3V0X2NsYXNzOworCX0KKwlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJm1zcl9jbGFzc19jcHVfbm90aWZpZXIpOworCisJZXJyID0gMDsKKwlnb3RvIG91dDsKKworb3V0X2NsYXNzOgorCWkgPSAwOworCWZvcl9lYWNoX29ubGluZV9jcHUoaSkKKwkJY2xhc3Nfc2ltcGxlX2RldmljZV9yZW1vdmUoTUtERVYoTVNSX01BSk9SLCBpKSk7CisJY2xhc3Nfc2ltcGxlX2Rlc3Ryb3kobXNyX2NsYXNzKTsKK291dF9jaHJkZXY6CisJdW5yZWdpc3Rlcl9jaHJkZXYoTVNSX01BSk9SLCAiY3B1L21zciIpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtc3JfZXhpdCh2b2lkKQoreworCWludCBjcHUgPSAwOworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQorCQljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihNU1JfTUFKT1IsIGNwdSkpOworCWNsYXNzX3NpbXBsZV9kZXN0cm95KG1zcl9jbGFzcyk7CisJdW5yZWdpc3Rlcl9jaHJkZXYoTVNSX01BSk9SLCAiY3B1L21zciIpOworCXVucmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZtc3JfY2xhc3NfY3B1X25vdGlmaWVyKTsKK30KKworbW9kdWxlX2luaXQobXNyX2luaXQpOworbW9kdWxlX2V4aXQobXNyX2V4aXQpCisKK01PRFVMRV9BVVRIT1IoIkguIFBldGVyIEFudmluIDxocGFAenl0b3IuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJ4ODYgZ2VuZXJpYyBNU1IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL25taS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9ubWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWIwYzUwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9ubWkuYwpAQCAtMCwwICsxLDU3MCBAQAorLyoKKyAqICBsaW51eC9hcmNoL2kzODYvbm1pLmMKKyAqCisgKiAgTk1JIHdhdGNoZG9nIHN1cHBvcnQgb24gQVBJQyBzeXN0ZW1zCisgKgorICogIFN0YXJ0ZWQgYnkgSW5nbyBNb2xuYXIgPG1pbmdvQHJlZGhhdC5jb20+CisgKgorICogIEZpeGVzOgorICogIE1pa2FlbCBQZXR0ZXJzc29uCTogQU1EIEs3IHN1cHBvcnQgZm9yIGxvY2FsIEFQSUMgTk1JIHdhdGNoZG9nLgorICogIE1pa2FlbCBQZXR0ZXJzc29uCTogUG93ZXIgTWFuYWdlbWVudCBmb3IgbG9jYWwgQVBJQyBOTUkgd2F0Y2hkb2cuCisgKiAgTWlrYWVsIFBldHRlcnNzb24JOiBQZW50aXVtIDQgc3VwcG9ydCBmb3IgbG9jYWwgQVBJQyBOTUkgd2F0Y2hkb2cuCisgKiAgUGF2ZWwgTWFjaGVrIGFuZAorICogIE1pa2FlbCBQZXR0ZXJzc29uCTogUE0gY29udmVydGVkIHRvIGRyaXZlciBtb2RlbC4gRGlzYWJsZS9lbmFibGUgQVBJLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25taS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorCisjaW5jbHVkZSA8YXNtL3NtcC5oPgorI2luY2x1ZGUgPGFzbS9tdHJyLmg+CisjaW5jbHVkZSA8YXNtL21wc3BlYy5oPgorI2luY2x1ZGUgPGFzbS9ubWkuaD4KKworI2luY2x1ZGUgIm1hY2hfdHJhcHMuaCIKKwordW5zaWduZWQgaW50IG5taV93YXRjaGRvZyA9IE5NSV9OT05FOworZXh0ZXJuIGludCB1bmtub3duX25taV9wYW5pYzsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm1pX2h6ID0gSFo7CitzdGF0aWMgdW5zaWduZWQgaW50IG5taV9wZXJmY3RyX21zcjsJLyogdGhlIE1TUiB0byByZXNldCBpbiBOTUkgaGFuZGxlciAqLworc3RhdGljIHVuc2lnbmVkIGludCBubWlfcDRfY2Njcl92YWw7CitleHRlcm4gdm9pZCBzaG93X3JlZ2lzdGVycyhzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKKy8qCisgKiBsYXBpY19ubWlfb3duZXIgdHJhY2tzIHRoZSBvd25lcnNoaXAgb2YgdGhlIGxhcGljIE5NSSBoYXJkd2FyZToKKyAqIC0gaXQgbWF5IGJlIHJlc2VydmVkIGJ5IHNvbWUgb3RoZXIgZHJpdmVyLCBvciBub3QKKyAqIC0gd2hlbiBub3QgcmVzZXJ2ZWQgYnkgc29tZSBvdGhlciBkcml2ZXIsIGl0IG1heSBiZSB1c2VkIGZvcgorICogICB0aGUgTk1JIHdhdGNoZG9nLCBvciBub3QKKyAqCisgKiBUaGlzIGlzIG1haW50YWluZWQgc2VwYXJhdGVseSBmcm9tIG5taV9hY3RpdmUgYmVjYXVzZSB0aGUgTk1JCisgKiB3YXRjaGRvZyBtYXkgYWxzbyBiZSBkcml2ZW4gZnJvbSB0aGUgSS9PIEFQSUMgdGltZXIuCisgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobGFwaWNfbm1pX293bmVyX2xvY2spOworc3RhdGljIHVuc2lnbmVkIGludCBsYXBpY19ubWlfb3duZXI7CisjZGVmaW5lIExBUElDX05NSV9XQVRDSERPRwkoMTw8MCkKKyNkZWZpbmUgTEFQSUNfTk1JX1JFU0VSVkVECSgxPDwxKQorCisvKiBubWlfYWN0aXZlOgorICogKzE6IHRoZSBsYXBpYyBOTUkgd2F0Y2hkb2cgaXMgYWN0aXZlLCBidXQgY2FuIGJlIGRpc2FibGVkCisgKiAgMDogdGhlIGxhcGljIE5NSSB3YXRjaGRvZyBoYXMgbm90IGJlZW4gc2V0IHVwLCBhbmQgY2Fubm90CisgKiAgICAgYmUgZW5hYmxlZAorICogLTE6IHRoZSBsYXBpYyBOTUkgd2F0Y2hkb2cgaXMgZGlzYWJsZWQsIGJ1dCBjYW4gYmUgZW5hYmxlZAorICovCitpbnQgbm1pX2FjdGl2ZTsKKworI2RlZmluZSBLN19FVk5UU0VMX0VOQUJMRQkoMSA8PCAyMikKKyNkZWZpbmUgSzdfRVZOVFNFTF9JTlQJCSgxIDw8IDIwKQorI2RlZmluZSBLN19FVk5UU0VMX09TCQkoMSA8PCAxNykKKyNkZWZpbmUgSzdfRVZOVFNFTF9VU1IJCSgxIDw8IDE2KQorI2RlZmluZSBLN19FVkVOVF9DWUNMRVNfUFJPQ0VTU09SX0lTX1JVTk5JTkcJMHg3NgorI2RlZmluZSBLN19OTUlfRVZFTlQJCUs3X0VWRU5UX0NZQ0xFU19QUk9DRVNTT1JfSVNfUlVOTklORworCisjZGVmaW5lIFA2X0VWTlRTRUwwX0VOQUJMRQkoMSA8PCAyMikKKyNkZWZpbmUgUDZfRVZOVFNFTF9JTlQJCSgxIDw8IDIwKQorI2RlZmluZSBQNl9FVk5UU0VMX09TCQkoMSA8PCAxNykKKyNkZWZpbmUgUDZfRVZOVFNFTF9VU1IJCSgxIDw8IDE2KQorI2RlZmluZSBQNl9FVkVOVF9DUFVfQ0xPQ0tTX05PVF9IQUxURUQJMHg3OQorI2RlZmluZSBQNl9OTUlfRVZFTlQJCVA2X0VWRU5UX0NQVV9DTE9DS1NfTk9UX0hBTFRFRAorCisjZGVmaW5lIE1TUl9QNF9NSVNDX0VOQUJMRQkweDFBMAorI2RlZmluZSBNU1JfUDRfTUlTQ19FTkFCTEVfUEVSRl9BVkFJTAkoMTw8NykKKyNkZWZpbmUgTVNSX1A0X01JU0NfRU5BQkxFX1BFQlNfVU5BVkFJTAkoMTw8MTIpCisjZGVmaW5lIE1TUl9QNF9QRVJGQ1RSMAkJMHgzMDAKKyNkZWZpbmUgTVNSX1A0X0NDQ1IwCQkweDM2MAorI2RlZmluZSBQNF9FU0NSX0VWRU5UX1NFTEVDVChOKQkoKE4pPDwyNSkKKyNkZWZpbmUgUDRfRVNDUl9PUwkJKDE8PDMpCisjZGVmaW5lIFA0X0VTQ1JfVVNSCQkoMTw8MikKKyNkZWZpbmUgUDRfQ0NDUl9PVkZfUE1JMAkoMTw8MjYpCisjZGVmaW5lIFA0X0NDQ1JfT1ZGX1BNSTEJKDE8PDI3KQorI2RlZmluZSBQNF9DQ0NSX1RIUkVTSE9MRChOKQkoKE4pPDwyMCkKKyNkZWZpbmUgUDRfQ0NDUl9DT01QTEVNRU5UCSgxPDwxOSkKKyNkZWZpbmUgUDRfQ0NDUl9DT01QQVJFCQkoMTw8MTgpCisjZGVmaW5lIFA0X0NDQ1JfUkVRVUlSRUQJKDM8PDE2KQorI2RlZmluZSBQNF9DQ0NSX0VTQ1JfU0VMRUNUKE4pCSgoTik8PDEzKQorI2RlZmluZSBQNF9DQ0NSX0VOQUJMRQkJKDE8PDEyKQorLyogU2V0IHVwIElRX0NPVU5URVIwIHRvIGJlaGF2ZSBsaWtlIGEgY2xvY2ssIGJ5IGhhdmluZyBJUV9DQ0NSMCBmaWx0ZXIKKyAgIENSVV9FU0NSMCAod2l0aCBhbnkgbm9uLW51bGwgZXZlbnQgc2VsZWN0b3IpIHRocm91Z2ggYSBjb21wbGVtZW50ZWQKKyAgIG1heCB0aHJlc2hvbGQuIFtJQTMyLVZvbDMsIFNlY3Rpb24gMTQuOS45XSAqLworI2RlZmluZSBNU1JfUDRfSVFfQ09VTlRFUjAJMHgzMEMKKyNkZWZpbmUgUDRfTk1JX0NSVV9FU0NSMAkoUDRfRVNDUl9FVkVOVF9TRUxFQ1QoMHgzRil8UDRfRVNDUl9PU3xQNF9FU0NSX1VTUikKKyNkZWZpbmUgUDRfTk1JX0lRX0NDQ1IwCVwKKwkoUDRfQ0NDUl9PVkZfUE1JMHxQNF9DQ0NSX1RIUkVTSE9MRCgxNSl8UDRfQ0NDUl9DT01QTEVNRU5UfAlcCisJIFA0X0NDQ1JfQ09NUEFSRXxQNF9DQ0NSX1JFUVVJUkVEfFA0X0NDQ1JfRVNDUl9TRUxFQ1QoNCl8UDRfQ0NDUl9FTkFCTEUpCisKK2ludCBfX2luaXQgY2hlY2tfbm1pX3dhdGNoZG9nICh2b2lkKQoreworCXVuc2lnbmVkIGludCBwcmV2X25taV9jb3VudFtOUl9DUFVTXTsKKwlpbnQgY3B1OworCisJcHJpbnRrKEtFUk5fSU5GTyAidGVzdGluZyBOTUkgd2F0Y2hkb2cgLi4uICIpOworCisJZm9yIChjcHUgPSAwOyBjcHUgPCBOUl9DUFVTOyBjcHUrKykKKwkJcHJldl9ubWlfY291bnRbY3B1XSA9IHBlcl9jcHUoaXJxX3N0YXQsIGNwdSkuX19ubWlfY291bnQ7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworCW1kZWxheSgoMTAqMTAwMCkvbm1pX2h6KTsgLy8gd2FpdCAxMCB0aWNrcworCisJLyogRklYTUU6IE9ubHkgYm9vdCBDUFUgaXMgb25saW5lIGF0IHRoaXMgc3RhZ2UuICBDaGVjayBDUFVzCisgICAgICAgICAgIGFzIHRoZXkgY29tZSB1cC4gKi8KKwlmb3IgKGNwdSA9IDA7IGNwdSA8IE5SX0NQVVM7IGNwdSsrKSB7CisjaWZkZWYgQ09ORklHX1NNUAorCQkvKiBDaGVjayBjcHVfY2FsbGluX21hcCBoZXJlIGJlY2F1c2UgdGhhdCBpcyBzZXQKKwkJICAgYWZ0ZXIgdGhlIHRpbWVyIGlzIHN0YXJ0ZWQuICovCisJCWlmICghY3B1X2lzc2V0KGNwdSwgY3B1X2NhbGxpbl9tYXApKQorCQkJY29udGludWU7CisjZW5kaWYKKwkJaWYgKG5taV9jb3VudChjcHUpIC0gcHJldl9ubWlfY291bnRbY3B1XSA8PSA1KSB7CisJCQlwcmludGsoIkNQVSMlZDogTk1JIGFwcGVhcnMgdG8gYmUgc3R1Y2shXG4iLCBjcHUpOworCQkJbm1pX2FjdGl2ZSA9IDA7CisJCQlsYXBpY19ubWlfb3duZXIgJj0gfkxBUElDX05NSV9XQVRDSERPRzsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwlwcmludGsoIk9LLlxuIik7CisKKwkvKiBub3cgdGhhdCB3ZSBrbm93IGl0IHdvcmtzIHdlIGNhbiByZWR1Y2UgTk1JIGZyZXF1ZW5jeSB0bworCSAgIHNvbWV0aGluZyBtb3JlIHJlYXNvbmFibGU7IG1ha2VzIGEgZGlmZmVyZW5jZSBpbiBzb21lIGNvbmZpZ3MgKi8KKwlpZiAobm1pX3dhdGNoZG9nID09IE5NSV9MT0NBTF9BUElDKQorCQlubWlfaHogPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX25taV93YXRjaGRvZyhjaGFyICpzdHIpCit7CisJaW50IG5taTsKKworCWdldF9vcHRpb24oJnN0ciwgJm5taSk7CisKKwlpZiAobm1pID49IE5NSV9JTlZBTElEKQorCQlyZXR1cm4gMDsKKwlpZiAobm1pID09IE5NSV9OT05FKQorCQlubWlfd2F0Y2hkb2cgPSBubWk7CisJLyoKKwkgKiBJZiBhbnkgb3RoZXIgeDg2IENQVSBoYXMgYSBsb2NhbCBBUElDLCB0aGVuCisJICogcGxlYXNlIHRlc3QgdGhlIE5NSSBzdHVmZiB0aGVyZSBhbmQgc2VuZCBtZSB0aGUKKwkgKiBtaXNzaW5nIGJpdHMuIFJpZ2h0IG5vdyBJbnRlbCBQNi9QNCBhbmQgQU1EIEs3IG9ubHkuCisJICovCisJaWYgKChubWkgPT0gTk1JX0xPQ0FMX0FQSUMpICYmCisJCQkoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfSU5URUwpICYmCisJCQkoYm9vdF9jcHVfZGF0YS54ODYgPT0gNiB8fCBib290X2NwdV9kYXRhLng4NiA9PSAxNSkpCisJCW5taV93YXRjaGRvZyA9IG5taTsKKwlpZiAoKG5taSA9PSBOTUlfTE9DQUxfQVBJQykgJiYKKwkJCShib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9BTUQpICYmCisJICAJCShib290X2NwdV9kYXRhLng4NiA9PSA2IHx8IGJvb3RfY3B1X2RhdGEueDg2ID09IDE1KSkKKwkJbm1pX3dhdGNoZG9nID0gbm1pOworCS8qCisJICogV2UgY2FuIGVuYWJsZSB0aGUgSU8tQVBJQyB3YXRjaGRvZworCSAqIHVuY29uZGl0aW9uYWxseS4KKwkgKi8KKwlpZiAobm1pID09IE5NSV9JT19BUElDKSB7CisJCW5taV9hY3RpdmUgPSAxOworCQlubWlfd2F0Y2hkb2cgPSBubWk7CisJfQorCXJldHVybiAxOworfQorCitfX3NldHVwKCJubWlfd2F0Y2hkb2c9Iiwgc2V0dXBfbm1pX3dhdGNoZG9nKTsKKworc3RhdGljIHZvaWQgZGlzYWJsZV9sYXBpY19ubWlfd2F0Y2hkb2codm9pZCkKK3sKKwlpZiAobm1pX2FjdGl2ZSA8PSAwKQorCQlyZXR1cm47CisJc3dpdGNoIChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IpIHsKKwljYXNlIFg4Nl9WRU5ET1JfQU1EOgorCQl3cm1zcihNU1JfSzdfRVZOVFNFTDAsIDAsIDApOworCQlicmVhazsKKwljYXNlIFg4Nl9WRU5ET1JfSU5URUw6CisJCXN3aXRjaCAoYm9vdF9jcHVfZGF0YS54ODYpIHsKKwkJY2FzZSA2OgorCQkJaWYgKGJvb3RfY3B1X2RhdGEueDg2X21vZGVsID4gMHhkKQorCQkJCWJyZWFrOworCisJCQl3cm1zcihNU1JfUDZfRVZOVFNFTDAsIDAsIDApOworCQkJYnJlYWs7CisJCWNhc2UgMTU6CisJCQlpZiAoYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPiAweDMpCisJCQkJYnJlYWs7CisKKwkJCXdybXNyKE1TUl9QNF9JUV9DQ0NSMCwgMCwgMCk7CisJCQl3cm1zcihNU1JfUDRfQ1JVX0VTQ1IwLCAwLCAwKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKwlubWlfYWN0aXZlID0gLTE7CisJLyogdGVsbCBkb19ubWkoKSBhbmQgb3RoZXJzIHRoYXQgd2UncmUgbm90IGFjdGl2ZSBhbnkgbW9yZSAqLworCW5taV93YXRjaGRvZyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGVuYWJsZV9sYXBpY19ubWlfd2F0Y2hkb2codm9pZCkKK3sKKwlpZiAobm1pX2FjdGl2ZSA8IDApIHsKKwkJbm1pX3dhdGNoZG9nID0gTk1JX0xPQ0FMX0FQSUM7CisJCXNldHVwX2FwaWNfbm1pX3dhdGNoZG9nKCk7CisJfQorfQorCitpbnQgcmVzZXJ2ZV9sYXBpY19ubWkodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgb2xkX293bmVyOworCisJc3Bpbl9sb2NrKCZsYXBpY19ubWlfb3duZXJfbG9jayk7CisJb2xkX293bmVyID0gbGFwaWNfbm1pX293bmVyOworCWxhcGljX25taV9vd25lciB8PSBMQVBJQ19OTUlfUkVTRVJWRUQ7CisJc3Bpbl91bmxvY2soJmxhcGljX25taV9vd25lcl9sb2NrKTsKKwlpZiAob2xkX293bmVyICYgTEFQSUNfTk1JX1JFU0VSVkVEKQorCQlyZXR1cm4gLUVCVVNZOworCWlmIChvbGRfb3duZXIgJiBMQVBJQ19OTUlfV0FUQ0hET0cpCisJCWRpc2FibGVfbGFwaWNfbm1pX3dhdGNoZG9nKCk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgcmVsZWFzZV9sYXBpY19ubWkodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgbmV3X293bmVyOworCisJc3Bpbl9sb2NrKCZsYXBpY19ubWlfb3duZXJfbG9jayk7CisJbmV3X293bmVyID0gbGFwaWNfbm1pX293bmVyICYgfkxBUElDX05NSV9SRVNFUlZFRDsKKwlsYXBpY19ubWlfb3duZXIgPSBuZXdfb3duZXI7CisJc3Bpbl91bmxvY2soJmxhcGljX25taV9vd25lcl9sb2NrKTsKKwlpZiAobmV3X293bmVyICYgTEFQSUNfTk1JX1dBVENIRE9HKQorCQllbmFibGVfbGFwaWNfbm1pX3dhdGNoZG9nKCk7Cit9CisKK3ZvaWQgZGlzYWJsZV90aW1lcl9ubWlfd2F0Y2hkb2codm9pZCkKK3sKKwlpZiAoKG5taV93YXRjaGRvZyAhPSBOTUlfSU9fQVBJQykgfHwgKG5taV9hY3RpdmUgPD0gMCkpCisJCXJldHVybjsKKworCXVuc2V0X25taV9jYWxsYmFjaygpOworCW5taV9hY3RpdmUgPSAtMTsKKwlubWlfd2F0Y2hkb2cgPSBOTUlfTk9ORTsKK30KKwordm9pZCBlbmFibGVfdGltZXJfbm1pX3dhdGNoZG9nKHZvaWQpCit7CisJaWYgKG5taV9hY3RpdmUgPCAwKSB7CisJCW5taV93YXRjaGRvZyA9IE5NSV9JT19BUElDOworCQl0b3VjaF9ubWlfd2F0Y2hkb2coKTsKKwkJbm1pX2FjdGl2ZSA9IDE7CisJfQorfQorCisjaWZkZWYgQ09ORklHX1BNCisKK3N0YXRpYyBpbnQgbm1pX3BtX2FjdGl2ZTsgLyogbm1pX2FjdGl2ZSBiZWZvcmUgc3VzcGVuZCAqLworCitzdGF0aWMgaW50IGxhcGljX25taV9zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIHUzMiBzdGF0ZSkKK3sKKwlubWlfcG1fYWN0aXZlID0gbm1pX2FjdGl2ZTsKKwlkaXNhYmxlX2xhcGljX25taV93YXRjaGRvZygpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxhcGljX25taV9yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKmRldikKK3sKKwlpZiAobm1pX3BtX2FjdGl2ZSA+IDApCisJCWVuYWJsZV9sYXBpY19ubWlfd2F0Y2hkb2coKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IHN5c2Rldl9jbGFzcyBubWlfc3lzY2xhc3MgPSB7CisJc2V0X2tzZXRfbmFtZSgibGFwaWNfbm1pIiksCisJLnJlc3VtZQkJPSBsYXBpY19ubWlfcmVzdW1lLAorCS5zdXNwZW5kCT0gbGFwaWNfbm1pX3N1c3BlbmQsCit9OworCitzdGF0aWMgc3RydWN0IHN5c19kZXZpY2UgZGV2aWNlX2xhcGljX25taSA9IHsKKwkuaWQJPSAwLAorCS5jbHMJPSAmbm1pX3N5c2NsYXNzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9sYXBpY19ubWlfc3lzZnModm9pZCkKK3sKKwlpbnQgZXJyb3I7CisKKwlpZiAobm1pX2FjdGl2ZSA9PSAwIHx8IG5taV93YXRjaGRvZyAhPSBOTUlfTE9DQUxfQVBJQykKKwkJcmV0dXJuIDA7CisKKwllcnJvciA9IHN5c2Rldl9jbGFzc19yZWdpc3Rlcigmbm1pX3N5c2NsYXNzKTsKKwlpZiAoIWVycm9yKQorCQllcnJvciA9IHN5c2Rldl9yZWdpc3RlcigmZGV2aWNlX2xhcGljX25taSk7CisJcmV0dXJuIGVycm9yOworfQorLyogbXVzdCBjb21lIGFmdGVyIHRoZSBsb2NhbCBBUElDJ3MgZGV2aWNlX2luaXRjYWxsKCkgKi8KK2xhdGVfaW5pdGNhbGwoaW5pdF9sYXBpY19ubWlfc3lzZnMpOworCisjZW5kaWYJLyogQ09ORklHX1BNICovCisKKy8qCisgKiBBY3RpdmF0ZSB0aGUgTk1JIHdhdGNoZG9nIHZpYSB0aGUgbG9jYWwgQVBJQy4KKyAqIE9yaWdpbmFsIGNvZGUgd3JpdHRlbiBieSBLZWl0aCBPd2Vucy4KKyAqLworCitzdGF0aWMgdm9pZCBjbGVhcl9tc3JfcmFuZ2UodW5zaWduZWQgaW50IGJhc2UsIHVuc2lnbmVkIGludCBuKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yKGkgPSAwOyBpIDwgbjsgKytpKQorCQl3cm1zcihiYXNlK2ksIDAsIDApOworfQorCitzdGF0aWMgdm9pZCBzZXR1cF9rN193YXRjaGRvZyh2b2lkKQoreworCXVuc2lnbmVkIGludCBldm50c2VsOworCisJbm1pX3BlcmZjdHJfbXNyID0gTVNSX0s3X1BFUkZDVFIwOworCisJY2xlYXJfbXNyX3JhbmdlKE1TUl9LN19FVk5UU0VMMCwgNCk7CisJY2xlYXJfbXNyX3JhbmdlKE1TUl9LN19QRVJGQ1RSMCwgNCk7CisKKwlldm50c2VsID0gSzdfRVZOVFNFTF9JTlQKKwkJfCBLN19FVk5UU0VMX09TCisJCXwgSzdfRVZOVFNFTF9VU1IKKwkJfCBLN19OTUlfRVZFTlQ7CisKKwl3cm1zcihNU1JfSzdfRVZOVFNFTDAsIGV2bnRzZWwsIDApOworCURwcmludGsoInNldHRpbmcgSzdfUEVSRkNUUjAgdG8gJTA4bHhcbiIsIC0oY3B1X2toei9ubWlfaHoqMTAwMCkpOworCXdybXNyKE1TUl9LN19QRVJGQ1RSMCwgLShjcHVfa2h6L25taV9oeioxMDAwKSwgLTEpOworCWFwaWNfd3JpdGUoQVBJQ19MVlRQQywgQVBJQ19ETV9OTUkpOworCWV2bnRzZWwgfD0gSzdfRVZOVFNFTF9FTkFCTEU7CisJd3Jtc3IoTVNSX0s3X0VWTlRTRUwwLCBldm50c2VsLCAwKTsKK30KKworc3RhdGljIHZvaWQgc2V0dXBfcDZfd2F0Y2hkb2codm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgZXZudHNlbDsKKworCW5taV9wZXJmY3RyX21zciA9IE1TUl9QNl9QRVJGQ1RSMDsKKworCWNsZWFyX21zcl9yYW5nZShNU1JfUDZfRVZOVFNFTDAsIDIpOworCWNsZWFyX21zcl9yYW5nZShNU1JfUDZfUEVSRkNUUjAsIDIpOworCisJZXZudHNlbCA9IFA2X0VWTlRTRUxfSU5UCisJCXwgUDZfRVZOVFNFTF9PUworCQl8IFA2X0VWTlRTRUxfVVNSCisJCXwgUDZfTk1JX0VWRU5UOworCisJd3Jtc3IoTVNSX1A2X0VWTlRTRUwwLCBldm50c2VsLCAwKTsKKwlEcHJpbnRrKCJzZXR0aW5nIFA2X1BFUkZDVFIwIHRvICUwOGx4XG4iLCAtKGNwdV9raHovbm1pX2h6KjEwMDApKTsKKwl3cm1zcihNU1JfUDZfUEVSRkNUUjAsIC0oY3B1X2toei9ubWlfaHoqMTAwMCksIDApOworCWFwaWNfd3JpdGUoQVBJQ19MVlRQQywgQVBJQ19ETV9OTUkpOworCWV2bnRzZWwgfD0gUDZfRVZOVFNFTDBfRU5BQkxFOworCXdybXNyKE1TUl9QNl9FVk5UU0VMMCwgZXZudHNlbCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgc2V0dXBfcDRfd2F0Y2hkb2codm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgbWlzY19lbmFibGUsIGR1bW15OworCisJcmRtc3IoTVNSX1A0X01JU0NfRU5BQkxFLCBtaXNjX2VuYWJsZSwgZHVtbXkpOworCWlmICghKG1pc2NfZW5hYmxlICYgTVNSX1A0X01JU0NfRU5BQkxFX1BFUkZfQVZBSUwpKQorCQlyZXR1cm4gMDsKKworCW5taV9wZXJmY3RyX21zciA9IE1TUl9QNF9JUV9DT1VOVEVSMDsKKwlubWlfcDRfY2Njcl92YWwgPSBQNF9OTUlfSVFfQ0NDUjA7CisjaWZkZWYgQ09ORklHX1NNUAorCWlmIChzbXBfbnVtX3NpYmxpbmdzID09IDIpCisJCW5taV9wNF9jY2NyX3ZhbCB8PSBQNF9DQ0NSX09WRl9QTUkxOworI2VuZGlmCisKKwlpZiAoIShtaXNjX2VuYWJsZSAmIE1TUl9QNF9NSVNDX0VOQUJMRV9QRUJTX1VOQVZBSUwpKQorCQljbGVhcl9tc3JfcmFuZ2UoMHgzRjEsIDIpOworCS8qIE1TUiAweDNGMCBzZWVtcyB0byBoYXZlIGEgZGVmYXVsdCB2YWx1ZSBvZiAweEZDMDAsIGJ1dCBjdXJyZW50CisJICAgZG9jcyBkb2Vzbid0IGZ1bGx5IGRlZmluZSBpdCwgc28gbGVhdmUgaXQgYWxvbmUgZm9yIG5vdy4gKi8KKwlpZiAoYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPj0gMHgzKSB7CisJCS8qIE1TUl9QNF9JUV9FU0NSMC8xICgweDNiYS8weDNiYikgcmVtb3ZlZCAqLworCQljbGVhcl9tc3JfcmFuZ2UoMHgzQTAsIDI2KTsKKwkJY2xlYXJfbXNyX3JhbmdlKDB4M0JDLCAzKTsKKwl9IGVsc2UgeworCQljbGVhcl9tc3JfcmFuZ2UoMHgzQTAsIDMxKTsKKwl9CisJY2xlYXJfbXNyX3JhbmdlKDB4M0MwLCA2KTsKKwljbGVhcl9tc3JfcmFuZ2UoMHgzQzgsIDYpOworCWNsZWFyX21zcl9yYW5nZSgweDNFMCwgMik7CisJY2xlYXJfbXNyX3JhbmdlKE1TUl9QNF9DQ0NSMCwgMTgpOworCWNsZWFyX21zcl9yYW5nZShNU1JfUDRfUEVSRkNUUjAsIDE4KTsKKworCXdybXNyKE1TUl9QNF9DUlVfRVNDUjAsIFA0X05NSV9DUlVfRVNDUjAsIDApOworCXdybXNyKE1TUl9QNF9JUV9DQ0NSMCwgUDRfTk1JX0lRX0NDQ1IwICYgflA0X0NDQ1JfRU5BQkxFLCAwKTsKKwlEcHJpbnRrKCJzZXR0aW5nIFA0X0lRX0NPVU5URVIwIHRvIDB4JTA4bHhcbiIsIC0oY3B1X2toei9ubWlfaHoqMTAwMCkpOworCXdybXNyKE1TUl9QNF9JUV9DT1VOVEVSMCwgLShjcHVfa2h6L25taV9oeioxMDAwKSwgLTEpOworCWFwaWNfd3JpdGUoQVBJQ19MVlRQQywgQVBJQ19ETV9OTUkpOworCXdybXNyKE1TUl9QNF9JUV9DQ0NSMCwgbm1pX3A0X2NjY3JfdmFsLCAwKTsKKwlyZXR1cm4gMTsKK30KKwordm9pZCBzZXR1cF9hcGljX25taV93YXRjaGRvZyAodm9pZCkKK3sKKwlzd2l0Y2ggKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvcikgeworCWNhc2UgWDg2X1ZFTkRPUl9BTUQ6CisJCWlmIChib290X2NwdV9kYXRhLng4NiAhPSA2ICYmIGJvb3RfY3B1X2RhdGEueDg2ICE9IDE1KQorCQkJcmV0dXJuOworCQlzZXR1cF9rN193YXRjaGRvZygpOworCQlicmVhazsKKwljYXNlIFg4Nl9WRU5ET1JfSU5URUw6CisJCXN3aXRjaCAoYm9vdF9jcHVfZGF0YS54ODYpIHsKKwkJY2FzZSA2OgorCQkJaWYgKGJvb3RfY3B1X2RhdGEueDg2X21vZGVsID4gMHhkKQorCQkJCXJldHVybjsKKworCQkJc2V0dXBfcDZfd2F0Y2hkb2coKTsKKwkJCWJyZWFrOworCQljYXNlIDE1OgorCQkJaWYgKGJvb3RfY3B1X2RhdGEueDg2X21vZGVsID4gMHgzKQorCQkJCXJldHVybjsKKworCQkJaWYgKCFzZXR1cF9wNF93YXRjaGRvZygpKQorCQkJCXJldHVybjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CisJbGFwaWNfbm1pX293bmVyID0gTEFQSUNfTk1JX1dBVENIRE9HOworCW5taV9hY3RpdmUgPSAxOworfQorCisvKgorICogdGhlIGJlc3Qgd2F5IHRvIGRldGVjdCB3aGV0aGVyIGEgQ1BVIGhhcyBhICdoYXJkIGxvY2t1cCcgcHJvYmxlbQorICogaXMgdG8gY2hlY2sgaXQncyBsb2NhbCBBUElDIHRpbWVyIElSUSBjb3VudHMuIElmIHRoZXkgYXJlIG5vdAorICogY2hhbmdpbmcgdGhlbiB0aGF0IENQVSBoYXMgc29tZSBwcm9ibGVtLgorICoKKyAqIGFzIHRoZXNlIHdhdGNoZG9nIE5NSSBJUlFzIGFyZSBnZW5lcmF0ZWQgb24gZXZlcnkgQ1BVLCB3ZSBvbmx5CisgKiBoYXZlIHRvIGNoZWNrIHRoZSBjdXJyZW50IHByb2Nlc3Nvci4KKyAqCisgKiBzaW5jZSBOTUlzIGRvbid0IGxpc3RlbiB0byBfYW55XyBsb2Nrcywgd2UgaGF2ZSB0byBiZSBleHRyZW1lbHkKKyAqIGNhcmVmdWwgbm90IHRvIHJlbHkgb24gdW5zYWZlIHZhcmlhYmxlcy4gVGhlIHByaW50ayBtaWdodCBsb2NrCisgKiB1cCB0aG91Z2gsIHNvIHdlIGhhdmUgdG8gYnJlYWsgdXAgYW55IGNvbnNvbGUgbG9ja3MgZmlyc3QgLi4uCisgKiBbd2hlbiB0aGVyZSB3aWxsIGJlIG1vcmUgdHR5LXJlbGF0ZWQgbG9ja3MsIGJyZWFrIHRoZW0gdXAKKyAqICBoZXJlIHRvbyFdCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGludAorCWxhc3RfaXJxX3N1bXMgW05SX0NQVVNdLAorCWFsZXJ0X2NvdW50ZXIgW05SX0NQVVNdOworCit2b2lkIHRvdWNoX25taV93YXRjaGRvZyAodm9pZCkKK3sKKwlpbnQgaTsKKworCS8qCisJICogSnVzdCByZXNldCB0aGUgYWxlcnQgY291bnRlcnMsIChvdGhlciBDUFVzIG1pZ2h0IGJlCisJICogc3Bpbm5pbmcgb24gbG9ja3Mgd2UgaG9sZCk6CisJICovCisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykKKwkJYWxlcnRfY291bnRlcltpXSA9IDA7Cit9CisKK2V4dGVybiB2b2lkIGRpZV9ubWkoc3RydWN0IHB0X3JlZ3MgKiwgY29uc3QgY2hhciAqbXNnKTsKKwordm9pZCBubWlfd2F0Y2hkb2dfdGljayAoc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCisJLyoKKwkgKiBTaW5jZSBjdXJyZW50X3RocmVhZF9pbmZvKCktPiBpcyBhbHdheXMgb24gdGhlIHN0YWNrLCBhbmQgd2UKKwkgKiBhbHdheXMgc3dpdGNoIHRoZSBzdGFjayBOTUktYXRvbWljYWxseSwgaXQncyBzYWZlIHRvIHVzZQorCSAqIHNtcF9wcm9jZXNzb3JfaWQoKS4KKwkgKi8KKwlpbnQgc3VtLCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlzdW0gPSBwZXJfY3B1KGlycV9zdGF0LCBjcHUpLmFwaWNfdGltZXJfaXJxczsKKworCWlmIChsYXN0X2lycV9zdW1zW2NwdV0gPT0gc3VtKSB7CisJCS8qCisJCSAqIEF5aWVlLCBsb29rcyBsaWtlIHRoaXMgQ1BVIGlzIHN0dWNrIC4uLgorCQkgKiB3YWl0IGEgZmV3IElSUXMgKDUgc2Vjb25kcykgYmVmb3JlIGRvaW5nIHRoZSBvb3BzIC4uLgorCQkgKi8KKwkJYWxlcnRfY291bnRlcltjcHVdKys7CisJCWlmIChhbGVydF9jb3VudGVyW2NwdV0gPT0gNSpubWlfaHopCisJCQlkaWVfbm1pKHJlZ3MsICJOTUkgV2F0Y2hkb2cgZGV0ZWN0ZWQgTE9DS1VQIik7CisJfSBlbHNlIHsKKwkJbGFzdF9pcnFfc3Vtc1tjcHVdID0gc3VtOworCQlhbGVydF9jb3VudGVyW2NwdV0gPSAwOworCX0KKwlpZiAobm1pX3BlcmZjdHJfbXNyKSB7CisJCWlmIChubWlfcGVyZmN0cl9tc3IgPT0gTVNSX1A0X0lRX0NPVU5URVIwKSB7CisJCQkvKgorCQkJICogUDQgcXVpcmtzOgorCQkJICogLSBBbiBvdmVyZmxvd24gcGVyZmN0ciB3aWxsIGFzc2VydCBpdHMgaW50ZXJydXB0CisJCQkgKiAgIHVudGlsIHRoZSBPVkYgZmxhZyBpbiBpdHMgQ0NDUiBpcyBjbGVhcmVkLgorCQkJICogLSBMVlRQQyBpcyBtYXNrZWQgb24gaW50ZXJydXB0IGFuZCBtdXN0IGJlCisJCQkgKiAgIHVubWFza2VkIGJ5IHRoZSBMVlRQQyBoYW5kbGVyLgorCQkJICovCisJCQl3cm1zcihNU1JfUDRfSVFfQ0NDUjAsIG5taV9wNF9jY2NyX3ZhbCwgMCk7CisJCQlhcGljX3dyaXRlKEFQSUNfTFZUUEMsIEFQSUNfRE1fTk1JKTsKKwkJfQorCQllbHNlIGlmIChubWlfcGVyZmN0cl9tc3IgPT0gTVNSX1A2X1BFUkZDVFIwKSB7CisJCQkvKiBPbmx5IFA2IGJhc2VkIFBlbnRpdW0gTSBuZWVkIHRvIHJlLXVubWFzaworCQkJICogdGhlIGFwaWMgdmVjdG9yIGJ1dCBpdCBkb2Vzbid0IGh1cnQKKwkJCSAqIG90aGVyIFA2IHZhcmlhbnQgKi8KKwkJCWFwaWNfd3JpdGUoQVBJQ19MVlRQQywgQVBJQ19ETV9OTUkpOworCQl9CisJCXdybXNyKG5taV9wZXJmY3RyX21zciwgLShjcHVfa2h6L25taV9oeioxMDAwKSwgLTEpOworCX0KK30KKworI2lmZGVmIENPTkZJR19TWVNDVEwKKworc3RhdGljIGludCB1bmtub3duX25taV9wYW5pY19jYWxsYmFjayhzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGNwdSkKK3sKKwl1bnNpZ25lZCBjaGFyIHJlYXNvbiA9IGdldF9ubWlfcmVhc29uKCk7CisJY2hhciBidWZbNjRdOworCisJaWYgKCEocmVhc29uICYgMHhjMCkpIHsKKwkJc3ByaW50ZihidWYsICJOTUkgcmVjZWl2ZWQgZm9yIHVua25vd24gcmVhc29uICUwMnhcbiIsIHJlYXNvbik7CisJCWRpZV9ubWkocmVncywgYnVmKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBwcm9jIGhhbmRsZXIgZm9yIC9wcm9jL3N5cy9rZXJuZWwvdW5rbm93bl9ubWlfcGFuaWMKKyAqLworaW50IHByb2NfdW5rbm93bl9ubWlfcGFuaWMoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCXZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVuZ3RoLCBsb2ZmX3QgKnBwb3MpCit7CisJaW50IG9sZF9zdGF0ZTsKKworCW9sZF9zdGF0ZSA9IHVua25vd25fbm1pX3BhbmljOworCXByb2NfZG9pbnR2ZWModGFibGUsIHdyaXRlLCBmaWxlLCBidWZmZXIsIGxlbmd0aCwgcHBvcyk7CisJaWYgKCEhb2xkX3N0YXRlID09ICEhdW5rbm93bl9ubWlfcGFuaWMpCisJCXJldHVybiAwOworCisJaWYgKHVua25vd25fbm1pX3BhbmljKSB7CisJCWlmIChyZXNlcnZlX2xhcGljX25taSgpIDwgMCkgeworCQkJdW5rbm93bl9ubWlfcGFuaWMgPSAwOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfSBlbHNlIHsKKwkJCXNldF9ubWlfY2FsbGJhY2sodW5rbm93bl9ubWlfcGFuaWNfY2FsbGJhY2spOworCQl9CisJfSBlbHNlIHsKKwkJcmVsZWFzZV9sYXBpY19ubWkoKTsKKwkJdW5zZXRfbm1pX2NhbGxiYWNrKCk7CisJfQorCXJldHVybiAwOworfQorCisjZW5kaWYKKworRVhQT1JUX1NZTUJPTChubWlfYWN0aXZlKTsKK0VYUE9SVF9TWU1CT0wobm1pX3dhdGNoZG9nKTsKK0VYUE9SVF9TWU1CT0wocmVzZXJ2ZV9sYXBpY19ubWkpOworRVhQT1JUX1NZTUJPTChyZWxlYXNlX2xhcGljX25taSk7CitFWFBPUlRfU1lNQk9MKGRpc2FibGVfdGltZXJfbm1pX3dhdGNoZG9nKTsKK0VYUE9SVF9TWU1CT0woZW5hYmxlX3RpbWVyX25taV93YXRjaGRvZyk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL251bWFxLmMgYi9hcmNoL2kzODYva2VybmVsL251bWFxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUxZWRmMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvbnVtYXEuYwpAQCAtMCwwICsxLDc5IEBACisvKgorICogV3JpdHRlbiBieTogUGF0cmljaWEgR2F1Z2hlbiwgSUJNIENvcnBvcmF0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCBJQk0gQ29ycC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgICAgICAgICAKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiBTZW5kIGZlZWRiYWNrIHRvIDxnb25lQHVzLmlibS5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L21tem9uZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25vZGVtYXNrLmg+CisjaW5jbHVkZSA8YXNtL251bWFxLmg+CisjaW5jbHVkZSA8YXNtL3RvcG9sb2d5Lmg+CisKKyNkZWZpbmUJTUJfVE9fUEFHRVMoYWRkcikgKChhZGRyKSA8PCAoMjAgLSBQQUdFX1NISUZUKSkKKworLyoKKyAqIEZ1bmN0aW9uOiBzbXBfZHVtcF9xY3QoKQorICoKKyAqIERlc2NyaXB0aW9uOiBnZXRzIG1lbW9yeSBsYXlvdXQgZnJvbSB0aGUgcXVhZCBjb25maWcgdGFibGUuICBUaGlzCisgKiBmdW5jdGlvbiBhbHNvIHVwZGF0ZXMgbm9kZV9vbmxpbmVfbWFwIHdpdGggdGhlIG5vZGVzIChxdWFkcykgcHJlc2VudC4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IHNtcF9kdW1wX3FjdCh2b2lkKQoreworCWludCBub2RlOworCXN0cnVjdCBlYWNocXVhZG1lbSAqZXE7CisJc3RydWN0IHN5c19jZmdfZGF0YSAqc2NkID0KKwkJKHN0cnVjdCBzeXNfY2ZnX2RhdGEgKilfX3ZhKFNZU19DRkdfREFUQV9QUklWX0FERFIpOworCisJbm9kZXNfY2xlYXIobm9kZV9vbmxpbmVfbWFwKTsKKwlmb3JfZWFjaF9ub2RlKG5vZGUpIHsKKwkJaWYgKHNjZC0+cXVhZHNfcHJlc2VudDMxXzAgJiAoMSA8PCBub2RlKSkgeworCQkJbm9kZV9zZXRfb25saW5lKG5vZGUpOworCQkJZXEgPSAmc2NkLT5lcVtub2RlXTsKKwkJCS8qIENvbnZlcnQgdG8gcGFnZXMgKi8KKwkJCW5vZGVfc3RhcnRfcGZuW25vZGVdID0gTUJfVE9fUEFHRVMoCisJCQkJZXEtPmhpX3NocmRfbWVtX3N0YXJ0IC0gZXEtPnByaXZfbWVtX3NpemUpOworCQkJbm9kZV9lbmRfcGZuW25vZGVdID0gTUJfVE9fUEFHRVMoCisJCQkJZXEtPmhpX3NocmRfbWVtX3N0YXJ0ICsgZXEtPmhpX3NocmRfbWVtX3NpemUpOworCisJCQltZW1vcnlfcHJlc2VudChub2RlLAorCQkJCW5vZGVfc3RhcnRfcGZuW25vZGVdLCBub2RlX2VuZF9wZm5bbm9kZV0pOworCQkJbm9kZV9yZW1hcF9zaXplW25vZGVdID0gbm9kZV9tZW1tYXBfc2l6ZV9ieXRlcyhub2RlLAorCQkJCQkJCW5vZGVfc3RhcnRfcGZuW25vZGVdLAorCQkJCQkJCW5vZGVfZW5kX3Bmbltub2RlXSk7CisJCX0KKwl9Cit9CisKKy8qCisgKiBVbmxpa2UgU3VtbWl0LCB3ZSBkb24ndCByZWFsbHkgY2FyZSB0byBsZXQgdGhlIE5VTUEtUQorICogZmFsbCBiYWNrIHRvIGZsYXQgbW9kZS4gIERvbid0IGNvbXBpbGUgZm9yIE5VTUEtUQorICogdW5sZXNzIHlvdSByZWFsbHkgbmVlZCBpdCEKKyAqLworaW50IF9faW5pdCBnZXRfbWVtY2ZnX251bWFxKHZvaWQpCit7CisJc21wX2R1bXBfcWN0KCk7CisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3BjaS1kbWEuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvcGNpLWRtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZTJlMDMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3BjaS1kbWEuYwpAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIER5bmFtaWMgRE1BIG1hcHBpbmcgc3VwcG9ydC4KKyAqCisgKiBPbiBpMzg2IHRoZXJlIGlzIG5vIGhhcmR3YXJlIGR5bmFtaWMgRE1BIGFkZHJlc3MgdHJhbnNsYXRpb24sCisgKiBzbyBjb25zaXN0ZW50IGFsbG9jL2ZyZWUgYXJlIG1lcmVseSBwYWdlIGFsbG9jYXRpb24vZnJlZWluZy4KKyAqIFRoZSByZXN0IG9mIHRoZSBkeW5hbWljIERNQSBtYXBwaW5nIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZAorICogaW4gYXNtL3BjaS5oLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKK3N0cnVjdCBkbWFfY29oZXJlbnRfbWVtIHsKKwl2b2lkCQkqdmlydF9iYXNlOworCXUzMgkJZGV2aWNlX2Jhc2U7CisJaW50CQlzaXplOworCWludAkJZmxhZ3M7CisJdW5zaWduZWQgbG9uZwkqYml0bWFwOworfTsKKwordm9pZCAqZG1hX2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCisJCQkgICBkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQoreworCXZvaWQgKnJldDsKKwlzdHJ1Y3QgZG1hX2NvaGVyZW50X21lbSAqbWVtID0gZGV2ID8gZGV2LT5kbWFfbWVtIDogTlVMTDsKKwlpbnQgb3JkZXIgPSBnZXRfb3JkZXIoc2l6ZSk7CisJLyogaWdub3JlIHJlZ2lvbiBzcGVjaWZpZXJzICovCisJZ2ZwICY9IH4oX19HRlBfRE1BIHwgX19HRlBfSElHSE1FTSk7CisKKwlpZiAobWVtKSB7CisJCWludCBwYWdlID0gYml0bWFwX2ZpbmRfZnJlZV9yZWdpb24obWVtLT5iaXRtYXAsIG1lbS0+c2l6ZSwKKwkJCQkJCSAgICAgb3JkZXIpOworCQlpZiAocGFnZSA+PSAwKSB7CisJCQkqZG1hX2hhbmRsZSA9IG1lbS0+ZGV2aWNlX2Jhc2UgKyAocGFnZSA8PCBQQUdFX1NISUZUKTsKKwkJCXJldCA9IG1lbS0+dmlydF9iYXNlICsgKHBhZ2UgPDwgUEFHRV9TSElGVCk7CisJCQltZW1zZXQocmV0LCAwLCBzaXplKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJaWYgKG1lbS0+ZmxhZ3MgJiBETUFfTUVNT1JZX0VYQ0xVU0lWRSkKKwkJCXJldHVybiBOVUxMOworCX0KKworCWlmIChkZXYgPT0gTlVMTCB8fCAoZGV2LT5jb2hlcmVudF9kbWFfbWFzayA8IDB4ZmZmZmZmZmYpKQorCQlnZnAgfD0gR0ZQX0RNQTsKKworCXJldCA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhnZnAsIG9yZGVyKTsKKworCWlmIChyZXQgIT0gTlVMTCkgeworCQltZW1zZXQocmV0LCAwLCBzaXplKTsKKwkJKmRtYV9oYW5kbGUgPSB2aXJ0X3RvX3BoeXMocmV0KTsKKwl9CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBkbWFfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAorCQkJIHZvaWQgKnZhZGRyLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUpCit7CisJc3RydWN0IGRtYV9jb2hlcmVudF9tZW0gKm1lbSA9IGRldiA/IGRldi0+ZG1hX21lbSA6IE5VTEw7CisJaW50IG9yZGVyID0gZ2V0X29yZGVyKHNpemUpOworCQorCWlmIChtZW0gJiYgdmFkZHIgPj0gbWVtLT52aXJ0X2Jhc2UgJiYgdmFkZHIgPCAobWVtLT52aXJ0X2Jhc2UgKyAobWVtLT5zaXplIDw8IFBBR0VfU0hJRlQpKSkgeworCQlpbnQgcGFnZSA9ICh2YWRkciAtIG1lbS0+dmlydF9iYXNlKSA+PiBQQUdFX1NISUZUOworCisJCWJpdG1hcF9yZWxlYXNlX3JlZ2lvbihtZW0tPmJpdG1hcCwgcGFnZSwgb3JkZXIpOworCX0gZWxzZQorCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXZhZGRyLCBvcmRlcik7Cit9CisKK2ludCBkbWFfZGVjbGFyZV9jb2hlcmVudF9tZW1vcnkoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGJ1c19hZGRyLAorCQkJCWRtYV9hZGRyX3QgZGV2aWNlX2FkZHIsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit7CisJdm9pZCBfX2lvbWVtICptZW1fYmFzZTsKKwlpbnQgcGFnZXMgPSBzaXplID4+IFBBR0VfU0hJRlQ7CisJaW50IGJpdG1hcF9zaXplID0gKHBhZ2VzICsgMzEpLzMyOworCisJaWYgKChmbGFncyAmIChETUFfTUVNT1JZX01BUCB8IERNQV9NRU1PUllfSU8pKSA9PSAwKQorCQlnb3RvIG91dDsKKwlpZiAoIXNpemUpCisJCWdvdG8gb3V0OworCWlmIChkZXYtPmRtYV9tZW0pCisJCWdvdG8gb3V0OworCisJLyogRklYTUU6IHRoaXMgcm91dGluZSBqdXN0IGlnbm9yZXMgRE1BX01FTU9SWV9JTkNMVURFU19DSElMRFJFTiAqLworCisJbWVtX2Jhc2UgPSBpb3JlbWFwKGJ1c19hZGRyLCBzaXplKTsKKwlpZiAoIW1lbV9iYXNlKQorCQlnb3RvIG91dDsKKworCWRldi0+ZG1hX21lbSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkbWFfY29oZXJlbnRfbWVtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYtPmRtYV9tZW0pCisJCWdvdG8gb3V0OworCW1lbXNldChkZXYtPmRtYV9tZW0sIDAsIHNpemVvZihzdHJ1Y3QgZG1hX2NvaGVyZW50X21lbSkpOworCWRldi0+ZG1hX21lbS0+Yml0bWFwID0ga21hbGxvYyhiaXRtYXBfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYtPmRtYV9tZW0tPmJpdG1hcCkKKwkJZ290byBmcmVlMV9vdXQ7CisJbWVtc2V0KGRldi0+ZG1hX21lbS0+Yml0bWFwLCAwLCBiaXRtYXBfc2l6ZSk7CisKKwlkZXYtPmRtYV9tZW0tPnZpcnRfYmFzZSA9IG1lbV9iYXNlOworCWRldi0+ZG1hX21lbS0+ZGV2aWNlX2Jhc2UgPSBkZXZpY2VfYWRkcjsKKwlkZXYtPmRtYV9tZW0tPnNpemUgPSBwYWdlczsKKwlkZXYtPmRtYV9tZW0tPmZsYWdzID0gZmxhZ3M7CisKKwlpZiAoZmxhZ3MgJiBETUFfTUVNT1JZX01BUCkKKwkJcmV0dXJuIERNQV9NRU1PUllfTUFQOworCisJcmV0dXJuIERNQV9NRU1PUllfSU87CisKKyBmcmVlMV9vdXQ6CisJa2ZyZWUoZGV2LT5kbWFfbWVtLT5iaXRtYXApOworIG91dDoKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZG1hX2RlY2xhcmVfY29oZXJlbnRfbWVtb3J5KTsKKwordm9pZCBkbWFfcmVsZWFzZV9kZWNsYXJlZF9tZW1vcnkoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBkbWFfY29oZXJlbnRfbWVtICptZW0gPSBkZXYtPmRtYV9tZW07CisJCisJaWYoIW1lbSkKKwkJcmV0dXJuOworCWRldi0+ZG1hX21lbSA9IE5VTEw7CisJaW91bm1hcChtZW0tPnZpcnRfYmFzZSk7CisJa2ZyZWUobWVtLT5iaXRtYXApOworCWtmcmVlKG1lbSk7Cit9CitFWFBPUlRfU1lNQk9MKGRtYV9yZWxlYXNlX2RlY2xhcmVkX21lbW9yeSk7CisKK3ZvaWQgKmRtYV9tYXJrX2RlY2xhcmVkX21lbW9yeV9vY2N1cGllZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCWRtYV9hZGRyX3QgZGV2aWNlX2FkZHIsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBkbWFfY29oZXJlbnRfbWVtICptZW0gPSBkZXYtPmRtYV9tZW07CisJaW50IHBhZ2VzID0gKHNpemUgKyAoZGV2aWNlX2FkZHIgJiB+UEFHRV9NQVNLKSArIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7CisJaW50IHBvcywgZXJyOworCisJaWYgKCFtZW0pCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJcG9zID0gKGRldmljZV9hZGRyIC0gbWVtLT5kZXZpY2VfYmFzZSkgPj4gUEFHRV9TSElGVDsKKwllcnIgPSBiaXRtYXBfYWxsb2NhdGVfcmVnaW9uKG1lbS0+Yml0bWFwLCBwb3MsIGdldF9vcmRlcihwYWdlcykpOworCWlmIChlcnIgIT0gMCkKKwkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKwlyZXR1cm4gbWVtLT52aXJ0X2Jhc2UgKyAocG9zIDw8IFBBR0VfU0hJRlQpOworfQorRVhQT1JUX1NZTUJPTChkbWFfbWFya19kZWNsYXJlZF9tZW1vcnlfb2NjdXBpZWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL2kzODYva2VybmVsL3Byb2Nlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzZmZWRmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTAsMCArMSw4NDggQEAKKy8qCisgKiAgbGludXgvYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk1ICBMaW51cyBUb3J2YWxkcworICoKKyAqICBQZW50aXVtIElJSSBGWFNSLCBTU0Ugc3VwcG9ydAorICoJR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPiwgTWF5IDIwMDAKKyAqLworCisvKgorICogVGhpcyBmaWxlIGhhbmRsZXMgdGhlIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgcGFydHMgb2YgcHJvY2VzcyBoYW5kbGluZy4uCisgKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9lbGZjb3JlLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9hLm91dC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9sZHQuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2kzODcuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KKyNpZmRlZiBDT05GSUdfTUFUSF9FTVVMQVRJT04KKyNpbmNsdWRlIDxhc20vbWF0aF9lbXUuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisKK2FzbWxpbmthZ2Ugdm9pZCByZXRfZnJvbV9mb3JrKHZvaWQpIF9fYXNtX18oInJldF9mcm9tX2ZvcmsiKTsKKworc3RhdGljIGludCBobHRfY291bnRlcjsKKwordW5zaWduZWQgbG9uZyBib290X29wdGlvbl9pZGxlX292ZXJyaWRlID0gMDsKK0VYUE9SVF9TWU1CT0woYm9vdF9vcHRpb25faWRsZV9vdmVycmlkZSk7CisKKy8qCisgKiBSZXR1cm4gc2F2ZWQgUEMgb2YgYSBibG9ja2VkIHRocmVhZC4KKyAqLwordW5zaWduZWQgbG9uZyB0aHJlYWRfc2F2ZWRfcGMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJcmV0dXJuICgodW5zaWduZWQgbG9uZyAqKXRzay0+dGhyZWFkLmVzcClbM107Cit9CisKKy8qCisgKiBQb3dlcm1hbmFnZW1lbnQgaWRsZSBmdW5jdGlvbiwgaWYgYW55Li4KKyAqLwordm9pZCAoKnBtX2lkbGUpKHZvaWQpOworc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGludCwgY3B1X2lkbGVfc3RhdGUpOworCit2b2lkIGRpc2FibGVfaGx0KHZvaWQpCit7CisJaGx0X2NvdW50ZXIrKzsKK30KKworRVhQT1JUX1NZTUJPTChkaXNhYmxlX2hsdCk7CisKK3ZvaWQgZW5hYmxlX2hsdCh2b2lkKQoreworCWhsdF9jb3VudGVyLS07Cit9CisKK0VYUE9SVF9TWU1CT0woZW5hYmxlX2hsdCk7CisKKy8qCisgKiBXZSB1c2UgdGhpcyBpZiB3ZSBkb24ndCBoYXZlIGFueSBiZXR0ZXIKKyAqIGlkbGUgcm91dGluZS4uCisgKi8KK3ZvaWQgZGVmYXVsdF9pZGxlKHZvaWQpCit7CisJaWYgKCFobHRfY291bnRlciAmJiBib290X2NwdV9kYXRhLmhsdF93b3Jrc19vaykgeworCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQlpZiAoIW5lZWRfcmVzY2hlZCgpKQorCQkJc2FmZV9oYWx0KCk7CisJCWVsc2UKKwkJCWxvY2FsX2lycV9lbmFibGUoKTsKKwl9IGVsc2UgeworCQljcHVfcmVsYXgoKTsKKwl9Cit9CisKKy8qCisgKiBPbiBTTVAgaXQncyBzbGlnaHRseSBmYXN0ZXIgKGJ1dCBtdWNoIG1vcmUgcG93ZXItY29uc3VtaW5nISkKKyAqIHRvIHBvbGwgdGhlIC0+d29yay5uZWVkX3Jlc2NoZWQgZmxhZyBpbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIHRoZQorICogY3Jvc3MtQ1BVIElQSSB0byBhcnJpdmUuIFVzZSB0aGlzIG9wdGlvbiB3aXRoIGNhdXRpb24uCisgKi8KK3N0YXRpYyB2b2lkIHBvbGxfaWRsZSAodm9pZCkKK3sKKwlpbnQgb2xkdmFsOworCisJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJLyoKKwkgKiBEZWFsIHdpdGggYW5vdGhlciBDUFUganVzdCBoYXZpbmcgY2hvc2VuIGEgdGhyZWFkIHRvCisJICogcnVuIGhlcmU6CisJICovCisJb2xkdmFsID0gdGVzdF9hbmRfY2xlYXJfdGhyZWFkX2ZsYWcoVElGX05FRURfUkVTQ0hFRCk7CisKKwlpZiAoIW9sZHZhbCkgeworCQlzZXRfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKKwkJYXNtIHZvbGF0aWxlKAorCQkJIjI6IgorCQkJInRlc3RsICUwLCAlMTsiCisJCQkicmVwOyBub3A7IgorCQkJImplIDJiOyIKKwkJCTogOiAiaSIoX1RJRl9ORUVEX1JFU0NIRUQpLCAibSIgKGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZmxhZ3MpKTsKKworCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUE9MTElOR19OUkZMQUcpOworCX0gZWxzZSB7CisJCXNldF9uZWVkX3Jlc2NoZWQoKTsKKwl9Cit9CisKKy8qCisgKiBUaGUgaWRsZSB0aHJlYWQuIFRoZXJlJ3Mgbm8gdXNlZnVsIHdvcmsgdG8gYmUKKyAqIGRvbmUsIHNvIGp1c3QgdHJ5IHRvIGNvbnNlcnZlIHBvd2VyIGFuZCBoYXZlIGEKKyAqIGxvdyBleGl0IGxhdGVuY3kgKGllIHNpdCBpbiBhIGxvb3Agd2FpdGluZyBmb3IKKyAqIHNvbWVib2R5IHRvIHNheSB0aGF0IHRoZXknZCBsaWtlIHRvIHJlc2NoZWR1bGUpCisgKi8KK3ZvaWQgY3B1X2lkbGUgKHZvaWQpCit7CisJLyogZW5kbGVzcyBpZGxlIGxvb3Agd2l0aCBubyBwcmlvcml0eSBhdCBhbGwgKi8KKwl3aGlsZSAoMSkgeworCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKSB7CisJCQl2b2lkICgqaWRsZSkodm9pZCk7CisKKwkJCWlmIChfX2dldF9jcHVfdmFyKGNwdV9pZGxlX3N0YXRlKSkKKwkJCQlfX2dldF9jcHVfdmFyKGNwdV9pZGxlX3N0YXRlKSA9IDA7CisKKwkJCXJtYigpOworCQkJaWRsZSA9IHBtX2lkbGU7CisKKwkJCWlmICghaWRsZSkKKwkJCQlpZGxlID0gZGVmYXVsdF9pZGxlOworCisJCQlfX2dldF9jcHVfdmFyKGlycV9zdGF0KS5pZGxlX3RpbWVzdGFtcCA9IGppZmZpZXM7CisJCQlpZGxlKCk7CisJCX0KKwkJc2NoZWR1bGUoKTsKKwl9Cit9CisKK3ZvaWQgY3B1X2lkbGVfd2FpdCh2b2lkKQoreworCXVuc2lnbmVkIGludCBjcHUsIHRoaXNfY3B1ID0gZ2V0X2NwdSgpOworCWNwdW1hc2tfdCBtYXA7CisKKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIGNwdW1hc2tfb2ZfY3B1KHRoaXNfY3B1KSk7CisJcHV0X2NwdSgpOworCisJY3B1c19jbGVhcihtYXApOworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CisJCXBlcl9jcHUoY3B1X2lkbGVfc3RhdGUsIGNwdSkgPSAxOworCQljcHVfc2V0KGNwdSwgbWFwKTsKKwl9CisKKwlfX2dldF9jcHVfdmFyKGNwdV9pZGxlX3N0YXRlKSA9IDA7CisKKwl3bWIoKTsKKwlkbyB7CisJCXNzbGVlcCgxKTsKKwkJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJCWlmIChjcHVfaXNzZXQoY3B1LCBtYXApICYmICFwZXJfY3B1KGNwdV9pZGxlX3N0YXRlLCBjcHUpKQorCQkJCWNwdV9jbGVhcihjcHUsIG1hcCk7CisJCX0KKwkJY3B1c19hbmQobWFwLCBtYXAsIGNwdV9vbmxpbmVfbWFwKTsKKwl9IHdoaWxlICghY3B1c19lbXB0eShtYXApKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNwdV9pZGxlX3dhaXQpOworCisvKgorICogVGhpcyB1c2VzIG5ldyBNT05JVE9SL01XQUlUIGluc3RydWN0aW9ucyBvbiBQNCBwcm9jZXNzb3JzIHdpdGggUE5JLAorICogd2hpY2ggY2FuIG9idmlhdGUgSVBJIHRvIHRyaWdnZXIgY2hlY2tpbmcgb2YgbmVlZF9yZXNjaGVkLgorICogV2UgZXhlY3V0ZSBNT05JVE9SIGFnYWluc3QgbmVlZF9yZXNjaGVkIGFuZCBlbnRlciBvcHRpbWl6ZWQgd2FpdCBzdGF0ZQorICogdGhyb3VnaCBNV0FJVC4gV2hlbmV2ZXIgc29tZW9uZSBjaGFuZ2VzIG5lZWRfcmVzY2hlZCwgd2Ugd291bGQgYmUgd29rZW4KKyAqIHVwIGZyb20gTVdBSVQgKHdpdGhvdXQgYW4gSVBJKS4KKyAqLworc3RhdGljIHZvaWQgbXdhaXRfaWRsZSh2b2lkKQoreworCWxvY2FsX2lycV9lbmFibGUoKTsKKworCWlmICghbmVlZF9yZXNjaGVkKCkpIHsKKwkJc2V0X3RocmVhZF9mbGFnKFRJRl9QT0xMSU5HX05SRkxBRyk7CisJCWRvIHsKKwkJCV9fbW9uaXRvcigodm9pZCAqKSZjdXJyZW50X3RocmVhZF9pbmZvKCktPmZsYWdzLCAwLCAwKTsKKwkJCWlmIChuZWVkX3Jlc2NoZWQoKSkKKwkJCQlicmVhazsKKwkJCV9fbXdhaXQoMCwgMCk7CisJCX0gd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSk7CisJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9QT0xMSU5HX05SRkxBRyk7CisJfQorfQorCit2b2lkIF9faW5pdCBzZWxlY3RfaWRsZV9yb3V0aW5lKGNvbnN0IHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKKwlpZiAoY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9NV0FJVCkpIHsKKwkJcHJpbnRrKCJtb25pdG9yL213YWl0IGZlYXR1cmUgcHJlc2VudC5cbiIpOworCQkvKgorCQkgKiBTa2lwLCBpZiBzZXR1cCBoYXMgb3ZlcnJpZGRlbiBpZGxlLgorCQkgKiBPbmUgQ1BVIHN1cHBvcnRzIG13YWl0ID0+IEFsbCBDUFVzIHN1cHBvcnRzIG13YWl0CisJCSAqLworCQlpZiAoIXBtX2lkbGUpIHsKKwkJCXByaW50aygidXNpbmcgbXdhaXQgaW4gaWRsZSB0aHJlYWRzLlxuIik7CisJCQlwbV9pZGxlID0gbXdhaXRfaWRsZTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBfX2luaXQgaWRsZV9zZXR1cCAoY2hhciAqc3RyKQoreworCWlmICghc3RybmNtcChzdHIsICJwb2xsIiwgNCkpIHsKKwkJcHJpbnRrKCJ1c2luZyBwb2xsaW5nIGlkbGUgdGhyZWFkcy5cbiIpOworCQlwbV9pZGxlID0gcG9sbF9pZGxlOworI2lmZGVmIENPTkZJR19YODZfU01QCisJCWlmIChzbXBfbnVtX3NpYmxpbmdzID4gMSkKKwkJCXByaW50aygiV0FSTklORzogcG9sbGluZyBpZGxlIGFuZCBIVCBlbmFibGVkLCBwZXJmb3JtYW5jZSBtYXkgZGVncmFkZS5cbiIpOworI2VuZGlmCisJfSBlbHNlIGlmICghc3RybmNtcChzdHIsICJoYWx0IiwgNCkpIHsKKwkJcHJpbnRrKCJ1c2luZyBoYWx0IGluIGlkbGUgdGhyZWFkcy5cbiIpOworCQlwbV9pZGxlID0gZGVmYXVsdF9pZGxlOworCX0KKworCWJvb3Rfb3B0aW9uX2lkbGVfb3ZlcnJpZGUgPSAxOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJpZGxlPSIsIGlkbGVfc2V0dXApOworCit2b2lkIHNob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBjcjAgPSAwTCwgY3IyID0gMEwsIGNyMyA9IDBMLCBjcjQgPSAwTDsKKworCXByaW50aygiXG4iKTsKKwlwcmludGsoIlBpZDogJWQsIGNvbW06ICUyMHNcbiIsIGN1cnJlbnQtPnBpZCwgY3VycmVudC0+Y29tbSk7CisJcHJpbnRrKCJFSVA6ICUwNHg6WzwlMDhseD5dIENQVTogJWRcbiIsMHhmZmZmICYgcmVncy0+eGNzLHJlZ3MtPmVpcCwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwlwcmludF9zeW1ib2woIkVJUCBpcyBhdCAlc1xuIiwgcmVncy0+ZWlwKTsKKworCWlmIChyZWdzLT54Y3MgJiAzKQorCQlwcmludGsoIiBFU1A6ICUwNHg6JTA4bHgiLDB4ZmZmZiAmIHJlZ3MtPnhzcyxyZWdzLT5lc3ApOworCXByaW50aygiIEVGTEFHUzogJTA4bHggICAgJXMgICglcylcbiIsCisJICAgICAgIHJlZ3MtPmVmbGFncywgcHJpbnRfdGFpbnRlZCgpLCBzeXN0ZW1fdXRzbmFtZS5yZWxlYXNlKTsKKwlwcmludGsoIkVBWDogJTA4bHggRUJYOiAlMDhseCBFQ1g6ICUwOGx4IEVEWDogJTA4bHhcbiIsCisJCXJlZ3MtPmVheCxyZWdzLT5lYngscmVncy0+ZWN4LHJlZ3MtPmVkeCk7CisJcHJpbnRrKCJFU0k6ICUwOGx4IEVESTogJTA4bHggRUJQOiAlMDhseCIsCisJCXJlZ3MtPmVzaSwgcmVncy0+ZWRpLCByZWdzLT5lYnApOworCXByaW50aygiIERTOiAlMDR4IEVTOiAlMDR4XG4iLAorCQkweGZmZmYgJiByZWdzLT54ZHMsMHhmZmZmICYgcmVncy0+eGVzKTsKKworCV9fYXNtX18oIm1vdmwgJSVjcjAsICUwIjogIj1yIiAoY3IwKSk7CisJX19hc21fXygibW92bCAlJWNyMiwgJTAiOiAiPXIiIChjcjIpKTsKKwlfX2FzbV9fKCJtb3ZsICUlY3IzLCAlMCI6ICI9ciIgKGNyMykpOworCS8qIFRoaXMgY291bGQgZmF1bHQgaWYgJWNyNCBkb2VzIG5vdCBleGlzdCAqLworCV9fYXNtX18oIjE6IG1vdmwgJSVjcjQsICUwCQlcbiIKKwkJIjI6CQkJCVxuIgorCQkiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIglcbiIKKwkJIi5sb25nIDFiLDJiCQkJXG4iCisJCSIucHJldmlvdXMJCQlcbiIKKwkJOiAiPXIiIChjcjQpOiAiMCIgKDApKTsKKwlwcmludGsoIkNSMDogJTA4bHggQ1IyOiAlMDhseCBDUjM6ICUwOGx4IENSNDogJTA4bHhcbiIsIGNyMCwgY3IyLCBjcjMsIGNyNCk7CisJc2hvd190cmFjZShOVUxMLCAmcmVncy0+ZXNwKTsKK30KKworLyoKKyAqIFRoaXMgZ2V0cyBydW4gd2l0aCAlZWJ4IGNvbnRhaW5pbmcgdGhlCisgKiBmdW5jdGlvbiB0byBjYWxsLCBhbmQgJWVkeCBjb250YWluaW5nCisgKiB0aGUgImFyZ3MiLgorICovCitleHRlcm4gdm9pZCBrZXJuZWxfdGhyZWFkX2hlbHBlcih2b2lkKTsKK19fYXNtX18oIi5zZWN0aW9uIC50ZXh0XG4iCisJIi5hbGlnbiA0XG4iCisJImtlcm5lbF90aHJlYWRfaGVscGVyOlxuXHQiCisJIm1vdmwgJWVkeCwlZWF4XG5cdCIKKwkicHVzaGwgJWVkeFxuXHQiCisJImNhbGwgKiVlYnhcblx0IgorCSJwdXNobCAlZWF4XG5cdCIKKwkiY2FsbCBkb19leGl0XG4iCisJIi5wcmV2aW91cyIpOworCisvKgorICogQ3JlYXRlIGEga2VybmVsIHRocmVhZAorICovCitpbnQga2VybmVsX3RocmVhZChpbnQgKCpmbikodm9pZCAqKSwgdm9pZCAqIGFyZywgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgcHRfcmVncyByZWdzOworCisJbWVtc2V0KCZyZWdzLCAwLCBzaXplb2YocmVncykpOworCisJcmVncy5lYnggPSAodW5zaWduZWQgbG9uZykgZm47CisJcmVncy5lZHggPSAodW5zaWduZWQgbG9uZykgYXJnOworCisJcmVncy54ZHMgPSBfX1VTRVJfRFM7CisJcmVncy54ZXMgPSBfX1VTRVJfRFM7CisJcmVncy5vcmlnX2VheCA9IC0xOworCXJlZ3MuZWlwID0gKHVuc2lnbmVkIGxvbmcpIGtlcm5lbF90aHJlYWRfaGVscGVyOworCXJlZ3MueGNzID0gX19LRVJORUxfQ1M7CisJcmVncy5lZmxhZ3MgPSBYODZfRUZMQUdTX0lGIHwgWDg2X0VGTEFHU19TRiB8IFg4Nl9FRkxBR1NfUEYgfCAweDI7CisKKwkvKiBPaywgY3JlYXRlIHRoZSBuZXcgcHJvY2Vzcy4uICovCisJcmV0dXJuIGRvX2ZvcmsoZmxhZ3MgfCBDTE9ORV9WTSB8IENMT05FX1VOVFJBQ0VELCAwLCAmcmVncywgMCwgTlVMTCwgTlVMTCk7Cit9CisKKy8qCisgKiBGcmVlIGN1cnJlbnQgdGhyZWFkIGRhdGEgc3RydWN0dXJlcyBldGMuLgorICovCit2b2lkIGV4aXRfdGhyZWFkKHZvaWQpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCXN0cnVjdCB0aHJlYWRfc3RydWN0ICp0ID0gJnRzay0+dGhyZWFkOworCisJLyogVGhlIHByb2Nlc3MgbWF5IGhhdmUgYWxsb2NhdGVkIGFuIGlvIHBvcnQgYml0bWFwLi4uIG51a2UgaXQuICovCisJaWYgKHVubGlrZWx5KE5VTEwgIT0gdC0+aW9fYml0bWFwX3B0cikpIHsKKwkJaW50IGNwdSA9IGdldF9jcHUoKTsKKwkJc3RydWN0IHRzc19zdHJ1Y3QgKnRzcyA9ICZwZXJfY3B1KGluaXRfdHNzLCBjcHUpOworCisJCWtmcmVlKHQtPmlvX2JpdG1hcF9wdHIpOworCQl0LT5pb19iaXRtYXBfcHRyID0gTlVMTDsKKwkJLyoKKwkJICogQ2FyZWZ1bCwgY2xlYXIgdGhpcyBpbiB0aGUgVFNTIHRvbzoKKwkJICovCisJCW1lbXNldCh0c3MtPmlvX2JpdG1hcCwgMHhmZiwgdHNzLT5pb19iaXRtYXBfbWF4KTsKKwkJdC0+aW9fYml0bWFwX21heCA9IDA7CisJCXRzcy0+aW9fYml0bWFwX293bmVyID0gTlVMTDsKKwkJdHNzLT5pb19iaXRtYXBfbWF4ID0gMDsKKwkJdHNzLT5pb19iaXRtYXBfYmFzZSA9IElOVkFMSURfSU9fQklUTUFQX09GRlNFVDsKKwkJcHV0X2NwdSgpOworCX0KK30KKwordm9pZCBmbHVzaF90aHJlYWQodm9pZCkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisKKwltZW1zZXQodHNrLT50aHJlYWQuZGVidWdyZWcsIDAsIHNpemVvZih1bnNpZ25lZCBsb25nKSo4KTsKKwltZW1zZXQodHNrLT50aHJlYWQudGxzX2FycmF5LCAwLCBzaXplb2YodHNrLT50aHJlYWQudGxzX2FycmF5KSk7CQorCS8qCisJICogRm9yZ2V0IGNvcHJvY2Vzc29yIHN0YXRlLi4KKwkgKi8KKwljbGVhcl9mcHUodHNrKTsKKwljbGVhcl91c2VkX21hdGgoKTsKK30KKwordm9pZCByZWxlYXNlX3RocmVhZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKmRlYWRfdGFzaykKK3sKKwlpZiAoZGVhZF90YXNrLT5tbSkgeworCQkvLyB0ZW1wb3JhcnkgZGVidWdnaW5nIGNoZWNrCisJCWlmIChkZWFkX3Rhc2stPm1tLT5jb250ZXh0LnNpemUpIHsKKwkJCXByaW50aygiV0FSTklORzogZGVhZCBwcm9jZXNzICU4cyBzdGlsbCBoYXMgTERUPyA8JXAvJWQ+XG4iLAorCQkJCQlkZWFkX3Rhc2stPmNvbW0sCisJCQkJCWRlYWRfdGFzay0+bW0tPmNvbnRleHQubGR0LAorCQkJCQlkZWFkX3Rhc2stPm1tLT5jb250ZXh0LnNpemUpOworCQkJQlVHKCk7CisJCX0KKwl9CisKKwlyZWxlYXNlX3ZtODZfaXJxcyhkZWFkX3Rhc2spOworfQorCisvKgorICogVGhpcyBnZXRzIGNhbGxlZCBiZWZvcmUgd2UgYWxsb2NhdGUgYSBuZXcgdGhyZWFkIGFuZCBjb3B5CisgKiB0aGUgY3VycmVudCB0YXNrIGludG8gaXQuCisgKi8KK3ZvaWQgcHJlcGFyZV90b19jb3B5KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworCXVubGF6eV9mcHUodHNrKTsKK30KKworaW50IGNvcHlfdGhyZWFkKGludCBuciwgdW5zaWduZWQgbG9uZyBjbG9uZV9mbGFncywgdW5zaWduZWQgbG9uZyBlc3AsCisJdW5zaWduZWQgbG9uZyB1bnVzZWQsCisJc3RydWN0IHRhc2tfc3RydWN0ICogcCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCXN0cnVjdCBwdF9yZWdzICogY2hpbGRyZWdzOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOworCWludCBlcnI7CisKKwljaGlsZHJlZ3MgPSAoKHN0cnVjdCBwdF9yZWdzICopIChUSFJFQURfU0laRSArICh1bnNpZ25lZCBsb25nKSBwLT50aHJlYWRfaW5mbykpIC0gMTsKKwkqY2hpbGRyZWdzID0gKnJlZ3M7CisJY2hpbGRyZWdzLT5lYXggPSAwOworCWNoaWxkcmVncy0+ZXNwID0gZXNwOworCisJcC0+dGhyZWFkLmVzcCA9ICh1bnNpZ25lZCBsb25nKSBjaGlsZHJlZ3M7CisJcC0+dGhyZWFkLmVzcDAgPSAodW5zaWduZWQgbG9uZykgKGNoaWxkcmVncysxKTsKKworCXAtPnRocmVhZC5laXAgPSAodW5zaWduZWQgbG9uZykgcmV0X2Zyb21fZm9yazsKKworCXNhdmVzZWdtZW50KGZzLHAtPnRocmVhZC5mcyk7CisJc2F2ZXNlZ21lbnQoZ3MscC0+dGhyZWFkLmdzKTsKKworCXRzayA9IGN1cnJlbnQ7CisJaWYgKHVubGlrZWx5KE5VTEwgIT0gdHNrLT50aHJlYWQuaW9fYml0bWFwX3B0cikpIHsKKwkJcC0+dGhyZWFkLmlvX2JpdG1hcF9wdHIgPSBrbWFsbG9jKElPX0JJVE1BUF9CWVRFUywgR0ZQX0tFUk5FTCk7CisJCWlmICghcC0+dGhyZWFkLmlvX2JpdG1hcF9wdHIpIHsKKwkJCXAtPnRocmVhZC5pb19iaXRtYXBfbWF4ID0gMDsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCW1lbWNweShwLT50aHJlYWQuaW9fYml0bWFwX3B0ciwgdHNrLT50aHJlYWQuaW9fYml0bWFwX3B0ciwKKwkJCUlPX0JJVE1BUF9CWVRFUyk7CisJfQorCisJLyoKKwkgKiBTZXQgYSBuZXcgVExTIGZvciB0aGUgY2hpbGQgdGhyZWFkPworCSAqLworCWlmIChjbG9uZV9mbGFncyAmIENMT05FX1NFVFRMUykgeworCQlzdHJ1Y3QgZGVzY19zdHJ1Y3QgKmRlc2M7CisJCXN0cnVjdCB1c2VyX2Rlc2MgaW5mbzsKKwkJaW50IGlkeDsKKworCQllcnIgPSAtRUZBVUxUOworCQlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sICh2b2lkIF9fdXNlciAqKWNoaWxkcmVncy0+ZXNpLCBzaXplb2YoaW5mbykpKQorCQkJZ290byBvdXQ7CisJCWVyciA9IC1FSU5WQUw7CisJCWlmIChMRFRfZW1wdHkoJmluZm8pKQorCQkJZ290byBvdXQ7CisKKwkJaWR4ID0gaW5mby5lbnRyeV9udW1iZXI7CisJCWlmIChpZHggPCBHRFRfRU5UUllfVExTX01JTiB8fCBpZHggPiBHRFRfRU5UUllfVExTX01BWCkKKwkJCWdvdG8gb3V0OworCisJCWRlc2MgPSBwLT50aHJlYWQudGxzX2FycmF5ICsgaWR4IC0gR0RUX0VOVFJZX1RMU19NSU47CisJCWRlc2MtPmEgPSBMRFRfZW50cnlfYSgmaW5mbyk7CisJCWRlc2MtPmIgPSBMRFRfZW50cnlfYigmaW5mbyk7CisJfQorCisJZXJyID0gMDsKKyBvdXQ6CisJaWYgKGVyciAmJiBwLT50aHJlYWQuaW9fYml0bWFwX3B0cikgeworCQlrZnJlZShwLT50aHJlYWQuaW9fYml0bWFwX3B0cik7CisJCXAtPnRocmVhZC5pb19iaXRtYXBfbWF4ID0gMDsKKwl9CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIGZpbGwgaW4gdGhlIHVzZXIgc3RydWN0dXJlIGZvciBhIGNvcmUgZHVtcC4uCisgKi8KK3ZvaWQgZHVtcF90aHJlYWQoc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBzdHJ1Y3QgdXNlciAqIGR1bXApCit7CisJaW50IGk7CisKKy8qIGNoYW5nZWQgdGhlIHNpemUgY2FsY3VsYXRpb25zIC0gc2hvdWxkIGhvcGVmdWxseSB3b3JrIGJldHRlci4gbGJ0ICovCisJZHVtcC0+bWFnaWMgPSBDTUFHSUM7CisJZHVtcC0+c3RhcnRfY29kZSA9IDA7CisJZHVtcC0+c3RhcnRfc3RhY2sgPSByZWdzLT5lc3AgJiB+KFBBR0VfU0laRSAtIDEpOworCWR1bXAtPnVfdHNpemUgPSAoKHVuc2lnbmVkIGxvbmcpIGN1cnJlbnQtPm1tLT5lbmRfY29kZSkgPj4gUEFHRV9TSElGVDsKKwlkdW1wLT51X2RzaXplID0gKCh1bnNpZ25lZCBsb25nKSAoY3VycmVudC0+bW0tPmJyayArIChQQUdFX1NJWkUtMSkpKSA+PiBQQUdFX1NISUZUOworCWR1bXAtPnVfZHNpemUgLT0gZHVtcC0+dV90c2l6ZTsKKwlkdW1wLT51X3NzaXplID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQlkdW1wLT51X2RlYnVncmVnW2ldID0gY3VycmVudC0+dGhyZWFkLmRlYnVncmVnW2ldOyAgCisKKwlpZiAoZHVtcC0+c3RhcnRfc3RhY2sgPCBUQVNLX1NJWkUpCisJCWR1bXAtPnVfc3NpemUgPSAoKHVuc2lnbmVkIGxvbmcpIChUQVNLX1NJWkUgLSBkdW1wLT5zdGFydF9zdGFjaykpID4+IFBBR0VfU0hJRlQ7CisKKwlkdW1wLT5yZWdzLmVieCA9IHJlZ3MtPmVieDsKKwlkdW1wLT5yZWdzLmVjeCA9IHJlZ3MtPmVjeDsKKwlkdW1wLT5yZWdzLmVkeCA9IHJlZ3MtPmVkeDsKKwlkdW1wLT5yZWdzLmVzaSA9IHJlZ3MtPmVzaTsKKwlkdW1wLT5yZWdzLmVkaSA9IHJlZ3MtPmVkaTsKKwlkdW1wLT5yZWdzLmVicCA9IHJlZ3MtPmVicDsKKwlkdW1wLT5yZWdzLmVheCA9IHJlZ3MtPmVheDsKKwlkdW1wLT5yZWdzLmRzID0gcmVncy0+eGRzOworCWR1bXAtPnJlZ3MuZXMgPSByZWdzLT54ZXM7CisJc2F2ZXNlZ21lbnQoZnMsZHVtcC0+cmVncy5mcyk7CisJc2F2ZXNlZ21lbnQoZ3MsZHVtcC0+cmVncy5ncyk7CisJZHVtcC0+cmVncy5vcmlnX2VheCA9IHJlZ3MtPm9yaWdfZWF4OworCWR1bXAtPnJlZ3MuZWlwID0gcmVncy0+ZWlwOworCWR1bXAtPnJlZ3MuY3MgPSByZWdzLT54Y3M7CisJZHVtcC0+cmVncy5lZmxhZ3MgPSByZWdzLT5lZmxhZ3M7CisJZHVtcC0+cmVncy5lc3AgPSByZWdzLT5lc3A7CisJZHVtcC0+cmVncy5zcyA9IHJlZ3MtPnhzczsKKworCWR1bXAtPnVfZnB2YWxpZCA9IGR1bXBfZnB1IChyZWdzLCAmZHVtcC0+aTM4Nyk7Cit9CisKKy8qIAorICogQ2FwdHVyZSB0aGUgdXNlciBzcGFjZSByZWdpc3RlcnMgaWYgdGhlIHRhc2sgaXMgbm90IHJ1bm5pbmcgKGluIHVzZXIgc3BhY2UpCisgKi8KK2ludCBkdW1wX3Rhc2tfcmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgZWxmX2dyZWdzZXRfdCAqcmVncykKK3sKKwlzdHJ1Y3QgcHRfcmVncyBwdHJlZ3M7CisJCisJcHRyZWdzID0gKihzdHJ1Y3QgcHRfcmVncyAqKQorCQkoKHVuc2lnbmVkIGxvbmcpdHNrLT50aHJlYWRfaW5mbytUSFJFQURfU0laRSAtIHNpemVvZihwdHJlZ3MpKTsKKwlwdHJlZ3MueGNzICY9IDB4ZmZmZjsKKwlwdHJlZ3MueGRzICY9IDB4ZmZmZjsKKwlwdHJlZ3MueGVzICY9IDB4ZmZmZjsKKwlwdHJlZ3MueHNzICY9IDB4ZmZmZjsKKworCWVsZl9jb3JlX2NvcHlfcmVncyhyZWdzLCAmcHRyZWdzKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2hhbmRsZV9pb19iaXRtYXAoc3RydWN0IHRocmVhZF9zdHJ1Y3QgKm5leHQsIHN0cnVjdCB0c3Nfc3RydWN0ICp0c3MpCit7CisJaWYgKCFuZXh0LT5pb19iaXRtYXBfcHRyKSB7CisJCS8qCisJCSAqIERpc2FibGUgdGhlIGJpdG1hcCB2aWEgYW4gaW52YWxpZCBvZmZzZXQuIFdlIHN0aWxsIGNhY2hlCisJCSAqIHRoZSBwcmV2aW91cyBiaXRtYXAgb3duZXIgYW5kIHRoZSBJTyBiaXRtYXAgY29udGVudHM6CisJCSAqLworCQl0c3MtPmlvX2JpdG1hcF9iYXNlID0gSU5WQUxJRF9JT19CSVRNQVBfT0ZGU0VUOworCQlyZXR1cm47CisJfQorCWlmIChsaWtlbHkobmV4dCA9PSB0c3MtPmlvX2JpdG1hcF9vd25lcikpIHsKKwkJLyoKKwkJICogUHJldmlvdXMgb3duZXIgb2YgdGhlIGJpdG1hcCAoaGVuY2UgdGhlIGJpdG1hcCBjb250ZW50KQorCQkgKiBtYXRjaGVzIHRoZSBuZXh0IHRhc2ssIHdlIGRvbnQgaGF2ZSB0byBkbyBhbnl0aGluZyBidXQKKwkJICogdG8gc2V0IGEgdmFsaWQgb2Zmc2V0IGluIHRoZSBUU1M6CisJCSAqLworCQl0c3MtPmlvX2JpdG1hcF9iYXNlID0gSU9fQklUTUFQX09GRlNFVDsKKwkJcmV0dXJuOworCX0KKwkvKgorCSAqIExhenkgVFNTJ3MgSS9PIGJpdG1hcCBjb3B5LiBXZSBzZXQgYW4gaW52YWxpZCBvZmZzZXQgaGVyZQorCSAqIGFuZCB3ZSBsZXQgdGhlIHRhc2sgdG8gZ2V0IGEgR1BGIGluIGNhc2UgYW4gSS9PIGluc3RydWN0aW9uCisJICogaXMgcGVyZm9ybWVkLiAgVGhlIGhhbmRsZXIgb2YgdGhlIEdQRiB3aWxsIHZlcmlmeSB0aGF0IHRoZQorCSAqIGZhdWx0aW5nIHRhc2sgaGFzIGEgdmFsaWQgSS9PIGJpdG1hcCBhbmQsIGl0IHRydWUsIGRvZXMgdGhlCisJICogcmVhbCBjb3B5IGFuZCByZXN0YXJ0IHRoZSBpbnN0cnVjdGlvbi4gIFRoaXMgd2lsbCBzYXZlIHVzCisJICogcmVkdW5kYW50IGNvcGllcyB3aGVuIHRoZSBjdXJyZW50bHkgc3dpdGNoZWQgdGFzayBkb2VzIG5vdAorCSAqIHBlcmZvcm0gYW55IEkvTyBkdXJpbmcgaXRzIHRpbWVzbGljZS4KKwkgKi8KKwl0c3MtPmlvX2JpdG1hcF9iYXNlID0gSU5WQUxJRF9JT19CSVRNQVBfT0ZGU0VUX0xBWlk7Cit9CisvKgorICogVGhpcyBzcGVjaWFsIG1hY3JvIGNhbiBiZSB1c2VkIHRvIGxvYWQgYSBkZWJ1Z2dpbmcgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBsb2FkZGVidWcodGhyZWFkLHJlZ2lzdGVyKSBcCisJCV9fYXNtX18oIm1vdmwgJTAsJSVkYiIgI3JlZ2lzdGVyICBcCisJCQk6IC8qIG5vIG91dHB1dCAqLyBcCisJCQk6InIiICh0aHJlYWQtPmRlYnVncmVnW3JlZ2lzdGVyXSkpCisKKy8qCisgKglzd2l0Y2hfdG8oeCx5bikgc2hvdWxkIHN3aXRjaCB0YXNrcyBmcm9tIHggdG8geS4KKyAqCisgKiBXZSBmc2F2ZS9md2FpdCBzbyB0aGF0IGFuIGV4Y2VwdGlvbiBnb2VzIG9mZiBhdCB0aGUgcmlnaHQgdGltZQorICogKGFzIGEgY2FsbCBmcm9tIHRoZSBmc2F2ZSBvciBmd2FpdCBpbiBlZmZlY3QpIHJhdGhlciB0aGFuIHRvCisgKiB0aGUgd3JvbmcgcHJvY2Vzcy4gTGF6eSBGUCBzYXZpbmcgbm8gbG9uZ2VyIG1ha2VzIGFueSBzZW5zZQorICogd2l0aCBtb2Rlcm4gQ1BVJ3MsIGFuZCB0aGlzIHNpbXBsaWZpZXMgYSBsb3Qgb2YgdGhpbmdzIChTTVAKKyAqIGFuZCBVUCBiZWNvbWUgdGhlIHNhbWUpLgorICoKKyAqIE5PVEUhIFdlIHVzZWQgdG8gdXNlIHRoZSB4ODYgaGFyZHdhcmUgY29udGV4dCBzd2l0Y2hpbmcuIFRoZQorICogcmVhc29uIGZvciBub3QgdXNpbmcgaXQgYW55IG1vcmUgYmVjb21lcyBhcHBhcmVudCB3aGVuIHlvdQorICogdHJ5IHRvIHJlY292ZXIgZ3JhY2VmdWxseSBmcm9tIHNhdmVkIHN0YXRlIHRoYXQgaXMgbm8gbG9uZ2VyCisgKiB2YWxpZCAoc3RhbGUgc2VnbWVudCByZWdpc3RlciB2YWx1ZXMgaW4gcGFydGljdWxhcikuIFdpdGggdGhlCisgKiBoYXJkd2FyZSB0YXNrLXN3aXRjaCwgdGhlcmUgaXMgbm8gd2F5IHRvIGZpeCB1cCBiYWQgc3RhdGUgaW4KKyAqIGEgcmVhc29uYWJsZSBtYW5uZXIuCisgKgorICogVGhlIGZhY3QgdGhhdCBJbnRlbCBkb2N1bWVudHMgdGhlIGhhcmR3YXJlIHRhc2stc3dpdGNoaW5nIHRvCisgKiBiZSBzbG93IGlzIGEgZmFpcmx5IHJlZCBoZXJyaW5nIC0gdGhpcyBjb2RlIGlzIG5vdCBub3RpY2VhYmx5CisgKiBmYXN0ZXIuIEhvd2V2ZXIsIHRoZXJlIF9pc18gc29tZSByb29tIGZvciBpbXByb3ZlbWVudCBoZXJlLAorICogc28gdGhlIHBlcmZvcm1hbmNlIGlzc3VlcyBtYXkgZXZlbnR1YWxseSBiZSBhIHZhbGlkIHBvaW50LgorICogTW9yZSBpbXBvcnRhbnQsIGhvd2V2ZXIsIGlzIHRoZSBmYWN0IHRoYXQgdGhpcyBhbGxvd3MgdXMgbXVjaAorICogbW9yZSBmbGV4aWJpbGl0eS4KKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIChpbiAlZWF4KSB3aWxsIGJlIHRoZSAicHJldiIgdGFzayBhZnRlcgorICogdGhlIHRhc2stc3dpdGNoLCBhbmQgc2hvd3MgdXAgaW4gcmV0X2Zyb21fZm9yayBpbiBlbnRyeS5TLAorICogZm9yIGV4YW1wbGUuCisgKi8KK3N0cnVjdCB0YXNrX3N0cnVjdCBmYXN0Y2FsbCAqIF9fc3dpdGNoX3RvKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldl9wLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHRfcCkKK3sKKwlzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqcHJldiA9ICZwcmV2X3AtPnRocmVhZCwKKwkJCQkgKm5leHQgPSAmbmV4dF9wLT50aHJlYWQ7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlzdHJ1Y3QgdHNzX3N0cnVjdCAqdHNzID0gJnBlcl9jcHUoaW5pdF90c3MsIGNwdSk7CisKKwkvKiBuZXZlciBwdXQgYSBwcmludGsgaW4gX19zd2l0Y2hfdG8uLi4gcHJpbnRrKCkgY2FsbHMgd2FrZV91cCooKSBpbmRpcmVjdGx5ICovCisKKwlfX3VubGF6eV9mcHUocHJldl9wKTsKKworCS8qCisJICogUmVsb2FkIGVzcDAsIExEVCBhbmQgdGhlIHBhZ2UgdGFibGUgcG9pbnRlcjoKKwkgKi8KKwlsb2FkX2VzcDAodHNzLCBuZXh0KTsKKworCS8qCisJICogTG9hZCB0aGUgcGVyLXRocmVhZCBUaHJlYWQtTG9jYWwgU3RvcmFnZSBkZXNjcmlwdG9yLgorCSAqLworCWxvYWRfVExTKG5leHQsIGNwdSk7CisKKwkvKgorCSAqIFNhdmUgYXdheSAlZnMgYW5kICVncy4gTm8gbmVlZCB0byBzYXZlICVlcyBhbmQgJWRzLCBhcworCSAqIHRob3NlIGFyZSBhbHdheXMga2VybmVsIHNlZ21lbnRzIHdoaWxlIGluc2lkZSB0aGUga2VybmVsLgorCSAqLworCWFzbSB2b2xhdGlsZSgibW92bCAlJWZzLCUwIjoiPW0iICgqKGludCAqKSZwcmV2LT5mcykpOworCWFzbSB2b2xhdGlsZSgibW92bCAlJWdzLCUwIjoiPW0iICgqKGludCAqKSZwcmV2LT5ncykpOworCisJLyoKKwkgKiBSZXN0b3JlICVmcyBhbmQgJWdzIGlmIG5lZWRlZC4KKwkgKi8KKwlpZiAodW5saWtlbHkocHJldi0+ZnMgfCBwcmV2LT5ncyB8IG5leHQtPmZzIHwgbmV4dC0+Z3MpKSB7CisJCWxvYWRzZWdtZW50KGZzLCBuZXh0LT5mcyk7CisJCWxvYWRzZWdtZW50KGdzLCBuZXh0LT5ncyk7CisJfQorCisJLyoKKwkgKiBOb3cgbWF5YmUgcmVsb2FkIHRoZSBkZWJ1ZyByZWdpc3RlcnMKKwkgKi8KKwlpZiAodW5saWtlbHkobmV4dC0+ZGVidWdyZWdbN10pKSB7CisJCWxvYWRkZWJ1ZyhuZXh0LCAwKTsKKwkJbG9hZGRlYnVnKG5leHQsIDEpOworCQlsb2FkZGVidWcobmV4dCwgMik7CisJCWxvYWRkZWJ1ZyhuZXh0LCAzKTsKKwkJLyogbm8gNCBhbmQgNSAqLworCQlsb2FkZGVidWcobmV4dCwgNik7CisJCWxvYWRkZWJ1ZyhuZXh0LCA3KTsKKwl9CisKKwlpZiAodW5saWtlbHkocHJldi0+aW9fYml0bWFwX3B0ciB8fCBuZXh0LT5pb19iaXRtYXBfcHRyKSkKKwkJaGFuZGxlX2lvX2JpdG1hcChuZXh0LCB0c3MpOworCisJcmV0dXJuIHByZXZfcDsKK30KKworYXNtbGlua2FnZSBpbnQgc3lzX2Zvcmsoc3RydWN0IHB0X3JlZ3MgcmVncykKK3sKKwlyZXR1cm4gZG9fZm9yayhTSUdDSExELCByZWdzLmVzcCwgJnJlZ3MsIDAsIE5VTEwsIE5VTEwpOworfQorCithc21saW5rYWdlIGludCBzeXNfY2xvbmUoc3RydWN0IHB0X3JlZ3MgcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGNsb25lX2ZsYWdzOworCXVuc2lnbmVkIGxvbmcgbmV3c3A7CisJaW50IF9fdXNlciAqcGFyZW50X3RpZHB0ciwgKmNoaWxkX3RpZHB0cjsKKworCWNsb25lX2ZsYWdzID0gcmVncy5lYng7CisJbmV3c3AgPSByZWdzLmVjeDsKKwlwYXJlbnRfdGlkcHRyID0gKGludCBfX3VzZXIgKilyZWdzLmVkeDsKKwljaGlsZF90aWRwdHIgPSAoaW50IF9fdXNlciAqKXJlZ3MuZWRpOworCWlmICghbmV3c3ApCisJCW5ld3NwID0gcmVncy5lc3A7CisJcmV0dXJuIGRvX2ZvcmsoY2xvbmVfZmxhZ3MsIG5ld3NwLCAmcmVncywgMCwgcGFyZW50X3RpZHB0ciwgY2hpbGRfdGlkcHRyKTsKK30KKworLyoKKyAqIFRoaXMgaXMgdHJpdmlhbCwgYW5kIG9uIHRoZSBmYWNlIG9mIGl0IGxvb2tzIGxpa2UgaXQKKyAqIGNvdWxkIGVxdWFsbHkgd2VsbCBiZSBkb25lIGluIHVzZXIgbW9kZS4KKyAqCisgKiBOb3Qgc28sIGZvciBxdWl0ZSB1bm9idmlvdXMgcmVhc29ucyAtIHJlZ2lzdGVyIHByZXNzdXJlLgorICogSW4gdXNlciBtb2RlIHZmb3JrKCkgY2Fubm90IGhhdmUgYSBzdGFjayBmcmFtZSwgYW5kIGlmCisgKiBkb25lIGJ5IGNhbGxpbmcgdGhlICJjbG9uZSgpIiBzeXN0ZW0gY2FsbCBkaXJlY3RseSwgeW91CisgKiBkbyBub3QgaGF2ZSBlbm91Z2ggY2FsbC1jbG9iYmVyZWQgcmVnaXN0ZXJzIHRvIGhvbGQgYWxsCisgKiB0aGUgaW5mb3JtYXRpb24geW91IG5lZWQuCisgKi8KK2FzbWxpbmthZ2UgaW50IHN5c192Zm9yayhzdHJ1Y3QgcHRfcmVncyByZWdzKQoreworCXJldHVybiBkb19mb3JrKENMT05FX1ZGT1JLIHwgQ0xPTkVfVk0gfCBTSUdDSExELCByZWdzLmVzcCwgJnJlZ3MsIDAsIE5VTEwsIE5VTEwpOworfQorCisvKgorICogc3lzX2V4ZWN2ZSgpIGV4ZWN1dGVzIGEgbmV3IHByb2dyYW0uCisgKi8KK2FzbWxpbmthZ2UgaW50IHN5c19leGVjdmUoc3RydWN0IHB0X3JlZ3MgcmVncykKK3sKKwlpbnQgZXJyb3I7CisJY2hhciAqIGZpbGVuYW1lOworCisJZmlsZW5hbWUgPSBnZXRuYW1lKChjaGFyIF9fdXNlciAqKSByZWdzLmVieCk7CisJZXJyb3IgPSBQVFJfRVJSKGZpbGVuYW1lKTsKKwlpZiAoSVNfRVJSKGZpbGVuYW1lKSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSBkb19leGVjdmUoZmlsZW5hbWUsCisJCQkoY2hhciBfX3VzZXIgKiBfX3VzZXIgKikgcmVncy5lY3gsCisJCQkoY2hhciBfX3VzZXIgKiBfX3VzZXIgKikgcmVncy5lZHgsCisJCQkmcmVncyk7CisJaWYgKGVycm9yID09IDApIHsKKwkJdGFza19sb2NrKGN1cnJlbnQpOworCQljdXJyZW50LT5wdHJhY2UgJj0gflBUX0RUUkFDRTsKKwkJdGFza191bmxvY2soY3VycmVudCk7CisJCS8qIE1ha2Ugc3VyZSB3ZSBkb24ndCByZXR1cm4gdXNpbmcgc3lzZW50ZXIuLiAqLworCQlzZXRfdGhyZWFkX2ZsYWcoVElGX0lSRVQpOworCX0KKwlwdXRuYW1lKGZpbGVuYW1lKTsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKKyNkZWZpbmUgdG9wX2VzcCAgICAgICAgICAgICAgICAoVEhSRUFEX1NJWkUgLSBzaXplb2YodW5zaWduZWQgbG9uZykpCisjZGVmaW5lIHRvcF9lYnAgICAgICAgICAgICAgICAgKFRIUkVBRF9TSVpFIC0gMipzaXplb2YodW5zaWduZWQgbG9uZykpCisKK3Vuc2lnbmVkIGxvbmcgZ2V0X3djaGFuKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwl1bnNpZ25lZCBsb25nIGVicCwgZXNwLCBlaXA7CisJdW5zaWduZWQgbG9uZyBzdGFja19wYWdlOworCWludCBjb3VudCA9IDA7CisJaWYgKCFwIHx8IHAgPT0gY3VycmVudCB8fCBwLT5zdGF0ZSA9PSBUQVNLX1JVTk5JTkcpCisJCXJldHVybiAwOworCXN0YWNrX3BhZ2UgPSAodW5zaWduZWQgbG9uZylwLT50aHJlYWRfaW5mbzsKKwllc3AgPSBwLT50aHJlYWQuZXNwOworCWlmICghc3RhY2tfcGFnZSB8fCBlc3AgPCBzdGFja19wYWdlIHx8IGVzcCA+IHRvcF9lc3Arc3RhY2tfcGFnZSkKKwkJcmV0dXJuIDA7CisJLyogaW5jbHVkZS9hc20taTM4Ni9zeXN0ZW0uaDpzd2l0Y2hfdG8oKSBwdXNoZXMgZWJwIGxhc3QuICovCisJZWJwID0gKih1bnNpZ25lZCBsb25nICopIGVzcDsKKwlkbyB7CisJCWlmIChlYnAgPCBzdGFja19wYWdlIHx8IGVicCA+IHRvcF9lYnArc3RhY2tfcGFnZSkKKwkJCXJldHVybiAwOworCQllaXAgPSAqKHVuc2lnbmVkIGxvbmcgKikgKGVicCs0KTsKKwkJaWYgKCFpbl9zY2hlZF9mdW5jdGlvbnMoZWlwKSkKKwkJCXJldHVybiBlaXA7CisJCWVicCA9ICoodW5zaWduZWQgbG9uZyAqKSBlYnA7CisJfSB3aGlsZSAoY291bnQrKyA8IDE2KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHN5c19hbGxvY190aHJlYWRfYXJlYTogZ2V0IGEgeWV0IHVudXNlZCBUTFMgZGVzY3JpcHRvciBpbmRleC4KKyAqLworc3RhdGljIGludCBnZXRfZnJlZV9pZHgodm9pZCkKK3sKKwlzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdCA9ICZjdXJyZW50LT50aHJlYWQ7CisJaW50IGlkeDsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgR0RUX0VOVFJZX1RMU19FTlRSSUVTOyBpZHgrKykKKwkJaWYgKGRlc2NfZW1wdHkodC0+dGxzX2FycmF5ICsgaWR4KSkKKwkJCXJldHVybiBpZHggKyBHRFRfRU5UUllfVExTX01JTjsKKwlyZXR1cm4gLUVTUkNIOworfQorCisvKgorICogU2V0IGEgZ2l2ZW4gVExTIGRlc2NyaXB0b3I6CisgKi8KK2FzbWxpbmthZ2UgaW50IHN5c19zZXRfdGhyZWFkX2FyZWEoc3RydWN0IHVzZXJfZGVzYyBfX3VzZXIgKnVfaW5mbykKK3sKKwlzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdCA9ICZjdXJyZW50LT50aHJlYWQ7CisJc3RydWN0IHVzZXJfZGVzYyBpbmZvOworCXN0cnVjdCBkZXNjX3N0cnVjdCAqZGVzYzsKKwlpbnQgY3B1LCBpZHg7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sIHVfaW5mbywgc2l6ZW9mKGluZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWR4ID0gaW5mby5lbnRyeV9udW1iZXI7CisKKwkvKgorCSAqIGluZGV4IC0xIG1lYW5zIHRoZSBrZXJuZWwgc2hvdWxkIHRyeSB0byBmaW5kIGFuZAorCSAqIGFsbG9jYXRlIGFuIGVtcHR5IGRlc2NyaXB0b3I6CisJICovCisJaWYgKGlkeCA9PSAtMSkgeworCQlpZHggPSBnZXRfZnJlZV9pZHgoKTsKKwkJaWYgKGlkeCA8IDApCisJCQlyZXR1cm4gaWR4OworCQlpZiAocHV0X3VzZXIoaWR4LCAmdV9pbmZvLT5lbnRyeV9udW1iZXIpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKGlkeCA8IEdEVF9FTlRSWV9UTFNfTUlOIHx8IGlkeCA+IEdEVF9FTlRSWV9UTFNfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRlc2MgPSB0LT50bHNfYXJyYXkgKyBpZHggLSBHRFRfRU5UUllfVExTX01JTjsKKworCS8qCisJICogV2UgbXVzdCBub3QgZ2V0IHByZWVtcHRlZCB3aGlsZSBtb2RpZnlpbmcgdGhlIFRMUy4KKwkgKi8KKwljcHUgPSBnZXRfY3B1KCk7CisKKwlpZiAoTERUX2VtcHR5KCZpbmZvKSkgeworCQlkZXNjLT5hID0gMDsKKwkJZGVzYy0+YiA9IDA7CisJfSBlbHNlIHsKKwkJZGVzYy0+YSA9IExEVF9lbnRyeV9hKCZpbmZvKTsKKwkJZGVzYy0+YiA9IExEVF9lbnRyeV9iKCZpbmZvKTsKKwl9CisJbG9hZF9UTFModCwgY3B1KTsKKworCXB1dF9jcHUoKTsKKworCXJldHVybiAwOworfQorCisvKgorICogR2V0IHRoZSBjdXJyZW50IFRocmVhZC1Mb2NhbCBTdG9yYWdlIGFyZWE6CisgKi8KKworI2RlZmluZSBHRVRfQkFTRShkZXNjKSAoIFwKKwkoKChkZXNjKS0+YSA+PiAxNikgJiAweDAwMDBmZmZmKSB8IFwKKwkoKChkZXNjKS0+YiA8PCAxNikgJiAweDAwZmYwMDAwKSB8IFwKKwkoIChkZXNjKS0+YiAgICAgICAgJiAweGZmMDAwMDAwKSAgICkKKworI2RlZmluZSBHRVRfTElNSVQoZGVzYykgKCBcCisJKChkZXNjKS0+YSAmIDB4MGZmZmYpIHwgXAorCSAoKGRlc2MpLT5iICYgMHhmMDAwMCkgKQorCQorI2RlZmluZSBHRVRfMzJCSVQoZGVzYykJCSgoKGRlc2MpLT5iID4+IDIyKSAmIDEpCisjZGVmaW5lIEdFVF9DT05URU5UUyhkZXNjKQkoKChkZXNjKS0+YiA+PiAxMCkgJiAzKQorI2RlZmluZSBHRVRfV1JJVEFCTEUoZGVzYykJKCgoZGVzYyktPmIgPj4gIDkpICYgMSkKKyNkZWZpbmUgR0VUX0xJTUlUX1BBR0VTKGRlc2MpCSgoKGRlc2MpLT5iID4+IDIzKSAmIDEpCisjZGVmaW5lIEdFVF9QUkVTRU5UKGRlc2MpCSgoKGRlc2MpLT5iID4+IDE1KSAmIDEpCisjZGVmaW5lIEdFVF9VU0VBQkxFKGRlc2MpCSgoKGRlc2MpLT5iID4+IDIwKSAmIDEpCisKK2FzbWxpbmthZ2UgaW50IHN5c19nZXRfdGhyZWFkX2FyZWEoc3RydWN0IHVzZXJfZGVzYyBfX3VzZXIgKnVfaW5mbykKK3sKKwlzdHJ1Y3QgdXNlcl9kZXNjIGluZm87CisJc3RydWN0IGRlc2Nfc3RydWN0ICpkZXNjOworCWludCBpZHg7CisKKwlpZiAoZ2V0X3VzZXIoaWR4LCAmdV9pbmZvLT5lbnRyeV9udW1iZXIpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoaWR4IDwgR0RUX0VOVFJZX1RMU19NSU4gfHwgaWR4ID4gR0RUX0VOVFJZX1RMU19NQVgpCisJCXJldHVybiAtRUlOVkFMOworCisJZGVzYyA9IGN1cnJlbnQtPnRocmVhZC50bHNfYXJyYXkgKyBpZHggLSBHRFRfRU5UUllfVExTX01JTjsKKworCWluZm8uZW50cnlfbnVtYmVyID0gaWR4OworCWluZm8uYmFzZV9hZGRyID0gR0VUX0JBU0UoZGVzYyk7CisJaW5mby5saW1pdCA9IEdFVF9MSU1JVChkZXNjKTsKKwlpbmZvLnNlZ18zMmJpdCA9IEdFVF8zMkJJVChkZXNjKTsKKwlpbmZvLmNvbnRlbnRzID0gR0VUX0NPTlRFTlRTKGRlc2MpOworCWluZm8ucmVhZF9leGVjX29ubHkgPSAhR0VUX1dSSVRBQkxFKGRlc2MpOworCWluZm8ubGltaXRfaW5fcGFnZXMgPSBHRVRfTElNSVRfUEFHRVMoZGVzYyk7CisJaW5mby5zZWdfbm90X3ByZXNlbnQgPSAhR0VUX1BSRVNFTlQoZGVzYyk7CisJaW5mby51c2VhYmxlID0gR0VUX1VTRUFCTEUoZGVzYyk7CisKKwlpZiAoY29weV90b191c2VyKHVfaW5mbywgJmluZm8sIHNpemVvZihpbmZvKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCit1bnNpZ25lZCBsb25nIGFyY2hfYWxpZ25fc3RhY2sodW5zaWduZWQgbG9uZyBzcCkKK3sKKwlpZiAocmFuZG9taXplX3ZhX3NwYWNlKQorCQlzcCAtPSBnZXRfcmFuZG9tX2ludCgpICUgODE5MjsKKwlyZXR1cm4gc3AgJiB+MHhmOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvcHRyYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJmMTc2NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvcHRyYWNlLmMKQEAgLTAsMCArMSw3MTcgQEAKKy8qIHB0cmFjZS5jICovCisvKiBCeSBSb3NzIEJpcm8gMS8yMy85MiAqLworLyoKKyAqIFBlbnRpdW0gSUlJIEZYU1IsIFNTRSBzdXBwb3J0CisgKglHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+LCBNYXkgMjAwMAorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+CisjaW5jbHVkZSA8bGludXgvc2VjY29tcC5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2kzODcuaD4KKyNpbmNsdWRlIDxhc20vZGVidWdyZWcuaD4KKyNpbmNsdWRlIDxhc20vbGR0Lmg+CisjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KKworLyoKKyAqIGRvZXMgbm90IHlldCBjYXRjaCBzaWduYWxzIHNlbnQgd2hlbiB0aGUgY2hpbGQgZGllcy4KKyAqIGluIGV4aXQuYyBvciBpbiBzaWduYWwuYy4KKyAqLworCisvKiBkZXRlcm1pbmVzIHdoaWNoIGZsYWdzIHRoZSB1c2VyIGhhcyBhY2Nlc3MgdG8uICovCisvKiAxID0gYWNjZXNzIDAgPSBubyBhY2Nlc3MgKi8KKyNkZWZpbmUgRkxBR19NQVNLIDB4MDAwNDRkZDUKKworLyogc2V0J3MgdGhlIHRyYXAgZmxhZy4gKi8KKyNkZWZpbmUgVFJBUF9GTEFHIDB4MTAwCisKKy8qCisgKiBPZmZzZXQgb2YgZWZsYWdzIG9uIGNoaWxkIHN0YWNrLi4KKyAqLworI2RlZmluZSBFRkxfT0ZGU0VUICgoRUZMLTIpKjQtc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSkKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcHRfcmVncyAqZ2V0X2NoaWxkX3JlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQoreworCXZvaWQgKnN0YWNrX3RvcCA9ICh2b2lkICopdGFzay0+dGhyZWFkLmVzcDA7CisJcmV0dXJuIHN0YWNrX3RvcCAtIHNpemVvZihzdHJ1Y3QgcHRfcmVncyk7Cit9CisKKy8qCisgKiB0aGlzIHJvdXRpbmUgd2lsbCBnZXQgYSB3b3JkIG9mZiBvZiB0aGUgcHJvY2Vzc2VzIHByaXZpbGVnZWQgc3RhY2suIAorICogdGhlIG9mZnNldCBpcyBob3cgZmFyIGZyb20gdGhlIGJhc2UgYWRkciBhcyBzdG9yZWQgaW4gdGhlIFRTUy4gIAorICogdGhpcyByb3V0aW5lIGFzc3VtZXMgdGhhdCBhbGwgdGhlIHByaXZpbGVnZWQgc3RhY2tzIGFyZSBpbiBvdXIKKyAqIGRhdGEgc3BhY2UuCisgKi8gICAKK3N0YXRpYyBpbmxpbmUgaW50IGdldF9zdGFja19sb25nKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IG9mZnNldCkKK3sKKwl1bnNpZ25lZCBjaGFyICpzdGFjazsKKworCXN0YWNrID0gKHVuc2lnbmVkIGNoYXIgKil0YXNrLT50aHJlYWQuZXNwMDsKKwlzdGFjayArPSBvZmZzZXQ7CisJcmV0dXJuICgqKChpbnQgKilzdGFjaykpOworfQorCisvKgorICogdGhpcyByb3V0aW5lIHdpbGwgcHV0IGEgd29yZCBvbiB0aGUgcHJvY2Vzc2VzIHByaXZpbGVnZWQgc3RhY2suIAorICogdGhlIG9mZnNldCBpcyBob3cgZmFyIGZyb20gdGhlIGJhc2UgYWRkciBhcyBzdG9yZWQgaW4gdGhlIFRTUy4gIAorICogdGhpcyByb3V0aW5lIGFzc3VtZXMgdGhhdCBhbGwgdGhlIHByaXZpbGVnZWQgc3RhY2tzIGFyZSBpbiBvdXIKKyAqIGRhdGEgc3BhY2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHB1dF9zdGFja19sb25nKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IG9mZnNldCwKKwl1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJdW5zaWduZWQgY2hhciAqIHN0YWNrOworCisJc3RhY2sgPSAodW5zaWduZWQgY2hhciAqKSB0YXNrLT50aHJlYWQuZXNwMDsKKwlzdGFjayArPSBvZmZzZXQ7CisJKih1bnNpZ25lZCBsb25nICopIHN0YWNrID0gZGF0YTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwdXRyZWcoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwKKwl1bnNpZ25lZCBsb25nIHJlZ25vLCB1bnNpZ25lZCBsb25nIHZhbHVlKQoreworCXN3aXRjaCAocmVnbm8gPj4gMikgeworCQljYXNlIEZTOgorCQkJaWYgKHZhbHVlICYmICh2YWx1ZSAmIDMpICE9IDMpCisJCQkJcmV0dXJuIC1FSU87CisJCQljaGlsZC0+dGhyZWFkLmZzID0gdmFsdWU7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBHUzoKKwkJCWlmICh2YWx1ZSAmJiAodmFsdWUgJiAzKSAhPSAzKQorCQkJCXJldHVybiAtRUlPOworCQkJY2hpbGQtPnRocmVhZC5ncyA9IHZhbHVlOworCQkJcmV0dXJuIDA7CisJCWNhc2UgRFM6CisJCWNhc2UgRVM6CisJCQlpZiAodmFsdWUgJiYgKHZhbHVlICYgMykgIT0gMykKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCXZhbHVlICY9IDB4ZmZmZjsKKwkJCWJyZWFrOworCQljYXNlIFNTOgorCQljYXNlIENTOgorCQkJaWYgKCh2YWx1ZSAmIDMpICE9IDMpCisJCQkJcmV0dXJuIC1FSU87CisJCQl2YWx1ZSAmPSAweGZmZmY7CisJCQlicmVhazsKKwkJY2FzZSBFRkw6CisJCQl2YWx1ZSAmPSBGTEFHX01BU0s7CisJCQl2YWx1ZSB8PSBnZXRfc3RhY2tfbG9uZyhjaGlsZCwgRUZMX09GRlNFVCkgJiB+RkxBR19NQVNLOworCQkJYnJlYWs7CisJfQorCWlmIChyZWdubyA+IEdTKjQpCisJCXJlZ25vIC09IDIqNDsKKwlwdXRfc3RhY2tfbG9uZyhjaGlsZCwgcmVnbm8gLSBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpLCB2YWx1ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldHJlZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLAorCXVuc2lnbmVkIGxvbmcgcmVnbm8pCit7CisJdW5zaWduZWQgbG9uZyByZXR2YWwgPSB+MFVMOworCisJc3dpdGNoIChyZWdubyA+PiAyKSB7CisJCWNhc2UgRlM6CisJCQlyZXR2YWwgPSBjaGlsZC0+dGhyZWFkLmZzOworCQkJYnJlYWs7CisJCWNhc2UgR1M6CisJCQlyZXR2YWwgPSBjaGlsZC0+dGhyZWFkLmdzOworCQkJYnJlYWs7CisJCWNhc2UgRFM6CisJCWNhc2UgRVM6CisJCWNhc2UgU1M6CisJCWNhc2UgQ1M6CisJCQlyZXR2YWwgPSAweGZmZmY7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJZGVmYXVsdDoKKwkJCWlmIChyZWdubyA+IEdTKjQpCisJCQkJcmVnbm8gLT0gMio0OworCQkJcmVnbm8gPSByZWdubyAtIHNpemVvZihzdHJ1Y3QgcHRfcmVncyk7CisJCQlyZXR2YWwgJj0gZ2V0X3N0YWNrX2xvbmcoY2hpbGQsIHJlZ25vKTsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworI2RlZmluZSBMRFRfU0VHTUVOVCA0CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNvbnZlcnRfZWlwX3RvX2xpbmVhcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHIsIHNlZzsKKworCWFkZHIgPSByZWdzLT5laXA7CisJc2VnID0gcmVncy0+eGNzICYgMHhmZmZmOworCWlmIChyZWdzLT5lZmxhZ3MgJiBWTV9NQVNLKSB7CisJCWFkZHIgPSAoYWRkciAmIDB4ZmZmZikgKyAoc2VnIDw8IDQpOworCQlyZXR1cm4gYWRkcjsKKwl9CisKKwkvKgorCSAqIFdlJ2xsIGFzc3VtZSB0aGF0IHRoZSBjb2RlIHNlZ21lbnRzIGluIHRoZSBHRFQKKwkgKiBhcmUgYWxsIHplcm8tYmFzZWQuIFRoYXQgaXMgbGFyZ2VseSB0cnVlOiB0aGUKKwkgKiBUTFMgc2VnbWVudHMgYXJlIHVzZWQgZm9yIGRhdGEsIGFuZCB0aGUgUE5QQklPUworCSAqIGFuZCBBUE0gYmlvcyBvbmVzIHdlIGp1c3QgaWdub3JlIGhlcmUuCisJICovCisJaWYgKHNlZyAmIExEVF9TRUdNRU5UKSB7CisJCXUzMiAqZGVzYzsKKwkJdW5zaWduZWQgbG9uZyBiYXNlOworCisJCWRvd24oJmNoaWxkLT5tbS0+Y29udGV4dC5zZW0pOworCQlkZXNjID0gY2hpbGQtPm1tLT5jb250ZXh0LmxkdCArIChzZWcgJiB+Nyk7CisJCWJhc2UgPSAoZGVzY1swXSA+PiAxNikgfCAoKGRlc2NbMV0gJiAweGZmKSA8PCAxNikgfCAoZGVzY1sxXSAmIDB4ZmYwMDAwMDApOworCisJCS8qIDE2LWJpdCBjb2RlIHNlZ21lbnQ/ICovCisJCWlmICghKChkZXNjWzFdID4+IDIyKSAmIDEpKQorCQkJYWRkciAmPSAweGZmZmY7CisJCWFkZHIgKz0gYmFzZTsKKwkJdXAoJmNoaWxkLT5tbS0+Y29udGV4dC5zZW0pOworCX0KKwlyZXR1cm4gYWRkcjsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfYXRfcG9wZihzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgaSwgY29waWVkOworCXVuc2lnbmVkIGNoYXIgb3Bjb2RlWzE2XTsKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBjb252ZXJ0X2VpcF90b19saW5lYXIoY2hpbGQsIHJlZ3MpOworCisJY29waWVkID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsIG9wY29kZSwgc2l6ZW9mKG9wY29kZSksIDApOworCWZvciAoaSA9IDA7IGkgPCBjb3BpZWQ7IGkrKykgeworCQlzd2l0Y2ggKG9wY29kZVtpXSkgeworCQkvKiBwb3BmICovCisJCWNhc2UgMHg5ZDoKKwkJCXJldHVybiAxOworCQkvKiBvcGNvZGUgYW5kIGFkZHJlc3Mgc2l6ZSBwcmVmaXhlcyAqLworCQljYXNlIDB4NjY6IGNhc2UgMHg2NzoKKwkJCWNvbnRpbnVlOworCQkvKiBpcnJlbGV2YW50IHByZWZpeGVzIChzZWdtZW50IG92ZXJyaWRlcyBhbmQgcmVwZWF0cykgKi8KKwkJY2FzZSAweDI2OiBjYXNlIDB4MmU6CisJCWNhc2UgMHgzNjogY2FzZSAweDNlOgorCQljYXNlIDB4NjQ6IGNhc2UgMHg2NToKKwkJY2FzZSAweGYwOiBjYXNlIDB4ZjI6IGNhc2UgMHhmMzoKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIHB1c2hmOiBOT1RFISBXZSBzaG91bGQgcHJvYmFibHkgbm90IGxldAorCQkgKiB0aGUgdXNlciBzZWUgdGhlIFRGIGJpdCBiZWluZyBzZXQuIEJ1dAorCQkgKiBpdCdzIG1vcmUgcGFpbiB0aGFuIGl0J3Mgd29ydGggdG8gYXZvaWQKKwkJICogaXQsIGFuZCBhIGRlYnVnZ2VyIGNvdWxkIGVtdWxhdGUgdGhpcworCQkgKiBhbGwgaW4gdXNlciBzcGFjZSBpZiBpdCBfcmVhbGx5XyBjYXJlcy4KKwkJICovCisJCWNhc2UgMHg5YzoKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZXRfc2luZ2xlc3RlcChzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKQoreworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gZ2V0X2NoaWxkX3JlZ3MoY2hpbGQpOworCisJLyoKKwkgKiBBbHdheXMgc2V0IFRJRl9TSU5HTEVTVEVQIC0gdGhpcyBndWFyYW50ZWVzIHRoYXQgCisJICogd2Ugc2luZ2xlLXN0ZXAgc3lzdGVtIGNhbGxzIGV0Yy4uICBUaGlzIHdpbGwgYWxzbworCSAqIGNhdXNlIHVzIHRvIHNldCBURiB3aGVuIHJldHVybmluZyB0byB1c2VyIG1vZGUuCisJICovCisJc2V0X3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX1NJTkdMRVNURVApOworCisJLyoKKwkgKiBJZiBURiB3YXMgYWxyZWFkeSBzZXQsIGRvbid0IGRvIGFueXRoaW5nIGVsc2UKKwkgKi8KKwlpZiAocmVncy0+ZWZsYWdzICYgVFJBUF9GTEFHKQorCQlyZXR1cm47CisKKwkvKiBTZXQgVEYgb24gdGhlIGtlcm5lbCBzdGFjay4uICovCisJcmVncy0+ZWZsYWdzIHw9IFRSQVBfRkxBRzsKKworCS8qCisJICogLi5idXQgaWYgVEYgaXMgY2hhbmdlZCBieSB0aGUgaW5zdHJ1Y3Rpb24gd2Ugd2lsbCB0cmFjZSwKKwkgKiBkb24ndCBtYXJrIGl0IGFzIGJlaW5nICJ1cyIgdGhhdCBzZXQgaXQsIHNvIHRoYXQgd2UKKwkgKiB3b24ndCBjbGVhciBpdCBieSBoYW5kIGxhdGVyLgorCSAqLworCWlmIChpc19hdF9wb3BmKGNoaWxkLCByZWdzKSkKKwkJcmV0dXJuOworCQorCWNoaWxkLT5wdHJhY2UgfD0gUFRfRFRSQUNFOworfQorCitzdGF0aWMgdm9pZCBjbGVhcl9zaW5nbGVzdGVwKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpCit7CisJLyogQWx3YXlzIGNsZWFyIFRJRl9TSU5HTEVTVEVQLi4uICovCisJY2xlYXJfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfU0lOR0xFU1RFUCk7CisKKwkvKiBCdXQgdG91Y2ggVEYgb25seSBpZiBpdCB3YXMgc2V0IGJ5IHVzLi4gKi8KKwlpZiAoY2hpbGQtPnB0cmFjZSAmIFBUX0RUUkFDRSkgeworCQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGdldF9jaGlsZF9yZWdzKGNoaWxkKTsKKwkJcmVncy0+ZWZsYWdzICY9IH5UUkFQX0ZMQUc7CisJCWNoaWxkLT5wdHJhY2UgJj0gflBUX0RUUkFDRTsKKwl9Cit9CisKKy8qCisgKiBDYWxsZWQgYnkga2VybmVsL3B0cmFjZS5jIHdoZW4gZGV0YWNoaW5nLi4KKyAqCisgKiBNYWtlIHN1cmUgdGhlIHNpbmdsZSBzdGVwIGJpdCBpcyBub3Qgc2V0LgorICovCit2b2lkIHB0cmFjZV9kaXNhYmxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpCit7IAorCWNsZWFyX3NpbmdsZXN0ZXAoY2hpbGQpOworfQorCisvKgorICogUGVyZm9ybSBnZXRfdGhyZWFkX2FyZWEgb24gYmVoYWxmIG9mIHRoZSB0cmFjZWQgY2hpbGQuCisgKi8KK3N0YXRpYyBpbnQKK3B0cmFjZV9nZXRfdGhyZWFkX2FyZWEoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwKKwkJICAgICAgIGludCBpZHgsIHN0cnVjdCB1c2VyX2Rlc2MgX191c2VyICp1c2VyX2Rlc2MpCit7CisJc3RydWN0IHVzZXJfZGVzYyBpbmZvOworCXN0cnVjdCBkZXNjX3N0cnVjdCAqZGVzYzsKKworLyoKKyAqIEdldCB0aGUgY3VycmVudCBUaHJlYWQtTG9jYWwgU3RvcmFnZSBhcmVhOgorICovCisKKyNkZWZpbmUgR0VUX0JBU0UoZGVzYykgKCBcCisJKCgoZGVzYyktPmEgPj4gMTYpICYgMHgwMDAwZmZmZikgfCBcCisJKCgoZGVzYyktPmIgPDwgMTYpICYgMHgwMGZmMDAwMCkgfCBcCisJKCAoZGVzYyktPmIgICAgICAgICYgMHhmZjAwMDAwMCkgICApCisKKyNkZWZpbmUgR0VUX0xJTUlUKGRlc2MpICggXAorCSgoZGVzYyktPmEgJiAweDBmZmZmKSB8IFwKKwkgKChkZXNjKS0+YiAmIDB4ZjAwMDApICkKKworI2RlZmluZSBHRVRfMzJCSVQoZGVzYykJCSgoKGRlc2MpLT5iID4+IDIyKSAmIDEpCisjZGVmaW5lIEdFVF9DT05URU5UUyhkZXNjKQkoKChkZXNjKS0+YiA+PiAxMCkgJiAzKQorI2RlZmluZSBHRVRfV1JJVEFCTEUoZGVzYykJKCgoZGVzYyktPmIgPj4gIDkpICYgMSkKKyNkZWZpbmUgR0VUX0xJTUlUX1BBR0VTKGRlc2MpCSgoKGRlc2MpLT5iID4+IDIzKSAmIDEpCisjZGVmaW5lIEdFVF9QUkVTRU5UKGRlc2MpCSgoKGRlc2MpLT5iID4+IDE1KSAmIDEpCisjZGVmaW5lIEdFVF9VU0VBQkxFKGRlc2MpCSgoKGRlc2MpLT5iID4+IDIwKSAmIDEpCisKKwlpZiAoaWR4IDwgR0RUX0VOVFJZX1RMU19NSU4gfHwgaWR4ID4gR0RUX0VOVFJZX1RMU19NQVgpCisJCXJldHVybiAtRUlOVkFMOworCisJZGVzYyA9IGNoaWxkLT50aHJlYWQudGxzX2FycmF5ICsgaWR4IC0gR0RUX0VOVFJZX1RMU19NSU47CisKKwlpbmZvLmVudHJ5X251bWJlciA9IGlkeDsKKwlpbmZvLmJhc2VfYWRkciA9IEdFVF9CQVNFKGRlc2MpOworCWluZm8ubGltaXQgPSBHRVRfTElNSVQoZGVzYyk7CisJaW5mby5zZWdfMzJiaXQgPSBHRVRfMzJCSVQoZGVzYyk7CisJaW5mby5jb250ZW50cyA9IEdFVF9DT05URU5UUyhkZXNjKTsKKwlpbmZvLnJlYWRfZXhlY19vbmx5ID0gIUdFVF9XUklUQUJMRShkZXNjKTsKKwlpbmZvLmxpbWl0X2luX3BhZ2VzID0gR0VUX0xJTUlUX1BBR0VTKGRlc2MpOworCWluZm8uc2VnX25vdF9wcmVzZW50ID0gIUdFVF9QUkVTRU5UKGRlc2MpOworCWluZm8udXNlYWJsZSA9IEdFVF9VU0VBQkxFKGRlc2MpOworCisJaWYgKGNvcHlfdG9fdXNlcih1c2VyX2Rlc2MsICZpbmZvLCBzaXplb2YoaW5mbykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCisvKgorICogUGVyZm9ybSBzZXRfdGhyZWFkX2FyZWEgb24gYmVoYWxmIG9mIHRoZSB0cmFjZWQgY2hpbGQuCisgKi8KK3N0YXRpYyBpbnQKK3B0cmFjZV9zZXRfdGhyZWFkX2FyZWEoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwKKwkJICAgICAgIGludCBpZHgsIHN0cnVjdCB1c2VyX2Rlc2MgX191c2VyICp1c2VyX2Rlc2MpCit7CisJc3RydWN0IHVzZXJfZGVzYyBpbmZvOworCXN0cnVjdCBkZXNjX3N0cnVjdCAqZGVzYzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgdXNlcl9kZXNjLCBzaXplb2YoaW5mbykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChpZHggPCBHRFRfRU5UUllfVExTX01JTiB8fCBpZHggPiBHRFRfRU5UUllfVExTX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXNjID0gY2hpbGQtPnRocmVhZC50bHNfYXJyYXkgKyBpZHggLSBHRFRfRU5UUllfVExTX01JTjsKKwlpZiAoTERUX2VtcHR5KCZpbmZvKSkgeworCQlkZXNjLT5hID0gMDsKKwkJZGVzYy0+YiA9IDA7CisJfSBlbHNlIHsKKwkJZGVzYy0+YSA9IExEVF9lbnRyeV9hKCZpbmZvKTsKKwkJZGVzYy0+YiA9IExEVF9lbnRyeV9iKCZpbmZvKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworYXNtbGlua2FnZSBpbnQgc3lzX3B0cmFjZShsb25nIHJlcXVlc3QsIGxvbmcgcGlkLCBsb25nIGFkZHIsIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkOworCXN0cnVjdCB1c2VyICogZHVtbXkgPSBOVUxMOworCWludCBpLCByZXQ7CisJdW5zaWduZWQgbG9uZyBfX3VzZXIgKmRhdGFwID0gKHVuc2lnbmVkIGxvbmcgX191c2VyICopZGF0YTsKKworCWxvY2tfa2VybmVsKCk7CisJcmV0ID0gLUVQRVJNOworCWlmIChyZXF1ZXN0ID09IFBUUkFDRV9UUkFDRU1FKSB7CisJCS8qIGFyZSB3ZSBhbHJlYWR5IGJlaW5nIHRyYWNlZD8gKi8KKwkJaWYgKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1BUUkFDRUQpCisJCQlnb3RvIG91dDsKKwkJcmV0ID0gc2VjdXJpdHlfcHRyYWNlKGN1cnJlbnQtPnBhcmVudCwgY3VycmVudCk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwkJLyogc2V0IHRoZSBwdHJhY2UgYml0IGluIHRoZSBwcm9jZXNzIGZsYWdzLiAqLworCQljdXJyZW50LT5wdHJhY2UgfD0gUFRfUFRSQUNFRDsKKwkJcmV0ID0gMDsKKwkJZ290byBvdXQ7CisJfQorCXJldCA9IC1FU1JDSDsKKwlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCWNoaWxkID0gZmluZF90YXNrX2J5X3BpZChwaWQpOworCWlmIChjaGlsZCkKKwkJZ2V0X3Rhc2tfc3RydWN0KGNoaWxkKTsKKwlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CisJaWYgKCFjaGlsZCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSAtRVBFUk07CisJaWYgKHBpZCA9PSAxKQkJLyogeW91IG1heSBub3QgbWVzcyB3aXRoIGluaXQgKi8KKwkJZ290byBvdXRfdHNrOworCisJaWYgKHJlcXVlc3QgPT0gUFRSQUNFX0FUVEFDSCkgeworCQlyZXQgPSBwdHJhY2VfYXR0YWNoKGNoaWxkKTsKKwkJZ290byBvdXRfdHNrOworCX0KKworCXJldCA9IHB0cmFjZV9jaGVja19hdHRhY2goY2hpbGQsIHJlcXVlc3QgPT0gUFRSQUNFX0tJTEwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dF90c2s7CisKKwlzd2l0Y2ggKHJlcXVlc3QpIHsKKwkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGVzZSB3aWxsIG5lZWQgdG8gYmUgZml4ZWQuICovCisJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6IC8qIHJlYWQgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLyAKKwljYXNlIFBUUkFDRV9QRUVLREFUQTogeworCQl1bnNpZ25lZCBsb25nIHRtcDsKKwkJaW50IGNvcGllZDsKKworCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOworCQlyZXQgPSAtRUlPOworCQlpZiAoY29waWVkICE9IHNpemVvZih0bXApKQorCQkJYnJlYWs7CisJCXJldCA9IHB1dF91c2VyKHRtcCwgZGF0YXApOworCQlicmVhazsKKwl9CisKKwkvKiByZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYS4gKi8KKwljYXNlIFBUUkFDRV9QRUVLVVNSOiB7CisJCXVuc2lnbmVkIGxvbmcgdG1wOworCisJCXJldCA9IC1FSU87CisJCWlmICgoYWRkciAmIDMpIHx8IGFkZHIgPCAwIHx8IAorCQkgICAgYWRkciA+IHNpemVvZihzdHJ1Y3QgdXNlcikgLSAzKQorCQkJYnJlYWs7CisKKwkJdG1wID0gMDsgIC8qIERlZmF1bHQgcmV0dXJuIGNvbmRpdGlvbiAqLworCQlpZihhZGRyIDwgRlJBTUVfU0laRSpzaXplb2YobG9uZykpCisJCQl0bXAgPSBnZXRyZWcoY2hpbGQsIGFkZHIpOworCQlpZihhZGRyID49IChsb25nKSAmZHVtbXktPnVfZGVidWdyZWdbMF0gJiYKKwkJICAgYWRkciA8PSAobG9uZykgJmR1bW15LT51X2RlYnVncmVnWzddKXsKKwkJCWFkZHIgLT0gKGxvbmcpICZkdW1teS0+dV9kZWJ1Z3JlZ1swXTsKKwkJCWFkZHIgPSBhZGRyID4+IDI7CisJCQl0bXAgPSBjaGlsZC0+dGhyZWFkLmRlYnVncmVnW2FkZHJdOworCQl9CisJCXJldCA9IHB1dF91c2VyKHRtcCwgZGF0YXApOworCQlicmVhazsKKwl9CisKKwkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGlzIHdpbGwgaGF2ZSB0byBiZSBmaXhlZC4gKi8KKwljYXNlIFBUUkFDRV9QT0tFVEVYVDogLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KKwljYXNlIFBUUkFDRV9QT0tFREFUQToKKwkJcmV0ID0gMDsKKwkJaWYgKGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmZGF0YSwgc2l6ZW9mKGRhdGEpLCAxKSA9PSBzaXplb2YoZGF0YSkpCisJCQlicmVhazsKKwkJcmV0ID0gLUVJTzsKKwkJYnJlYWs7CisKKwljYXNlIFBUUkFDRV9QT0tFVVNSOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEgKi8KKwkJcmV0ID0gLUVJTzsKKwkJaWYgKChhZGRyICYgMykgfHwgYWRkciA8IDAgfHwgCisJCSAgICBhZGRyID4gc2l6ZW9mKHN0cnVjdCB1c2VyKSAtIDMpCisJCQlicmVhazsKKworCQlpZiAoYWRkciA8IEZSQU1FX1NJWkUqc2l6ZW9mKGxvbmcpKSB7CisJCQlyZXQgPSBwdXRyZWcoY2hpbGQsIGFkZHIsIGRhdGEpOworCQkJYnJlYWs7CisJCX0KKwkJLyogV2UgbmVlZCB0byBiZSB2ZXJ5IGNhcmVmdWwgaGVyZS4gIFdlIGltcGxpY2l0bHkKKwkJICAgd2FudCB0byBtb2RpZnkgYSBwb3J0aW9uIG9mIHRoZSB0YXNrX3N0cnVjdCwgYW5kIHdlCisJCSAgIGhhdmUgdG8gYmUgc2VsZWN0aXZlIGFib3V0IHdoYXQgcG9ydGlvbnMgd2UgYWxsb3cgc29tZW9uZQorCQkgICB0byBtb2RpZnkuICovCisKKwkJICByZXQgPSAtRUlPOworCQkgIGlmKGFkZHIgPj0gKGxvbmcpICZkdW1teS0+dV9kZWJ1Z3JlZ1swXSAmJgorCQkgICAgIGFkZHIgPD0gKGxvbmcpICZkdW1teS0+dV9kZWJ1Z3JlZ1s3XSl7CisKKwkJCSAgaWYoYWRkciA9PSAobG9uZykgJmR1bW15LT51X2RlYnVncmVnWzRdKSBicmVhazsKKwkJCSAgaWYoYWRkciA9PSAobG9uZykgJmR1bW15LT51X2RlYnVncmVnWzVdKSBicmVhazsKKwkJCSAgaWYoYWRkciA8IChsb25nKSAmZHVtbXktPnVfZGVidWdyZWdbNF0gJiYKKwkJCSAgICAgKCh1bnNpZ25lZCBsb25nKSBkYXRhKSA+PSBUQVNLX1NJWkUtMykgYnJlYWs7CisJCQkgIAorCQkJICAvKiBTYW5pdHktY2hlY2sgZGF0YS4gVGFrZSBvbmUgaGFsZi1ieXRlIGF0IG9uY2Ugd2l0aAorCQkJICAgKiBjaGVjayA9ICh2YWwgPj4gKDE2ICsgNCppKSkgJiAweGYuIEl0IGNvbnRhaW5zIHRoZQorCQkJICAgKiBSL1dpIGFuZCBMRU5pIGJpdHM7IGJpdHMgMCBhbmQgMSBhcmUgUi9XaSwgYW5kIGJpdHMKKwkJCSAgICogMiBhbmQgMyBhcmUgTEVOaS4gR2l2ZW4gYSBsaXN0IG9mIGludmFsaWQgdmFsdWVzLAorCQkJICAgKiB3ZSBkbyBtYXNrIHw9IDEgPDwgaW52YWxpZF92YWx1ZSwgc28gdGhhdAorCQkJICAgKiAobWFzayA+PiBjaGVjaykgJiAxIGlzIGEgY29ycmVjdCB0ZXN0IGZvciBpbnZhbGlkCisJCQkgICAqIHZhbHVlcy4KKwkJCSAgICoKKwkJCSAgICogUi9XaSBjb250YWlucyB0aGUgdHlwZSBvZiB0aGUgYnJlYWtwb2ludCAvCisJCQkgICAqIHdhdGNocG9pbnQsIExFTmkgY29udGFpbnMgdGhlIGxlbmd0aCBvZiB0aGUgd2F0Y2hlZAorCQkJICAgKiBkYXRhIGluIHRoZSB3YXRjaHBvaW50IGNhc2UuCisJCQkgICAqCisJCQkgICAqIFRoZSBpbnZhbGlkIHZhbHVlcyBhcmU6CisJCQkgICAqIC0gTEVOaSA9PSAweDEwICh1bmRlZmluZWQpLCBzbyBtYXNrIHw9IDB4MGYwMC4KKwkJCSAgICogLSBSL1dpID09IDB4MTAgKGJyZWFrIG9uIEkvTyByZWFkcyBvciB3cml0ZXMpLCBzbworCQkJICAgKiAgIG1hc2sgfD0gMHg0NDQ0LgorCQkJICAgKiAtIFIvV2kgPT0gMHgwMCAmJiBMRU5pICE9IDB4MDAsIHNvIHdlIGhhdmUgbWFzayB8PQorCQkJICAgKiAgIDB4MTExMC4KKwkJCSAgICoKKwkJCSAgICogRmluYWxseSwgbWFzayA9IDB4MGYwMCB8IDB4NDQ0NCB8IDB4MTExMCA9PSAweDVmNTQuCisJCQkgICAqCisJCQkgICAqIFNlZSB0aGUgSW50ZWwgTWFudWFsICJTeXN0ZW0gUHJvZ3JhbW1pbmcgR3VpZGUiLAorCQkJICAgKiAxNS4yLjQKKwkJCSAgICoKKwkJCSAgICogTm90ZSB0aGF0IExFTmkgPT0gMHgxMCBpcyBkZWZpbmVkIG9uIHg4Nl82NCBpbiBsb25nCisJCQkgICAqIG1vZGUgKGkuZS4gZXZlbiBmb3IgMzItYml0IHVzZXJzcGFjZSBzb2Z0d2FyZSwgYnV0CisJCQkgICAqIDY0LWJpdCBrZXJuZWwpLCBzbyB0aGUgeDg2XzY0IG1hc2sgdmFsdWUgaXMgMHg1NDU0LgorCQkJICAgKiBTZWUgdGhlIEFNRCBtYW51YWwgbm8uIDI0NTkzIChBTUQ2NCBTeXN0ZW0KKwkJCSAgICogUHJvZ3JhbW1pbmcpKi8KKworCQkJICBpZihhZGRyID09IChsb25nKSAmZHVtbXktPnVfZGVidWdyZWdbN10pIHsKKwkJCQkgIGRhdGEgJj0gfkRSX0NPTlRST0xfUkVTRVJWRUQ7CisJCQkJICBmb3IoaT0wOyBpPDQ7IGkrKykKKwkJCQkJICBpZiAoKDB4NWY1NCA+PiAoKGRhdGEgPj4gKDE2ICsgNCppKSkgJiAweGYpKSAmIDEpCisJCQkJCQkgIGdvdG8gb3V0X3RzazsKKwkJCSAgfQorCisJCQkgIGFkZHIgLT0gKGxvbmcpICZkdW1teS0+dV9kZWJ1Z3JlZzsKKwkJCSAgYWRkciA9IGFkZHIgPj4gMjsKKwkJCSAgY2hpbGQtPnRocmVhZC5kZWJ1Z3JlZ1thZGRyXSA9IGRhdGE7CisJCQkgIHJldCA9IDA7CisJCSAgfQorCQkgIGJyZWFrOworCisJY2FzZSBQVFJBQ0VfU1lTQ0FMTDoJLyogY29udGludWUgYW5kIHN0b3AgYXQgbmV4dCAocmV0dXJuIGZyb20pIHN5c2NhbGwgKi8KKwljYXNlIFBUUkFDRV9DT05UOgkvKiByZXN0YXJ0IGFmdGVyIHNpZ25hbC4gKi8KKwkJcmV0ID0gLUVJTzsKKwkJaWYgKCh1bnNpZ25lZCBsb25nKSBkYXRhID4gX05TSUcpCisJCQlicmVhazsKKwkJaWYgKHJlcXVlc3QgPT0gUFRSQUNFX1NZU0NBTEwpIHsKKwkJCXNldF90c2tfdGhyZWFkX2ZsYWcoY2hpbGQsIFRJRl9TWVNDQUxMX1RSQUNFKTsKKwkJfQorCQllbHNlIHsKKwkJCWNsZWFyX3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX1NZU0NBTExfVFJBQ0UpOworCQl9CisJCWNoaWxkLT5leGl0X2NvZGUgPSBkYXRhOworCQkvKiBtYWtlIHN1cmUgdGhlIHNpbmdsZSBzdGVwIGJpdCBpcyBub3Qgc2V0LiAqLworCQljbGVhcl9zaW5nbGVzdGVwKGNoaWxkKTsKKwkJd2FrZV91cF9wcm9jZXNzKGNoaWxkKTsKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisKKy8qCisgKiBtYWtlIHRoZSBjaGlsZCBleGl0LiAgQmVzdCBJIGNhbiBkbyBpcyBzZW5kIGl0IGEgc2lna2lsbC4gCisgKiBwZXJoYXBzIGl0IHNob3VsZCBiZSBwdXQgaW4gdGhlIHN0YXR1cyB0aGF0IGl0IHdhbnRzIHRvIAorICogZXhpdC4KKyAqLworCWNhc2UgUFRSQUNFX0tJTEw6CisJCXJldCA9IDA7CisJCWlmIChjaGlsZC0+ZXhpdF9zdGF0ZSA9PSBFWElUX1pPTUJJRSkJLyogYWxyZWFkeSBkZWFkICovCisJCQlicmVhazsKKwkJY2hpbGQtPmV4aXRfY29kZSA9IFNJR0tJTEw7CisJCS8qIG1ha2Ugc3VyZSB0aGUgc2luZ2xlIHN0ZXAgYml0IGlzIG5vdCBzZXQuICovCisJCWNsZWFyX3NpbmdsZXN0ZXAoY2hpbGQpOworCQl3YWtlX3VwX3Byb2Nlc3MoY2hpbGQpOworCQlicmVhazsKKworCWNhc2UgUFRSQUNFX1NJTkdMRVNURVA6CS8qIHNldCB0aGUgdHJhcCBmbGFnLiAqLworCQlyZXQgPSAtRUlPOworCQlpZiAoKHVuc2lnbmVkIGxvbmcpIGRhdGEgPiBfTlNJRykKKwkJCWJyZWFrOworCQljbGVhcl90c2tfdGhyZWFkX2ZsYWcoY2hpbGQsIFRJRl9TWVNDQUxMX1RSQUNFKTsKKwkJc2V0X3NpbmdsZXN0ZXAoY2hpbGQpOworCQljaGlsZC0+ZXhpdF9jb2RlID0gZGF0YTsKKwkJLyogZ2l2ZSBpdCBhIGNoYW5jZSB0byBydW4uICovCisJCXdha2VfdXBfcHJvY2VzcyhjaGlsZCk7CisJCXJldCA9IDA7CisJCWJyZWFrOworCisJY2FzZSBQVFJBQ0VfREVUQUNIOgorCQkvKiBkZXRhY2ggYSBwcm9jZXNzIHRoYXQgd2FzIGF0dGFjaGVkLiAqLworCQlyZXQgPSBwdHJhY2VfZGV0YWNoKGNoaWxkLCBkYXRhKTsKKwkJYnJlYWs7CisKKwljYXNlIFBUUkFDRV9HRVRSRUdTOiB7IC8qIEdldCBhbGwgZ3AgcmVncyBmcm9tIHRoZSBjaGlsZC4gKi8KKwkgIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGRhdGFwLCBGUkFNRV9TSVpFKnNpemVvZihsb25nKSkpIHsKKwkJCXJldCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQlmb3IgKCBpID0gMDsgaSA8IEZSQU1FX1NJWkUqc2l6ZW9mKGxvbmcpOyBpICs9IHNpemVvZihsb25nKSApIHsKKwkJCV9fcHV0X3VzZXIoZ2V0cmVnKGNoaWxkLCBpKSwgZGF0YXApOworCQkJZGF0YXArKzsKKwkJfQorCQlyZXQgPSAwOworCQlicmVhazsKKwl9CisKKwljYXNlIFBUUkFDRV9TRVRSRUdTOiB7IC8qIFNldCBhbGwgZ3AgcmVncyBpbiB0aGUgY2hpbGQuICovCisJCXVuc2lnbmVkIGxvbmcgdG1wOworCSAgCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBkYXRhcCwgRlJBTUVfU0laRSpzaXplb2YobG9uZykpKSB7CisJCQlyZXQgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKwkJZm9yICggaSA9IDA7IGkgPCBGUkFNRV9TSVpFKnNpemVvZihsb25nKTsgaSArPSBzaXplb2YobG9uZykgKSB7CisJCQlfX2dldF91c2VyKHRtcCwgZGF0YXApOworCQkJcHV0cmVnKGNoaWxkLCBpLCB0bXApOworCQkJZGF0YXArKzsKKwkJfQorCQlyZXQgPSAwOworCQlicmVhazsKKwl9CisKKwljYXNlIFBUUkFDRV9HRVRGUFJFR1M6IHsgLyogR2V0IHRoZSBjaGlsZCBGUFUgc3RhdGUuICovCisJCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZGF0YXAsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB1c2VyX2kzODdfc3RydWN0KSkpIHsKKwkJCXJldCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQlyZXQgPSAwOworCQlpZiAoIXRza191c2VkX21hdGgoY2hpbGQpKQorCQkJaW5pdF9mcHUoY2hpbGQpOworCQlnZXRfZnByZWdzKChzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCBfX3VzZXIgKilkYXRhLCBjaGlsZCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgUFRSQUNFX1NFVEZQUkVHUzogeyAvKiBTZXQgdGhlIGNoaWxkIEZQVSBzdGF0ZS4gKi8KKwkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGRhdGFwLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCkpKSB7CisJCQlyZXQgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKwkJc2V0X3N0b3BwZWRfY2hpbGRfdXNlZF9tYXRoKGNoaWxkKTsKKwkJc2V0X2ZwcmVncyhjaGlsZCwgKHN0cnVjdCB1c2VyX2kzODdfc3RydWN0IF9fdXNlciAqKWRhdGEpOworCQlyZXQgPSAwOworCQlicmVhazsKKwl9CisKKwljYXNlIFBUUkFDRV9HRVRGUFhSRUdTOiB7IC8qIEdldCB0aGUgY2hpbGQgZXh0ZW5kZWQgRlBVIHN0YXRlLiAqLworCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGRhdGFwLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgdXNlcl9meHNyX3N0cnVjdCkpKSB7CisJCQlyZXQgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCF0c2tfdXNlZF9tYXRoKGNoaWxkKSkKKwkJCWluaXRfZnB1KGNoaWxkKTsKKwkJcmV0ID0gZ2V0X2ZweHJlZ3MoKHN0cnVjdCB1c2VyX2Z4c3Jfc3RydWN0IF9fdXNlciAqKWRhdGEsIGNoaWxkKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBQVFJBQ0VfU0VURlBYUkVHUzogeyAvKiBTZXQgdGhlIGNoaWxkIGV4dGVuZGVkIEZQVSBzdGF0ZS4gKi8KKwkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGRhdGFwLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgdXNlcl9meHNyX3N0cnVjdCkpKSB7CisJCQlyZXQgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKwkJc2V0X3N0b3BwZWRfY2hpbGRfdXNlZF9tYXRoKGNoaWxkKTsKKwkJcmV0ID0gc2V0X2ZweHJlZ3MoY2hpbGQsIChzdHJ1Y3QgdXNlcl9meHNyX3N0cnVjdCBfX3VzZXIgKilkYXRhKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBQVFJBQ0VfR0VUX1RIUkVBRF9BUkVBOgorCQlyZXQgPSBwdHJhY2VfZ2V0X3RocmVhZF9hcmVhKGNoaWxkLCBhZGRyLAorCQkJCQkoc3RydWN0IHVzZXJfZGVzYyBfX3VzZXIgKikgZGF0YSk7CisJCWJyZWFrOworCisJY2FzZSBQVFJBQ0VfU0VUX1RIUkVBRF9BUkVBOgorCQlyZXQgPSBwdHJhY2Vfc2V0X3RocmVhZF9hcmVhKGNoaWxkLCBhZGRyLAorCQkJCQkoc3RydWN0IHVzZXJfZGVzYyBfX3VzZXIgKikgZGF0YSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0ID0gcHRyYWNlX3JlcXVlc3QoY2hpbGQsIHJlcXVlc3QsIGFkZHIsIGRhdGEpOworCQlicmVhazsKKwl9CitvdXRfdHNrOgorCXB1dF90YXNrX3N0cnVjdChjaGlsZCk7CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgc2VuZF9zaWd0cmFwKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGVycm9yX2NvZGUpCit7CisJc3RydWN0IHNpZ2luZm8gaW5mbzsKKworCXRzay0+dGhyZWFkLnRyYXBfbm8gPSAxOworCXRzay0+dGhyZWFkLmVycm9yX2NvZGUgPSBlcnJvcl9jb2RlOworCisJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworCWluZm8uc2lfc2lnbm8gPSBTSUdUUkFQOworCWluZm8uc2lfY29kZSA9IFRSQVBfQlJLUFQ7CisKKwkvKiBVc2VyLW1vZGUgZWlwPyAqLworCWluZm8uc2lfYWRkciA9IHVzZXJfbW9kZShyZWdzKSA/ICh2b2lkIF9fdXNlciAqKSByZWdzLT5laXAgOiBOVUxMOworCisJLyogU2VuZCB1cyB0aGUgZmFrZXkgU0lHVFJBUCAqLworCWZvcmNlX3NpZ19pbmZvKFNJR1RSQVAsICZpbmZvLCB0c2spOworfQorCisvKiBub3RpZmljYXRpb24gb2Ygc3lzdGVtIGNhbGwgZW50cnkvZXhpdAorICogLSB0cmlnZ2VyZWQgYnkgY3VycmVudC0+d29yay5zeXNjYWxsX3RyYWNlCisgKi8KK19fYXR0cmlidXRlX18oKHJlZ3Bhcm0oMykpKQordm9pZCBkb19zeXNjYWxsX3RyYWNlKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgZW50cnlleGl0KQoreworCS8qIGRvIHRoZSBzZWN1cmUgY29tcHV0aW5nIGNoZWNrIGZpcnN0ICovCisJc2VjdXJlX2NvbXB1dGluZyhyZWdzLT5vcmlnX2VheCk7CisKKwlpZiAodW5saWtlbHkoY3VycmVudC0+YXVkaXRfY29udGV4dCkpIHsKKwkJaWYgKCFlbnRyeWV4aXQpCisJCQlhdWRpdF9zeXNjYWxsX2VudHJ5KGN1cnJlbnQsIHJlZ3MtPm9yaWdfZWF4LAorCQkJCQkgICAgcmVncy0+ZWJ4LCByZWdzLT5lY3gsCisJCQkJCSAgICByZWdzLT5lZHgsIHJlZ3MtPmVzaSk7CisJCWVsc2UKKwkJCWF1ZGl0X3N5c2NhbGxfZXhpdChjdXJyZW50LCByZWdzLT5lYXgpOworCX0KKworCWlmICghKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1BUUkFDRUQpKQorCQlyZXR1cm47CisKKwkvKiBGYWtlIGEgZGVidWcgdHJhcCAqLworCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9TSU5HTEVTVEVQKSkKKwkJc2VuZF9zaWd0cmFwKGN1cnJlbnQsIHJlZ3MsIDApOworCisJaWYgKCF0ZXN0X3RocmVhZF9mbGFnKFRJRl9TWVNDQUxMX1RSQUNFKSkKKwkJcmV0dXJuOworCisJLyogdGhlIDB4ODAgcHJvdmlkZXMgYSB3YXkgZm9yIHRoZSB0cmFjaW5nIHBhcmVudCB0byBkaXN0aW5ndWlzaAorCSAgIGJldHdlZW4gYSBzeXNjYWxsIHN0b3AgYW5kIFNJR1RSQVAgZGVsaXZlcnkgKi8KKwlwdHJhY2Vfbm90aWZ5KFNJR1RSQVAgfCAoKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1RSQUNFU1lTR09PRCkgPyAweDgwIDogMCkpOworCisJLyoKKwkgKiB0aGlzIGlzbid0IHRoZSBzYW1lIGFzIGNvbnRpbnVpbmcgd2l0aCBhIHNpZ25hbCwgYnV0IGl0IHdpbGwgZG8KKwkgKiBmb3Igbm9ybWFsIHVzZS4gIHN0cmFjZSBvbmx5IGNvbnRpbnVlcyB3aXRoIGEgc2lnbmFsIGlmIHRoZQorCSAqIHN0b3BwaW5nIHNpZ25hbCBpcyBub3QgU0lHVFJBUC4gIC1icmwKKwkgKi8KKwlpZiAoY3VycmVudC0+ZXhpdF9jb2RlKSB7CisJCXNlbmRfc2lnKGN1cnJlbnQtPmV4aXRfY29kZSwgY3VycmVudCwgMSk7CisJCWN1cnJlbnQtPmV4aXRfY29kZSA9IDA7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9xdWlya3MuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvcXVpcmtzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFmODljYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvcXVpcmtzLmMKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB3b3JrLWFyb3VuZHMgZm9yIHg4NiBhbmQgeDg2XzY0IHBsYXRmb3JtIGJ1Z3MuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX1g4Nl9JT19BUElDKSAmJiBkZWZpbmVkKENPTkZJR19TTVApICYmIGRlZmluZWQoQ09ORklHX1BDSSkKKworc3RhdGljIHZvaWQgX19kZXZpbml0IHF1aXJrX2ludGVsX2lycWJhbGFuY2Uoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwl1OCBjb25maWcsIHJldjsKKwl1MzIgd29yZDsKKworCS8qIEJJT1MgbWF5IGVuYWJsZSBoYXJkd2FyZSBJUlEgYmFsYW5jaW5nIGZvcgorCSAqIEU3NTIwL0U3MzIwL0U3NTI1KHJldmlzaW9uIElEIDB4OSBhbmQgYmVsb3cpCisJICogYmFzZWQgcGxhdGZvcm1zLgorCSAqIERpc2FibGUgU1cgaXJxYmFsYW5jZS9hZmZpbml0eSBvbiB0aG9zZSBwbGF0Zm9ybXMuCisJICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfQ0xBU1NfUkVWSVNJT04sICZyZXYpOworCWlmIChyZXYgPiAweDkpCisJCXJldHVybjsKKworCXByaW50ayhLRVJOX0lORk8gIkludGVsIEU3NTIwLzczMjAvNzUyNSBkZXRlY3RlZC4iKTsKKworCS8qIGVuYWJsZSBhY2Nlc3MgdG8gY29uZmlnIHNwYWNlKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4ZjQsICZjb25maWcpOworCWNvbmZpZyB8PSAweDI7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHhmNCwgY29uZmlnKTsKKworCS8qIHJlYWQgeFRQUiByZWdpc3RlciAqLworCXJhd19wY2lfb3BzLT5yZWFkKDAsIDAsIDB4NDAsIDB4NGMsIDIsICZ3b3JkKTsKKworCWlmICghKHdvcmQgJiAoMSA8PCAxMykpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIkRpc2FibGluZyBpcnEgYmFsYW5jaW5nIGFuZCBhZmZpbml0eVxuIik7CisjaWZkZWYgQ09ORklHX0lSUUJBTEFOQ0UKKwkJaXJxYmFsYW5jZV9kaXNhYmxlKCIiKTsKKyNlbmRpZgorCQlub2lycWRlYnVnX3NldHVwKCIiKTsKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCQlub19pcnFfYWZmaW5pdHkgPSAxOworI2VuZGlmCisJfQorCisJY29uZmlnICY9IH4weDI7CisJLyogZGlzYWJsZSBhY2Nlc3MgdG8gY29uZmlnIHNwYWNlKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweGY0LCBjb25maWcpOworfQorREVDTEFSRV9QQ0lfRklYVVBfRklOQUwoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9FNzMyMF9NQ0gsCXF1aXJrX2ludGVsX2lycWJhbGFuY2UpOworREVDTEFSRV9QQ0lfRklYVVBfRklOQUwoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9FNzUyNV9NQ0gsCXF1aXJrX2ludGVsX2lycWJhbGFuY2UpOworREVDTEFSRV9QQ0lfRklYVVBfRklOQUwoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9FNzUyMF9NQ0gsCXF1aXJrX2ludGVsX2lycWJhbGFuY2UpOworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3JlYm9vdC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9yZWJvb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDdlOTk0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9yZWJvb3QuYwpAQCAtMCwwICsxLDM4MiBAQAorLyoKKyAqICBsaW51eC9hcmNoL2kzODYva2VybmVsL3JlYm9vdC5jCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9lZmkuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9hcGljLmg+CisjaW5jbHVkZSAibWFjaF9yZWJvb3QuaCIKKworLyoKKyAqIFBvd2VyIG9mZiBmdW5jdGlvbiwgaWYgYW55CisgKi8KK3ZvaWQgKCpwbV9wb3dlcl9vZmYpKHZvaWQpOworCitzdGF0aWMgaW50IHJlYm9vdF9tb2RlOworc3RhdGljIGludCByZWJvb3RfdGhydV9iaW9zOworCisjaWZkZWYgQ09ORklHX1NNUAoraW50IHJlYm9vdF9zbXAgPSAwOworc3RhdGljIGludCByZWJvb3RfY3B1ID0gLTE7CisvKiBzaGFtZWxlc3NseSBncmFiYmVkIGZyb20gbGliL3ZzcHJpbnRmLmMgZm9yIHJlYWRhYmlsaXR5ICovCisjZGVmaW5lIGlzX2RpZ2l0KGMpCSgoYykgPj0gJzAnICYmIChjKSA8PSAnOScpCisjZW5kaWYKK3N0YXRpYyBpbnQgX19pbml0IHJlYm9vdF9zZXR1cChjaGFyICpzdHIpCit7CisJd2hpbGUoMSkgeworCQlzd2l0Y2ggKCpzdHIpIHsKKwkJY2FzZSAndyc6IC8qICJ3YXJtIiByZWJvb3QgKG5vIG1lbW9yeSB0ZXN0aW5nIGV0YykgKi8KKwkJCXJlYm9vdF9tb2RlID0gMHgxMjM0OworCQkJYnJlYWs7CisJCWNhc2UgJ2MnOiAvKiAiY29sZCIgcmVib290ICh3aXRoIG1lbW9yeSB0ZXN0aW5nIGV0YykgKi8KKwkJCXJlYm9vdF9tb2RlID0gMHgwOworCQkJYnJlYWs7CisJCWNhc2UgJ2InOiAvKiAiYmlvcyIgcmVib290IGJ5IGp1bXBpbmcgdGhyb3VnaCB0aGUgQklPUyAqLworCQkJcmVib290X3RocnVfYmlvcyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnaCc6IC8qICJoYXJkIiByZWJvb3QgYnkgdG9nZ2xpbmcgUkVTRVQgYW5kL29yIGNyYXNoaW5nIHRoZSBDUFUgKi8KKwkJCXJlYm9vdF90aHJ1X2Jpb3MgPSAwOworCQkJYnJlYWs7CisjaWZkZWYgQ09ORklHX1NNUAorCQljYXNlICdzJzogLyogInNtcCIgcmVib290IGJ5IGV4ZWN1dGluZyByZXNldCBvbiBCU1Agb3Igb3RoZXIgQ1BVKi8KKwkJCXJlYm9vdF9zbXAgPSAxOworCQkJaWYgKGlzX2RpZ2l0KCooc3RyKzEpKSkgeworCQkJCXJlYm9vdF9jcHUgPSAoaW50KSAoKihzdHIrMSkgLSAnMCcpOworCQkJCWlmIChpc19kaWdpdCgqKHN0cisyKSkpIAorCQkJCQlyZWJvb3RfY3B1ID0gcmVib290X2NwdSoxMCArIChpbnQpKCooc3RyKzIpIC0gJzAnKTsKKwkJCX0KKwkJCQkvKiB3ZSB3aWxsIGxlYXZlIHNvcnRpbmcgb3V0IHRoZSBmaW5hbCB2YWx1ZSAKKwkJCQl3aGVuIHdlIGFyZSByZWFkeSB0byByZWJvb3QsIHNpbmNlIHdlIG1pZ2h0IG5vdAorIAkJCQloYXZlIHNldCB1cCBib290X2NwdV9pZCBvciBzbXBfbnVtX2NwdSAqLworCQkJYnJlYWs7CisjZW5kaWYKKwkJfQorCQlpZigoc3RyID0gc3RyY2hyKHN0ciwnLCcpKSAhPSBOVUxMKQorCQkJc3RyKys7CisJCWVsc2UKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgicmVib290PSIsIHJlYm9vdF9zZXR1cCk7CisKKy8qCisgKiBSZWJvb3Qgb3B0aW9ucyBhbmQgc3lzdGVtIGF1dG8tZGV0ZWN0aW9uIGNvZGUgcHJvdmlkZWQgYnkKKyAqIERlbGwgSW5jLiBzbyB0aGVpciBzeXN0ZW1zICJqdXN0IHdvcmsiLiA6LSkKKyAqLworCisvKgorICogU29tZSBtYWNoaW5lcyByZXF1aXJlIHRoZSAicmVib290PWIiICBjb21tYW5kbGluZSBvcHRpb24sIHRoaXMgcXVpcmsgbWFrZXMgdGhhdCBhdXRvbWF0aWMuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHNldF9iaW9zX3JlYm9vdChzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZCkKK3sKKwlpZiAoIXJlYm9vdF90aHJ1X2Jpb3MpIHsKKwkJcmVib290X3RocnVfYmlvcyA9IDE7CisJCXByaW50ayhLRVJOX0lORk8gIiVzIHNlcmllcyBib2FyZCBkZXRlY3RlZC4gU2VsZWN0aW5nIEJJT1MtbWV0aG9kIGZvciByZWJvb3RzLlxuIiwgZC0+aWRlbnQpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNvbWUgbWFjaGluZXMgcmVxdWlyZSB0aGUgInJlYm9vdD1zIiAgY29tbWFuZGxpbmUgb3B0aW9uLCB0aGlzIHF1aXJrIG1ha2VzIHRoYXQgYXV0b21hdGljLgorICovCitzdGF0aWMgaW50IF9faW5pdCBzZXRfc21wX3JlYm9vdChzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZCkKK3sKKyNpZmRlZiBDT05GSUdfU01QCisJaWYgKCFyZWJvb3Rfc21wKSB7CisJCXJlYm9vdF9zbXAgPSAxOworCQlwcmludGsoS0VSTl9JTkZPICIlcyBzZXJpZXMgYm9hcmQgZGV0ZWN0ZWQuIFNlbGVjdGluZyBTTVAtbWV0aG9kIGZvciByZWJvb3RzLlxuIiwgZC0+aWRlbnQpOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKgorICogU29tZSBtYWNoaW5lcyByZXF1aXJlIHRoZSAicmVib290PWIscyIgIGNvbW1hbmRsaW5lIG9wdGlvbiwgdGhpcyBxdWlyayBtYWtlcyB0aGF0IGF1dG9tYXRpYy4KKyAqLworc3RhdGljIGludCBfX2luaXQgc2V0X3NtcF9iaW9zX3JlYm9vdChzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZCkKK3sKKwlzZXRfc21wX3JlYm9vdChkKTsKKwlzZXRfYmlvc19yZWJvb3QoZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBfX2luaXRkYXRhIHJlYm9vdF9kbWlfdGFibGVbXSA9IHsKKwl7CS8qIEhhbmRsZSBwcm9ibGVtcyB3aXRoIHJlYm9vdGluZyBvbiBEZWxsIDEzMDAncyAqLworCQkuY2FsbGJhY2sgPSBzZXRfc21wX2Jpb3NfcmVib290LAorCQkuaWRlbnQgPSAiRGVsbCBQb3dlckVkZ2UgMTMwMCIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBDb21wdXRlciBDb3Jwb3JhdGlvbiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJQb3dlckVkZ2UgMTMwMC8iKSwKKwkJfSwKKwl9LAorCXsJLyogSGFuZGxlIHByb2JsZW1zIHdpdGggcmVib290aW5nIG9uIERlbGwgMzAwJ3MgKi8KKwkJLmNhbGxiYWNrID0gc2V0X2Jpb3NfcmVib290LAorCQkuaWRlbnQgPSAiRGVsbCBQb3dlckVkZ2UgMzAwIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIENvbXB1dGVyIENvcnBvcmF0aW9uIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlBvd2VyRWRnZSAzMDAvIiksCisJCX0sCisJfSwKKwl7CS8qIEhhbmRsZSBwcm9ibGVtcyB3aXRoIHJlYm9vdGluZyBvbiBEZWxsIDI0MDAncyAqLworCQkuY2FsbGJhY2sgPSBzZXRfYmlvc19yZWJvb3QsCisJCS5pZGVudCA9ICJEZWxsIFBvd2VyRWRnZSAyNDAwIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIENvbXB1dGVyIENvcnBvcmF0aW9uIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlBvd2VyRWRnZSAyNDAwIiksCisJCX0sCisJfSwKKwl7IH0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IHJlYm9vdF9pbml0KHZvaWQpCit7CisJZG1pX2NoZWNrX3N5c3RlbShyZWJvb3RfZG1pX3RhYmxlKTsKKwlyZXR1cm4gMDsKK30KKworY29yZV9pbml0Y2FsbChyZWJvb3RfaW5pdCk7CisKKy8qIFRoZSBmb2xsb3dpbmcgY29kZSBhbmQgZGF0YSByZWJvb3RzIHRoZSBtYWNoaW5lIGJ5IHN3aXRjaGluZyB0byByZWFsCisgICBtb2RlIGFuZCBqdW1waW5nIHRvIHRoZSBCSU9TIHJlc2V0IGVudHJ5IHBvaW50LCBhcyBpZiB0aGUgQ1BVIGhhcworICAgcmVhbGx5IGJlZW4gcmVzZXQuICBUaGUgcHJldmlvdXMgdmVyc2lvbiBhc2tlZCB0aGUga2V5Ym9hcmQKKyAgIGNvbnRyb2xsZXIgdG8gcHVsc2UgdGhlIENQVSByZXNldCBsaW5lLCB3aGljaCBpcyBtb3JlIHRob3JvdWdoLCBidXQKKyAgIGRvZXNuJ3Qgd29yayB3aXRoIGF0IGxlYXN0IG9uZSB0eXBlIG9mIDQ4NiBtb3RoZXJib2FyZC4gIEl0IGlzIGVhc3kKKyAgIHRvIHN0b3AgdGhpcyBjb2RlIHdvcmtpbmc7IGhlbmNlIHRoZSBjb3Bpb3VzIGNvbW1lbnRzLiAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nCityZWFsX21vZGVfZ2R0X2VudHJpZXMgWzNdID0KK3sKKwkweDAwMDAwMDAwMDAwMDAwMDBVTEwsCS8qIE51bGwgZGVzY3JpcHRvciAqLworCTB4MDAwMDlhMDAwMDAwZmZmZlVMTCwJLyogMTYtYml0IHJlYWwtbW9kZSA2NGsgY29kZSBhdCAweDAwMDAwMDAwICovCisJMHgwMDAwOTIwMDAxMDBmZmZmVUxMCS8qIDE2LWJpdCByZWFsLW1vZGUgNjRrIGRhdGEgYXQgMHgwMDAwMDEwMCAqLworfTsKKworc3RhdGljIHN0cnVjdAoreworCXVuc2lnbmVkIHNob3J0ICAgICAgIHNpemUgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCXVuc2lnbmVkIGxvbmcgbG9uZyAqIGJhc2UgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfQorcmVhbF9tb2RlX2dkdCA9IHsgc2l6ZW9mIChyZWFsX21vZGVfZ2R0X2VudHJpZXMpIC0gMSwgcmVhbF9tb2RlX2dkdF9lbnRyaWVzIH0sCityZWFsX21vZGVfaWR0ID0geyAweDNmZiwgTlVMTCB9LAorbm9faWR0ID0geyAwLCBOVUxMIH07CisKKworLyogVGhpcyBpcyAxNi1iaXQgcHJvdGVjdGVkIG1vZGUgY29kZSB0byBkaXNhYmxlIHBhZ2luZyBhbmQgdGhlIGNhY2hlLAorICAgc3dpdGNoIHRvIHJlYWwgbW9kZSBhbmQganVtcCB0byB0aGUgQklPUyByZXNldCBjb2RlLgorCisgICBUaGUgaW5zdHJ1Y3Rpb24gdGhhdCBzd2l0Y2hlcyB0byByZWFsIG1vZGUgYnkgd3JpdGluZyB0byBDUjAgbXVzdCBiZQorICAgZm9sbG93ZWQgaW1tZWRpYXRlbHkgYnkgYSBmYXIganVtcCBpbnN0cnVjdGlvbiwgd2hpY2ggc2V0IENTIHRvIGEKKyAgIHZhbGlkIHZhbHVlIGZvciByZWFsIG1vZGUsIGFuZCBmbHVzaGVzIHRoZSBwcmVmZXRjaCBxdWV1ZSB0byBhdm9pZAorICAgcnVubmluZyBpbnN0cnVjdGlvbnMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBkZWNvZGVkIGluIHByb3RlY3RlZAorICAgbW9kZS4KKworICAgQ2xlYXJzIGFsbCB0aGUgZmxhZ3MgZXhjZXB0IEVULCBlc3BlY2lhbGx5IFBHIChwYWdpbmcpLCBQRQorICAgKHByb3RlY3RlZC1tb2RlIGVuYWJsZSkgYW5kIFRTICh0YXNrIHN3aXRjaCBmb3IgY29wcm9jZXNzb3Igc3RhdGUKKyAgIHNhdmUpLiAgRmx1c2hlcyB0aGUgVExCIGFmdGVyIHBhZ2luZyBoYXMgYmVlbiBkaXNhYmxlZC4gIFNldHMgQ0QgYW5kCisgICBOVywgdG8gZGlzYWJsZSB0aGUgY2FjaGUgb24gYSA0ODYsIGFuZCBpbnZhbGlkYXRlcyB0aGUgY2FjaGUuICBUaGlzCisgICBpcyBtb3JlIGxpa2UgdGhlIHN0YXRlIG9mIGEgNDg2IGFmdGVyIHJlc2V0LiAgSSBkb24ndCBrbm93IGlmCisgICBzb21ldGhpbmcgZWxzZSBzaG91bGQgYmUgZG9uZSBmb3Igb3RoZXIgY2hpcHMuCisKKyAgIE1vcmUgY291bGQgYmUgZG9uZSBoZXJlIHRvIHNldCB1cCB0aGUgcmVnaXN0ZXJzIGFzIGlmIGEgQ1BVIHJlc2V0IGhhZAorICAgb2NjdXJyZWQ7IGhvcGVmdWxseSByZWFsIEJJT1NzIGRvbid0IGFzc3VtZSBtdWNoLiAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciByZWFsX21vZGVfc3dpdGNoIFtdID0KK3sKKwkweDY2LCAweDBmLCAweDIwLCAweGMwLAkJCS8qICAgIG1vdmwgICVjcjAsJWVheCAgICAgICAgKi8KKwkweDY2LCAweDgzLCAweGUwLCAweDExLAkJCS8qICAgIGFuZGwgICQweDAwMDAwMDExLCVlYXggKi8KKwkweDY2LCAweDBkLCAweDAwLCAweDAwLCAweDAwLCAweDYwLAkvKiAgICBvcmwgICAkMHg2MDAwMDAwMCwlZWF4ICovCisJMHg2NiwgMHgwZiwgMHgyMiwgMHhjMCwJCQkvKiAgICBtb3ZsICAlZWF4LCVjcjAgICAgICAgICovCisJMHg2NiwgMHgwZiwgMHgyMiwgMHhkOCwJCQkvKiAgICBtb3ZsICAlZWF4LCVjcjMgICAgICAgICovCisJMHg2NiwgMHgwZiwgMHgyMCwgMHhjMywJCQkvKiAgICBtb3ZsICAlY3IwLCVlYnggICAgICAgICovCisJMHg2NiwgMHg4MSwgMHhlMywgMHgwMCwgMHgwMCwgMHgwMCwgMHg2MCwJLyogICAgYW5kbCAgJDB4NjAwMDAwMDAsJWVieCAqLworCTB4NzQsIDB4MDIsCQkJCS8qICAgIGp6ICAgIGYgICAgICAgICAgICAgICAgKi8KKwkweDBmLCAweDA5LAkJCQkvKiAgICB3YmludmQgICAgICAgICAgICAgICAgICovCisJMHgyNCwgMHgxMCwJCQkJLyogZjogYW5kYiAgJDB4MTAsYWwgICAgICAgICAqLworCTB4NjYsIDB4MGYsIDB4MjIsIDB4YzAJCQkvKiAgICBtb3ZsICAlZWF4LCVjcjAgICAgICAgICovCit9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIganVtcF90b19iaW9zIFtdID0KK3sKKwkweGVhLCAweDAwLCAweDAwLCAweGZmLCAweGZmCQkvKiAgICBsam1wICAkMHhmZmZmLCQweDAwMDAgICovCit9OworCisvKgorICogU3dpdGNoIHRvIHJlYWwgbW9kZSBhbmQgdGhlbiBleGVjdXRlIHRoZSBjb2RlCisgKiBzcGVjaWZpZWQgYnkgdGhlIGNvZGUgYW5kIGxlbmd0aCBwYXJhbWV0ZXJzLgorICogV2UgYXNzdW1lIHRoYXQgbGVuZ3RoIHdpbGwgYXdheXMgYmUgbGVzcyB0aGF0IDEwMCEKKyAqLwordm9pZCBtYWNoaW5lX3JlYWxfcmVzdGFydCh1bnNpZ25lZCBjaGFyICpjb2RlLCBpbnQgbGVuZ3RoKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJLyogV3JpdGUgemVybyB0byBDTU9TIHJlZ2lzdGVyIG51bWJlciAweDBmLCB3aGljaCB0aGUgQklPUyBQT1NUCisJICAgcm91dGluZSB3aWxsIHJlY29nbml6ZSBhcyB0ZWxsaW5nIGl0IHRvIGRvIGEgcHJvcGVyIHJlYm9vdC4gIChXZWxsCisJICAgdGhhdCdzIHdoYXQgdGhpcyBib29rIGluIGZyb250IG9mIG1lIHNheXMgLS0gaXQgbWF5IG9ubHkgYXBwbHkgdG8KKwkgICB0aGUgUGhvZW5peCBCSU9TIHRob3VnaCwgaXQncyBub3QgY2xlYXIpLiAgQXQgdGhlIHNhbWUgdGltZSwKKwkgICBkaXNhYmxlIE5NSXMgYnkgc2V0dGluZyB0aGUgdG9wIGJpdCBpbiB0aGUgQ01PUyBhZGRyZXNzIHJlZ2lzdGVyLAorCSAgIGFzIHdlJ3JlIGFib3V0IHRvIGRvIHBlY3VsaWFyIHRoaW5ncyB0byB0aGUgQ1BVLiAgSSdtIG5vdCBzdXJlIGlmCisJICAgYG91dGJfcCcgaXMgbmVlZGVkIGluc3RlYWQgb2YganVzdCBgb3V0YicuICBVc2UgaXQgdG8gYmUgb24gdGhlCisJICAgc2FmZSBzaWRlLiAgKFllcywgQ01PU19XUklURSBkb2VzIG91dGJfcCdzLiAtICBQYXVsIEcuKQorCSAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Y19sb2NrLCBmbGFncyk7CisJQ01PU19XUklURSgweDAwLCAweDhmKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGNfbG9jaywgZmxhZ3MpOworCisJLyogUmVtYXAgdGhlIGtlcm5lbCBhdCB2aXJ0dWFsIGFkZHJlc3MgemVybywgYXMgd2VsbCBhcyBvZmZzZXQgemVybworCSAgIGZyb20gdGhlIGtlcm5lbCBzZWdtZW50LiAgVGhpcyBhc3N1bWVzIHRoZSBrZXJuZWwgc2VnbWVudCBzdGFydHMgYXQKKwkgICB2aXJ0dWFsIGFkZHJlc3MgUEFHRV9PRkZTRVQuICovCisKKwltZW1jcHkgKHN3YXBwZXJfcGdfZGlyLCBzd2FwcGVyX3BnX2RpciArIFVTRVJfUEdEX1BUUlMsCisJCXNpemVvZiAoc3dhcHBlcl9wZ19kaXIgWzBdKSAqIEtFUk5FTF9QR0RfUFRSUyk7CisKKwkvKgorCSAqIFVzZSBgc3dhcHBlcl9wZ19kaXInIGFzIG91ciBwYWdlIGRpcmVjdG9yeS4KKwkgKi8KKwlsb2FkX2NyMyhzd2FwcGVyX3BnX2Rpcik7CisKKwkvKiBXcml0ZSAweDEyMzQgdG8gYWJzb2x1dGUgbWVtb3J5IGxvY2F0aW9uIDB4NDcyLiAgVGhlIEJJT1MgcmVhZHMKKwkgICB0aGlzIG9uIGJvb3RpbmcgdG8gdGVsbCBpdCB0byAiQnlwYXNzIG1lbW9yeSB0ZXN0IChhbHNvIHdhcm0KKwkgICBib290KSIuICBUaGlzIHNlZW1zIGxpa2UgYSBmYWlybHkgc3RhbmRhcmQgdGhpbmcgdGhhdCBnZXRzIHNldCBieQorCSAgIFJFQk9PVC5DT00gcHJvZ3JhbXMsIGFuZCB0aGUgcHJldmlvdXMgcmVzZXQgcm91dGluZSBkaWQgdGhpcworCSAgIHRvby4gKi8KKworCSooKHVuc2lnbmVkIHNob3J0ICopMHg0NzIpID0gcmVib290X21vZGU7CisKKwkvKiBGb3IgdGhlIHN3aXRjaCB0byByZWFsIG1vZGUsIGNvcHkgc29tZSBjb2RlIHRvIGxvdyBtZW1vcnkuICBJdCBoYXMKKwkgICB0byBiZSBpbiB0aGUgZmlyc3QgNjRrIGJlY2F1c2UgaXQgaXMgcnVubmluZyBpbiAxNi1iaXQgbW9kZSwgYW5kIGl0CisJICAgaGFzIHRvIGhhdmUgdGhlIHNhbWUgcGh5c2ljYWwgYW5kIHZpcnR1YWwgYWRkcmVzcywgYmVjYXVzZSBpdCB0dXJucworCSAgIG9mZiBwYWdpbmcuICBDb3B5IGl0IG5lYXIgdGhlIGVuZCBvZiB0aGUgZmlyc3QgcGFnZSwgb3V0IG9mIHRoZSB3YXkKKwkgICBvZiBCSU9TIHZhcmlhYmxlcy4gKi8KKworCW1lbWNweSAoKHZvaWQgKikgKDB4MTAwMCAtIHNpemVvZiAocmVhbF9tb2RlX3N3aXRjaCkgLSAxMDApLAorCQlyZWFsX21vZGVfc3dpdGNoLCBzaXplb2YgKHJlYWxfbW9kZV9zd2l0Y2gpKTsKKwltZW1jcHkgKCh2b2lkICopICgweDEwMDAgLSAxMDApLCBjb2RlLCBsZW5ndGgpOworCisJLyogU2V0IHVwIHRoZSBJRFQgZm9yIHJlYWwgbW9kZS4gKi8KKworCV9fYXNtX18gX192b2xhdGlsZV9fICgibGlkdCAlMCIgOiA6ICJtIiAocmVhbF9tb2RlX2lkdCkpOworCisJLyogU2V0IHVwIGEgR0RUIGZyb20gd2hpY2ggd2UgY2FuIGxvYWQgc2VnbWVudCBkZXNjcmlwdG9ycyBmb3IgcmVhbAorCSAgIG1vZGUuICBUaGUgR0RUIGlzIG5vdCB1c2VkIGluIHJlYWwgbW9kZTsgaXQgaXMganVzdCBuZWVkZWQgaGVyZSB0bworCSAgIHByZXBhcmUgdGhlIGRlc2NyaXB0b3JzLiAqLworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJsZ2R0ICUwIiA6IDogIm0iIChyZWFsX21vZGVfZ2R0KSk7CisKKwkvKiBMb2FkIHRoZSBkYXRhIHNlZ21lbnQgcmVnaXN0ZXJzLCBhbmQgdGh1cyB0aGUgZGVzY3JpcHRvcnMgcmVhZHkgZm9yCisJICAgcmVhbCBtb2RlLiAgVGhlIGJhc2UgYWRkcmVzcyBvZiBlYWNoIHNlZ21lbnQgaXMgMHgxMDAsIDE2IHRpbWVzIHRoZQorCSAgIHNlbGVjdG9yIHZhbHVlIGJlaW5nIGxvYWRlZCBoZXJlLiAgVGhpcyBpcyBzbyB0aGF0IHRoZSBzZWdtZW50CisJICAgcmVnaXN0ZXJzIGRvbid0IGhhdmUgdG8gYmUgcmVsb2FkZWQgYWZ0ZXIgc3dpdGNoaW5nIHRvIHJlYWwgbW9kZToKKwkgICB0aGUgdmFsdWVzIGFyZSBjb25zaXN0ZW50IGZvciByZWFsIG1vZGUgb3BlcmF0aW9uIGFscmVhZHkuICovCisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdmwgJDB4MDAxMCwlJWVheFxuIgorCQkJCSJcdG1vdmwgJSVlYXgsJSVkc1xuIgorCQkJCSJcdG1vdmwgJSVlYXgsJSVlc1xuIgorCQkJCSJcdG1vdmwgJSVlYXgsJSVmc1xuIgorCQkJCSJcdG1vdmwgJSVlYXgsJSVnc1xuIgorCQkJCSJcdG1vdmwgJSVlYXgsJSVzcyIgOiA6IDogImVheCIpOworCisJLyogSnVtcCB0byB0aGUgMTYtYml0IGNvZGUgdGhhdCB3ZSBjb3BpZWQgZWFybGllci4gIEl0IGRpc2FibGVzIHBhZ2luZworCSAgIGFuZCB0aGUgY2FjaGUsIHN3aXRjaGVzIHRvIHJlYWwgbW9kZSwgYW5kIGp1bXBzIHRvIHRoZSBCSU9TIHJlc2V0CisJICAgZW50cnkgcG9pbnQuICovCisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImxqbXAgJDB4MDAwOCwlMCIKKwkJCQk6CisJCQkJOiAiaSIgKCh2b2lkICopICgweDEwMDAgLSBzaXplb2YgKHJlYWxfbW9kZV9zd2l0Y2gpIC0gMTAwKSkpOworfQorCit2b2lkIG1hY2hpbmVfcmVzdGFydChjaGFyICogX191bnVzZWQpCit7CisjaWZkZWYgQ09ORklHX1NNUAorCWludCBjcHVpZDsKKwkKKwljcHVpZCA9IEdFVF9BUElDX0lEKGFwaWNfcmVhZChBUElDX0lEKSk7CisKKwlpZiAocmVib290X3NtcCkgeworCisJCS8qIGNoZWNrIHRvIHNlZSBpZiByZWJvb3RfY3B1IGlzIHZhbGlkIAorCQkgICBpZiBpdHMgbm90LCBkZWZhdWx0IHRvIHRoZSBCU1AgKi8KKwkJaWYgKChyZWJvb3RfY3B1ID09IC0xKSB8fCAgCisJCSAgICAgIChyZWJvb3RfY3B1ID4gKE5SX0NQVVMgLTEpKSAgfHwgCisJCSAgICAgICFwaHlzaWRfaXNzZXQoY3B1aWQsIHBoeXNfY3B1X3ByZXNlbnRfbWFwKSkKKwkJCXJlYm9vdF9jcHUgPSBib290X2NwdV9waHlzaWNhbF9hcGljaWQ7CisKKwkJcmVib290X3NtcCA9IDA7ICAvKiB1c2UgdGhpcyBhcyBhIGZsYWcgdG8gb25seSBnbyB0aHJvdWdoIHRoaXMgb25jZSovCisJCS8qIHJlLXJ1biB0aGlzIGZ1bmN0aW9uIG9uIHRoZSBvdGhlciBDUFVzCisJCSAgIGl0IHdpbGwgZmFsbCB0aG91Z2ggdGhpcyBzZWN0aW9uIHNpbmNlIHdlIGhhdmUgCisJCSAgIGNsZWFyZWQgcmVib290X3NtcCwgYW5kIGRvIHRoZSByZWJvb3QgaWYgaXQgaXMgdGhlCisJCSAgIGNvcnJlY3QgQ1BVLCBvdGhlcndpc2UgaXQgaGFsdHMuICovCisJCWlmIChyZWJvb3RfY3B1ICE9IGNwdWlkKQorCQkJc21wX2NhbGxfZnVuY3Rpb24oKHZvaWQgKiltYWNoaW5lX3Jlc3RhcnQgLCBOVUxMLCAxLCAwKTsKKwl9CisKKwkvKiBpZiByZWJvb3RfY3B1IGlzIHN0aWxsIC0xLCB0aGVuIHdlIHdhbnQgYSB0cmFkaW9uYWwgcmVib290LCAKKwkgICBhbmQgaWYgd2UgYXJlIG5vdCBydW5uaW5nIG9uIHRoZSByZWJvb3RfY3B1LCwgaGFsdCAqLworCWlmICgocmVib290X2NwdSAhPSAtMSkgJiYgKGNwdWlkICE9IHJlYm9vdF9jcHUpKSB7CisJCWZvciAoOzspCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgiaGx0Iik7CisJfQorCS8qCisJICogU3RvcCBhbGwgQ1BVcyBhbmQgdHVybiBvZmYgbG9jYWwgQVBJQ3MgYW5kIHRoZSBJTy1BUElDLCBzbworCSAqIG90aGVyIE9TcyBzZWUgYSBjbGVhbiBJUlEgc3RhdGUuCisJICovCisJc21wX3NlbmRfc3RvcCgpOworI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KKworCWxhcGljX3NodXRkb3duKCk7CisKKyNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKKwlkaXNhYmxlX0lPX0FQSUMoKTsKKyNlbmRpZgorCisJaWYgKCFyZWJvb3RfdGhydV9iaW9zKSB7CisJCWlmIChlZmlfZW5hYmxlZCkgeworCQkJZWZpLnJlc2V0X3N5c3RlbShFRklfUkVTRVRfQ09MRCwgRUZJX1NVQ0NFU1MsIDAsIE5VTEwpOworCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oImxpZHQgJTAiOiA6Im0iIChub19pZHQpKTsKKwkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJpbnQzIik7CisJCX0KKwkJLyogcmVib290aW5nIG5lZWRzIHRvIHRvdWNoIHRoZSBwYWdlIGF0IGFic29sdXRlIGFkZHIgMCAqLworCQkqKCh1bnNpZ25lZCBzaG9ydCAqKV9fdmEoMHg0NzIpKSA9IHJlYm9vdF9tb2RlOworCQlmb3IgKDs7KSB7CisJCQltYWNoX3JlYm9vdCgpOworCQkJLyogVGhhdCBkaWRuJ3Qgd29yayAtIGZvcmNlIGEgdHJpcGxlIGZhdWx0Li4gKi8KKwkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJsaWR0ICUwIjogOiJtIiAobm9faWR0KSk7CisJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiaW50MyIpOworCQl9CisJfQorCWlmIChlZmlfZW5hYmxlZCkKKwkJZWZpLnJlc2V0X3N5c3RlbShFRklfUkVTRVRfV0FSTSwgRUZJX1NVQ0NFU1MsIDAsIE5VTEwpOworCisJbWFjaGluZV9yZWFsX3Jlc3RhcnQoanVtcF90b19iaW9zLCBzaXplb2YoanVtcF90b19iaW9zKSk7Cit9CisKK0VYUE9SVF9TWU1CT0wobWFjaGluZV9yZXN0YXJ0KTsKKwordm9pZCBtYWNoaW5lX2hhbHQodm9pZCkKK3sKK30KKworRVhQT1JUX1NZTUJPTChtYWNoaW5lX2hhbHQpOworCit2b2lkIG1hY2hpbmVfcG93ZXJfb2ZmKHZvaWQpCit7CisJbGFwaWNfc2h1dGRvd24oKTsKKworCWlmIChlZmlfZW5hYmxlZCkKKwkJZWZpLnJlc2V0X3N5c3RlbShFRklfUkVTRVRfU0hVVERPV04sIEVGSV9TVUNDRVNTLCAwLCBOVUxMKTsKKwlpZiAocG1fcG93ZXJfb2ZmKQorCQlwbV9wb3dlcl9vZmYoKTsKK30KKworRVhQT1JUX1NZTUJPTChtYWNoaW5lX3Bvd2VyX29mZik7CisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvc2N4MjAwLmMgYi9hcmNoL2kzODYva2VybmVsL3NjeDIwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZTIwM2EKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3NjeDIwMC5jCkBAIC0wLDAgKzEsMTY3IEBACisvKiBsaW51eC9hcmNoL2kzODYva2VybmVsL3NjeDIwMC5jIAorCisgICBDb3B5cmlnaHQgKGMpIDIwMDEsMjAwMiBDaHJpc3RlciBXZWluaWdlbCA8d2luZ2VsQG5hbm8tc3lzdGVtLmNvbT4KKworICAgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBTQ3gyMDAgc3VwcG9ydC4gKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSA8bGludXgvc2N4MjAwLmg+CisKKy8qIFZlcmlmeSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIGJsb2NrIHJlYWxseSBpcyB0aGVyZSAqLworI2RlZmluZSBzY3gyMDBfY2JfcHJvYmUoYmFzZSkgKGludygoYmFzZSkgKyBTQ3gyMDBfQ0JBKSA9PSAoYmFzZSkpCisKKyNkZWZpbmUgTkFNRSAic2N4MjAwIgorCitNT0RVTEVfQVVUSE9SKCJDaHJpc3RlciBXZWluaWdlbCA8d2luZ2VsQG5hbm8tc3lzdGVtLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTmF0U2VtaSBTQ3gyMDAgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3Vuc2lnbmVkIHNjeDIwMF9ncGlvX2Jhc2UgPSAwOworbG9uZyBzY3gyMDBfZ3Bpb19zaGFkb3dbMl07CisKK3Vuc2lnbmVkIHNjeDIwMF9jYl9iYXNlID0gMDsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNjeDIwMF90YmxbXSA9IHsKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OUywgUENJX0RFVklDRV9JRF9OU19TQ3gyMDBfQlJJREdFKSB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX05TLCBQQ0lfREVWSUNFX0lEX05TX1NDMTEwMF9CUklER0UpIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlMsIFBDSV9ERVZJQ0VfSURfTlNfU0N4MjAwX1hCVVMpICAgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OUywgUENJX0RFVklDRV9JRF9OU19TQzExMDBfWEJVUykgICB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSxzY3gyMDBfdGJsKTsKKworc3RhdGljIGludCBfX2RldmluaXQgc2N4MjAwX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICosIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICopOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgc2N4MjAwX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUgPSAic2N4MjAwIiwKKwkuaWRfdGFibGUgPSBzY3gyMDBfdGJsLAorCS5wcm9iZSA9IHNjeDIwMF9wcm9iZSwKK307CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soc2N4MjAwX2dwaW9fY29uZmlnX2xvY2spOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzY3gyMDBfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJaW50IGJhbms7CisJdW5zaWduZWQgYmFzZTsKKworCWlmIChwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9OU19TQ3gyMDBfQlJJREdFIHx8CisJICAgIHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX05TX1NDMTEwMF9CUklER0UpIHsKKwkJYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBOQU1FICI6IEdQSU8gYmFzZSAweCV4XG4iLCBiYXNlKTsKKworCQlpZiAocmVxdWVzdF9yZWdpb24oYmFzZSwgU0N4MjAwX0dQSU9fU0laRSwgIk5hdFNlbWkgU0N4MjAwIEdQSU8iKSA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgTkFNRSAiOiBjYW4ndCBhbGxvY2F0ZSBJL08gZm9yIEdQSU9zXG4iKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKworCQlzY3gyMDBfZ3Bpb19iYXNlID0gYmFzZTsKKworCQkvKiByZWFkIHRoZSBjdXJyZW50IHZhbHVlcyBkcml2ZW4gb24gdGhlIEdQSU8gc2lnbmFscyAqLworCQlmb3IgKGJhbmsgPSAwOyBiYW5rIDwgMjsgKytiYW5rKQorCQkJc2N4MjAwX2dwaW9fc2hhZG93W2JhbmtdID0gaW5sKHNjeDIwMF9ncGlvX2Jhc2UgKyAweDEwICogYmFuayk7CisKKwl9IGVsc2UgeworCQkvKiBmaW5kIHRoZSBiYXNlIG9mIHRoZSBDb25maWd1cmF0aW9uIEJsb2NrICovCisJCWlmIChzY3gyMDBfY2JfcHJvYmUoU0N4MjAwX0NCX0JBU0VfRklYRUQpKSB7CisJCQlzY3gyMDBfY2JfYmFzZSA9IFNDeDIwMF9DQl9CQVNFX0ZJWEVEOworCQl9IGVsc2UgeworCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIFNDeDIwMF9DQkFfU0NSQVRDSCwgJmJhc2UpOworCQkJaWYgKHNjeDIwMF9jYl9wcm9iZShiYXNlKSkgeworCQkJCXNjeDIwMF9jYl9iYXNlID0gYmFzZTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyBOQU1FICI6IENvbmZpZ3VyYXRpb24gQmxvY2sgbm90IGZvdW5kXG4iKTsKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCX0KKwkJfQorCQlwcmludGsoS0VSTl9JTkZPIE5BTUUgIjogQ29uZmlndXJhdGlvbiBCbG9jayBiYXNlIDB4JXhcbiIsIHNjeDIwMF9jYl9iYXNlKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordTMyIHNjeDIwMF9ncGlvX2NvbmZpZ3VyZShpbnQgaW5kZXgsIHUzMiBtYXNrLCB1MzIgYml0cykKK3sKKwl1MzIgY29uZmlnLCBuZXdfY29uZmlnOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2N4MjAwX2dwaW9fY29uZmlnX2xvY2ssIGZsYWdzKTsKKworCW91dGwoaW5kZXgsIHNjeDIwMF9ncGlvX2Jhc2UgKyAweDIwKTsKKwljb25maWcgPSBpbmwoc2N4MjAwX2dwaW9fYmFzZSArIDB4MjQpOworCisJbmV3X2NvbmZpZyA9IChjb25maWcgJiBtYXNrKSB8IGJpdHM7CisJb3V0bChuZXdfY29uZmlnLCBzY3gyMDBfZ3Bpb19iYXNlICsgMHgyNCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY3gyMDBfZ3Bpb19jb25maWdfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGNvbmZpZzsKK30KKworI2lmIDAKK3ZvaWQgc2N4MjAwX2dwaW9fZHVtcCh1bnNpZ25lZCBpbmRleCkKK3sKKwl1MzIgY29uZmlnID0gc2N4MjAwX2dwaW9fY29uZmlndXJlKGluZGV4LCB+MCwgMCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIkdQSU8lMDJ1OiAweCUwOGx4IiwgaW5kZXgsICh1bnNpZ25lZCBsb25nKWNvbmZpZyk7CisJCisJaWYgKGNvbmZpZyAmIDEpIAorCQlwcmludGsoIiBPRSIpOyAvKiBvdXRwdXQgZW5hYmxlZCAqLworCWVsc2UKKwkJcHJpbnRrKCIgVFMiKTsgLyogdHJpc3RhdGUgKi8KKwlpZiAoY29uZmlnICYgMikgCisJCXByaW50aygiIFBQIik7IC8qIHB1c2ggcHVsbCAqLworCWVsc2UKKwkJcHJpbnRrKCIgT0QiKTsgLyogb3BlbiBkcmFpbiAqLworCWlmIChjb25maWcgJiA0KSAKKwkJcHJpbnRrKCIgUFVFIik7IC8qIHB1bGwgdXAgZW5hYmxlZCAqLworCWVsc2UKKwkJcHJpbnRrKCIgUFVEIik7IC8qIHB1bGwgdXAgZGlzYWJsZWQgKi8KKwlpZiAoY29uZmlnICYgOCkgCisJCXByaW50aygiIExPQ0tFRCIpOyAvKiBsb2NrZWQgKi8KKwlpZiAoY29uZmlnICYgMTYpIAorCQlwcmludGsoIiBMRVZFTCIpOyAvKiBsZXZlbCBpbnB1dCAqLworCWVsc2UKKwkJcHJpbnRrKCIgRURHRSIpOyAvKiBlZGdlIGlucHV0ICovCisJaWYgKGNvbmZpZyAmIDMyKSAKKwkJcHJpbnRrKCIgSEkiKTsgLyogdHJpZ2dlciBvbiByaXNpbmcgZWRnZSAqLworCWVsc2UKKwkJcHJpbnRrKCIgTE8iKTsgLyogdHJpZ2dlciBvbiBmYWxsaW5nIGVkZ2UgKi8KKwlpZiAoY29uZmlnICYgNjQpIAorCQlwcmludGsoIiBERUJPVU5DRSIpOyAvKiBkZWJvdW5jZSAqLworCXByaW50aygiXG4iKTsKK30KKyNlbmRpZiAgLyogIDAgICovCisKK3N0YXRpYyBpbnQgX19pbml0IHNjeDIwMF9pbml0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyBOQU1FICI6IE5hdFNlbWkgU0N4MjAwIERyaXZlclxuIik7CisKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZzY3gyMDBfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzY3gyMDBfY2xlYW51cCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmc2N4MjAwX3BjaV9kcml2ZXIpOworCXJlbGVhc2VfcmVnaW9uKHNjeDIwMF9ncGlvX2Jhc2UsIFNDeDIwMF9HUElPX1NJWkUpOworfQorCittb2R1bGVfaW5pdChzY3gyMDBfaW5pdCk7Cittb2R1bGVfZXhpdChzY3gyMDBfY2xlYW51cCk7CisKK0VYUE9SVF9TWU1CT0woc2N4MjAwX2dwaW9fYmFzZSk7CitFWFBPUlRfU1lNQk9MKHNjeDIwMF9ncGlvX3NoYWRvdyk7CitFWFBPUlRfU1lNQk9MKHNjeDIwMF9ncGlvX2NvbmZpZ3VyZSk7CitFWFBPUlRfU1lNQk9MKHNjeDIwMF9jYl9iYXNlKTsKKworLyoKKyAgICBMb2NhbCB2YXJpYWJsZXM6CisgICAgICAgIGNvbXBpbGUtY29tbWFuZDogIm1ha2UgLWsgLUMgLi4vLi4vLi4gU1VCRElSUz1hcmNoL2kzODYva2VybmVsIG1vZHVsZXMiCisgICAgICAgIGMtYmFzaWMtb2Zmc2V0OiA4CisgICAgRW5kOgorKi8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvc2VtYXBob3JlLmMgYi9hcmNoL2kzODYva2VybmVsL3NlbWFwaG9yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2OWY0OTZlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9zZW1hcGhvcmUuYwpAQCAtMCwwICsxLDI5NyBAQAorLyoKKyAqIGkzODYgc2VtYXBob3JlIGltcGxlbWVudGF0aW9uLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMTk5OSBMaW51cyBUb3J2YWxkcworICoKKyAqIFBvcnRpb25zIENvcHlyaWdodCAxOTk5IFJlZCBIYXQsIEluYy4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIHJ3IHNlbWFwaG9yZXMgaW1wbGVtZW50ZWQgTm92ZW1iZXIgMTk5OSBieSBCZW5qYW1pbiBMYUhhaXNlIDxiY3JsQGt2YWNrLm9yZz4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKworLyoKKyAqIFNlbWFwaG9yZXMgYXJlIGltcGxlbWVudGVkIHVzaW5nIGEgdHdvLXdheSBjb3VudGVyOgorICogVGhlICJjb3VudCIgdmFyaWFibGUgaXMgZGVjcmVtZW50ZWQgZm9yIGVhY2ggcHJvY2VzcworICogdGhhdCB0cmllcyB0byBhY3F1aXJlIHRoZSBzZW1hcGhvcmUsIHdoaWxlIHRoZSAic2xlZXBpbmciCisgKiB2YXJpYWJsZSBpcyBhIGNvdW50IG9mIHN1Y2ggYWNxdWlyZXMuCisgKgorICogTm90YWJseSwgdGhlIGlubGluZSAidXAoKSIgYW5kICJkb3duKCkiIGZ1bmN0aW9ucyBjYW4KKyAqIGVmZmljaWVudGx5IHRlc3QgaWYgdGhleSBuZWVkIHRvIGRvIGFueSBleHRyYSB3b3JrICh1cAorICogbmVlZHMgdG8gZG8gc29tZXRoaW5nIG9ubHkgaWYgY291bnQgd2FzIG5lZ2F0aXZlIGJlZm9yZQorICogdGhlIGluY3JlbWVudCBvcGVyYXRpb24uCisgKgorICogInNsZWVwaW5nIiBhbmQgdGhlIGNvbnRlbnRpb24gcm91dGluZSBvcmRlcmluZyBpcyBwcm90ZWN0ZWQKKyAqIGJ5IHRoZSBzcGlubG9jayBpbiB0aGUgc2VtYXBob3JlJ3Mgd2FpdHF1ZXVlIGhlYWQuCisgKgorICogTm90ZSB0aGF0IHRoZXNlIGZ1bmN0aW9ucyBhcmUgb25seSBjYWxsZWQgd2hlbiB0aGVyZSBpcworICogY29udGVudGlvbiBvbiB0aGUgbG9jaywgYW5kIGFzIHN1Y2ggYWxsIHRoaXMgaXMgdGhlCisgKiAibm9uLWNyaXRpY2FsIiBwYXJ0IG9mIHRoZSB3aG9sZSBzZW1hcGhvcmUgYnVzaW5lc3MuIFRoZQorICogY3JpdGljYWwgcGFydCBpcyB0aGUgaW5saW5lIHN0dWZmIGluIDxhc20vc2VtYXBob3JlLmg+CisgKiB3aGVyZSB3ZSB3YW50IHRvIGF2b2lkIGFueSBleHRyYSBqdW1wcyBhbmQgY2FsbHMuCisgKi8KKworLyoKKyAqIExvZ2ljOgorICogIC0gb25seSBvbiBhIGJvdW5kYXJ5IGNvbmRpdGlvbiBkbyB3ZSBuZWVkIHRvIGNhcmUuIFdoZW4gd2UgZ28KKyAqICAgIGZyb20gYSBuZWdhdGl2ZSBjb3VudCB0byBhIG5vbi1uZWdhdGl2ZSwgd2Ugd2FrZSBwZW9wbGUgdXAuCisgKiAgLSB3aGVuIHdlIGdvIGZyb20gYSBub24tbmVnYXRpdmUgY291bnQgdG8gYSBuZWdhdGl2ZSBkbyB3ZQorICogICAgKGEpIHN5bmNocm9uaXplIHdpdGggdGhlICJzbGVlcGVyIiBjb3VudCBhbmQgKGIpIG1ha2Ugc3VyZQorICogICAgdGhhdCB3ZSdyZSBvbiB0aGUgd2FrZXVwIGxpc3QgYmVmb3JlIHdlIHN5bmNocm9uaXplIHNvIHRoYXQKKyAqICAgIHdlIGNhbm5vdCBsb3NlIHdha2V1cCBldmVudHMuCisgKi8KKworc3RhdGljIGZhc3RjYWxsIHZvaWQgX19hdHRyaWJ1dGVfdXNlZF9fICBfX3VwKHN0cnVjdCBzZW1hcGhvcmUgKnNlbSkKK3sKKwl3YWtlX3VwKCZzZW0tPndhaXQpOworfQorCitzdGF0aWMgZmFzdGNhbGwgdm9pZCBfX2F0dHJpYnV0ZV91c2VkX18gX19zY2hlZCBfX2Rvd24oc3RydWN0IHNlbWFwaG9yZSAqIHNlbSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgdHNrKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJdHNrLT5zdGF0ZSA9IFRBU0tfVU5JTlRFUlJVUFRJQkxFOworCXNwaW5fbG9ja19pcnFzYXZlKCZzZW0tPndhaXQubG9jaywgZmxhZ3MpOworCWFkZF93YWl0X3F1ZXVlX2V4Y2x1c2l2ZV9sb2NrZWQoJnNlbS0+d2FpdCwgJndhaXQpOworCisJc2VtLT5zbGVlcGVycysrOworCWZvciAoOzspIHsKKwkJaW50IHNsZWVwZXJzID0gc2VtLT5zbGVlcGVyczsKKworCQkvKgorCQkgKiBBZGQgImV2ZXJ5Ym9keSBlbHNlIiBpbnRvIGl0LiBUaGV5IGFyZW4ndAorCQkgKiBwbGF5aW5nLCBiZWNhdXNlIHdlIG93biB0aGUgc3BpbmxvY2sgaW4KKwkJICogdGhlIHdhaXRfcXVldWVfaGVhZC4KKwkJICovCisJCWlmICghYXRvbWljX2FkZF9uZWdhdGl2ZShzbGVlcGVycyAtIDEsICZzZW0tPmNvdW50KSkgeworCQkJc2VtLT5zbGVlcGVycyA9IDA7CisJCQlicmVhazsKKwkJfQorCQlzZW0tPnNsZWVwZXJzID0gMTsJLyogdXMgLSBzZWUgLTEgYWJvdmUgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VtLT53YWl0LmxvY2ssIGZsYWdzKTsKKworCQlzY2hlZHVsZSgpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzZW0tPndhaXQubG9jaywgZmxhZ3MpOworCQl0c2stPnN0YXRlID0gVEFTS19VTklOVEVSUlVQVElCTEU7CisJfQorCXJlbW92ZV93YWl0X3F1ZXVlX2xvY2tlZCgmc2VtLT53YWl0LCAmd2FpdCk7CisJd2FrZV91cF9sb2NrZWQoJnNlbS0+d2FpdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VtLT53YWl0LmxvY2ssIGZsYWdzKTsKKwl0c2stPnN0YXRlID0gVEFTS19SVU5OSU5HOworfQorCitzdGF0aWMgZmFzdGNhbGwgaW50IF9fYXR0cmlidXRlX3VzZWRfXyBfX3NjaGVkIF9fZG93bl9pbnRlcnJ1cHRpYmxlKHN0cnVjdCBzZW1hcGhvcmUgKiBzZW0pCit7CisJaW50IHJldHZhbCA9IDA7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIHRzayk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXRzay0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbS0+d2FpdC5sb2NrLCBmbGFncyk7CisJYWRkX3dhaXRfcXVldWVfZXhjbHVzaXZlX2xvY2tlZCgmc2VtLT53YWl0LCAmd2FpdCk7CisKKwlzZW0tPnNsZWVwZXJzKys7CisJZm9yICg7OykgeworCQlpbnQgc2xlZXBlcnMgPSBzZW0tPnNsZWVwZXJzOworCisJCS8qCisJCSAqIFdpdGggc2lnbmFscyBwZW5kaW5nLCB0aGlzIHR1cm5zIGludG8KKwkJICogdGhlIHRyeWxvY2sgZmFpbHVyZSBjYXNlIC0gd2Ugd29uJ3QgYmUKKwkJICogc2xlZXBpbmcsIGFuZCB3ZSogY2FuJ3QgZ2V0IHRoZSBsb2NrIGFzCisJCSAqIGl0IGhhcyBjb250ZW50aW9uLiBKdXN0IGNvcnJlY3QgdGhlIGNvdW50CisJCSAqIGFuZCBleGl0LgorCQkgKi8KKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyZXR2YWwgPSAtRUlOVFI7CisJCQlzZW0tPnNsZWVwZXJzID0gMDsKKwkJCWF0b21pY19hZGQoc2xlZXBlcnMsICZzZW0tPmNvdW50KTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogQWRkICJldmVyeWJvZHkgZWxzZSIgaW50byBpdC4gVGhleSBhcmVuJ3QKKwkJICogcGxheWluZywgYmVjYXVzZSB3ZSBvd24gdGhlIHNwaW5sb2NrIGluCisJCSAqIHdhaXRfcXVldWVfaGVhZC4gVGhlICItMSIgaXMgYmVjYXVzZSB3ZSdyZQorCQkgKiBzdGlsbCBob3BpbmcgdG8gZ2V0IHRoZSBzZW1hcGhvcmUuCisJCSAqLworCQlpZiAoIWF0b21pY19hZGRfbmVnYXRpdmUoc2xlZXBlcnMgLSAxLCAmc2VtLT5jb3VudCkpIHsKKwkJCXNlbS0+c2xlZXBlcnMgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJc2VtLT5zbGVlcGVycyA9IDE7CS8qIHVzIC0gc2VlIC0xIGFib3ZlICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbS0+d2FpdC5sb2NrLCBmbGFncyk7CisKKwkJc2NoZWR1bGUoKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2VtLT53YWl0LmxvY2ssIGZsYWdzKTsKKwkJdHNrLT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwl9CisJcmVtb3ZlX3dhaXRfcXVldWVfbG9ja2VkKCZzZW0tPndhaXQsICZ3YWl0KTsKKwl3YWtlX3VwX2xvY2tlZCgmc2VtLT53YWl0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZW0tPndhaXQubG9jaywgZmxhZ3MpOworCisJdHNrLT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogVHJ5bG9jayBmYWlsZWQgLSBtYWtlIHN1cmUgd2UgY29ycmVjdCBmb3IKKyAqIGhhdmluZyBkZWNyZW1lbnRlZCB0aGUgY291bnQuCisgKgorICogV2UgY291bGQgaGF2ZSBkb25lIHRoZSB0cnlsb2NrIHdpdGggYQorICogc2luZ2xlICJjbXB4Y2hnIiB3aXRob3V0IGZhaWx1cmUgY2FzZXMsCisgKiBidXQgdGhlbiBpdCB3b3VsZG4ndCB3b3JrIG9uIGEgMzg2LgorICovCitzdGF0aWMgZmFzdGNhbGwgaW50IF9fYXR0cmlidXRlX3VzZWRfXyBfX2Rvd25fdHJ5bG9jayhzdHJ1Y3Qgc2VtYXBob3JlICogc2VtKQoreworCWludCBzbGVlcGVyczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbS0+d2FpdC5sb2NrLCBmbGFncyk7CisJc2xlZXBlcnMgPSBzZW0tPnNsZWVwZXJzICsgMTsKKwlzZW0tPnNsZWVwZXJzID0gMDsKKworCS8qCisJICogQWRkICJldmVyeWJvZHkgZWxzZSIgYW5kIHVzIGludG8gaXQuIFRoZXkgYXJlbid0CisJICogcGxheWluZywgYmVjYXVzZSB3ZSBvd24gdGhlIHNwaW5sb2NrIGluIHRoZQorCSAqIHdhaXRfcXVldWVfaGVhZC4KKwkgKi8KKwlpZiAoIWF0b21pY19hZGRfbmVnYXRpdmUoc2xlZXBlcnMsICZzZW0tPmNvdW50KSkgeworCQl3YWtlX3VwX2xvY2tlZCgmc2VtLT53YWl0KTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZW0tPndhaXQubG9jaywgZmxhZ3MpOworCXJldHVybiAxOworfQorCisKKy8qCisgKiBUaGUgc2VtYXBob3JlIG9wZXJhdGlvbnMgaGF2ZSBhIHNwZWNpYWwgY2FsbGluZyBzZXF1ZW5jZSB0aGF0CisgKiBhbGxvdyB1cyB0byBkbyBhIHNpbXBsZXIgaW4tbGluZSB2ZXJzaW9uIG9mIHRoZW0uIFRoZXNlIHJvdXRpbmVzCisgKiBuZWVkIHRvIGNvbnZlcnQgdGhhdCBzZXF1ZW5jZSBiYWNrIGludG8gdGhlIEMgc2VxdWVuY2Ugd2hlbgorICogdGhlcmUgaXMgY29udGVudGlvbiBvbiB0aGUgc2VtYXBob3JlLgorICoKKyAqICVlYXggY29udGFpbnMgdGhlIHNlbWFwaG9yZSBwb2ludGVyIG9uIGVudHJ5LiBTYXZlIHRoZSBDLWNsb2JiZXJlZAorICogcmVnaXN0ZXJzICglZWF4LCAlZWR4IGFuZCAlZWN4KSBleGNlcHQgJWVheCB3aGlzaCBpcyBlaXRoZXIgYSByZXR1cm4KKyAqIHZhbHVlIG9yIGp1c3QgY2xvYmJlcmVkLi4KKyAqLworYXNtKAorIi5zZWN0aW9uIC5zY2hlZC50ZXh0XG4iCisiLmFsaWduIDRcbiIKKyIuZ2xvYmwgX19kb3duX2ZhaWxlZFxuIgorIl9fZG93bl9mYWlsZWQ6XG5cdCIKKyNpZiBkZWZpbmVkKENPTkZJR19GUkFNRV9QT0lOVEVSKQorCSJwdXNobCAlZWJwXG5cdCIKKwkibW92bCAgJWVzcCwlZWJwXG5cdCIKKyNlbmRpZgorCSJwdXNobCAlZWR4XG5cdCIKKwkicHVzaGwgJWVjeFxuXHQiCisJImNhbGwgX19kb3duXG5cdCIKKwkicG9wbCAlZWN4XG5cdCIKKwkicG9wbCAlZWR4XG5cdCIKKyNpZiBkZWZpbmVkKENPTkZJR19GUkFNRV9QT0lOVEVSKQorCSJtb3ZsICVlYnAsJWVzcFxuXHQiCisJInBvcGwgJWVicFxuXHQiCisjZW5kaWYKKwkicmV0IgorKTsKKworYXNtKAorIi5zZWN0aW9uIC5zY2hlZC50ZXh0XG4iCisiLmFsaWduIDRcbiIKKyIuZ2xvYmwgX19kb3duX2ZhaWxlZF9pbnRlcnJ1cHRpYmxlXG4iCisiX19kb3duX2ZhaWxlZF9pbnRlcnJ1cHRpYmxlOlxuXHQiCisjaWYgZGVmaW5lZChDT05GSUdfRlJBTUVfUE9JTlRFUikKKwkicHVzaGwgJWVicFxuXHQiCisJIm1vdmwgICVlc3AsJWVicFxuXHQiCisjZW5kaWYKKwkicHVzaGwgJWVkeFxuXHQiCisJInB1c2hsICVlY3hcblx0IgorCSJjYWxsIF9fZG93bl9pbnRlcnJ1cHRpYmxlXG5cdCIKKwkicG9wbCAlZWN4XG5cdCIKKwkicG9wbCAlZWR4XG5cdCIKKyNpZiBkZWZpbmVkKENPTkZJR19GUkFNRV9QT0lOVEVSKQorCSJtb3ZsICVlYnAsJWVzcFxuXHQiCisJInBvcGwgJWVicFxuXHQiCisjZW5kaWYKKwkicmV0IgorKTsKKworYXNtKAorIi5zZWN0aW9uIC5zY2hlZC50ZXh0XG4iCisiLmFsaWduIDRcbiIKKyIuZ2xvYmwgX19kb3duX2ZhaWxlZF90cnlsb2NrXG4iCisiX19kb3duX2ZhaWxlZF90cnlsb2NrOlxuXHQiCisjaWYgZGVmaW5lZChDT05GSUdfRlJBTUVfUE9JTlRFUikKKwkicHVzaGwgJWVicFxuXHQiCisJIm1vdmwgICVlc3AsJWVicFxuXHQiCisjZW5kaWYKKwkicHVzaGwgJWVkeFxuXHQiCisJInB1c2hsICVlY3hcblx0IgorCSJjYWxsIF9fZG93bl90cnlsb2NrXG5cdCIKKwkicG9wbCAlZWN4XG5cdCIKKwkicG9wbCAlZWR4XG5cdCIKKyNpZiBkZWZpbmVkKENPTkZJR19GUkFNRV9QT0lOVEVSKQorCSJtb3ZsICVlYnAsJWVzcFxuXHQiCisJInBvcGwgJWVicFxuXHQiCisjZW5kaWYKKwkicmV0IgorKTsKKworYXNtKAorIi5zZWN0aW9uIC5zY2hlZC50ZXh0XG4iCisiLmFsaWduIDRcbiIKKyIuZ2xvYmwgX191cF93YWtldXBcbiIKKyJfX3VwX3dha2V1cDpcblx0IgorCSJwdXNobCAlZWR4XG5cdCIKKwkicHVzaGwgJWVjeFxuXHQiCisJImNhbGwgX191cFxuXHQiCisJInBvcGwgJWVjeFxuXHQiCisJInBvcGwgJWVkeFxuXHQiCisJInJldCIKKyk7CisKKy8qCisgKiBydyBzcGlubG9jayBmYWxsYmFja3MKKyAqLworI2lmIGRlZmluZWQoQ09ORklHX1NNUCkKK2FzbSgKKyIuc2VjdGlvbiAuc2NoZWQudGV4dFxuIgorIi5hbGlnbgk0XG4iCisiLmdsb2JsCV9fd3JpdGVfbG9ja19mYWlsZWRcbiIKKyJfX3dyaXRlX2xvY2tfZmFpbGVkOlxuXHQiCisJTE9DSyAiYWRkbAkkIiBSV19MT0NLX0JJQVNfU1RSICIsKCVlYXgpXG4iCisiMToJcmVwOyBub3Bcblx0IgorCSJjbXBsCSQiIFJXX0xPQ0tfQklBU19TVFIgIiwoJWVheClcblx0IgorCSJqbmUJMWJcblx0IgorCUxPQ0sgInN1YmwJJCIgUldfTE9DS19CSUFTX1NUUiAiLCglZWF4KVxuXHQiCisJImpueglfX3dyaXRlX2xvY2tfZmFpbGVkXG5cdCIKKwkicmV0IgorKTsKKworYXNtKAorIi5zZWN0aW9uIC5zY2hlZC50ZXh0XG4iCisiLmFsaWduCTRcbiIKKyIuZ2xvYmwJX19yZWFkX2xvY2tfZmFpbGVkXG4iCisiX19yZWFkX2xvY2tfZmFpbGVkOlxuXHQiCisJTE9DSyAiaW5jbAkoJWVheClcbiIKKyIxOglyZXA7IG5vcFxuXHQiCisJImNtcGwJJDEsKCVlYXgpXG5cdCIKKwkianMJMWJcblx0IgorCUxPQ0sgImRlY2wJKCVlYXgpXG5cdCIKKwkianMJX19yZWFkX2xvY2tfZmFpbGVkXG5cdCIKKwkicmV0IgorKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9zZXR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NWVjNzMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3NldHVwLmMKQEAgLTAsMCArMSwxNTM1IEBACisvKgorICogIGxpbnV4L2FyY2gvaTM4Ni9rZXJuZWwvc2V0dXAuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUgIExpbnVzIFRvcnZhbGRzCisgKgorICogIFN1cHBvcnQgb2YgQklHTUVNIGFkZGVkIGJ5IEdlcmhhcmQgV2ljaGVydCwgU2llbWVucyBBRywgSnVseSAxOTk5CisgKgorICogIE1lbW9yeSByZWdpb24gc3VwcG9ydAorICoJRGF2aWQgUGFyc29ucyA8b3JjQHBlbGwuY2hpLmlsLnVzPiwgSnVseS1BdWd1c3QgMTk5OQorICoKKyAqICBBZGRlZCBFODIwIHNhbml0aXphdGlvbiByb3V0aW5lIChyZW1vdmVzIG92ZXJsYXBwaW5nIG1lbW9yeSByZWdpb25zKTsKKyAqICBCcmlhbiBNb3lsZSA8Ym1veWxlQG12aXN0YS5jb20+LCBGZWJydWFyeSAyMDAxCisgKgorICogTW92ZWQgQ1BVIGRldGVjdGlvbiBjb2RlIHRvIGNwdS8ke2NwdX0uYworICogICAgUGF0cmljayBNb2NoZWwgPG1vY2hlbEBvc2RsLm9yZz4sIE1hcmNoIDIwMDIKKyAqCisgKiAgUHJvdmlzaW9ucyBmb3IgZW1wdHkgRTgyMCBtZW1vcnkgcmVnaW9ucyAocmVwb3J0ZWQgYnkgY2VydGFpbiBCSU9TZXMpLgorICogIEFsZXggQWNoZW5iYWNoIDx4ZWxhQHNsaXQuZGU+LCBEZWNlbWJlciAyMDAyLgorICoKKyAqLworCisvKgorICogVGhpcyBmaWxlIGhhbmRsZXMgdGhlIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgcGFydHMgb2YgaW5pdGlhbGl6YXRpb24KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9hcG1fYmlvcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXRyZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tY2EuaD4KKyNpbmNsdWRlIDxsaW51eC9yb290X2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lZmkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZWRkLmg+CisjaW5jbHVkZSA8bGludXgvbm9kZW1hc2suaD4KKyNpbmNsdWRlIDx2aWRlby9lZGlkLmg+CisjaW5jbHVkZSA8YXNtL2U4MjAuaD4KKyNpbmNsdWRlIDxhc20vbXBzcGVjLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL2FyY2hfaG9va3MuaD4KKyNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KKyNpbmNsdWRlIDxhc20vaW9fYXBpYy5oPgorI2luY2x1ZGUgPGFzbS9pc3QuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlICJzZXR1cF9hcmNoX3ByZS5oIgorI2luY2x1ZGUgPGJpb3NfZWJkYS5oPgorCisvKiBUaGlzIHZhbHVlIGlzIHNldCB1cCBieSB0aGUgZWFybHkgYm9vdCBjb2RlIHRvIHBvaW50IHRvIHRoZSB2YWx1ZQorICAgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGJvb3QgdGltZSBwYWdlIHRhYmxlcy4gIEl0IGNvbnRhaW5zIGEgKnBoeXNpY2FsKgorICAgYWRkcmVzcywgYW5kIG11c3Qgbm90IGJlIGluIHRoZSAuYnNzIHNlZ21lbnQhICovCit1bnNpZ25lZCBsb25nIGluaXRfcGdfdGFibGVzX2VuZCBfX2luaXRkYXRhID0gfjBVTDsKKworaW50IGRpc2FibGVfcHNlIF9faW5pdGRhdGEgPSAwOworCisvKgorICogTWFjaGluZSBzZXR1cC4uCisgKi8KKworI2lmZGVmIENPTkZJR19FRkkKK2ludCBlZmlfZW5hYmxlZCA9IDA7CitFWFBPUlRfU1lNQk9MKGVmaV9lbmFibGVkKTsKKyNlbmRpZgorCisvKiBjcHUgZGF0YSBhcyBkZXRlY3RlZCBieSB0aGUgYXNzZW1ibHkgY29kZSBpbiBoZWFkLlMgKi8KK3N0cnVjdCBjcHVpbmZvX3g4NiBuZXdfY3B1X2RhdGEgX19pbml0ZGF0YSA9IHsgMCwgMCwgMCwgMCwgLTEsIDEsIDAsIDAsIC0xIH07CisvKiBjb21tb24gY3B1IGRhdGEgZm9yIGFsbCBjcHVzICovCitzdHJ1Y3QgY3B1aW5mb194ODYgYm9vdF9jcHVfZGF0YSA9IHsgMCwgMCwgMCwgMCwgLTEsIDEsIDAsIDAsIC0xIH07CisKK3Vuc2lnbmVkIGxvbmcgbW11X2NyNF9mZWF0dXJlczsKKworI2lmZGVmCUNPTkZJR19BQ1BJX0lOVEVSUFJFVEVSCisJaW50IGFjcGlfZGlzYWJsZWQgPSAwOworI2Vsc2UKKwlpbnQgYWNwaV9kaXNhYmxlZCA9IDE7CisjZW5kaWYKK0VYUE9SVF9TWU1CT0woYWNwaV9kaXNhYmxlZCk7CisKKyNpZmRlZglDT05GSUdfQUNQSV9CT09UCitpbnQgX19pbml0ZGF0YSBhY3BpX2ZvcmNlID0gMDsKK2V4dGVybiBhY3BpX2ludGVycnVwdF9mbGFncwlhY3BpX3NjaV9mbGFnczsKKyNlbmRpZgorCisvKiBmb3IgTUNBLCBidXQgYW55b25lIGVsc2UgY2FuIHVzZSBpdCBpZiB0aGV5IHdhbnQgKi8KK3Vuc2lnbmVkIGludCBtYWNoaW5lX2lkOwordW5zaWduZWQgaW50IG1hY2hpbmVfc3VibW9kZWxfaWQ7Cit1bnNpZ25lZCBpbnQgQklPU19yZXZpc2lvbjsKK3Vuc2lnbmVkIGludCBtY2FfcGVudGl1bV9mbGFnOworCisvKiBGb3IgUENJIG9yIG90aGVyIG1lbW9yeS1tYXBwZWQgcmVzb3VyY2VzICovCit1bnNpZ25lZCBsb25nIHBjaV9tZW1fc3RhcnQgPSAweDEwMDAwMDAwOworCisvKiBCb290IGxvYWRlciBJRCBhcyBhbiBpbnRlZ2VyLCBmb3IgdGhlIGJlbmVmaXQgb2YgcHJvY19kb2ludHZlYyAqLworaW50IGJvb3Rsb2FkZXJfdHlwZTsKKworLyogdXNlci1kZWZpbmVkIGhpZ2htZW0gc2l6ZSAqLworc3RhdGljIHVuc2lnbmVkIGludCBoaWdobWVtX3BhZ2VzID0gLTE7CisKKy8qCisgKiBTZXR1cCBvcHRpb25zCisgKi8KK3N0cnVjdCBkcml2ZV9pbmZvX3N0cnVjdCB7IGNoYXIgZHVtbXlbMzJdOyB9IGRyaXZlX2luZm87CitzdHJ1Y3Qgc2NyZWVuX2luZm8gc2NyZWVuX2luZm87CitzdHJ1Y3QgYXBtX2luZm8gYXBtX2luZm87CitzdHJ1Y3Qgc3lzX2Rlc2NfdGFibGVfc3RydWN0IHsKKwl1bnNpZ25lZCBzaG9ydCBsZW5ndGg7CisJdW5zaWduZWQgY2hhciB0YWJsZVswXTsKK307CitzdHJ1Y3QgZWRpZF9pbmZvIGVkaWRfaW5mbzsKK3N0cnVjdCBpc3RfaW5mbyBpc3RfaW5mbzsKK3N0cnVjdCBlODIwbWFwIGU4MjA7CisKK2V4dGVybiB2b2lkIGVhcmx5X2NwdV9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgZG1pX3NjYW5fbWFjaGluZSh2b2lkKTsKK2V4dGVybiB2b2lkIGdlbmVyaWNfYXBpY19wcm9iZShjaGFyICopOworZXh0ZXJuIGludCByb290X21vdW50ZmxhZ3M7CisKK3Vuc2lnbmVkIGxvbmcgc2F2ZWRfdmlkZW9tb2RlOworCisjZGVmaW5lIFJBTURJU0tfSU1BR0VfU1RBUlRfTUFTSyAgCTB4MDdGRgorI2RlZmluZSBSQU1ESVNLX1BST01QVF9GTEFHCQkweDgwMDAKKyNkZWZpbmUgUkFNRElTS19MT0FEX0ZMQUcJCTB4NDAwMAkKKworc3RhdGljIGNoYXIgY29tbWFuZF9saW5lW0NPTU1BTkRfTElORV9TSVpFXTsKKwordW5zaWduZWQgY2hhciBfX2luaXRkYXRhIGJvb3RfcGFyYW1zW1BBUkFNX1NJWkVdOworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGRhdGFfcmVzb3VyY2UgPSB7CisJLm5hbWUJPSAiS2VybmVsIGRhdGEiLAorCS5zdGFydAk9IDAsCisJLmVuZAk9IDAsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9NRU0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY29kZV9yZXNvdXJjZSA9IHsKKwkubmFtZQk9ICJLZXJuZWwgY29kZSIsCisJLnN0YXJ0CT0gMCwKKwkuZW5kCT0gMCwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX01FTQorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzeXN0ZW1fcm9tX3Jlc291cmNlID0geworCS5uYW1lCT0gIlN5c3RlbSBST00iLAorCS5zdGFydAk9IDB4ZjAwMDAsCisJLmVuZAk9IDB4ZmZmZmYsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9SRUFET05MWSB8IElPUkVTT1VSQ0VfTUVNCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGV4dGVuc2lvbl9yb21fcmVzb3VyY2UgPSB7CisJLm5hbWUJPSAiRXh0ZW5zaW9uIFJPTSIsCisJLnN0YXJ0CT0gMHhlMDAwMCwKKwkuZW5kCT0gMHhlZmZmZiwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX1JFQURPTkxZIHwgSU9SRVNPVVJDRV9NRU0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYWRhcHRlcl9yb21fcmVzb3VyY2VzW10gPSB7IHsKKwkubmFtZSAJPSAiQWRhcHRlciBST00iLAorCS5zdGFydAk9IDB4YzgwMDAsCisJLmVuZAk9IDAsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9SRUFET05MWSB8IElPUkVTT1VSQ0VfTUVNCit9LCB7CisJLm5hbWUgCT0gIkFkYXB0ZXIgUk9NIiwKKwkuc3RhcnQJPSAwLAorCS5lbmQJPSAwLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfUkVBRE9OTFkgfCBJT1JFU09VUkNFX01FTQorfSwgeworCS5uYW1lIAk9ICJBZGFwdGVyIFJPTSIsCisJLnN0YXJ0CT0gMCwKKwkuZW5kCT0gMCwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX1JFQURPTkxZIHwgSU9SRVNPVVJDRV9NRU0KK30sIHsKKwkubmFtZSAJPSAiQWRhcHRlciBST00iLAorCS5zdGFydAk9IDAsCisJLmVuZAk9IDAsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9SRUFET05MWSB8IElPUkVTT1VSQ0VfTUVNCit9LCB7CisJLm5hbWUgCT0gIkFkYXB0ZXIgUk9NIiwKKwkuc3RhcnQJPSAwLAorCS5lbmQJPSAwLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfUkVBRE9OTFkgfCBJT1JFU09VUkNFX01FTQorfSwgeworCS5uYW1lIAk9ICJBZGFwdGVyIFJPTSIsCisJLnN0YXJ0CT0gMCwKKwkuZW5kCT0gMCwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX1JFQURPTkxZIHwgSU9SRVNPVVJDRV9NRU0KK30gfTsKKworI2RlZmluZSBBREFQVEVSX1JPTV9SRVNPVVJDRVMgXAorCShzaXplb2YgYWRhcHRlcl9yb21fcmVzb3VyY2VzIC8gc2l6ZW9mIGFkYXB0ZXJfcm9tX3Jlc291cmNlc1swXSkKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB2aWRlb19yb21fcmVzb3VyY2UgPSB7CisJLm5hbWUgCT0gIlZpZGVvIFJPTSIsCisJLnN0YXJ0CT0gMHhjMDAwMCwKKwkuZW5kCT0gMHhjN2ZmZiwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX1JFQURPTkxZIHwgSU9SRVNPVVJDRV9NRU0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdmlkZW9fcmFtX3Jlc291cmNlID0geworCS5uYW1lCT0gIlZpZGVvIFJBTSBhcmVhIiwKKwkuc3RhcnQJPSAweGEwMDAwLAorCS5lbmQJPSAweGJmZmZmLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfTUVNCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHN0YW5kYXJkX2lvX3Jlc291cmNlc1tdID0geyB7CisJLm5hbWUJPSAiZG1hMSIsCisJLnN0YXJ0CT0gMHgwMDAwLAorCS5lbmQJPSAweDAwMWYsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9JTworfSwgeworCS5uYW1lCT0gInBpYzEiLAorCS5zdGFydAk9IDB4MDAyMCwKKwkuZW5kCT0gMHgwMDIxLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfSU8KK30sIHsKKwkubmFtZSAgID0gInRpbWVyMCIsCisJLnN0YXJ0CT0gMHgwMDQwLAorCS5lbmQgICAgPSAweDAwNDMsCisJLmZsYWdzICA9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfSU8KK30sIHsKKwkubmFtZSAgID0gInRpbWVyMSIsCisJLnN0YXJ0ICA9IDB4MDA1MCwKKwkuZW5kICAgID0gMHgwMDUzLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfSU8KK30sIHsKKwkubmFtZQk9ICJrZXlib2FyZCIsCisJLnN0YXJ0CT0gMHgwMDYwLAorCS5lbmQJPSAweDAwNmYsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9JTworfSwgeworCS5uYW1lCT0gImRtYSBwYWdlIHJlZyIsCisJLnN0YXJ0CT0gMHgwMDgwLAorCS5lbmQJPSAweDAwOGYsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9JTworfSwgeworCS5uYW1lCT0gInBpYzIiLAorCS5zdGFydAk9IDB4MDBhMCwKKwkuZW5kCT0gMHgwMGExLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfSU8KK30sIHsKKwkubmFtZQk9ICJkbWEyIiwKKwkuc3RhcnQJPSAweDAwYzAsCisJLmVuZAk9IDB4MDBkZiwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX0lPCit9LCB7CisJLm5hbWUJPSAiZnB1IiwKKwkuc3RhcnQJPSAweDAwZjAsCisJLmVuZAk9IDB4MDBmZiwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX0lPCit9IH07CisKKyNkZWZpbmUgU1RBTkRBUkRfSU9fUkVTT1VSQ0VTIFwKKwkoc2l6ZW9mIHN0YW5kYXJkX2lvX3Jlc291cmNlcyAvIHNpemVvZiBzdGFuZGFyZF9pb19yZXNvdXJjZXNbMF0pCisKKyNkZWZpbmUgcm9tc2lnbmF0dXJlKHgpICgqKHVuc2lnbmVkIHNob3J0ICopKHgpID09IDB4YWE1NSkKKworc3RhdGljIGludCBfX2luaXQgcm9tY2hlY2tzdW0odW5zaWduZWQgY2hhciAqcm9tLCB1bnNpZ25lZCBsb25nIGxlbmd0aCkKK3sKKwl1bnNpZ25lZCBjaGFyICpwLCBzdW0gPSAwOworCisJZm9yIChwID0gcm9tOyBwIDwgcm9tICsgbGVuZ3RoOyBwKyspCisJCXN1bSArPSAqcDsKKwlyZXR1cm4gc3VtID09IDA7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBwcm9iZV9yb21zKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBzdGFydCwgbGVuZ3RoLCB1cHBlcjsKKwl1bnNpZ25lZCBjaGFyICpyb207CisJaW50CSAgICAgIGk7CisKKwkvKiB2aWRlbyByb20gKi8KKwl1cHBlciA9IGFkYXB0ZXJfcm9tX3Jlc291cmNlc1swXS5zdGFydDsKKwlmb3IgKHN0YXJ0ID0gdmlkZW9fcm9tX3Jlc291cmNlLnN0YXJ0OyBzdGFydCA8IHVwcGVyOyBzdGFydCArPSAyMDQ4KSB7CisJCXJvbSA9IGlzYV9idXNfdG9fdmlydChzdGFydCk7CisJCWlmICghcm9tc2lnbmF0dXJlKHJvbSkpCisJCQljb250aW51ZTsKKworCQl2aWRlb19yb21fcmVzb3VyY2Uuc3RhcnQgPSBzdGFydDsKKworCQkvKiAwIDwgbGVuZ3RoIDw9IDB4N2YgKiA1MTIsIGhpc3RvcmljYWxseSAqLworCQlsZW5ndGggPSByb21bMl0gKiA1MTI7CisKKwkJLyogaWYgY2hlY2tzdW0gb2theSwgdHJ1c3QgbGVuZ3RoIGJ5dGUgKi8KKwkJaWYgKGxlbmd0aCAmJiByb21jaGVja3N1bShyb20sIGxlbmd0aCkpCisJCQl2aWRlb19yb21fcmVzb3VyY2UuZW5kID0gc3RhcnQgKyBsZW5ndGggLSAxOworCisJCXJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCAmdmlkZW9fcm9tX3Jlc291cmNlKTsKKwkJYnJlYWs7CisJfQorCisJc3RhcnQgPSAodmlkZW9fcm9tX3Jlc291cmNlLmVuZCArIDEgKyAyMDQ3KSAmIH4yMDQ3VUw7CisJaWYgKHN0YXJ0IDwgdXBwZXIpCisJCXN0YXJ0ID0gdXBwZXI7CisKKwkvKiBzeXN0ZW0gcm9tICovCisJcmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZzeXN0ZW1fcm9tX3Jlc291cmNlKTsKKwl1cHBlciA9IHN5c3RlbV9yb21fcmVzb3VyY2Uuc3RhcnQ7CisKKwkvKiBjaGVjayBmb3IgZXh0ZW5zaW9uIHJvbSAoaWdub3JlIGxlbmd0aCBieXRlISkgKi8KKwlyb20gPSBpc2FfYnVzX3RvX3ZpcnQoZXh0ZW5zaW9uX3JvbV9yZXNvdXJjZS5zdGFydCk7CisJaWYgKHJvbXNpZ25hdHVyZShyb20pKSB7CisJCWxlbmd0aCA9IGV4dGVuc2lvbl9yb21fcmVzb3VyY2UuZW5kIC0gZXh0ZW5zaW9uX3JvbV9yZXNvdXJjZS5zdGFydCArIDE7CisJCWlmIChyb21jaGVja3N1bShyb20sIGxlbmd0aCkpIHsKKwkJCXJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCAmZXh0ZW5zaW9uX3JvbV9yZXNvdXJjZSk7CisJCQl1cHBlciA9IGV4dGVuc2lvbl9yb21fcmVzb3VyY2Uuc3RhcnQ7CisJCX0KKwl9CisKKwkvKiBjaGVjayBmb3IgYWRhcHRlciByb21zIG9uIDJrIGJvdW5kYXJpZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQURBUFRFUl9ST01fUkVTT1VSQ0VTICYmIHN0YXJ0IDwgdXBwZXI7IHN0YXJ0ICs9IDIwNDgpIHsKKwkJcm9tID0gaXNhX2J1c190b192aXJ0KHN0YXJ0KTsKKwkJaWYgKCFyb21zaWduYXR1cmUocm9tKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIDAgPCBsZW5ndGggPD0gMHg3ZiAqIDUxMiwgaGlzdG9yaWNhbGx5ICovCisJCWxlbmd0aCA9IHJvbVsyXSAqIDUxMjsKKworCQkvKiBidXQgYWNjZXB0IGFueSBsZW5ndGggdGhhdCBmaXRzIGlmIGNoZWNrc3VtIG9rYXkgKi8KKwkJaWYgKCFsZW5ndGggfHwgc3RhcnQgKyBsZW5ndGggPiB1cHBlciB8fCAhcm9tY2hlY2tzdW0ocm9tLCBsZW5ndGgpKQorCQkJY29udGludWU7CisKKwkJYWRhcHRlcl9yb21fcmVzb3VyY2VzW2ldLnN0YXJ0ID0gc3RhcnQ7CisJCWFkYXB0ZXJfcm9tX3Jlc291cmNlc1tpXS5lbmQgPSBzdGFydCArIGxlbmd0aCAtIDE7CisJCXJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCAmYWRhcHRlcl9yb21fcmVzb3VyY2VzW2ldKTsKKworCQlzdGFydCA9IGFkYXB0ZXJfcm9tX3Jlc291cmNlc1tpKytdLmVuZCAmIH4yMDQ3VUw7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2luaXQgbGltaXRfcmVnaW9ucyh1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgY3VycmVudF9hZGRyID0gMDsKKwlpbnQgaTsKKworCWlmIChlZmlfZW5hYmxlZCkgeworCQlmb3IgKGkgPSAwOyBpIDwgbWVtbWFwLm5yX21hcDsgaSsrKSB7CisJCQljdXJyZW50X2FkZHIgPSBtZW1tYXAubWFwW2ldLnBoeXNfYWRkciArCisJCQkJICAgICAgIChtZW1tYXAubWFwW2ldLm51bV9wYWdlcyA8PCAxMik7CisJCQlpZiAobWVtbWFwLm1hcFtpXS50eXBlID09IEVGSV9DT05WRU5USU9OQUxfTUVNT1JZKSB7CisJCQkJaWYgKGN1cnJlbnRfYWRkciA+PSBzaXplKSB7CisJCQkJCW1lbW1hcC5tYXBbaV0ubnVtX3BhZ2VzIC09CisJCQkJCQkoKChjdXJyZW50X2FkZHItc2l6ZSkgKyBQQUdFX1NJWkUtMSkgPj4gUEFHRV9TSElGVCk7CisJCQkJCW1lbW1hcC5ucl9tYXAgPSBpICsgMTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlmb3IgKGkgPSAwOyBpIDwgZTgyMC5ucl9tYXA7IGkrKykgeworCQlpZiAoZTgyMC5tYXBbaV0udHlwZSA9PSBFODIwX1JBTSkgeworCQkJY3VycmVudF9hZGRyID0gZTgyMC5tYXBbaV0uYWRkciArIGU4MjAubWFwW2ldLnNpemU7CisJCQlpZiAoY3VycmVudF9hZGRyID49IHNpemUpIHsKKwkJCQllODIwLm1hcFtpXS5zaXplIC09IGN1cnJlbnRfYWRkci1zaXplOworCQkJCWU4MjAubnJfbWFwID0gaSArIDE7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2luaXQgYWRkX21lbW9yeV9yZWdpb24odW5zaWduZWQgbG9uZyBsb25nIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBzaXplLCBpbnQgdHlwZSkKK3sKKwlpbnQgeDsKKworCWlmICghZWZpX2VuYWJsZWQpIHsKKyAgICAgICAJCXggPSBlODIwLm5yX21hcDsKKworCQlpZiAoeCA9PSBFODIwTUFYKSB7CisJCSAgICBwcmludGsoS0VSTl9FUlIgIk9vb3BzISBUb28gbWFueSBlbnRyaWVzIGluIHRoZSBtZW1vcnkgbWFwIVxuIik7CisJCSAgICByZXR1cm47CisJCX0KKworCQllODIwLm1hcFt4XS5hZGRyID0gc3RhcnQ7CisJCWU4MjAubWFwW3hdLnNpemUgPSBzaXplOworCQllODIwLm1hcFt4XS50eXBlID0gdHlwZTsKKwkJZTgyMC5ucl9tYXArKzsKKwl9Cit9IC8qIGFkZF9tZW1vcnlfcmVnaW9uICovCisKKyNkZWZpbmUgRTgyMF9ERUJVRwkxCisKK3N0YXRpYyB2b2lkIF9faW5pdCBwcmludF9tZW1vcnlfbWFwKGNoYXIgKndobykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7CisJCXByaW50aygiICVzOiAlMDE2THggLSAlMDE2THggIiwgd2hvLAorCQkJZTgyMC5tYXBbaV0uYWRkciwKKwkJCWU4MjAubWFwW2ldLmFkZHIgKyBlODIwLm1hcFtpXS5zaXplKTsKKwkJc3dpdGNoIChlODIwLm1hcFtpXS50eXBlKSB7CisJCWNhc2UgRTgyMF9SQU06CXByaW50aygiKHVzYWJsZSlcbiIpOworCQkJCWJyZWFrOworCQljYXNlIEU4MjBfUkVTRVJWRUQ6CisJCQkJcHJpbnRrKCIocmVzZXJ2ZWQpXG4iKTsKKwkJCQlicmVhazsKKwkJY2FzZSBFODIwX0FDUEk6CisJCQkJcHJpbnRrKCIoQUNQSSBkYXRhKVxuIik7CisJCQkJYnJlYWs7CisJCWNhc2UgRTgyMF9OVlM6CisJCQkJcHJpbnRrKCIoQUNQSSBOVlMpXG4iKTsKKwkJCQlicmVhazsKKwkJZGVmYXVsdDoJcHJpbnRrKCJ0eXBlICVsdVxuIiwgZTgyMC5tYXBbaV0udHlwZSk7CisJCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qCisgKiBTYW5pdGl6ZSB0aGUgQklPUyBlODIwIG1hcC4KKyAqCisgKiBTb21lIGU4MjAgcmVzcG9uc2VzIGluY2x1ZGUgb3ZlcmxhcHBpbmcgZW50cmllcy4gIFRoZSBmb2xsb3dpbmcgCisgKiByZXBsYWNlcyB0aGUgb3JpZ2luYWwgZTgyMCBtYXAgd2l0aCBhIG5ldyBvbmUsIHJlbW92aW5nIG92ZXJsYXBzLgorICoKKyAqLworc3RydWN0IGNoYW5nZV9tZW1iZXIgeworCXN0cnVjdCBlODIwZW50cnkgKnBiaW9zOyAvKiBwb2ludGVyIHRvIG9yaWdpbmFsIGJpb3MgZW50cnkgKi8KKwl1bnNpZ25lZCBsb25nIGxvbmcgYWRkcjsgLyogYWRkcmVzcyBmb3IgdGhpcyBjaGFuZ2UgcG9pbnQgKi8KK307CitzdGF0aWMgc3RydWN0IGNoYW5nZV9tZW1iZXIgY2hhbmdlX3BvaW50X2xpc3RbMipFODIwTUFYXSBfX2luaXRkYXRhOworc3RhdGljIHN0cnVjdCBjaGFuZ2VfbWVtYmVyICpjaGFuZ2VfcG9pbnRbMipFODIwTUFYXSBfX2luaXRkYXRhOworc3RhdGljIHN0cnVjdCBlODIwZW50cnkgKm92ZXJsYXBfbGlzdFtFODIwTUFYXSBfX2luaXRkYXRhOworc3RhdGljIHN0cnVjdCBlODIwZW50cnkgbmV3X2Jpb3NbRTgyME1BWF0gX19pbml0ZGF0YTsKKworc3RhdGljIGludCBfX2luaXQgc2FuaXRpemVfZTgyMF9tYXAoc3RydWN0IGU4MjBlbnRyeSAqIGJpb3NtYXAsIGNoYXIgKiBwbnJfbWFwKQoreworCXN0cnVjdCBjaGFuZ2VfbWVtYmVyICpjaGFuZ2VfdG1wOworCXVuc2lnbmVkIGxvbmcgY3VycmVudF90eXBlLCBsYXN0X3R5cGU7CisJdW5zaWduZWQgbG9uZyBsb25nIGxhc3RfYWRkcjsKKwlpbnQgY2hnaWR4LCBzdGlsbF9jaGFuZ2luZzsKKwlpbnQgb3ZlcmxhcF9lbnRyaWVzOworCWludCBuZXdfYmlvc19lbnRyeTsKKwlpbnQgb2xkX25yLCBuZXdfbnIsIGNoZ19ucjsKKwlpbnQgaTsKKworCS8qCisJCVZpc3VhbGx5IHdlJ3JlIHBlcmZvcm1pbmcgdGhlIGZvbGxvd2luZyAoMSwyLDMsNCA9IG1lbW9yeSB0eXBlcykuLi4KKworCQlTYW1wbGUgbWVtb3J5IG1hcCAody9vdmVybGFwcyk6CisJCSAgIF9fX18yMl9fX19fX19fX19fX19fX19fXworCQkgICBfX19fX19fX19fX19fX19fX19fX19fNF8KKwkJICAgX19fXzExMTFfX19fX19fX19fX19fX19fCisJCSAgIF80NF9fX19fX19fX19fX19fX19fX19fXworCQkgICAxMTExMTExMV9fX19fX19fX19fX19fX18KKwkJICAgX19fX19fX19fX19fX19fX19fX18zM19fCisJCSAgIF9fX19fX19fX19fNDRfX19fX19fX19fXworCQkgICBfX19fX19fX19fMzMzMzNfX19fX19fX18KKwkJICAgX19fX19fX19fX19fX18yMl9fX19fX19fCisJCSAgIF9fX19fX19fX19fX19fX19fX18yMjIyXworCQkgICBfX19fX19fX18xMTExMTExMTFfX19fX18KKwkJICAgX19fX19fX19fX19fX19fX19fX19fMTFfCisJCSAgIF9fX19fX19fX19fX19fX19fNF9fX19fXworCisJCVNhbml0aXplZCBlcXVpdmFsZW50IChubyBvdmVybGFwKToKKwkJICAgMV9fX19fX19fX19fX19fX19fX19fX19fCisJCSAgIF80NF9fX19fX19fX19fX19fX19fX19fXworCQkgICBfX18xX19fX19fX19fX19fX19fX19fX18KKwkJICAgX19fXzIyX19fX19fX19fX19fX19fX19fCisJCSAgIF9fX19fXzExX19fX19fX19fX19fX19fXworCQkgICBfX19fX19fX18xX19fX19fX19fX19fX18KKwkJICAgX19fX19fX19fXzNfX19fX19fX19fX19fCisJCSAgIF9fX19fX19fX19fNDRfX19fX19fX19fXworCQkgICBfX19fX19fX19fX19fMzNfX19fX19fX18KKwkJICAgX19fX19fX19fX19fX19fMl9fX19fX19fCisJCSAgIF9fX19fX19fX19fX19fX18xX19fX19fXworCQkgICBfX19fX19fX19fX19fX19fXzRfX19fX18KKwkJICAgX19fX19fX19fX19fX19fX19fXzJfX19fCisJCSAgIF9fX19fX19fX19fX19fX19fX19fMzNfXworCQkgICBfX19fX19fX19fX19fX19fX19fX19fNF8KKwkqLworCisJLyogaWYgdGhlcmUncyBvbmx5IG9uZSBtZW1vcnkgcmVnaW9uLCBkb24ndCBib3RoZXIgKi8KKwlpZiAoKnBucl9tYXAgPCAyKQorCQlyZXR1cm4gLTE7CisKKwlvbGRfbnIgPSAqcG5yX21hcDsKKworCS8qIGJhaWwgb3V0IGlmIHdlIGZpbmQgYW55IHVucmVhc29uYWJsZSBhZGRyZXNzZXMgaW4gYmlvcyBtYXAgKi8KKwlmb3IgKGk9MDsgaTxvbGRfbnI7IGkrKykKKwkJaWYgKGJpb3NtYXBbaV0uYWRkciArIGJpb3NtYXBbaV0uc2l6ZSA8IGJpb3NtYXBbaV0uYWRkcikKKwkJCXJldHVybiAtMTsKKworCS8qIGNyZWF0ZSBwb2ludGVycyBmb3IgaW5pdGlhbCBjaGFuZ2UtcG9pbnQgaW5mb3JtYXRpb24gKGZvciBzb3J0aW5nKSAqLworCWZvciAoaT0wOyBpIDwgMipvbGRfbnI7IGkrKykKKwkJY2hhbmdlX3BvaW50W2ldID0gJmNoYW5nZV9wb2ludF9saXN0W2ldOworCisJLyogcmVjb3JkIGFsbCBrbm93biBjaGFuZ2UtcG9pbnRzIChzdGFydGluZyBhbmQgZW5kaW5nIGFkZHJlc3NlcyksCisJICAgb21pdHRpbmcgdGhvc2UgdGhhdCBhcmUgZm9yIGVtcHR5IG1lbW9yeSByZWdpb25zICovCisJY2hnaWR4ID0gMDsKKwlmb3IgKGk9MDsgaSA8IG9sZF9ucjsgaSsrKQl7CisJCWlmIChiaW9zbWFwW2ldLnNpemUgIT0gMCkgeworCQkJY2hhbmdlX3BvaW50W2NoZ2lkeF0tPmFkZHIgPSBiaW9zbWFwW2ldLmFkZHI7CisJCQljaGFuZ2VfcG9pbnRbY2hnaWR4KytdLT5wYmlvcyA9ICZiaW9zbWFwW2ldOworCQkJY2hhbmdlX3BvaW50W2NoZ2lkeF0tPmFkZHIgPSBiaW9zbWFwW2ldLmFkZHIgKyBiaW9zbWFwW2ldLnNpemU7CisJCQljaGFuZ2VfcG9pbnRbY2hnaWR4KytdLT5wYmlvcyA9ICZiaW9zbWFwW2ldOworCQl9CisJfQorCWNoZ19uciA9IGNoZ2lkeDsgICAgCS8qIHRydWUgbnVtYmVyIG9mIGNoYW5nZS1wb2ludHMgKi8KKworCS8qIHNvcnQgY2hhbmdlLXBvaW50IGxpc3QgYnkgbWVtb3J5IGFkZHJlc3NlcyAobG93IC0+IGhpZ2gpICovCisJc3RpbGxfY2hhbmdpbmcgPSAxOworCXdoaWxlIChzdGlsbF9jaGFuZ2luZykJeworCQlzdGlsbF9jaGFuZ2luZyA9IDA7CisJCWZvciAoaT0xOyBpIDwgY2hnX25yOyBpKyspICB7CisJCQkvKiBpZiA8Y3VycmVudF9hZGRyPiA+IDxsYXN0X2FkZHI+LCBzd2FwICovCisJCQkvKiBvciwgaWYgY3VycmVudD08c3RhcnRfYWRkcj4gJiBsYXN0PTxlbmRfYWRkcj4sIHN3YXAgKi8KKwkJCWlmICgoY2hhbmdlX3BvaW50W2ldLT5hZGRyIDwgY2hhbmdlX3BvaW50W2ktMV0tPmFkZHIpIHx8CisJCQkJKChjaGFuZ2VfcG9pbnRbaV0tPmFkZHIgPT0gY2hhbmdlX3BvaW50W2ktMV0tPmFkZHIpICYmCisJCQkJIChjaGFuZ2VfcG9pbnRbaV0tPmFkZHIgPT0gY2hhbmdlX3BvaW50W2ldLT5wYmlvcy0+YWRkcikgJiYKKwkJCQkgKGNoYW5nZV9wb2ludFtpLTFdLT5hZGRyICE9IGNoYW5nZV9wb2ludFtpLTFdLT5wYmlvcy0+YWRkcikpCisJCQkgICApCisJCQl7CisJCQkJY2hhbmdlX3RtcCA9IGNoYW5nZV9wb2ludFtpXTsKKwkJCQljaGFuZ2VfcG9pbnRbaV0gPSBjaGFuZ2VfcG9pbnRbaS0xXTsKKwkJCQljaGFuZ2VfcG9pbnRbaS0xXSA9IGNoYW5nZV90bXA7CisJCQkJc3RpbGxfY2hhbmdpbmc9MTsKKwkJCX0KKwkJfQorCX0KKworCS8qIGNyZWF0ZSBhIG5ldyBiaW9zIG1lbW9yeSBtYXAsIHJlbW92aW5nIG92ZXJsYXBzICovCisJb3ZlcmxhcF9lbnRyaWVzPTA7CSAvKiBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgb3ZlcmxhcCB0YWJsZSAqLworCW5ld19iaW9zX2VudHJ5PTA7CSAvKiBpbmRleCBmb3IgY3JlYXRpbmcgbmV3IGJpb3MgbWFwIGVudHJpZXMgKi8KKwlsYXN0X3R5cGUgPSAwOwkJIC8qIHN0YXJ0IHdpdGggdW5kZWZpbmVkIG1lbW9yeSB0eXBlICovCisJbGFzdF9hZGRyID0gMDsJCSAvKiBzdGFydCB3aXRoIDAgYXMgbGFzdCBzdGFydGluZyBhZGRyZXNzICovCisJLyogbG9vcCB0aHJvdWdoIGNoYW5nZS1wb2ludHMsIGRldGVybWluaW5nIGFmZmVjdCBvbiB0aGUgbmV3IGJpb3MgbWFwICovCisJZm9yIChjaGdpZHg9MDsgY2hnaWR4IDwgY2hnX25yOyBjaGdpZHgrKykKKwl7CisJCS8qIGtlZXAgdHJhY2sgb2YgYWxsIG92ZXJsYXBwaW5nIGJpb3MgZW50cmllcyAqLworCQlpZiAoY2hhbmdlX3BvaW50W2NoZ2lkeF0tPmFkZHIgPT0gY2hhbmdlX3BvaW50W2NoZ2lkeF0tPnBiaW9zLT5hZGRyKQorCQl7CisJCQkvKiBhZGQgbWFwIGVudHJ5IHRvIG92ZXJsYXAgbGlzdCAoPiAxIGVudHJ5IGltcGxpZXMgYW4gb3ZlcmxhcCkgKi8KKwkJCW92ZXJsYXBfbGlzdFtvdmVybGFwX2VudHJpZXMrK109Y2hhbmdlX3BvaW50W2NoZ2lkeF0tPnBiaW9zOworCQl9CisJCWVsc2UKKwkJeworCQkJLyogcmVtb3ZlIGVudHJ5IGZyb20gbGlzdCAob3JkZXIgaW5kZXBlbmRlbnQsIHNvIHN3YXAgd2l0aCBsYXN0KSAqLworCQkJZm9yIChpPTA7IGk8b3ZlcmxhcF9lbnRyaWVzOyBpKyspCisJCQl7CisJCQkJaWYgKG92ZXJsYXBfbGlzdFtpXSA9PSBjaGFuZ2VfcG9pbnRbY2hnaWR4XS0+cGJpb3MpCisJCQkJCW92ZXJsYXBfbGlzdFtpXSA9IG92ZXJsYXBfbGlzdFtvdmVybGFwX2VudHJpZXMtMV07CisJCQl9CisJCQlvdmVybGFwX2VudHJpZXMtLTsKKwkJfQorCQkvKiBpZiB0aGVyZSBhcmUgb3ZlcmxhcHBpbmcgZW50cmllcywgZGVjaWRlIHdoaWNoICJ0eXBlIiB0byB1c2UgKi8KKwkJLyogKGxhcmdlciB2YWx1ZSB0YWtlcyBwcmVjZWRlbmNlIC0tIDE9dXNhYmxlLCAyLDMsNCw0Kz11bnVzYWJsZSkgKi8KKwkJY3VycmVudF90eXBlID0gMDsKKwkJZm9yIChpPTA7IGk8b3ZlcmxhcF9lbnRyaWVzOyBpKyspCisJCQlpZiAob3ZlcmxhcF9saXN0W2ldLT50eXBlID4gY3VycmVudF90eXBlKQorCQkJCWN1cnJlbnRfdHlwZSA9IG92ZXJsYXBfbGlzdFtpXS0+dHlwZTsKKwkJLyogY29udGludWUgYnVpbGRpbmcgdXAgbmV3IGJpb3MgbWFwIGJhc2VkIG9uIHRoaXMgaW5mb3JtYXRpb24gKi8KKwkJaWYgKGN1cnJlbnRfdHlwZSAhPSBsYXN0X3R5cGUpCXsKKwkJCWlmIChsYXN0X3R5cGUgIT0gMCkJIHsKKwkJCQluZXdfYmlvc1tuZXdfYmlvc19lbnRyeV0uc2l6ZSA9CisJCQkJCWNoYW5nZV9wb2ludFtjaGdpZHhdLT5hZGRyIC0gbGFzdF9hZGRyOworCQkJCS8qIG1vdmUgZm9yd2FyZCBvbmx5IGlmIHRoZSBuZXcgc2l6ZSB3YXMgbm9uLXplcm8gKi8KKwkJCQlpZiAobmV3X2Jpb3NbbmV3X2Jpb3NfZW50cnldLnNpemUgIT0gMCkKKwkJCQkJaWYgKCsrbmV3X2Jpb3NfZW50cnkgPj0gRTgyME1BWCkKKwkJCQkJCWJyZWFrOyAJLyogbm8gbW9yZSBzcGFjZSBsZWZ0IGZvciBuZXcgYmlvcyBlbnRyaWVzICovCisJCQl9CisJCQlpZiAoY3VycmVudF90eXBlICE9IDApCXsKKwkJCQluZXdfYmlvc1tuZXdfYmlvc19lbnRyeV0uYWRkciA9IGNoYW5nZV9wb2ludFtjaGdpZHhdLT5hZGRyOworCQkJCW5ld19iaW9zW25ld19iaW9zX2VudHJ5XS50eXBlID0gY3VycmVudF90eXBlOworCQkJCWxhc3RfYWRkcj1jaGFuZ2VfcG9pbnRbY2hnaWR4XS0+YWRkcjsKKwkJCX0KKwkJCWxhc3RfdHlwZSA9IGN1cnJlbnRfdHlwZTsKKwkJfQorCX0KKwluZXdfbnIgPSBuZXdfYmlvc19lbnRyeTsgICAvKiByZXRhaW4gY291bnQgZm9yIG5ldyBiaW9zIGVudHJpZXMgKi8KKworCS8qIGNvcHkgbmV3IGJpb3MgbWFwcGluZyBpbnRvIG9yaWdpbmFsIGxvY2F0aW9uICovCisJbWVtY3B5KGJpb3NtYXAsIG5ld19iaW9zLCBuZXdfbnIqc2l6ZW9mKHN0cnVjdCBlODIwZW50cnkpKTsKKwkqcG5yX21hcCA9IG5ld19ucjsKKworCXJldHVybiAwOworfQorCisvKgorICogQ29weSB0aGUgQklPUyBlODIwIG1hcCBpbnRvIGEgc2FmZSBwbGFjZS4KKyAqCisgKiBTYW5pdHktY2hlY2sgaXQgd2hpbGUgd2UncmUgYXQgaXQuLgorICoKKyAqIElmIHdlJ3JlIGx1Y2t5IGFuZCBsaXZlIG9uIGEgbW9kZXJuIHN5c3RlbSwgdGhlIHNldHVwIGNvZGUKKyAqIHdpbGwgaGF2ZSBnaXZlbiB1cyBhIG1lbW9yeSBtYXAgdGhhdCB3ZSBjYW4gdXNlIHRvIHByb3Blcmx5CisgKiBzZXQgdXAgbWVtb3J5LiAgSWYgd2UgYXJlbid0LCB3ZSdsbCBmYWtlIGEgbWVtb3J5IG1hcC4KKyAqCisgKiBXZSBjaGVjayB0byBzZWUgdGhhdCB0aGUgbWVtb3J5IG1hcCBjb250YWlucyBhdCBsZWFzdCAyIGVsZW1lbnRzCisgKiBiZWZvcmUgd2UnbGwgdXNlIGl0LCBiZWNhdXNlIHRoZSBkZXRlY3Rpb24gY29kZSBpbiBzZXR1cC5TIG1heQorICogbm90IGJlIHBlcmZlY3QgYW5kIG1vc3QgZXZlcnkgUEMga25vd24gdG8gbWFuIGhhcyB0d28gbWVtb3J5CisgKiByZWdpb25zOiBvbmUgZnJvbSAwIHRvIDY0MGssIGFuZCBvbmUgZnJvbSAxbWIgdXAuICAoVGhlIElCTQorICogdGhpbmtwYWQgNTYweCwgZm9yIGV4YW1wbGUsIGRvZXMgbm90IGNvb3BlcmF0ZSB3aXRoIHRoZSBtZW1vcnkKKyAqIGRldGVjdGlvbiBjb2RlLikKKyAqLworc3RhdGljIGludCBfX2luaXQgY29weV9lODIwX21hcChzdHJ1Y3QgZTgyMGVudHJ5ICogYmlvc21hcCwgaW50IG5yX21hcCkKK3sKKwkvKiBPbmx5IG9uZSBtZW1vcnkgcmVnaW9uIChvciBuZWdhdGl2ZSk/IElnbm9yZSBpdCAqLworCWlmIChucl9tYXAgPCAyKQorCQlyZXR1cm4gLTE7CisKKwlkbyB7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBzdGFydCA9IGJpb3NtYXAtPmFkZHI7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBzaXplID0gYmlvc21hcC0+c2l6ZTsKKwkJdW5zaWduZWQgbG9uZyBsb25nIGVuZCA9IHN0YXJ0ICsgc2l6ZTsKKwkJdW5zaWduZWQgbG9uZyB0eXBlID0gYmlvc21hcC0+dHlwZTsKKworCQkvKiBPdmVyZmxvdyBpbiA2NCBiaXRzPyBJZ25vcmUgdGhlIG1lbW9yeSBtYXAuICovCisJCWlmIChzdGFydCA+IGVuZCkKKwkJCXJldHVybiAtMTsKKworCQkvKgorCQkgKiBTb21lIEJJT1NlcyBjbGFpbSBSQU0gaW4gdGhlIDY0MGsgLSAxTSByZWdpb24uCisJCSAqIE5vdCByaWdodC4gRml4IGl0IHVwLgorCQkgKi8KKwkJaWYgKHR5cGUgPT0gRTgyMF9SQU0pIHsKKwkJCWlmIChzdGFydCA8IDB4MTAwMDAwVUxMICYmIGVuZCA+IDB4QTAwMDBVTEwpIHsKKwkJCQlpZiAoc3RhcnQgPCAweEEwMDAwVUxMKQorCQkJCQlhZGRfbWVtb3J5X3JlZ2lvbihzdGFydCwgMHhBMDAwMFVMTC1zdGFydCwgdHlwZSk7CisJCQkJaWYgKGVuZCA8PSAweDEwMDAwMFVMTCkKKwkJCQkJY29udGludWU7CisJCQkJc3RhcnQgPSAweDEwMDAwMFVMTDsKKwkJCQlzaXplID0gZW5kIC0gc3RhcnQ7CisJCQl9CisJCX0KKwkJYWRkX21lbW9yeV9yZWdpb24oc3RhcnQsIHNpemUsIHR5cGUpOworCX0gd2hpbGUgKGJpb3NtYXArKywtLW5yX21hcCk7CisJcmV0dXJuIDA7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19FREQpIHx8IGRlZmluZWQoQ09ORklHX0VERF9NT0RVTEUpCitzdHJ1Y3QgZWRkIGVkZDsKKyNpZmRlZiBDT05GSUdfRUREX01PRFVMRQorRVhQT1JUX1NZTUJPTChlZGQpOworI2VuZGlmCisvKioKKyAqIGNvcHlfZWRkKCkgLSBDb3B5IHRoZSBCSU9TIEVERCBpbmZvcm1hdGlvbgorICogICAgICAgICAgICAgIGZyb20gYm9vdF9wYXJhbXMgaW50byBhIHNhZmUgcGxhY2UuCisgKgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY29weV9lZGQodm9pZCkKK3sKKyAgICAgbWVtY3B5KGVkZC5tYnJfc2lnbmF0dXJlLCBFRERfTUJSX1NJR05BVFVSRSwgc2l6ZW9mKGVkZC5tYnJfc2lnbmF0dXJlKSk7CisgICAgIG1lbWNweShlZGQuZWRkX2luZm8sIEVERF9CVUYsIHNpemVvZihlZGQuZWRkX2luZm8pKTsKKyAgICAgZWRkLm1icl9zaWduYXR1cmVfbnIgPSBFRERfTUJSX1NJR19OUjsKKyAgICAgZWRkLmVkZF9pbmZvX25yID0gRUREX05SOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X2VkZCh2b2lkKQoreworfQorI2VuZGlmCisKKy8qCisgKiBEbyBOT1QgRVZFUiBsb29rIGF0IHRoZSBCSU9TIG1lbW9yeSBzaXplIGxvY2F0aW9uLgorICogSXQgZG9lcyBub3Qgd29yayBvbiBtYW55IG1hY2hpbmVzLgorICovCisjZGVmaW5lIExPV01FTVNJWkUoKQkoMHg5ZjAwMCkKKworc3RhdGljIHZvaWQgX19pbml0IHBhcnNlX2NtZGxpbmVfZWFybHkgKGNoYXIgKiogY21kbGluZV9wKQoreworCWNoYXIgYyA9ICcgJywgKnRvID0gY29tbWFuZF9saW5lLCAqZnJvbSA9IHNhdmVkX2NvbW1hbmRfbGluZTsKKwlpbnQgbGVuID0gMDsKKwlpbnQgdXNlcmRlZiA9IDA7CisKKwkvKiBTYXZlIHVucGFyc2VkIGNvbW1hbmQgbGluZSBjb3B5IGZvciAvcHJvYy9jbWRsaW5lICovCisJc2F2ZWRfY29tbWFuZF9saW5lW0NPTU1BTkRfTElORV9TSVpFLTFdID0gJ1wwJzsKKworCWZvciAoOzspIHsKKwkJaWYgKGMgIT0gJyAnKQorCQkJZ290byBuZXh0X2NoYXI7CisJCS8qCisJCSAqICJtZW09bm9wZW50aXVtIiBkaXNhYmxlcyB0aGUgNE1CIHBhZ2UgdGFibGVzLgorCQkgKiAibWVtPVhYWFtrS21NXSIgZGVmaW5lcyBhIG1lbW9yeSByZWdpb24gZnJvbSBISUdIX01FTQorCQkgKiB0byA8bWVtPiwgb3ZlcnJpZGluZyB0aGUgYmlvcyBzaXplLgorCQkgKiAibWVtbWFwPVhYWFtLa21NXUBYWFhbS2ttTV0iIGRlZmluZXMgYSBtZW1vcnkgcmVnaW9uIGZyb20KKwkJICogPHN0YXJ0PiB0byA8c3RhcnQ+KzxtZW0+LCBvdmVycmlkaW5nIHRoZSBiaW9zIHNpemUuCisJCSAqCisJCSAqIEhQQSB0ZWxscyBtZSBib290bG9hZGVycyBuZWVkIHRvIHBhcnNlIG1lbT0sIHNvIG5vIG5ldworCQkgKiBvcHRpb24gc2hvdWxkIGJlIG1lbT0gIFthbHNvIHNlZSBEb2N1bWVudGF0aW9uL2kzODYvYm9vdC50eHRdCisJCSAqLworCQlpZiAoIW1lbWNtcChmcm9tLCAibWVtPSIsIDQpKSB7CisJCQlpZiAodG8gIT0gY29tbWFuZF9saW5lKQorCQkJCXRvLS07CisJCQlpZiAoIW1lbWNtcChmcm9tKzQsICJub3BlbnRpdW0iLCA5KSkgeworCQkJCWZyb20gKz0gOSs0OworCQkJCWNsZWFyX2JpdChYODZfRkVBVFVSRV9QU0UsIGJvb3RfY3B1X2RhdGEueDg2X2NhcGFiaWxpdHkpOworCQkJCWRpc2FibGVfcHNlID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJLyogSWYgdGhlIHVzZXIgc3BlY2lmaWVzIG1lbW9yeSBzaXplLCB3ZQorCQkJCSAqIGxpbWl0IHRoZSBCSU9TLXByb3ZpZGVkIG1lbW9yeSBtYXAgdG8KKwkJCQkgKiB0aGF0IHNpemUuIGV4YWN0bWFwIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkKKwkJCQkgKiB0aGUgZXhhY3QgbWFwLiBtZW09bnVtYmVyIGNhbiBiZSB1c2VkIHRvCisJCQkJICogdHJpbSB0aGUgZXhpc3RpbmcgbWVtb3J5IG1hcC4KKwkJCQkgKi8KKwkJCQl1bnNpZ25lZCBsb25nIGxvbmcgbWVtX3NpemU7CisgCisJCQkJbWVtX3NpemUgPSBtZW1wYXJzZShmcm9tKzQsICZmcm9tKTsKKwkJCQlsaW1pdF9yZWdpb25zKG1lbV9zaXplKTsKKwkJCQl1c2VyZGVmPTE7CisJCQl9CisJCX0KKworCQllbHNlIGlmICghbWVtY21wKGZyb20sICJtZW1tYXA9IiwgNykpIHsKKwkJCWlmICh0byAhPSBjb21tYW5kX2xpbmUpCisJCQkJdG8tLTsKKwkJCWlmICghbWVtY21wKGZyb20rNywgImV4YWN0bWFwIiwgOCkpIHsKKwkJCQlmcm9tICs9IDgrNzsKKwkJCQllODIwLm5yX21hcCA9IDA7CisJCQkJdXNlcmRlZiA9IDE7CisJCQl9IGVsc2UgeworCQkJCS8qIElmIHRoZSB1c2VyIHNwZWNpZmllcyBtZW1vcnkgc2l6ZSwgd2UKKwkJCQkgKiBsaW1pdCB0aGUgQklPUy1wcm92aWRlZCBtZW1vcnkgbWFwIHRvCisJCQkJICogdGhhdCBzaXplLiBleGFjdG1hcCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5CisJCQkJICogdGhlIGV4YWN0IG1hcC4gbWVtPW51bWJlciBjYW4gYmUgdXNlZCB0bworCQkJCSAqIHRyaW0gdGhlIGV4aXN0aW5nIG1lbW9yeSBtYXAuCisJCQkJICovCisJCQkJdW5zaWduZWQgbG9uZyBsb25nIHN0YXJ0X2F0LCBtZW1fc2l6ZTsKKyAKKwkJCQltZW1fc2l6ZSA9IG1lbXBhcnNlKGZyb20rNywgJmZyb20pOworCQkJCWlmICgqZnJvbSA9PSAnQCcpIHsKKwkJCQkJc3RhcnRfYXQgPSBtZW1wYXJzZShmcm9tKzEsICZmcm9tKTsKKwkJCQkJYWRkX21lbW9yeV9yZWdpb24oc3RhcnRfYXQsIG1lbV9zaXplLCBFODIwX1JBTSk7CisJCQkJfSBlbHNlIGlmICgqZnJvbSA9PSAnIycpIHsKKwkJCQkJc3RhcnRfYXQgPSBtZW1wYXJzZShmcm9tKzEsICZmcm9tKTsKKwkJCQkJYWRkX21lbW9yeV9yZWdpb24oc3RhcnRfYXQsIG1lbV9zaXplLCBFODIwX0FDUEkpOworCQkJCX0gZWxzZSBpZiAoKmZyb20gPT0gJyQnKSB7CisJCQkJCXN0YXJ0X2F0ID0gbWVtcGFyc2UoZnJvbSsxLCAmZnJvbSk7CisJCQkJCWFkZF9tZW1vcnlfcmVnaW9uKHN0YXJ0X2F0LCBtZW1fc2l6ZSwgRTgyMF9SRVNFUlZFRCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbGltaXRfcmVnaW9ucyhtZW1fc2l6ZSk7CisJCQkJCXVzZXJkZWY9MTsKKwkJCQl9CisJCQl9CisJCX0KKworCQllbHNlIGlmICghbWVtY21wKGZyb20sICJub2V4ZWM9IiwgNykpCisJCQlub2V4ZWNfc2V0dXAoZnJvbSArIDcpOworCisKKyNpZmRlZiAgQ09ORklHX1g4Nl9TTVAKKwkJLyoKKwkJICogSWYgdGhlIEJJT1MgZW51bWVyYXRlcyBwaHlzaWNhbCBwcm9jZXNzb3JzIGJlZm9yZSBsb2dpY2FsLAorCQkgKiBtYXhjcHVzPU4gYXQgZW51bWVyYXRpb24tdGltZSBjYW4gYmUgdXNlZCB0byBkaXNhYmxlIEhULgorCQkgKi8KKwkJZWxzZSBpZiAoIW1lbWNtcChmcm9tLCAibWF4Y3B1cz0iLCA4KSkgeworCQkJZXh0ZXJuIHVuc2lnbmVkIGludCBtYXhjcHVzOworCisJCQltYXhjcHVzID0gc2ltcGxlX3N0cnRvdWwoZnJvbSArIDgsIE5VTEwsIDApOworCQl9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BQ1BJX0JPT1QKKwkJLyogImFjcGk9b2ZmIiBkaXNhYmxlcyBib3RoIEFDUEkgdGFibGUgcGFyc2luZyBhbmQgaW50ZXJwcmV0ZXIgKi8KKwkJZWxzZSBpZiAoIW1lbWNtcChmcm9tLCAiYWNwaT1vZmYiLCA4KSkgeworCQkJZGlzYWJsZV9hY3BpKCk7CisJCX0KKworCQkvKiBhY3BpPWZvcmNlIHRvIG92ZXItcmlkZSBibGFjay1saXN0ICovCisJCWVsc2UgaWYgKCFtZW1jbXAoZnJvbSwgImFjcGk9Zm9yY2UiLCAxMCkpIHsKKwkJCWFjcGlfZm9yY2UgPSAxOworCQkJYWNwaV9odCA9IDE7CisJCQlhY3BpX2Rpc2FibGVkID0gMDsKKwkJfQorCisJCS8qIGFjcGk9c3RyaWN0IGRpc2FibGVzIG91dC1vZi1zcGVjIHdvcmthcm91bmRzICovCisJCWVsc2UgaWYgKCFtZW1jbXAoZnJvbSwgImFjcGk9c3RyaWN0IiwgMTEpKSB7CisJCQlhY3BpX3N0cmljdCA9IDE7CisJCX0KKworCQkvKiBMaW1pdCBBQ1BJIGp1c3QgdG8gYm9vdC10aW1lIHRvIGVuYWJsZSBIVCAqLworCQllbHNlIGlmICghbWVtY21wKGZyb20sICJhY3BpPWh0IiwgNykpIHsKKwkJCWlmICghYWNwaV9mb3JjZSkKKwkJCQlkaXNhYmxlX2FjcGkoKTsKKwkJCWFjcGlfaHQgPSAxOworCQl9CisJCQorCQkvKiAicGNpPW5vYWNwaSIgZGlzYWJsZSBBQ1BJIElSUSByb3V0aW5nIGFuZCBQQ0kgc2NhbiAqLworCQllbHNlIGlmICghbWVtY21wKGZyb20sICJwY2k9bm9hY3BpIiwgMTApKSB7CisJCQlhY3BpX2Rpc2FibGVfcGNpKCk7CisJCX0KKwkJLyogImFjcGk9bm9pcnEiIGRpc2FibGVzIEFDUEkgaW50ZXJydXB0IHJvdXRpbmcgKi8KKwkJZWxzZSBpZiAoIW1lbWNtcChmcm9tLCAiYWNwaT1ub2lycSIsIDEwKSkgeworCQkJYWNwaV9ub2lycV9zZXQoKTsKKwkJfQorCisJCWVsc2UgaWYgKCFtZW1jbXAoZnJvbSwgImFjcGlfc2NpPWVkZ2UiLCAxMykpCisJCQlhY3BpX3NjaV9mbGFncy50cmlnZ2VyID0gIDE7CisKKwkJZWxzZSBpZiAoIW1lbWNtcChmcm9tLCAiYWNwaV9zY2k9bGV2ZWwiLCAxNCkpCisJCQlhY3BpX3NjaV9mbGFncy50cmlnZ2VyID0gMzsKKworCQllbHNlIGlmICghbWVtY21wKGZyb20sICJhY3BpX3NjaT1oaWdoIiwgMTMpKQorCQkJYWNwaV9zY2lfZmxhZ3MucG9sYXJpdHkgPSAxOworCisJCWVsc2UgaWYgKCFtZW1jbXAoZnJvbSwgImFjcGlfc2NpPWxvdyIsIDEyKSkKKwkJCWFjcGlfc2NpX2ZsYWdzLnBvbGFyaXR5ID0gMzsKKworI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQworCQllbHNlIGlmICghbWVtY21wKGZyb20sICJhY3BpX3NraXBfdGltZXJfb3ZlcnJpZGUiLCAyNCkpCisJCQlhY3BpX3NraXBfdGltZXJfb3ZlcnJpZGUgPSAxOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKKwkJLyogZGlzYWJsZSBJTy1BUElDICovCisJCWVsc2UgaWYgKCFtZW1jbXAoZnJvbSwgIm5vYXBpYyIsIDYpKQorCQkJZGlzYWJsZV9pb2FwaWNfc2V0dXAoKTsKKyNlbmRpZiAvKiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMgKi8KKyNlbmRpZiAvKiBDT05GSUdfQUNQSV9CT09UICovCisKKwkJLyoKKwkJICogaGlnaG1lbT1zaXplIGZvcmNlcyBoaWdobWVtIHRvIGJlIGV4YWN0bHkgJ3NpemUnIGJ5dGVzLgorCQkgKiBUaGlzIHdvcmtzIGV2ZW4gb24gYm94ZXMgdGhhdCBoYXZlIG5vIGhpZ2htZW0gb3RoZXJ3aXNlLgorCQkgKiBUaGlzIGFsc28gd29ya3MgdG8gcmVkdWNlIGhpZ2htZW0gc2l6ZSBvbiBiaWdnZXIgYm94ZXMuCisJCSAqLworCQllbHNlIGlmICghbWVtY21wKGZyb20sICJoaWdobWVtPSIsIDgpKQorCQkJaGlnaG1lbV9wYWdlcyA9IG1lbXBhcnNlKGZyb20rOCwgJmZyb20pID4+IFBBR0VfU0hJRlQ7CisJCisJCS8qCisJCSAqIHZtYWxsb2M9c2l6ZSBmb3JjZXMgdGhlIHZtYWxsb2MgYXJlYSB0byBiZSBleGFjdGx5ICdzaXplJworCQkgKiBieXRlcy4gVGhpcyBjYW4gYmUgdXNlZCB0byBpbmNyZWFzZSAob3IgZGVjcmVhc2UpIHRoZQorCQkgKiB2bWFsbG9jIGFyZWEgLSB0aGUgZGVmYXVsdCBpcyAxMjhtLgorCQkgKi8KKwkJZWxzZSBpZiAoIW1lbWNtcChmcm9tLCAidm1hbGxvYz0iLCA4KSkKKwkJCV9fVk1BTExPQ19SRVNFUlZFID0gbWVtcGFyc2UoZnJvbSs4LCAmZnJvbSk7CisKKwluZXh0X2NoYXI6CisJCWMgPSAqKGZyb20rKyk7CisJCWlmICghYykKKwkJCWJyZWFrOworCQlpZiAoQ09NTUFORF9MSU5FX1NJWkUgPD0gKytsZW4pCisJCQlicmVhazsKKwkJKih0bysrKSA9IGM7CisJfQorCSp0byA9ICdcMCc7CisJKmNtZGxpbmVfcCA9IGNvbW1hbmRfbGluZTsKKwlpZiAodXNlcmRlZikgeworCQlwcmludGsoS0VSTl9JTkZPICJ1c2VyLWRlZmluZWQgcGh5c2ljYWwgUkFNIG1hcDpcbiIpOworCQlwcmludF9tZW1vcnlfbWFwKCJ1c2VyIik7CisJfQorfQorCisvKgorICogQ2FsbGJhY2sgZm9yIGVmaV9tZW1vcnlfd2Fsay4KKyAqLworc3RhdGljIGludCBfX2luaXQKK2VmaV9maW5kX21heF9wZm4odW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsIHZvaWQgKmFyZykKK3sKKwl1bnNpZ25lZCBsb25nICptYXhfcGZuID0gYXJnLCBwZm47CisKKwlpZiAoc3RhcnQgPCBlbmQpIHsKKwkJcGZuID0gUEZOX1VQKGVuZCAtMSk7CisJCWlmIChwZm4gPiAqbWF4X3BmbikKKwkJCSptYXhfcGZuID0gcGZuOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKgorICogRmluZCB0aGUgaGlnaGVzdCBwYWdlIGZyYW1lIG51bWJlciB3ZSBoYXZlIGF2YWlsYWJsZQorICovCit2b2lkIF9faW5pdCBmaW5kX21heF9wZm4odm9pZCkKK3sKKwlpbnQgaTsKKworCW1heF9wZm4gPSAwOworCWlmIChlZmlfZW5hYmxlZCkgeworCQllZmlfbWVtbWFwX3dhbGsoZWZpX2ZpbmRfbWF4X3BmbiwgJm1heF9wZm4pOworCQlyZXR1cm47CisJfQorCisJZm9yIChpID0gMDsgaSA8IGU4MjAubnJfbWFwOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBzdGFydCwgZW5kOworCQkvKiBSQU0/ICovCisJCWlmIChlODIwLm1hcFtpXS50eXBlICE9IEU4MjBfUkFNKQorCQkJY29udGludWU7CisJCXN0YXJ0ID0gUEZOX1VQKGU4MjAubWFwW2ldLmFkZHIpOworCQllbmQgPSBQRk5fRE9XTihlODIwLm1hcFtpXS5hZGRyICsgZTgyMC5tYXBbaV0uc2l6ZSk7CisJCWlmIChzdGFydCA+PSBlbmQpCisJCQljb250aW51ZTsKKwkJaWYgKGVuZCA+IG1heF9wZm4pCisJCQltYXhfcGZuID0gZW5kOworCX0KK30KKworLyoKKyAqIERldGVybWluZSBsb3cgYW5kIGhpZ2ggbWVtb3J5IHJhbmdlczoKKyAqLwordW5zaWduZWQgbG9uZyBfX2luaXQgZmluZF9tYXhfbG93X3Bmbih2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgbWF4X2xvd19wZm47CisKKwltYXhfbG93X3BmbiA9IG1heF9wZm47CisJaWYgKG1heF9sb3dfcGZuID4gTUFYTUVNX1BGTikgeworCQlpZiAoaGlnaG1lbV9wYWdlcyA9PSAtMSkKKwkJCWhpZ2htZW1fcGFnZXMgPSBtYXhfcGZuIC0gTUFYTUVNX1BGTjsKKwkJaWYgKGhpZ2htZW1fcGFnZXMgKyBNQVhNRU1fUEZOIDwgbWF4X3BmbikKKwkJCW1heF9wZm4gPSBNQVhNRU1fUEZOICsgaGlnaG1lbV9wYWdlczsKKwkJaWYgKGhpZ2htZW1fcGFnZXMgKyBNQVhNRU1fUEZOID4gbWF4X3BmbikgeworCQkJcHJpbnRrKCJvbmx5ICVsdU1CIGhpZ2htZW0gcGFnZXMgYXZhaWxhYmxlLCBpZ25vcmluZyBoaWdobWVtIHNpemUgb2YgJXVNQi5cbiIsIHBhZ2VzX3RvX21iKG1heF9wZm4gLSBNQVhNRU1fUEZOKSwgcGFnZXNfdG9fbWIoaGlnaG1lbV9wYWdlcykpOworCQkJaGlnaG1lbV9wYWdlcyA9IDA7CisJCX0KKwkJbWF4X2xvd19wZm4gPSBNQVhNRU1fUEZOOworI2lmbmRlZiBDT05GSUdfSElHSE1FTQorCQkvKiBNYXhpbXVtIG1lbW9yeSB1c2FibGUgaXMgd2hhdCBpcyBkaXJlY3RseSBhZGRyZXNzYWJsZSAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HICJXYXJuaW5nIG9ubHkgJWxkTUIgd2lsbCBiZSB1c2VkLlxuIiwKKwkJCQkJTUFYTUVNPj4yMCk7CisJCWlmIChtYXhfcGZuID4gTUFYX05PTlBBRV9QRk4pCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJVc2UgYSBQQUUgZW5hYmxlZCBrZXJuZWwuXG4iKTsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVXNlIGEgSElHSE1FTSBlbmFibGVkIGtlcm5lbC5cbiIpOworCQltYXhfcGZuID0gTUFYTUVNX1BGTjsKKyNlbHNlIC8qICFDT05GSUdfSElHSE1FTSAqLworI2lmbmRlZiBDT05GSUdfWDg2X1BBRQorCQlpZiAobWF4X3BmbiA+IE1BWF9OT05QQUVfUEZOKSB7CisJCQltYXhfcGZuID0gTUFYX05PTlBBRV9QRk47CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJXYXJuaW5nIG9ubHkgNEdCIHdpbGwgYmUgdXNlZC5cbiIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVXNlIGEgUEFFIGVuYWJsZWQga2VybmVsLlxuIik7CisJCX0KKyNlbmRpZiAvKiAhQ09ORklHX1g4Nl9QQUUgKi8KKyNlbmRpZiAvKiAhQ09ORklHX0hJR0hNRU0gKi8KKwl9IGVsc2UgeworCQlpZiAoaGlnaG1lbV9wYWdlcyA9PSAtMSkKKwkJCWhpZ2htZW1fcGFnZXMgPSAwOworI2lmZGVmIENPTkZJR19ISUdITUVNCisJCWlmIChoaWdobWVtX3BhZ2VzID49IG1heF9wZm4pIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiaGlnaG1lbSBzaXplIHNwZWNpZmllZCAoJXVNQikgaXMgYmlnZ2VyIHRoYW4gcGFnZXMgYXZhaWxhYmxlICglbHVNQikhLlxuIiwgcGFnZXNfdG9fbWIoaGlnaG1lbV9wYWdlcyksIHBhZ2VzX3RvX21iKG1heF9wZm4pKTsKKwkJCWhpZ2htZW1fcGFnZXMgPSAwOworCQl9CisJCWlmIChoaWdobWVtX3BhZ2VzKSB7CisJCQlpZiAobWF4X2xvd19wZm4taGlnaG1lbV9wYWdlcyA8IDY0KjEwMjQqMTAyNC9QQUdFX1NJWkUpeworCQkJCXByaW50ayhLRVJOX0VSUiAiaGlnaG1lbSBzaXplICV1TUIgcmVzdWx0cyBpbiBzbWFsbGVyIHRoYW4gNjRNQiBsb3dtZW0sIGlnbm9yaW5nIGl0LlxuIiwgcGFnZXNfdG9fbWIoaGlnaG1lbV9wYWdlcykpOworCQkJCWhpZ2htZW1fcGFnZXMgPSAwOworCQkJfQorCQkJbWF4X2xvd19wZm4gLT0gaGlnaG1lbV9wYWdlczsKKwkJfQorI2Vsc2UKKwkJaWYgKGhpZ2htZW1fcGFnZXMpCisJCQlwcmludGsoS0VSTl9FUlIgImlnbm9yaW5nIGhpZ2htZW0gc2l6ZSBvbiBub24taGlnaG1lbSBrZXJuZWwhXG4iKTsKKyNlbmRpZgorCX0KKwlyZXR1cm4gbWF4X2xvd19wZm47Cit9CisKKy8qCisgKiBGcmVlIGFsbCBhdmFpbGFibGUgbWVtb3J5IGZvciBib290IHRpbWUgYWxsb2NhdGlvbi4gIFVzZWQKKyAqIGFzIGEgY2FsbGJhY2sgZnVuY3Rpb24gYnkgZWZpX21lbW9yeV93YWxrKCkKKyAqLworCitzdGF0aWMgaW50IF9faW5pdAorZnJlZV9hdmFpbGFibGVfbWVtb3J5KHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLCB2b2lkICphcmcpCit7CisJLyogY2hlY2sgbWF4X2xvd19wZm4gKi8KKwlpZiAoc3RhcnQgPj0gKChtYXhfbG93X3BmbiArIDEpIDw8IFBBR0VfU0hJRlQpKQorCQlyZXR1cm4gMDsKKwlpZiAoZW5kID49ICgobWF4X2xvd19wZm4gKyAxKSA8PCBQQUdFX1NISUZUKSkKKwkJZW5kID0gKG1heF9sb3dfcGZuICsgMSkgPDwgUEFHRV9TSElGVDsKKwlpZiAoc3RhcnQgPCBlbmQpCisJCWZyZWVfYm9vdG1lbShzdGFydCwgZW5kIC0gc3RhcnQpOworCisJcmV0dXJuIDA7Cit9CisvKgorICogUmVnaXN0ZXIgZnVsbHkgYXZhaWxhYmxlIGxvdyBSQU0gcGFnZXMgd2l0aCB0aGUgYm9vdG1lbSBhbGxvY2F0b3IuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCByZWdpc3Rlcl9ib290bWVtX2xvd19wYWdlcyh1bnNpZ25lZCBsb25nIG1heF9sb3dfcGZuKQoreworCWludCBpOworCisJaWYgKGVmaV9lbmFibGVkKSB7CisJCWVmaV9tZW1tYXBfd2FsayhmcmVlX2F2YWlsYWJsZV9tZW1vcnksIE5VTEwpOworCQlyZXR1cm47CisJfQorCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgY3Vycl9wZm4sIGxhc3RfcGZuLCBzaXplOworCQkvKgorCQkgKiBSZXNlcnZlIHVzYWJsZSBsb3cgbWVtb3J5CisJCSAqLworCQlpZiAoZTgyMC5tYXBbaV0udHlwZSAhPSBFODIwX1JBTSkKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBXZSBhcmUgcm91bmRpbmcgdXAgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdXNhYmxlIG1lbW9yeToKKwkJICovCisJCWN1cnJfcGZuID0gUEZOX1VQKGU4MjAubWFwW2ldLmFkZHIpOworCQlpZiAoY3Vycl9wZm4gPj0gbWF4X2xvd19wZm4pCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogLi4uIGFuZCBhdCB0aGUgZW5kIG9mIHRoZSB1c2FibGUgcmFuZ2UgZG93bndhcmRzOgorCQkgKi8KKwkJbGFzdF9wZm4gPSBQRk5fRE9XTihlODIwLm1hcFtpXS5hZGRyICsgZTgyMC5tYXBbaV0uc2l6ZSk7CisKKwkJaWYgKGxhc3RfcGZuID4gbWF4X2xvd19wZm4pCisJCQlsYXN0X3BmbiA9IG1heF9sb3dfcGZuOworCisJCS8qCisJCSAqIC4uIGZpbmFsbHksIGRpZCBhbGwgdGhlIHJvdW5kaW5nIGFuZCBwbGF5aW5nCisJCSAqIGFyb3VuZCBqdXN0IG1ha2UgdGhlIGFyZWEgZ28gYXdheT8KKwkJICovCisJCWlmIChsYXN0X3BmbiA8PSBjdXJyX3BmbikKKwkJCWNvbnRpbnVlOworCisJCXNpemUgPSBsYXN0X3BmbiAtIGN1cnJfcGZuOworCQlmcmVlX2Jvb3RtZW0oUEZOX1BIWVMoY3Vycl9wZm4pLCBQRk5fUEhZUyhzaXplKSk7CisJfQorfQorCisvKgorICogd29ya2Fyb3VuZCBmb3IgRGVsbCBzeXN0ZW1zIHRoYXQgbmVnbGVjdCB0byByZXNlcnZlIEVCREEKKyAqLworc3RhdGljIHZvaWQgX19pbml0IHJlc2VydmVfZWJkYV9yZWdpb24odm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgYWRkcjsKKwlhZGRyID0gZ2V0X2Jpb3NfZWJkYSgpOworCWlmIChhZGRyKQorCQlyZXNlcnZlX2Jvb3RtZW0oYWRkciwgUEFHRV9TSVpFKTsJCit9CisKKyNpZm5kZWYgQ09ORklHX0RJU0NPTlRJR01FTQordm9pZCBfX2luaXQgc2V0dXBfYm9vdG1lbV9hbGxvY2F0b3Iodm9pZCk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXQgc2V0dXBfbWVtb3J5KHZvaWQpCit7CisJLyoKKwkgKiBwYXJ0aWFsbHkgdXNlZCBwYWdlcyBhcmUgbm90IHVzYWJsZSAtIHRodXMKKwkgKiB3ZSBhcmUgcm91bmRpbmcgdXB3YXJkczoKKwkgKi8KKwltaW5fbG93X3BmbiA9IFBGTl9VUChpbml0X3BnX3RhYmxlc19lbmQpOworCisJZmluZF9tYXhfcGZuKCk7CisKKwltYXhfbG93X3BmbiA9IGZpbmRfbWF4X2xvd19wZm4oKTsKKworI2lmZGVmIENPTkZJR19ISUdITUVNCisJaGlnaHN0YXJ0X3BmbiA9IGhpZ2hlbmRfcGZuID0gbWF4X3BmbjsKKwlpZiAobWF4X3BmbiA+IG1heF9sb3dfcGZuKSB7CisJCWhpZ2hzdGFydF9wZm4gPSBtYXhfbG93X3BmbjsKKwl9CisJcHJpbnRrKEtFUk5fTk9USUNFICIlbGRNQiBISUdITUVNIGF2YWlsYWJsZS5cbiIsCisJCXBhZ2VzX3RvX21iKGhpZ2hlbmRfcGZuIC0gaGlnaHN0YXJ0X3BmbikpOworI2VuZGlmCisJcHJpbnRrKEtFUk5fTk9USUNFICIlbGRNQiBMT1dNRU0gYXZhaWxhYmxlLlxuIiwKKwkJCXBhZ2VzX3RvX21iKG1heF9sb3dfcGZuKSk7CisKKwlzZXR1cF9ib290bWVtX2FsbG9jYXRvcigpOworCisJcmV0dXJuIG1heF9sb3dfcGZuOworfQorCit2b2lkIF9faW5pdCB6b25lX3NpemVzX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHpvbmVzX3NpemVbTUFYX05SX1pPTkVTXSA9IHswLCAwLCAwfTsKKwl1bnNpZ25lZCBpbnQgbWF4X2RtYSwgbG93OworCisJbWF4X2RtYSA9IHZpcnRfdG9fcGh5cygoY2hhciAqKU1BWF9ETUFfQUREUkVTUykgPj4gUEFHRV9TSElGVDsKKwlsb3cgPSBtYXhfbG93X3BmbjsKKworCWlmIChsb3cgPCBtYXhfZG1hKQorCQl6b25lc19zaXplW1pPTkVfRE1BXSA9IGxvdzsKKwllbHNlIHsKKwkJem9uZXNfc2l6ZVtaT05FX0RNQV0gPSBtYXhfZG1hOworCQl6b25lc19zaXplW1pPTkVfTk9STUFMXSA9IGxvdyAtIG1heF9kbWE7CisjaWZkZWYgQ09ORklHX0hJR0hNRU0KKwkJem9uZXNfc2l6ZVtaT05FX0hJR0hNRU1dID0gaGlnaGVuZF9wZm4gLSBsb3c7CisjZW5kaWYKKwl9CisJZnJlZV9hcmVhX2luaXQoem9uZXNfc2l6ZSk7Cit9CisjZWxzZQorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2V0dXBfbWVtb3J5KHZvaWQpOworZXh0ZXJuIHZvaWQgem9uZV9zaXplc19pbml0KHZvaWQpOworI2VuZGlmIC8qICFDT05GSUdfRElTQ09OVElHTUVNICovCisKK3ZvaWQgX19pbml0IHNldHVwX2Jvb3RtZW1fYWxsb2NhdG9yKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBib290bWFwX3NpemU7CisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBib290LXRpbWUgYWxsb2NhdG9yICh3aXRoIGxvdyBtZW1vcnkgb25seSk6CisJICovCisJYm9vdG1hcF9zaXplID0gaW5pdF9ib290bWVtKG1pbl9sb3dfcGZuLCBtYXhfbG93X3Bmbik7CisKKwlyZWdpc3Rlcl9ib290bWVtX2xvd19wYWdlcyhtYXhfbG93X3Bmbik7CisKKwkvKgorCSAqIFJlc2VydmUgdGhlIGJvb3RtZW0gYml0bWFwIGl0c2VsZiBhcyB3ZWxsLiBXZSBkbyB0aGlzIGluIHR3bworCSAqIHN0ZXBzIChmaXJzdCBzdGVwIHdhcyBpbml0X2Jvb3RtZW0oKSkgYmVjYXVzZSB0aGlzIGNhdGNoZXMKKwkgKiB0aGUgKHZlcnkgdW5saWtlbHkpIGNhc2Ugb2YgdXMgYWNjaWRlbnRhbGx5IGluaXRpYWxpemluZyB0aGUKKwkgKiBib290bWVtIGFsbG9jYXRvciB3aXRoIGFuIGludmFsaWQgUkFNIGFyZWEuCisJICovCisJcmVzZXJ2ZV9ib290bWVtKEhJR0hfTUVNT1JZLCAoUEZOX1BIWVMobWluX2xvd19wZm4pICsKKwkJCSBib290bWFwX3NpemUgKyBQQUdFX1NJWkUtMSkgLSAoSElHSF9NRU1PUlkpKTsKKworCS8qCisJICogcmVzZXJ2ZSBwaHlzaWNhbCBwYWdlIDAgLSBpdCdzIGEgc3BlY2lhbCBCSU9TIHBhZ2Ugb24gbWFueSBib3hlcywKKwkgKiBlbmFibGluZyBjbGVhbiByZWJvb3RzLCBTTVAgb3BlcmF0aW9uLCBsYXB0b3AgZnVuY3Rpb25zLgorCSAqLworCXJlc2VydmVfYm9vdG1lbSgwLCBQQUdFX1NJWkUpOworCisJLyogcmVzZXJ2ZSBFQkRBIHJlZ2lvbiwgaXQncyBhIDRLIHJlZ2lvbiAqLworCXJlc2VydmVfZWJkYV9yZWdpb24oKTsKKworICAgIC8qIGNvdWxkIGJlIGFuIEFNRCA3NjhNUFggY2hpcHNldC4gUmVzZXJ2ZSBhIHBhZ2UgIGJlZm9yZSBWR0EgdG8gcHJldmVudAorICAgICAgIFBDSSBwcmVmZXRjaCBpbnRvIGl0IChlcnJhdGEgIzU2KS4gVXN1YWxseSB0aGUgcGFnZSBpcyByZXNlcnZlZCBhbnl3YXlzLAorICAgICAgIHVubGVzcyB5b3UgaGF2ZSBubyBQUy8yIG1vdXNlIHBsdWdnZWQgaW4uICovCisJaWYgKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0FNRCAmJgorCSAgICBib290X2NwdV9kYXRhLng4NiA9PSA2KQorCSAgICAgcmVzZXJ2ZV9ib290bWVtKDB4YTAwMDAgLSA0MDk2LCA0MDk2KTsKKworI2lmZGVmIENPTkZJR19TTVAKKwkvKgorCSAqIEJ1dCBmaXJzdCBwaW5jaCBhIGZldyBmb3IgdGhlIHN0YWNrL3RyYW1wb2xpbmUgc3R1ZmYKKwkgKiBGSVhNRTogRG9uJ3QgbmVlZCB0aGUgZXh0cmEgcGFnZSBhdCA0SywgYnV0IG5lZWQgdG8gZml4CisJICogdHJhbXBvbGluZSBiZWZvcmUgcmVtb3ZpbmcgaXQuIChzZWUgdGhlIEdEVCBzdHVmZikKKwkgKi8KKwlyZXNlcnZlX2Jvb3RtZW0oUEFHRV9TSVpFLCBQQUdFX1NJWkUpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0FDUElfU0xFRVAKKwkvKgorCSAqIFJlc2VydmUgbG93IG1lbW9yeSByZWdpb24gZm9yIHNsZWVwIHN1cHBvcnQuCisJICovCisJYWNwaV9yZXNlcnZlX2Jvb3RtZW0oKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19YODZfRklORF9TTVBfQ09ORklHCisJLyoKKwkgKiBGaW5kIGFuZCByZXNlcnZlIHBvc3NpYmxlIGJvb3QtdGltZSBTTVAgY29uZmlndXJhdGlvbjoKKwkgKi8KKwlmaW5kX3NtcF9jb25maWcoKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECisJaWYgKExPQURFUl9UWVBFICYmIElOSVRSRF9TVEFSVCkgeworCQlpZiAoSU5JVFJEX1NUQVJUICsgSU5JVFJEX1NJWkUgPD0gKG1heF9sb3dfcGZuIDw8IFBBR0VfU0hJRlQpKSB7CisJCQlyZXNlcnZlX2Jvb3RtZW0oSU5JVFJEX1NUQVJULCBJTklUUkRfU0laRSk7CisJCQlpbml0cmRfc3RhcnQgPQorCQkJCUlOSVRSRF9TVEFSVCA/IElOSVRSRF9TVEFSVCArIFBBR0VfT0ZGU0VUIDogMDsKKwkJCWluaXRyZF9lbmQgPSBpbml0cmRfc3RhcnQrSU5JVFJEX1NJWkU7CisJCX0KKwkJZWxzZSB7CisJCQlwcmludGsoS0VSTl9FUlIgImluaXRyZCBleHRlbmRzIGJleW9uZCBlbmQgb2YgbWVtb3J5ICIKKwkJCSAgICAiKDB4JTA4bHggPiAweCUwOGx4KVxuZGlzYWJsaW5nIGluaXRyZFxuIiwKKwkJCSAgICBJTklUUkRfU1RBUlQgKyBJTklUUkRfU0laRSwKKwkJCSAgICBtYXhfbG93X3BmbiA8PCBQQUdFX1NISUZUKTsKKwkJCWluaXRyZF9zdGFydCA9IDA7CisJCX0KKwl9CisjZW5kaWYKK30KKworLyoKKyAqIFRoZSBub2RlIDAgcGdkYXQgaXMgaW5pdGlhbGl6ZWQgYmVmb3JlIGFsbCBvZiB0aGVzZSBiZWNhdXNlCisgKiBpdCdzIG5lZWRlZCBmb3IgYm9vdG1lbS4gIG5vZGU+MCBwZ2RhdHMgaGF2ZSB0aGVpciB2aXJ0dWFsCisgKiBzcGFjZSBhbGxvY2F0ZWQgYmVmb3JlIHRoZSBwYWdldGFibGVzIGFyZSBpbiBwbGFjZSB0byBhY2Nlc3MKKyAqIHRoZW0sIHNvIHRoZXkgY2FuJ3QgYmUgY2xlYXJlZCB0aGVuLgorICoKKyAqIFRoaXMgc2hvdWxkIGFsbCBjb21waWxlIGRvd24gdG8gbm90aGluZyB3aGVuIE5VTUEgaXMgb2ZmLgorICovCit2b2lkIF9faW5pdCByZW1hcHBlZF9wZ2RhdF9pbml0KHZvaWQpCit7CisJaW50IG5pZDsKKworCWZvcl9lYWNoX29ubGluZV9ub2RlKG5pZCkgeworCQlpZiAobmlkICE9IDApCisJCQltZW1zZXQoTk9ERV9EQVRBKG5pZCksIDAsIHNpemVvZihzdHJ1Y3QgcGdsaXN0X2RhdGEpKTsKKwl9Cit9CisKKy8qCisgKiBSZXF1ZXN0IGFkZHJlc3Mgc3BhY2UgZm9yIGFsbCBzdGFuZGFyZCBSQU0gYW5kIFJPTSByZXNvdXJjZXMKKyAqIGFuZCBhbHNvIGZvciByZWdpb25zIHJlcG9ydGVkIGFzIHJlc2VydmVkIGJ5IHRoZSBlODIwLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQKK2xlZ2FjeV9pbml0X2lvbWVtX3Jlc291cmNlcyhzdHJ1Y3QgcmVzb3VyY2UgKmNvZGVfcmVzb3VyY2UsIHN0cnVjdCByZXNvdXJjZSAqZGF0YV9yZXNvdXJjZSkKK3sKKwlpbnQgaTsKKworCXByb2JlX3JvbXMoKTsKKwlmb3IgKGkgPSAwOyBpIDwgZTgyMC5ucl9tYXA7IGkrKykgeworCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwkJaWYgKGU4MjAubWFwW2ldLmFkZHIgKyBlODIwLm1hcFtpXS5zaXplID4gMHgxMDAwMDAwMDBVTEwpCisJCQljb250aW51ZTsKKwkJcmVzID0gYWxsb2NfYm9vdG1lbV9sb3coc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOworCQlzd2l0Y2ggKGU4MjAubWFwW2ldLnR5cGUpIHsKKwkJY2FzZSBFODIwX1JBTToJcmVzLT5uYW1lID0gIlN5c3RlbSBSQU0iOyBicmVhazsKKwkJY2FzZSBFODIwX0FDUEk6CXJlcy0+bmFtZSA9ICJBQ1BJIFRhYmxlcyI7IGJyZWFrOworCQljYXNlIEU4MjBfTlZTOglyZXMtPm5hbWUgPSAiQUNQSSBOb24tdm9sYXRpbGUgU3RvcmFnZSI7IGJyZWFrOworCQlkZWZhdWx0OglyZXMtPm5hbWUgPSAicmVzZXJ2ZWQiOworCQl9CisJCXJlcy0+c3RhcnQgPSBlODIwLm1hcFtpXS5hZGRyOworCQlyZXMtPmVuZCA9IHJlcy0+c3RhcnQgKyBlODIwLm1hcFtpXS5zaXplIC0gMTsKKwkJcmVzLT5mbGFncyA9IElPUkVTT1VSQ0VfTUVNIHwgSU9SRVNPVVJDRV9CVVNZOworCQlyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgcmVzKTsKKwkJaWYgKGU4MjAubWFwW2ldLnR5cGUgPT0gRTgyMF9SQU0pIHsKKwkJCS8qCisJCQkgKiAgV2UgZG9uJ3Qga25vdyB3aGljaCBSQU0gcmVnaW9uIGNvbnRhaW5zIGtlcm5lbCBkYXRhLAorCQkJICogIHNvIHdlIHRyeSBpdCByZXBlYXRlZGx5IGFuZCBsZXQgdGhlIHJlc291cmNlIG1hbmFnZXIKKwkJCSAqICB0ZXN0IGl0LgorCQkJICovCisJCQlyZXF1ZXN0X3Jlc291cmNlKHJlcywgY29kZV9yZXNvdXJjZSk7CisJCQlyZXF1ZXN0X3Jlc291cmNlKHJlcywgZGF0YV9yZXNvdXJjZSk7CisJCX0KKwl9Cit9CisKKy8qCisgKiBSZXF1ZXN0IGFkZHJlc3Mgc3BhY2UgZm9yIGFsbCBzdGFuZGFyZCByZXNvdXJjZXMKKyAqLworc3RhdGljIHZvaWQgX19pbml0IHJlZ2lzdGVyX21lbW9yeSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZ2Fwc3RhcnQsIGdhcHNpemU7CisJdW5zaWduZWQgbG9uZyBsb25nIGxhc3Q7CisJaW50CSAgICAgIGk7CisKKwlpZiAoZWZpX2VuYWJsZWQpCisJCWVmaV9pbml0aWFsaXplX2lvbWVtX3Jlc291cmNlcygmY29kZV9yZXNvdXJjZSwgJmRhdGFfcmVzb3VyY2UpOworCWVsc2UKKwkJbGVnYWN5X2luaXRfaW9tZW1fcmVzb3VyY2VzKCZjb2RlX3Jlc291cmNlLCAmZGF0YV9yZXNvdXJjZSk7CisKKwkvKiBFRkkgc3lzdGVtcyBtYXkgc3RpbGwgaGF2ZSBWR0EgKi8KKwlyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgJnZpZGVvX3JhbV9yZXNvdXJjZSk7CisKKwkvKiByZXF1ZXN0IEkvTyBzcGFjZSBmb3IgZGV2aWNlcyB1c2VkIG9uIGFsbCBpWzM0NV04NiBQQ3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgU1RBTkRBUkRfSU9fUkVTT1VSQ0VTOyBpKyspCisJCXJlcXVlc3RfcmVzb3VyY2UoJmlvcG9ydF9yZXNvdXJjZSwgJnN0YW5kYXJkX2lvX3Jlc291cmNlc1tpXSk7CisKKwkvKgorCSAqIFNlYXJjaCBmb3IgdGhlIGJpZ2VzdCBnYXAgaW4gdGhlIGxvdyAzMiBiaXRzIG9mIHRoZSBlODIwCisJICogbWVtb3J5IHNwYWNlLgorCSAqLworCWxhc3QgPSAweDEwMDAwMDAwMHVsbDsKKwlnYXBzdGFydCA9IDB4MTAwMDAwMDA7CisJZ2Fwc2l6ZSA9IDB4NDAwMDAwOworCWkgPSBlODIwLm5yX21hcDsKKwl3aGlsZSAoLS1pID49IDApIHsKKwkJdW5zaWduZWQgbG9uZyBsb25nIHN0YXJ0ID0gZTgyMC5tYXBbaV0uYWRkcjsKKwkJdW5zaWduZWQgbG9uZyBsb25nIGVuZCA9IHN0YXJ0ICsgZTgyMC5tYXBbaV0uc2l6ZTsKKworCQkvKgorCQkgKiBTaW5jZSAibGFzdCIgaXMgYXQgbW9zdCA0R0IsIHdlIGtub3cgd2UnbGwKKwkJICogZml0IGluIDMyIGJpdHMgaWYgdGhpcyBjb25kaXRpb24gaXMgdHJ1ZQorCQkgKi8KKwkJaWYgKGxhc3QgPiBlbmQpIHsKKwkJCXVuc2lnbmVkIGxvbmcgZ2FwID0gbGFzdCAtIGVuZDsKKworCQkJaWYgKGdhcCA+IGdhcHNpemUpIHsKKwkJCQlnYXBzaXplID0gZ2FwOworCQkJCWdhcHN0YXJ0ID0gZW5kOworCQkJfQorCQl9CisJCWlmIChzdGFydCA8IGxhc3QpCisJCQlsYXN0ID0gc3RhcnQ7CisJfQorCisJLyoKKwkgKiBTdGFydCBhbGxvY2F0aW5nIGR5bmFtaWMgUENJIG1lbW9yeSBhIGJpdCBpbnRvIHRoZSBnYXAsCisJICogYWxpZ25lZCB1cCB0byB0aGUgbmVhcmVzdCBtZWdhYnl0ZS4KKwkgKgorCSAqIFF1ZXN0aW9uOiBzaG91bGQgd2UgdHJ5IHRvIHBhZCBpdCB1cCBhIGJpdCAoZG8gc29tZXRoaW5nCisJICogbGlrZSAiICsgKGdhcHNpemUgPj4gMykiIGluIHRoZXJlIHRvbz8pLiBXZSBub3cgaGF2ZSB0aGUKKwkgKiB0ZWNobm9sb2d5LgorCSAqLworCXBjaV9tZW1fc3RhcnQgPSAoZ2Fwc3RhcnQgKyAweGZmZmZmKSAmIH4weGZmZmZmOworCisJcHJpbnRrKCJBbGxvY2F0aW5nIFBDSSByZXNvdXJjZXMgc3RhcnRpbmcgYXQgJTA4bHggKGdhcDogJTA4bHg6JTA4bHgpXG4iLAorCQlwY2lfbWVtX3N0YXJ0LCBnYXBzdGFydCwgZ2Fwc2l6ZSk7Cit9CisKKy8qIFVzZSBpbmxpbmUgYXNzZW1ibHkgdG8gZGVmaW5lIHRoaXMgYmVjYXVzZSB0aGUgbm9wcyBhcmUgZGVmaW5lZCAKKyAgIGFzIGlubGluZSBhc3NlbWJseSBzdHJpbmdzIGluIHRoZSBpbmNsdWRlIGZpbGVzIGFuZCB3ZSBjYW5ub3QgCisgICBnZXQgdGhlbSBlYXNpbHkgaW50byBzdHJpbmdzLiAqLworYXNtKCJcdC5kYXRhXG5pbnRlbG5vcHM6ICIgCisgICAgR0VORVJJQ19OT1AxIEdFTkVSSUNfTk9QMiBHRU5FUklDX05PUDMgR0VORVJJQ19OT1A0IEdFTkVSSUNfTk9QNSBHRU5FUklDX05PUDYKKyAgICBHRU5FUklDX05PUDcgR0VORVJJQ19OT1A4KTsgCithc20oIlx0LmRhdGFcbms4bm9wczogIiAKKyAgICBLOF9OT1AxIEs4X05PUDIgSzhfTk9QMyBLOF9OT1A0IEs4X05PUDUgSzhfTk9QNgorICAgIEs4X05PUDcgSzhfTk9QOCk7IAorYXNtKCJcdC5kYXRhXG5rN25vcHM6ICIgCisgICAgSzdfTk9QMSBLN19OT1AyIEs3X05PUDMgSzdfTk9QNCBLN19OT1A1IEs3X05PUDYKKyAgICBLN19OT1A3IEs3X05PUDgpOyAKKyAgICAKK2V4dGVybiB1bnNpZ25lZCBjaGFyIGludGVsbm9wc1tdLCBrOG5vcHNbXSwgazdub3BzW107CitzdGF0aWMgdW5zaWduZWQgY2hhciAqaW50ZWxfbm9wc1tBU01fTk9QX01BWCsxXSA9IHsgCisgICAgIE5VTEwsCisgICAgIGludGVsbm9wcywKKyAgICAgaW50ZWxub3BzICsgMSwKKyAgICAgaW50ZWxub3BzICsgMSArIDIsCisgICAgIGludGVsbm9wcyArIDEgKyAyICsgMywKKyAgICAgaW50ZWxub3BzICsgMSArIDIgKyAzICsgNCwKKyAgICAgaW50ZWxub3BzICsgMSArIDIgKyAzICsgNCArIDUsCisgICAgIGludGVsbm9wcyArIDEgKyAyICsgMyArIDQgKyA1ICsgNiwKKyAgICAgaW50ZWxub3BzICsgMSArIDIgKyAzICsgNCArIDUgKyA2ICsgNywKK307IAorc3RhdGljIHVuc2lnbmVkIGNoYXIgKms4X25vcHNbQVNNX05PUF9NQVgrMV0gPSB7IAorICAgICBOVUxMLAorICAgICBrOG5vcHMsCisgICAgIGs4bm9wcyArIDEsCisgICAgIGs4bm9wcyArIDEgKyAyLAorICAgICBrOG5vcHMgKyAxICsgMiArIDMsCisgICAgIGs4bm9wcyArIDEgKyAyICsgMyArIDQsCisgICAgIGs4bm9wcyArIDEgKyAyICsgMyArIDQgKyA1LAorICAgICBrOG5vcHMgKyAxICsgMiArIDMgKyA0ICsgNSArIDYsCisgICAgIGs4bm9wcyArIDEgKyAyICsgMyArIDQgKyA1ICsgNiArIDcsCit9OyAKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICprN19ub3BzW0FTTV9OT1BfTUFYKzFdID0geyAKKyAgICAgTlVMTCwKKyAgICAgazdub3BzLAorICAgICBrN25vcHMgKyAxLAorICAgICBrN25vcHMgKyAxICsgMiwKKyAgICAgazdub3BzICsgMSArIDIgKyAzLAorICAgICBrN25vcHMgKyAxICsgMiArIDMgKyA0LAorICAgICBrN25vcHMgKyAxICsgMiArIDMgKyA0ICsgNSwKKyAgICAgazdub3BzICsgMSArIDIgKyAzICsgNCArIDUgKyA2LAorICAgICBrN25vcHMgKyAxICsgMiArIDMgKyA0ICsgNSArIDYgKyA3LAorfTsgCitzdGF0aWMgc3RydWN0IG5vcCB7IAorICAgICBpbnQgY3B1aWQ7IAorICAgICB1bnNpZ25lZCBjaGFyICoqbm9wdGFibGU7IAorfSBub3B0eXBlc1tdID0geyAKKyAgICAgeyBYODZfRkVBVFVSRV9LOCwgazhfbm9wcyB9LCAKKyAgICAgeyBYODZfRkVBVFVSRV9LNywgazdfbm9wcyB9LCAKKyAgICAgeyAtMSwgTlVMTCB9Cit9OyAKKworLyogUmVwbGFjZSBpbnN0cnVjdGlvbnMgd2l0aCBiZXR0ZXIgYWx0ZXJuYXRpdmVzIGZvciB0aGlzIENQVSB0eXBlLgorCisgICBUaGlzIHJ1bnMgYmVmb3JlIFNNUCBpcyBpbml0aWFsaXplZCB0byBhdm9pZCBTTVAgcHJvYmxlbXMgd2l0aAorICAgc2VsZiBtb2RpZnlpbmcgY29kZS4gVGhpcyBpbXBsaWVzIHRoYXQgYXNzeW1ldHJpYyBzeXN0ZW1zIHdoZXJlCisgICBBUHMgaGF2ZSBsZXNzIGNhcGFiaWxpdGllcyB0aGFuIHRoZSBib290IHByb2Nlc3NvciBhcmUgbm90IGhhbmRsZWQuIAorICAgSW4gdGhpcyBjYXNlIGJvb3Qgd2l0aCAibm9yZXBsYWNlbWVudCIuICovIAordm9pZCBhcHBseV9hbHRlcm5hdGl2ZXModm9pZCAqc3RhcnQsIHZvaWQgKmVuZCkgCit7IAorCXN0cnVjdCBhbHRfaW5zdHIgKmE7IAorCWludCBkaWZmLCBpLCBrOworICAgICAgICB1bnNpZ25lZCBjaGFyICoqbm9wdGFibGUgPSBpbnRlbF9ub3BzOyAKKwlmb3IgKGkgPSAwOyBub3B0eXBlc1tpXS5jcHVpZCA+PSAwOyBpKyspIHsgCisJCWlmIChib290X2NwdV9oYXMobm9wdHlwZXNbaV0uY3B1aWQpKSB7IAorCQkJbm9wdGFibGUgPSBub3B0eXBlc1tpXS5ub3B0YWJsZTsKKwkJCWJyZWFrOworCQl9CisJfSAKKwlmb3IgKGEgPSBzdGFydDsgKHZvaWQgKilhIDwgZW5kOyBhKyspIHsgCisJCWlmICghYm9vdF9jcHVfaGFzKGEtPmNwdWlkKSkKKwkJCWNvbnRpbnVlOworCQlCVUdfT04oYS0+cmVwbGFjZW1lbnRsZW4gPiBhLT5pbnN0cmxlbik7IAorCQltZW1jcHkoYS0+aW5zdHIsIGEtPnJlcGxhY2VtZW50LCBhLT5yZXBsYWNlbWVudGxlbik7IAorCQlkaWZmID0gYS0+aW5zdHJsZW4gLSBhLT5yZXBsYWNlbWVudGxlbjsgCisJCS8qIFBhZCB0aGUgcmVzdCB3aXRoIG5vcHMgKi8KKwkJZm9yIChpID0gYS0+cmVwbGFjZW1lbnRsZW47IGRpZmYgPiAwOyBkaWZmIC09IGssIGkgKz0gaykgeworCQkJayA9IGRpZmY7CisJCQlpZiAoayA+IEFTTV9OT1BfTUFYKQorCQkJCWsgPSBBU01fTk9QX01BWDsKKwkJCW1lbWNweShhLT5pbnN0ciArIGksIG5vcHRhYmxlW2tdLCBrKTsgCisJCX0gCisJfQorfSAKKworc3RhdGljIGludCBub19yZXBsYWNlbWVudCBfX2luaXRkYXRhID0gMDsgCisgCit2b2lkIF9faW5pdCBhbHRlcm5hdGl2ZV9pbnN0cnVjdGlvbnModm9pZCkKK3sKKwlleHRlcm4gc3RydWN0IGFsdF9pbnN0ciBfX2FsdF9pbnN0cnVjdGlvbnNbXSwgX19hbHRfaW5zdHJ1Y3Rpb25zX2VuZFtdOworCWlmIChub19yZXBsYWNlbWVudCkgCisJCXJldHVybjsKKwlhcHBseV9hbHRlcm5hdGl2ZXMoX19hbHRfaW5zdHJ1Y3Rpb25zLCBfX2FsdF9pbnN0cnVjdGlvbnNfZW5kKTsKK30KKworc3RhdGljIGludCBfX2luaXQgbm9yZXBsYWNlbWVudF9zZXR1cChjaGFyICpzKQoreyAKKyAgICAgbm9fcmVwbGFjZW1lbnQgPSAxOyAKKyAgICAgcmV0dXJuIDA7IAorfSAKKworX19zZXR1cCgibm9yZXBsYWNlbWVudCIsIG5vcmVwbGFjZW1lbnRfc2V0dXApOyAKKworc3RhdGljIGNoYXIgKiBfX2luaXQgbWFjaGluZV9zcGVjaWZpY19tZW1vcnlfc2V0dXAodm9pZCk7CisKKyNpZmRlZiBDT05GSUdfTUNBCitzdGF0aWMgdm9pZCBzZXRfbWNhX2J1cyhpbnQgeCkKK3sKKwlNQ0FfYnVzID0geDsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCBzZXRfbWNhX2J1cyhpbnQgeCkgeyB9CisjZW5kaWYKKworLyoKKyAqIERldGVybWluZSBpZiB3ZSB3ZXJlIGxvYWRlZCBieSBhbiBFRkkgbG9hZGVyLiAgSWYgc28sIHRoZW4gd2UgaGF2ZSBhbHNvIGJlZW4KKyAqIHBhc3NlZCB0aGUgZWZpIG1lbW1hcCwgc3lzdGFiLCBldGMuLCBzbyB3ZSBzaG91bGQgdXNlIHRoZXNlIGRhdGEgc3RydWN0dXJlcworICogZm9yIGluaXRpYWxpemF0aW9uLiAgTm90ZSwgdGhlIGVmaSBpbml0IGNvZGUgcGF0aCBpcyBkZXRlcm1pbmVkIGJ5IHRoZQorICogZ2xvYmFsIGVmaV9lbmFibGVkLiBUaGlzIGFsbG93cyB0aGUgc2FtZSBrZXJuZWwgaW1hZ2UgdG8gYmUgdXNlZCBvbiBleGlzdGluZworICogc3lzdGVtcyAod2l0aCBhIHRyYWRpdGlvbmFsIEJJT1MpIGFzIHdlbGwgYXMgb24gRUZJIHN5c3RlbXMuCisgKi8KK3ZvaWQgX19pbml0IHNldHVwX2FyY2goY2hhciAqKmNtZGxpbmVfcCkKK3sKKwl1bnNpZ25lZCBsb25nIG1heF9sb3dfcGZuOworCisJbWVtY3B5KCZib290X2NwdV9kYXRhLCAmbmV3X2NwdV9kYXRhLCBzaXplb2YobmV3X2NwdV9kYXRhKSk7CisJcHJlX3NldHVwX2FyY2hfaG9vaygpOworCWVhcmx5X2NwdV9pbml0KCk7CisKKwkvKgorCSAqIEZJWE1FOiBUaGlzIGlzbid0IGFuIG9mZmljaWFsIGxvYWRlcl90eXBlIHJpZ2h0CisJICogbm93IGJ1dCBkb2VzIGN1cnJlbnRseSB3b3JrIHdpdGggZWxpbG8uCisJICogSWYgd2Ugd2VyZSBjb25maWd1cmVkIGFzIGFuIEVGSSBrZXJuZWwsIGNoZWNrIHRvIG1ha2UKKwkgKiBzdXJlIHRoYXQgd2Ugd2VyZSBsb2FkZWQgY29ycmVjdGx5IGZyb20gZWxpbG8gYW5kIHRoYXQKKwkgKiB0aGUgc3lzdGVtIHRhYmxlIGlzIHZhbGlkLiAgSWYgbm90LCB0aGVuIGluaXRpYWxpemUgbm9ybWFsbHkuCisJICovCisjaWZkZWYgQ09ORklHX0VGSQorCWlmICgoTE9BREVSX1RZUEUgPT0gMHg1MCkgJiYgRUZJX1NZU1RBQikKKwkJZWZpX2VuYWJsZWQgPSAxOworI2VuZGlmCisKKyAJUk9PVF9ERVYgPSBvbGRfZGVjb2RlX2RldihPUklHX1JPT1RfREVWKTsKKyAJZHJpdmVfaW5mbyA9IERSSVZFX0lORk87CisgCXNjcmVlbl9pbmZvID0gU0NSRUVOX0lORk87CisJZWRpZF9pbmZvID0gRURJRF9JTkZPOworCWFwbV9pbmZvLmJpb3MgPSBBUE1fQklPU19JTkZPOworCWlzdF9pbmZvID0gSVNUX0lORk87CisJc2F2ZWRfdmlkZW9tb2RlID0gVklERU9fTU9ERTsKKwlpZiggU1lTX0RFU0NfVEFCTEUubGVuZ3RoICE9IDAgKSB7CisJCXNldF9tY2FfYnVzKFNZU19ERVNDX1RBQkxFLnRhYmxlWzNdICYgMHgyKTsKKwkJbWFjaGluZV9pZCA9IFNZU19ERVNDX1RBQkxFLnRhYmxlWzBdOworCQltYWNoaW5lX3N1Ym1vZGVsX2lkID0gU1lTX0RFU0NfVEFCTEUudGFibGVbMV07CisJCUJJT1NfcmV2aXNpb24gPSBTWVNfREVTQ19UQUJMRS50YWJsZVsyXTsKKwl9CisJYm9vdGxvYWRlcl90eXBlID0gTE9BREVSX1RZUEU7CisKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9SQU0KKwlyZF9pbWFnZV9zdGFydCA9IFJBTURJU0tfRkxBR1MgJiBSQU1ESVNLX0lNQUdFX1NUQVJUX01BU0s7CisJcmRfcHJvbXB0ID0gKChSQU1ESVNLX0ZMQUdTICYgUkFNRElTS19QUk9NUFRfRkxBRykgIT0gMCk7CisJcmRfZG9sb2FkID0gKChSQU1ESVNLX0ZMQUdTICYgUkFNRElTS19MT0FEX0ZMQUcpICE9IDApOworI2VuZGlmCisJQVJDSF9TRVRVUAorCWlmIChlZmlfZW5hYmxlZCkKKwkJZWZpX2luaXQoKTsKKwllbHNlIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQklPUy1wcm92aWRlZCBwaHlzaWNhbCBSQU0gbWFwOlxuIik7CisJCXByaW50X21lbW9yeV9tYXAobWFjaGluZV9zcGVjaWZpY19tZW1vcnlfc2V0dXAoKSk7CisJfQorCisJY29weV9lZGQoKTsKKworCWlmICghTU9VTlRfUk9PVF9SRE9OTFkpCisJCXJvb3RfbW91bnRmbGFncyAmPSB+TVNfUkRPTkxZOworCWluaXRfbW0uc3RhcnRfY29kZSA9ICh1bnNpZ25lZCBsb25nKSBfdGV4dDsKKwlpbml0X21tLmVuZF9jb2RlID0gKHVuc2lnbmVkIGxvbmcpIF9ldGV4dDsKKwlpbml0X21tLmVuZF9kYXRhID0gKHVuc2lnbmVkIGxvbmcpIF9lZGF0YTsKKwlpbml0X21tLmJyayA9IGluaXRfcGdfdGFibGVzX2VuZCArIFBBR0VfT0ZGU0VUOworCisJY29kZV9yZXNvdXJjZS5zdGFydCA9IHZpcnRfdG9fcGh5cyhfdGV4dCk7CisJY29kZV9yZXNvdXJjZS5lbmQgPSB2aXJ0X3RvX3BoeXMoX2V0ZXh0KS0xOworCWRhdGFfcmVzb3VyY2Uuc3RhcnQgPSB2aXJ0X3RvX3BoeXMoX2V0ZXh0KTsKKwlkYXRhX3Jlc291cmNlLmVuZCA9IHZpcnRfdG9fcGh5cyhfZWRhdGEpLTE7CisKKwlwYXJzZV9jbWRsaW5lX2Vhcmx5KGNtZGxpbmVfcCk7CisKKwltYXhfbG93X3BmbiA9IHNldHVwX21lbW9yeSgpOworCisJLyoKKwkgKiBOT1RFOiBiZWZvcmUgdGhpcyBwb2ludCBfbm9ib2R5XyBpcyBhbGxvd2VkIHRvIGFsbG9jYXRlCisJICogYW55IG1lbW9yeSB1c2luZyB0aGUgYm9vdG1lbSBhbGxvY2F0b3IuICBBbHRob3VnaCB0aGUKKwkgKiBhbGxvY3RvciBpcyBub3cgaW5pdGlhbGlzZWQgb25seSB0aGUgZmlyc3QgOE1iIG9mIHRoZSBrZXJuZWwKKwkgKiB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgaGFzIGJlZW4gbWFwcGVkLiAgQWxsIGFsbG9jYXRpb25zIGJlZm9yZQorCSAqIHBhZ2luZ19pbml0KCkgaGFzIGNvbXBsZXRlZCBtdXN0IHVzZSB0aGUgYWxsb2NfYm9vdG1lbV9sb3dfcGFnZXMoKQorCSAqIHZhcmlhbnQgKHdoaWNoIGFsbG9jYXRlcyBETUEnYWJsZSBtZW1vcnkpIGFuZCBjYXJlIG11c3QgYmUgdGFrZW4KKwkgKiBub3QgdG8gZXhjZWVkIHRoZSA4TWIgbGltaXQuCisJICovCisKKyNpZmRlZiBDT05GSUdfU01QCisJc21wX2FsbG9jX21lbW9yeSgpOyAvKiBBUCBwcm9jZXNzb3IgcmVhbG1vZGUgc3RhY2tzIGluIGxvdyBtZW1vcnkqLworI2VuZGlmCisJcGFnaW5nX2luaXQoKTsKKwlyZW1hcHBlZF9wZ2RhdF9pbml0KCk7CisJem9uZV9zaXplc19pbml0KCk7CisKKwkvKgorCSAqIE5PVEU6IGF0IHRoaXMgcG9pbnQgdGhlIGJvb3RtZW0gYWxsb2NhdG9yIGlzIGZ1bGx5IGF2YWlsYWJsZS4KKwkgKi8KKworI2lmZGVmIENPTkZJR19FQVJMWV9QUklOVEsKKwl7CisJCWNoYXIgKnMgPSBzdHJzdHIoKmNtZGxpbmVfcCwgImVhcmx5cHJpbnRrPSIpOworCQlpZiAocykgeworCQkJZXh0ZXJuIHZvaWQgc2V0dXBfZWFybHlfcHJpbnRrKGNoYXIgKik7CisKKwkJCXNldHVwX2Vhcmx5X3ByaW50ayhzKTsKKwkJCXByaW50aygiZWFybHkgY29uc29sZSBlbmFibGVkXG4iKTsKKwkJfQorCX0KKyNlbmRpZgorCisKKwlkbWlfc2Nhbl9tYWNoaW5lKCk7CisKKyNpZmRlZiBDT05GSUdfWDg2X0dFTkVSSUNBUkNICisJZ2VuZXJpY19hcGljX3Byb2JlKCpjbWRsaW5lX3ApOworI2VuZGlmCQorCWlmIChlZmlfZW5hYmxlZCkKKwkJZWZpX21hcF9tZW1tYXAoKTsKKworCS8qCisJICogUGFyc2UgdGhlIEFDUEkgdGFibGVzIGZvciBwb3NzaWJsZSBib290LXRpbWUgU01QIGNvbmZpZ3VyYXRpb24uCisJICovCisJYWNwaV9ib290X3RhYmxlX2luaXQoKTsKKwlhY3BpX2Jvb3RfaW5pdCgpOworCisjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCisJaWYgKHNtcF9mb3VuZF9jb25maWcpCisJCWdldF9zbXBfY29uZmlnKCk7CisjZW5kaWYKKworCXJlZ2lzdGVyX21lbW9yeSgpOworCisjaWZkZWYgQ09ORklHX1ZUCisjaWYgZGVmaW5lZChDT05GSUdfVkdBX0NPTlNPTEUpCisJaWYgKCFlZmlfZW5hYmxlZCB8fCAoZWZpX21lbV90eXBlKDB4YTAwMDApICE9IEVGSV9DT05WRU5USU9OQUxfTUVNT1JZKSkKKwkJY29uc3dpdGNocCA9ICZ2Z2FfY29uOworI2VsaWYgZGVmaW5lZChDT05GSUdfRFVNTVlfQ09OU09MRSkKKwljb25zd2l0Y2hwID0gJmR1bW15X2NvbjsKKyNlbmRpZgorI2VuZGlmCit9CisKKyNpbmNsdWRlICJzZXR1cF9hcmNoX3Bvc3QuaCIKKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOmMKKyAqIGMtZmlsZS1zdHlsZToiayZyIgorICogYy1iYXNpYy1vZmZzZXQ6OAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3NpZ2ZyYW1lLmggYi9hcmNoL2kzODYva2VybmVsL3NpZ2ZyYW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIxYjE0ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvc2lnZnJhbWUuaApAQCAtMCwwICsxLDIxIEBACitzdHJ1Y3Qgc2lnZnJhbWUKK3sKKwljaGFyICpwcmV0Y29kZTsKKwlpbnQgc2lnOworCXN0cnVjdCBzaWdjb250ZXh0IHNjOworCXN0cnVjdCBfZnBzdGF0ZSBmcHN0YXRlOworCXVuc2lnbmVkIGxvbmcgZXh0cmFtYXNrW19OU0lHX1dPUkRTLTFdOworCWNoYXIgcmV0Y29kZVs4XTsKK307CisKK3N0cnVjdCBydF9zaWdmcmFtZQoreworCWNoYXIgKnByZXRjb2RlOworCWludCBzaWc7CisJc3RydWN0IHNpZ2luZm8gKnBpbmZvOworCXZvaWQgKnB1YzsKKwlzdHJ1Y3Qgc2lnaW5mbyBpbmZvOworCXN0cnVjdCB1Y29udGV4dCB1YzsKKwlzdHJ1Y3QgX2Zwc3RhdGUgZnBzdGF0ZTsKKwljaGFyIHJldGNvZGVbOF07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc2lnbmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYzNjAyZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvc2lnbmFsLmMKQEAgLTAsMCArMSw2NjUgQEAKKy8qCisgKiAgbGludXgvYXJjaC9pMzg2L2tlcm5lbC9zaWduYWwuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKgorICogIDE5OTctMTEtMjggIE1vZGlmaWVkIGZvciBQT1NJWC4xYiBzaWduYWxzIGJ5IFJpY2hhcmQgSGVuZGVyc29uCisgKiAgMjAwMC0wNi0yMCAgUGVudGl1bSBJSUkgRlhTUiwgU1NFIHN1cHBvcnQgYnkgR2FyZXRoIEh1Z2hlcworICovCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJzb25hbGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lbGYuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3Vjb250ZXh0Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaTM4Ny5oPgorI2luY2x1ZGUgInNpZ2ZyYW1lLmgiCisKKyNkZWZpbmUgREVCVUdfU0lHIDAKKworI2RlZmluZSBfQkxPQ0tBQkxFICh+KHNpZ21hc2soU0lHS0lMTCkgfCBzaWdtYXNrKFNJR1NUT1ApKSkKKworLyoKKyAqIEF0b21pY2FsbHkgc3dhcCBpbiB0aGUgbmV3IHNpZ25hbCBtYXNrLCBhbmQgd2FpdCBmb3IgYSBzaWduYWwuCisgKi8KK2FzbWxpbmthZ2UgaW50CitzeXNfc2lnc3VzcGVuZChpbnQgaGlzdG9yeTAsIGludCBoaXN0b3J5MSwgb2xkX3NpZ3NldF90IG1hc2spCit7CisJc3RydWN0IHB0X3JlZ3MgKiByZWdzID0gKHN0cnVjdCBwdF9yZWdzICopICZoaXN0b3J5MDsKKwlzaWdzZXRfdCBzYXZlc2V0OworCisJbWFzayAmPSBfQkxPQ0tBQkxFOworCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCXNhdmVzZXQgPSBjdXJyZW50LT5ibG9ja2VkOworCXNpZ2luaXRzZXQoJmN1cnJlbnQtPmJsb2NrZWQsIG1hc2spOworCXJlY2FsY19zaWdwZW5kaW5nKCk7CisJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKworCXJlZ3MtPmVheCA9IC1FSU5UUjsKKwl3aGlsZSAoMSkgeworCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwkJc2NoZWR1bGUoKTsKKwkJaWYgKGRvX3NpZ25hbChyZWdzLCAmc2F2ZXNldCkpCisJCQlyZXR1cm4gLUVJTlRSOworCX0KK30KKworYXNtbGlua2FnZSBpbnQKK3N5c19ydF9zaWdzdXNwZW5kKHN0cnVjdCBwdF9yZWdzIHJlZ3MpCit7CisJc2lnc2V0X3Qgc2F2ZXNldCwgbmV3c2V0OworCisJLyogWFhYOiBEb24ndCBwcmVjbHVkZSBoYW5kbGluZyBkaWZmZXJlbnQgc2l6ZWQgc2lnc2V0X3Qncy4gICovCisJaWYgKHJlZ3MuZWN4ICE9IHNpemVvZihzaWdzZXRfdCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdzZXQsIChzaWdzZXRfdCBfX3VzZXIgKilyZWdzLmVieCwgc2l6ZW9mKG5ld3NldCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlzaWdkZWxzZXRtYXNrKCZuZXdzZXQsIH5fQkxPQ0tBQkxFKTsKKworCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCXNhdmVzZXQgPSBjdXJyZW50LT5ibG9ja2VkOworCWN1cnJlbnQtPmJsb2NrZWQgPSBuZXdzZXQ7CisJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCisJcmVncy5lYXggPSAtRUlOVFI7CisJd2hpbGUgKDEpIHsKKwkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJCXNjaGVkdWxlKCk7CisJCWlmIChkb19zaWduYWwoJnJlZ3MsICZzYXZlc2V0KSkKKwkJCXJldHVybiAtRUlOVFI7CisJfQorfQorCithc21saW5rYWdlIGludCAKK3N5c19zaWdhY3Rpb24oaW50IHNpZywgY29uc3Qgc3RydWN0IG9sZF9zaWdhY3Rpb24gX191c2VyICphY3QsCisJICAgICAgc3RydWN0IG9sZF9zaWdhY3Rpb24gX191c2VyICpvYWN0KQoreworCXN0cnVjdCBrX3NpZ2FjdGlvbiBuZXdfa2EsIG9sZF9rYTsKKwlpbnQgcmV0OworCisJaWYgKGFjdCkgeworCQlvbGRfc2lnc2V0X3QgbWFzazsKKwkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGFjdCwgc2l6ZW9mKCphY3QpKSB8fAorCQkgICAgX19nZXRfdXNlcihuZXdfa2Euc2Euc2FfaGFuZGxlciwgJmFjdC0+c2FfaGFuZGxlcikgfHwKKwkJICAgIF9fZ2V0X3VzZXIobmV3X2thLnNhLnNhX3Jlc3RvcmVyLCAmYWN0LT5zYV9yZXN0b3JlcikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJX19nZXRfdXNlcihuZXdfa2Euc2Euc2FfZmxhZ3MsICZhY3QtPnNhX2ZsYWdzKTsKKwkJX19nZXRfdXNlcihtYXNrLCAmYWN0LT5zYV9tYXNrKTsKKwkJc2lnaW5pdHNldCgmbmV3X2thLnNhLnNhX21hc2ssIG1hc2spOworCX0KKworCXJldCA9IGRvX3NpZ2FjdGlvbihzaWcsIGFjdCA/ICZuZXdfa2EgOiBOVUxMLCBvYWN0ID8gJm9sZF9rYSA6IE5VTEwpOworCisJaWYgKCFyZXQgJiYgb2FjdCkgeworCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIG9hY3QsIHNpemVvZigqb2FjdCkpIHx8CisJCSAgICBfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9oYW5kbGVyLCAmb2FjdC0+c2FfaGFuZGxlcikgfHwKKwkJICAgIF9fcHV0X3VzZXIob2xkX2thLnNhLnNhX3Jlc3RvcmVyLCAmb2FjdC0+c2FfcmVzdG9yZXIpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCV9fcHV0X3VzZXIob2xkX2thLnNhLnNhX2ZsYWdzLCAmb2FjdC0+c2FfZmxhZ3MpOworCQlfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9tYXNrLnNpZ1swXSwgJm9hY3QtPnNhX21hc2spOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2FzbWxpbmthZ2UgaW50CitzeXNfc2lnYWx0c3RhY2sodW5zaWduZWQgbG9uZyBlYngpCit7CisJLyogVGhpcyBpcyBuZWVkZWQgdG8gbWFrZSBnY2MgcmVhbGl6ZSBpdCBkb2Vzbid0IG93biB0aGUgInN0cnVjdCBwdF9yZWdzIiAqLworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gKHN0cnVjdCBwdF9yZWdzICopJmVieDsKKwljb25zdCBzdGFja190IF9fdXNlciAqdXNzID0gKGNvbnN0IHN0YWNrX3QgX191c2VyICopZWJ4OworCXN0YWNrX3QgX191c2VyICp1b3NzID0gKHN0YWNrX3QgX191c2VyICopcmVncy0+ZWN4OworCisJcmV0dXJuIGRvX3NpZ2FsdHN0YWNrKHVzcywgdW9zcywgcmVncy0+ZXNwKTsKK30KKworCisvKgorICogRG8gYSBzaWduYWwgcmV0dXJuOyB1bmRvIHRoZSBzaWduYWwgc3RhY2suCisgKi8KKworc3RhdGljIGludAorcmVzdG9yZV9zaWdjb250ZXh0KHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKnNjLCBpbnQgKnBlYXgpCit7CisJdW5zaWduZWQgaW50IGVyciA9IDA7CisKKwkvKiBBbHdheXMgbWFrZSBhbnkgcGVuZGluZyByZXN0YXJ0ZWQgc3lzdGVtIGNhbGxzIHJldHVybiAtRUlOVFIgKi8KKwljdXJyZW50X3RocmVhZF9pbmZvKCktPnJlc3RhcnRfYmxvY2suZm4gPSBkb19ub19yZXN0YXJ0X3N5c2NhbGw7CisKKyNkZWZpbmUgQ09QWSh4KQkJZXJyIHw9IF9fZ2V0X3VzZXIocmVncy0+eCwgJnNjLT54KQorCisjZGVmaW5lIENPUFlfU0VHKHNlZykJCQkJCQkJXAorCXsgdW5zaWduZWQgc2hvcnQgdG1wOwkJCQkJCVwKKwkgIGVyciB8PSBfX2dldF91c2VyKHRtcCwgJnNjLT5zZWcpOwkJCQlcCisJICByZWdzLT54IyNzZWcgPSB0bXA7IH0KKworI2RlZmluZSBDT1BZX1NFR19TVFJJQ1Qoc2VnKQkJCQkJCVwKKwl7IHVuc2lnbmVkIHNob3J0IHRtcDsJCQkJCQlcCisJICBlcnIgfD0gX19nZXRfdXNlcih0bXAsICZzYy0+c2VnKTsJCQkJXAorCSAgcmVncy0+eCMjc2VnID0gdG1wfDM7IH0KKworI2RlZmluZSBHRVRfU0VHKHNlZykJCQkJCQkJXAorCXsgdW5zaWduZWQgc2hvcnQgdG1wOwkJCQkJCVwKKwkgIGVyciB8PSBfX2dldF91c2VyKHRtcCwgJnNjLT5zZWcpOwkJCQlcCisJICBsb2Fkc2VnbWVudChzZWcsdG1wKTsgfQorCisjZGVmaW5lCUZJWF9FRkxBR1MJKFg4Nl9FRkxBR1NfQUMgfCBYODZfRUZMQUdTX09GIHwgWDg2X0VGTEFHU19ERiB8IFwKKwkJCSBYODZfRUZMQUdTX1RGIHwgWDg2X0VGTEFHU19TRiB8IFg4Nl9FRkxBR1NfWkYgfCBcCisJCQkgWDg2X0VGTEFHU19BRiB8IFg4Nl9FRkxBR1NfUEYgfCBYODZfRUZMQUdTX0NGKQorCisJR0VUX1NFRyhncyk7CisJR0VUX1NFRyhmcyk7CisJQ09QWV9TRUcoZXMpOworCUNPUFlfU0VHKGRzKTsKKwlDT1BZKGVkaSk7CisJQ09QWShlc2kpOworCUNPUFkoZWJwKTsKKwlDT1BZKGVzcCk7CisJQ09QWShlYngpOworCUNPUFkoZWR4KTsKKwlDT1BZKGVjeCk7CisJQ09QWShlaXApOworCUNPUFlfU0VHX1NUUklDVChjcyk7CisJQ09QWV9TRUdfU1RSSUNUKHNzKTsKKwkKKwl7CisJCXVuc2lnbmVkIGludCB0bXBmbGFnczsKKwkJZXJyIHw9IF9fZ2V0X3VzZXIodG1wZmxhZ3MsICZzYy0+ZWZsYWdzKTsKKwkJcmVncy0+ZWZsYWdzID0gKHJlZ3MtPmVmbGFncyAmIH5GSVhfRUZMQUdTKSB8ICh0bXBmbGFncyAmIEZJWF9FRkxBR1MpOworCQlyZWdzLT5vcmlnX2VheCA9IC0xOwkJLyogZGlzYWJsZSBzeXNjYWxsIGNoZWNrcyAqLworCX0KKworCXsKKwkJc3RydWN0IF9mcHN0YXRlIF9fdXNlciAqIGJ1ZjsKKwkJZXJyIHw9IF9fZ2V0X3VzZXIoYnVmLCAmc2MtPmZwc3RhdGUpOworCQlpZiAoYnVmKSB7CisJCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmLCBzaXplb2YoKmJ1ZikpKQorCQkJCWdvdG8gYmFkZnJhbWU7CisJCQllcnIgfD0gcmVzdG9yZV9pMzg3KGJ1Zik7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm1lID0gY3VycmVudDsKKwkJCWlmICh1c2VkX21hdGgoKSkgeworCQkJCWNsZWFyX2ZwdShtZSk7CisJCQkJY2xlYXJfdXNlZF9tYXRoKCk7CisJCQl9CisJCX0KKwl9CisKKwllcnIgfD0gX19nZXRfdXNlcigqcGVheCwgJnNjLT5lYXgpOworCXJldHVybiBlcnI7CisKK2JhZGZyYW1lOgorCXJldHVybiAxOworfQorCithc21saW5rYWdlIGludCBzeXNfc2lncmV0dXJuKHVuc2lnbmVkIGxvbmcgX191bnVzZWQpCit7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKikgJl9fdW51c2VkOworCXN0cnVjdCBzaWdmcmFtZSBfX3VzZXIgKmZyYW1lID0gKHN0cnVjdCBzaWdmcmFtZSBfX3VzZXIgKikocmVncy0+ZXNwIC0gOCk7CisJc2lnc2V0X3Qgc2V0OworCWludCBlYXg7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnJhbWUsIHNpemVvZigqZnJhbWUpKSkKKwkJZ290byBiYWRmcmFtZTsKKwlpZiAoX19nZXRfdXNlcihzZXQuc2lnWzBdLCAmZnJhbWUtPnNjLm9sZG1hc2spCisJICAgIHx8IChfTlNJR19XT1JEUyA+IDEKKwkJJiYgX19jb3B5X2Zyb21fdXNlcigmc2V0LnNpZ1sxXSwgJmZyYW1lLT5leHRyYW1hc2ssCisJCQkJICAgIHNpemVvZihmcmFtZS0+ZXh0cmFtYXNrKSkpKQorCQlnb3RvIGJhZGZyYW1lOworCisJc2lnZGVsc2V0bWFzaygmc2V0LCB+X0JMT0NLQUJMRSk7CisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJY3VycmVudC0+YmxvY2tlZCA9IHNldDsKKwlyZWNhbGNfc2lncGVuZGluZygpOworCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJCisJaWYgKHJlc3RvcmVfc2lnY29udGV4dChyZWdzLCAmZnJhbWUtPnNjLCAmZWF4KSkKKwkJZ290byBiYWRmcmFtZTsKKwlyZXR1cm4gZWF4OworCitiYWRmcmFtZToKKwlmb3JjZV9zaWcoU0lHU0VHViwgY3VycmVudCk7CisJcmV0dXJuIDA7Cit9CQorCithc21saW5rYWdlIGludCBzeXNfcnRfc2lncmV0dXJuKHVuc2lnbmVkIGxvbmcgX191bnVzZWQpCit7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKikgJl9fdW51c2VkOworCXN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKmZyYW1lID0gKHN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKikocmVncy0+ZXNwIC0gNCk7CisJc2lnc2V0X3Qgc2V0OworCWludCBlYXg7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnJhbWUsIHNpemVvZigqZnJhbWUpKSkKKwkJZ290byBiYWRmcmFtZTsKKwlpZiAoX19jb3B5X2Zyb21fdXNlcigmc2V0LCAmZnJhbWUtPnVjLnVjX3NpZ21hc2ssIHNpemVvZihzZXQpKSkKKwkJZ290byBiYWRmcmFtZTsKKworCXNpZ2RlbHNldG1hc2soJnNldCwgfl9CTE9DS0FCTEUpOworCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCWN1cnJlbnQtPmJsb2NrZWQgPSBzZXQ7CisJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCQorCWlmIChyZXN0b3JlX3NpZ2NvbnRleHQocmVncywgJmZyYW1lLT51Yy51Y19tY29udGV4dCwgJmVheCkpCisJCWdvdG8gYmFkZnJhbWU7CisKKwlpZiAoZG9fc2lnYWx0c3RhY2soJmZyYW1lLT51Yy51Y19zdGFjaywgTlVMTCwgcmVncy0+ZXNwKSA9PSAtRUZBVUxUKQorCQlnb3RvIGJhZGZyYW1lOworCisJcmV0dXJuIGVheDsKKworYmFkZnJhbWU6CisJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOworCXJldHVybiAwOworfQkKKworLyoKKyAqIFNldCB1cCBhIHNpZ25hbCBmcmFtZS4KKyAqLworCitzdGF0aWMgaW50CitzZXR1cF9zaWdjb250ZXh0KHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqc2MsIHN0cnVjdCBfZnBzdGF0ZSBfX3VzZXIgKmZwc3RhdGUsCisJCSBzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBtYXNrKQoreworCWludCB0bXAsIGVyciA9IDA7CisKKwl0bXAgPSAwOworCV9fYXNtX18oIm1vdmwgJSVncywlMCIgOiAiPXIiKHRtcCk6ICIwIih0bXApKTsKKwllcnIgfD0gX19wdXRfdXNlcih0bXAsICh1bnNpZ25lZCBpbnQgX191c2VyICopJnNjLT5ncyk7CisJX19hc21fXygibW92bCAlJWZzLCUwIiA6ICI9ciIodG1wKTogIjAiKHRtcCkpOworCWVyciB8PSBfX3B1dF91c2VyKHRtcCwgKHVuc2lnbmVkIGludCBfX3VzZXIgKikmc2MtPmZzKTsKKworCWVyciB8PSBfX3B1dF91c2VyKHJlZ3MtPnhlcywgKHVuc2lnbmVkIGludCBfX3VzZXIgKikmc2MtPmVzKTsKKwllcnIgfD0gX19wdXRfdXNlcihyZWdzLT54ZHMsICh1bnNpZ25lZCBpbnQgX191c2VyICopJnNjLT5kcyk7CisJZXJyIHw9IF9fcHV0X3VzZXIocmVncy0+ZWRpLCAmc2MtPmVkaSk7CisJZXJyIHw9IF9fcHV0X3VzZXIocmVncy0+ZXNpLCAmc2MtPmVzaSk7CisJZXJyIHw9IF9fcHV0X3VzZXIocmVncy0+ZWJwLCAmc2MtPmVicCk7CisJZXJyIHw9IF9fcHV0X3VzZXIocmVncy0+ZXNwLCAmc2MtPmVzcCk7CisJZXJyIHw9IF9fcHV0X3VzZXIocmVncy0+ZWJ4LCAmc2MtPmVieCk7CisJZXJyIHw9IF9fcHV0X3VzZXIocmVncy0+ZWR4LCAmc2MtPmVkeCk7CisJZXJyIHw9IF9fcHV0X3VzZXIocmVncy0+ZWN4LCAmc2MtPmVjeCk7CisJZXJyIHw9IF9fcHV0X3VzZXIocmVncy0+ZWF4LCAmc2MtPmVheCk7CisJZXJyIHw9IF9fcHV0X3VzZXIoY3VycmVudC0+dGhyZWFkLnRyYXBfbm8sICZzYy0+dHJhcG5vKTsKKwllcnIgfD0gX19wdXRfdXNlcihjdXJyZW50LT50aHJlYWQuZXJyb3JfY29kZSwgJnNjLT5lcnIpOworCWVyciB8PSBfX3B1dF91c2VyKHJlZ3MtPmVpcCwgJnNjLT5laXApOworCWVyciB8PSBfX3B1dF91c2VyKHJlZ3MtPnhjcywgKHVuc2lnbmVkIGludCBfX3VzZXIgKikmc2MtPmNzKTsKKwllcnIgfD0gX19wdXRfdXNlcihyZWdzLT5lZmxhZ3MsICZzYy0+ZWZsYWdzKTsKKwllcnIgfD0gX19wdXRfdXNlcihyZWdzLT5lc3AsICZzYy0+ZXNwX2F0X3NpZ25hbCk7CisJZXJyIHw9IF9fcHV0X3VzZXIocmVncy0+eHNzLCAodW5zaWduZWQgaW50IF9fdXNlciAqKSZzYy0+c3MpOworCisJdG1wID0gc2F2ZV9pMzg3KGZwc3RhdGUpOworCWlmICh0bXAgPCAwKQorCSAgZXJyID0gMTsKKwllbHNlCisJICBlcnIgfD0gX19wdXRfdXNlcih0bXAgPyBmcHN0YXRlIDogTlVMTCwgJnNjLT5mcHN0YXRlKTsKKworCS8qIG5vbi1pQkNTMiBleHRlbnNpb25zLi4gKi8KKwllcnIgfD0gX19wdXRfdXNlcihtYXNrLCAmc2MtPm9sZG1hc2spOworCWVyciB8PSBfX3B1dF91c2VyKGN1cnJlbnQtPnRocmVhZC5jcjIsICZzYy0+Y3IyKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBEZXRlcm1pbmUgd2hpY2ggc3RhY2sgdG8gdXNlLi4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fdXNlciAqCitnZXRfc2lnZnJhbWUoc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBzaXplX3QgZnJhbWVfc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGVzcDsKKworCS8qIERlZmF1bHQgdG8gdXNpbmcgbm9ybWFsIHN0YWNrICovCisJZXNwID0gcmVncy0+ZXNwOworCisJLyogVGhpcyBpcyB0aGUgWC9PcGVuIHNhbmN0aW9uZWQgc2lnbmFsIHN0YWNrIHN3aXRjaGluZy4gICovCisJaWYgKGthLT5zYS5zYV9mbGFncyAmIFNBX09OU1RBQ0spIHsKKwkJaWYgKHNhc19zc19mbGFncyhlc3ApID09IDApCisJCQllc3AgPSBjdXJyZW50LT5zYXNfc3Nfc3AgKyBjdXJyZW50LT5zYXNfc3Nfc2l6ZTsKKwl9CisKKwkvKiBUaGlzIGlzIHRoZSBsZWdhY3kgc2lnbmFsIHN0YWNrIHN3aXRjaGluZy4gKi8KKwllbHNlIGlmICgocmVncy0+eHNzICYgMHhmZmZmKSAhPSBfX1VTRVJfRFMgJiYKKwkJICEoa2EtPnNhLnNhX2ZsYWdzICYgU0FfUkVTVE9SRVIpICYmCisJCSBrYS0+c2Euc2FfcmVzdG9yZXIpIHsKKwkJZXNwID0gKHVuc2lnbmVkIGxvbmcpIGthLT5zYS5zYV9yZXN0b3JlcjsKKwl9CisKKwlyZXR1cm4gKHZvaWQgX191c2VyICopKChlc3AgLSBmcmFtZV9zaXplKSAmIC04dWwpOworfQorCisvKiBUaGVzZSBzeW1ib2xzIGFyZSBkZWZpbmVkIHdpdGggdGhlIGFkZHJlc3NlcyBpbiB0aGUgdnN5c2NhbGwgcGFnZS4KKyAgIFNlZSB2c3lzY2FsbC1zaWdyZXR1cm4uUy4gICovCitleHRlcm4gdm9pZCBfX3VzZXIgX19rZXJuZWxfc2lncmV0dXJuOworZXh0ZXJuIHZvaWQgX191c2VyIF9fa2VybmVsX3J0X3NpZ3JldHVybjsKKworc3RhdGljIHZvaWQgc2V0dXBfZnJhbWUoaW50IHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwKKwkJCXNpZ3NldF90ICpzZXQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwl2b2lkIF9fdXNlciAqcmVzdG9yZXI7CisJc3RydWN0IHNpZ2ZyYW1lIF9fdXNlciAqZnJhbWU7CisJaW50IGVyciA9IDA7CisJaW50IHVzaWc7CisKKwlmcmFtZSA9IGdldF9zaWdmcmFtZShrYSwgcmVncywgc2l6ZW9mKCpmcmFtZSkpOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBmcmFtZSwgc2l6ZW9mKCpmcmFtZSkpKQorCQlnb3RvIGdpdmVfc2lnc2VndjsKKworCXVzaWcgPSBjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluCisJCSYmIGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZXhlY19kb21haW4tPnNpZ25hbF9pbnZtYXAKKwkJJiYgc2lnIDwgMzIKKwkJPyBjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluLT5zaWduYWxfaW52bWFwW3NpZ10KKwkJOiBzaWc7CisKKwllcnIgPSBfX3B1dF91c2VyKHVzaWcsICZmcmFtZS0+c2lnKTsKKwlpZiAoZXJyKQorCQlnb3RvIGdpdmVfc2lnc2VndjsKKworCWVyciA9IHNldHVwX3NpZ2NvbnRleHQoJmZyYW1lLT5zYywgJmZyYW1lLT5mcHN0YXRlLCByZWdzLCBzZXQtPnNpZ1swXSk7CisJaWYgKGVycikKKwkJZ290byBnaXZlX3NpZ3NlZ3Y7CisKKwlpZiAoX05TSUdfV09SRFMgPiAxKSB7CisJCWVyciA9IF9fY29weV90b191c2VyKCZmcmFtZS0+ZXh0cmFtYXNrLCAmc2V0LT5zaWdbMV0sCisJCQkJICAgICAgc2l6ZW9mKGZyYW1lLT5leHRyYW1hc2spKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZ2l2ZV9zaWdzZWd2OworCX0KKworCXJlc3RvcmVyID0gJl9fa2VybmVsX3NpZ3JldHVybjsKKwlpZiAoa2EtPnNhLnNhX2ZsYWdzICYgU0FfUkVTVE9SRVIpCisJCXJlc3RvcmVyID0ga2EtPnNhLnNhX3Jlc3RvcmVyOworCisJLyogU2V0IHVwIHRvIHJldHVybiBmcm9tIHVzZXJzcGFjZS4gICovCisJZXJyIHw9IF9fcHV0X3VzZXIocmVzdG9yZXIsICZmcmFtZS0+cHJldGNvZGUpOworCSAKKwkvKgorCSAqIFRoaXMgaXMgcG9wbCAlZWF4IDsgbW92bCAkLCVlYXggOyBpbnQgJDB4ODAKKwkgKgorCSAqIFdFIERPIE5PVCBVU0UgSVQgQU5ZIE1PUkUhIEl0J3Mgb25seSBsZWZ0IGhlcmUgZm9yIGhpc3RvcmljYWwKKwkgKiByZWFzb25zIGFuZCBiZWNhdXNlIGdkYiB1c2VzIGl0IGFzIGEgc2lnbmF0dXJlIHRvIG5vdGljZQorCSAqIHNpZ25hbCBoYW5kbGVyIHN0YWNrIGZyYW1lcy4KKwkgKi8KKwllcnIgfD0gX19wdXRfdXNlcigweGI4NTgsIChzaG9ydCBfX3VzZXIgKikoZnJhbWUtPnJldGNvZGUrMCkpOworCWVyciB8PSBfX3B1dF91c2VyKF9fTlJfc2lncmV0dXJuLCAoaW50IF9fdXNlciAqKShmcmFtZS0+cmV0Y29kZSsyKSk7CisJZXJyIHw9IF9fcHV0X3VzZXIoMHg4MGNkLCAoc2hvcnQgX191c2VyICopKGZyYW1lLT5yZXRjb2RlKzYpKTsKKworCWlmIChlcnIpCisJCWdvdG8gZ2l2ZV9zaWdzZWd2OworCisJLyogU2V0IHVwIHJlZ2lzdGVycyBmb3Igc2lnbmFsIGhhbmRsZXIgKi8KKwlyZWdzLT5lc3AgPSAodW5zaWduZWQgbG9uZykgZnJhbWU7CisJcmVncy0+ZWlwID0gKHVuc2lnbmVkIGxvbmcpIGthLT5zYS5zYV9oYW5kbGVyOworCXJlZ3MtPmVheCA9ICh1bnNpZ25lZCBsb25nKSBzaWc7CisJcmVncy0+ZWR4ID0gKHVuc2lnbmVkIGxvbmcpIDA7CisJcmVncy0+ZWN4ID0gKHVuc2lnbmVkIGxvbmcpIDA7CisKKwlzZXRfZnMoVVNFUl9EUyk7CisJcmVncy0+eGRzID0gX19VU0VSX0RTOworCXJlZ3MtPnhlcyA9IF9fVVNFUl9EUzsKKwlyZWdzLT54c3MgPSBfX1VTRVJfRFM7CisJcmVncy0+eGNzID0gX19VU0VSX0NTOworCisJLyoKKwkgKiBDbGVhciBURiB3aGVuIGVudGVyaW5nIHRoZSBzaWduYWwgaGFuZGxlciwgYnV0CisJICogbm90aWZ5IGFueSB0cmFjZXIgdGhhdCB3YXMgc2luZ2xlLXN0ZXBwaW5nIGl0LgorCSAqIFRoZSB0cmFjZXIgbWF5IHdhbnQgdG8gc2luZ2xlLXN0ZXAgaW5zaWRlIHRoZQorCSAqIGhhbmRsZXIgdG9vLgorCSAqLworCXJlZ3MtPmVmbGFncyAmPSB+VEZfTUFTSzsKKwlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfU0lOR0xFU1RFUCkpCisJCXB0cmFjZV9ub3RpZnkoU0lHVFJBUCk7CisKKyNpZiBERUJVR19TSUcKKwlwcmludGsoIlNJRyBkZWxpdmVyICglczolZCk6IHNwPSVwIHBjPSVwIHJhPSVwXG4iLAorCQljdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIGZyYW1lLCByZWdzLT5laXAsIGZyYW1lLT5wcmV0Y29kZSk7CisjZW5kaWYKKworCXJldHVybjsKKworZ2l2ZV9zaWdzZWd2OgorCWZvcmNlX3NpZ3NlZ3Yoc2lnLCBjdXJyZW50KTsKK30KKworc3RhdGljIHZvaWQgc2V0dXBfcnRfZnJhbWUoaW50IHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc2lnaW5mb190ICppbmZvLAorCQkJICAgc2lnc2V0X3QgKnNldCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCXZvaWQgX191c2VyICpyZXN0b3JlcjsKKwlzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICpmcmFtZTsKKwlpbnQgZXJyID0gMDsKKwlpbnQgdXNpZzsKKworCWZyYW1lID0gZ2V0X3NpZ2ZyYW1lKGthLCByZWdzLCBzaXplb2YoKmZyYW1lKSk7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGZyYW1lLCBzaXplb2YoKmZyYW1lKSkpCisJCWdvdG8gZ2l2ZV9zaWdzZWd2OworCisJdXNpZyA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZXhlY19kb21haW4KKwkJJiYgY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbi0+c2lnbmFsX2ludm1hcAorCQkmJiBzaWcgPCAzMgorCQk/IGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZXhlY19kb21haW4tPnNpZ25hbF9pbnZtYXBbc2lnXQorCQk6IHNpZzsKKworCWVyciB8PSBfX3B1dF91c2VyKHVzaWcsICZmcmFtZS0+c2lnKTsKKwllcnIgfD0gX19wdXRfdXNlcigmZnJhbWUtPmluZm8sICZmcmFtZS0+cGluZm8pOworCWVyciB8PSBfX3B1dF91c2VyKCZmcmFtZS0+dWMsICZmcmFtZS0+cHVjKTsKKwllcnIgfD0gY29weV9zaWdpbmZvX3RvX3VzZXIoJmZyYW1lLT5pbmZvLCBpbmZvKTsKKwlpZiAoZXJyKQorCQlnb3RvIGdpdmVfc2lnc2VndjsKKworCS8qIENyZWF0ZSB0aGUgdWNvbnRleHQuICAqLworCWVyciB8PSBfX3B1dF91c2VyKDAsICZmcmFtZS0+dWMudWNfZmxhZ3MpOworCWVyciB8PSBfX3B1dF91c2VyKDAsICZmcmFtZS0+dWMudWNfbGluayk7CisJZXJyIHw9IF9fcHV0X3VzZXIoY3VycmVudC0+c2FzX3NzX3NwLCAmZnJhbWUtPnVjLnVjX3N0YWNrLnNzX3NwKTsKKwllcnIgfD0gX19wdXRfdXNlcihzYXNfc3NfZmxhZ3MocmVncy0+ZXNwKSwKKwkJCSAgJmZyYW1lLT51Yy51Y19zdGFjay5zc19mbGFncyk7CisJZXJyIHw9IF9fcHV0X3VzZXIoY3VycmVudC0+c2FzX3NzX3NpemUsICZmcmFtZS0+dWMudWNfc3RhY2suc3Nfc2l6ZSk7CisJZXJyIHw9IHNldHVwX3NpZ2NvbnRleHQoJmZyYW1lLT51Yy51Y19tY29udGV4dCwgJmZyYW1lLT5mcHN0YXRlLAorCQkJICAgICAgICByZWdzLCBzZXQtPnNpZ1swXSk7CisJZXJyIHw9IF9fY29weV90b191c2VyKCZmcmFtZS0+dWMudWNfc2lnbWFzaywgc2V0LCBzaXplb2YoKnNldCkpOworCWlmIChlcnIpCisJCWdvdG8gZ2l2ZV9zaWdzZWd2OworCisJLyogU2V0IHVwIHRvIHJldHVybiBmcm9tIHVzZXJzcGFjZS4gICovCisJcmVzdG9yZXIgPSAmX19rZXJuZWxfcnRfc2lncmV0dXJuOworCWlmIChrYS0+c2Euc2FfZmxhZ3MgJiBTQV9SRVNUT1JFUikKKwkJcmVzdG9yZXIgPSBrYS0+c2Euc2FfcmVzdG9yZXI7CisJZXJyIHw9IF9fcHV0X3VzZXIocmVzdG9yZXIsICZmcmFtZS0+cHJldGNvZGUpOworCSAKKwkvKgorCSAqIFRoaXMgaXMgbW92bCAkLCVlYXggOyBpbnQgJDB4ODAKKwkgKgorCSAqIFdFIERPIE5PVCBVU0UgSVQgQU5ZIE1PUkUhIEl0J3Mgb25seSBsZWZ0IGhlcmUgZm9yIGhpc3RvcmljYWwKKwkgKiByZWFzb25zIGFuZCBiZWNhdXNlIGdkYiB1c2VzIGl0IGFzIGEgc2lnbmF0dXJlIHRvIG5vdGljZQorCSAqIHNpZ25hbCBoYW5kbGVyIHN0YWNrIGZyYW1lcy4KKwkgKi8KKwllcnIgfD0gX19wdXRfdXNlcigweGI4LCAoY2hhciBfX3VzZXIgKikoZnJhbWUtPnJldGNvZGUrMCkpOworCWVyciB8PSBfX3B1dF91c2VyKF9fTlJfcnRfc2lncmV0dXJuLCAoaW50IF9fdXNlciAqKShmcmFtZS0+cmV0Y29kZSsxKSk7CisJZXJyIHw9IF9fcHV0X3VzZXIoMHg4MGNkLCAoc2hvcnQgX191c2VyICopKGZyYW1lLT5yZXRjb2RlKzUpKTsKKworCWlmIChlcnIpCisJCWdvdG8gZ2l2ZV9zaWdzZWd2OworCisJLyogU2V0IHVwIHJlZ2lzdGVycyBmb3Igc2lnbmFsIGhhbmRsZXIgKi8KKwlyZWdzLT5lc3AgPSAodW5zaWduZWQgbG9uZykgZnJhbWU7CisJcmVncy0+ZWlwID0gKHVuc2lnbmVkIGxvbmcpIGthLT5zYS5zYV9oYW5kbGVyOworCXJlZ3MtPmVheCA9ICh1bnNpZ25lZCBsb25nKSB1c2lnOworCXJlZ3MtPmVkeCA9ICh1bnNpZ25lZCBsb25nKSAmZnJhbWUtPmluZm87CisJcmVncy0+ZWN4ID0gKHVuc2lnbmVkIGxvbmcpICZmcmFtZS0+dWM7CisKKwlzZXRfZnMoVVNFUl9EUyk7CisJcmVncy0+eGRzID0gX19VU0VSX0RTOworCXJlZ3MtPnhlcyA9IF9fVVNFUl9EUzsKKwlyZWdzLT54c3MgPSBfX1VTRVJfRFM7CisJcmVncy0+eGNzID0gX19VU0VSX0NTOworCisJLyoKKwkgKiBDbGVhciBURiB3aGVuIGVudGVyaW5nIHRoZSBzaWduYWwgaGFuZGxlciwgYnV0CisJICogbm90aWZ5IGFueSB0cmFjZXIgdGhhdCB3YXMgc2luZ2xlLXN0ZXBwaW5nIGl0LgorCSAqIFRoZSB0cmFjZXIgbWF5IHdhbnQgdG8gc2luZ2xlLXN0ZXAgaW5zaWRlIHRoZQorCSAqIGhhbmRsZXIgdG9vLgorCSAqLworCXJlZ3MtPmVmbGFncyAmPSB+VEZfTUFTSzsKKwlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfU0lOR0xFU1RFUCkpCisJCXB0cmFjZV9ub3RpZnkoU0lHVFJBUCk7CisKKyNpZiBERUJVR19TSUcKKwlwcmludGsoIlNJRyBkZWxpdmVyICglczolZCk6IHNwPSVwIHBjPSVwIHJhPSVwXG4iLAorCQljdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIGZyYW1lLCByZWdzLT5laXAsIGZyYW1lLT5wcmV0Y29kZSk7CisjZW5kaWYKKworCXJldHVybjsKKworZ2l2ZV9zaWdzZWd2OgorCWZvcmNlX3NpZ3NlZ3Yoc2lnLCBjdXJyZW50KTsKK30KKworLyoKKyAqIE9LLCB3ZSdyZSBpbnZva2luZyBhIGhhbmRsZXIKKyAqLwkKKworc3RhdGljIHZvaWQKK2hhbmRsZV9zaWduYWwodW5zaWduZWQgbG9uZyBzaWcsIHNpZ2luZm9fdCAqaW5mbywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwKKwkgICAgICBzaWdzZXRfdCAqb2xkc2V0LAlzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJLyogQXJlIHdlIGZyb20gYSBzeXN0ZW0gY2FsbD8gKi8KKwlpZiAocmVncy0+b3JpZ19lYXggPj0gMCkgeworCQkvKiBJZiBzbywgY2hlY2sgc3lzdGVtIGNhbGwgcmVzdGFydGluZy4uICovCisJCXN3aXRjaCAocmVncy0+ZWF4KSB7CisJCSAgICAgICAgY2FzZSAtRVJFU1RBUlRfUkVTVEFSVEJMT0NLOgorCQkJY2FzZSAtRVJFU1RBUlROT0hBTkQ6CisJCQkJcmVncy0+ZWF4ID0gLUVJTlRSOworCQkJCWJyZWFrOworCisJCQljYXNlIC1FUkVTVEFSVFNZUzoKKwkJCQlpZiAoIShrYS0+c2Euc2FfZmxhZ3MgJiBTQV9SRVNUQVJUKSkgeworCQkJCQlyZWdzLT5lYXggPSAtRUlOVFI7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCS8qIGZhbGx0aHJvdWdoICovCisJCQljYXNlIC1FUkVTVEFSVE5PSU5UUjoKKwkJCQlyZWdzLT5lYXggPSByZWdzLT5vcmlnX2VheDsKKwkJCQlyZWdzLT5laXAgLT0gMjsKKwkJfQorCX0KKworCS8qCisJICogSWYgVEYgaXMgc2V0IGR1ZSB0byBhIGRlYnVnZ2VyIChQVF9EVFJBQ0UpLCBjbGVhciB0aGUgVEYgZmxhZyBzbworCSAqIHRoYXQgcmVnaXN0ZXIgaW5mb3JtYXRpb24gaW4gdGhlIHNpZ2NvbnRleHQgaXMgY29ycmVjdC4KKwkgKi8KKwlpZiAodW5saWtlbHkocmVncy0+ZWZsYWdzICYgVEZfTUFTSykKKwkgICAgJiYgbGlrZWx5KGN1cnJlbnQtPnB0cmFjZSAmIFBUX0RUUkFDRSkpIHsKKwkJY3VycmVudC0+cHRyYWNlICY9IH5QVF9EVFJBQ0U7CisJCXJlZ3MtPmVmbGFncyAmPSB+VEZfTUFTSzsKKwl9CisKKwkvKiBTZXQgdXAgdGhlIHN0YWNrIGZyYW1lICovCisJaWYgKGthLT5zYS5zYV9mbGFncyAmIFNBX1NJR0lORk8pCisJCXNldHVwX3J0X2ZyYW1lKHNpZywga2EsIGluZm8sIG9sZHNldCwgcmVncyk7CisJZWxzZQorCQlzZXR1cF9mcmFtZShzaWcsIGthLCBvbGRzZXQsIHJlZ3MpOworCisJaWYgKCEoa2EtPnNhLnNhX2ZsYWdzICYgU0FfTk9ERUZFUikpIHsKKwkJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJCXNpZ29yc2V0cygmY3VycmVudC0+YmxvY2tlZCwmY3VycmVudC0+YmxvY2tlZCwma2EtPnNhLnNhX21hc2spOworCQlzaWdhZGRzZXQoJmN1cnJlbnQtPmJsb2NrZWQsc2lnKTsKKwkJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwl9Cit9CisKKy8qCisgKiBOb3RlIHRoYXQgJ2luaXQnIGlzIGEgc3BlY2lhbCBwcm9jZXNzOiBpdCBkb2Vzbid0IGdldCBzaWduYWxzIGl0IGRvZXNuJ3QKKyAqIHdhbnQgdG8gaGFuZGxlLiBUaHVzIHlvdSBjYW5ub3Qga2lsbCBpbml0IGV2ZW4gd2l0aCBhIFNJR0tJTEwgZXZlbiBieQorICogbWlzdGFrZS4KKyAqLworaW50IGZhc3RjYWxsIGRvX3NpZ25hbChzdHJ1Y3QgcHRfcmVncyAqcmVncywgc2lnc2V0X3QgKm9sZHNldCkKK3sKKwlzaWdpbmZvX3QgaW5mbzsKKwlpbnQgc2lnbnI7CisJc3RydWN0IGtfc2lnYWN0aW9uIGthOworCisJLyoKKwkgKiBXZSB3YW50IHRoZSBjb21tb24gY2FzZSB0byBnbyBmYXN0LCB3aGljaAorCSAqIGlzIHdoeSB3ZSBtYXkgaW4gY2VydGFpbiBjYXNlcyBnZXQgaGVyZSBmcm9tCisJICoga2VybmVsIG1vZGUuIEp1c3QgcmV0dXJuIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcKKwkgKiBpZiBzby4KKwkgKi8KKwlpZiAoKHJlZ3MtPnhjcyAmIDMpICE9IDMpCisJCXJldHVybiAxOworCisJaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfRlJFRVpFKSB7CisJCXJlZnJpZ2VyYXRvcigwKTsKKwkJZ290byBub19zaWduYWw7CisJfQorCisJaWYgKCFvbGRzZXQpCisJCW9sZHNldCA9ICZjdXJyZW50LT5ibG9ja2VkOworCisJc2lnbnIgPSBnZXRfc2lnbmFsX3RvX2RlbGl2ZXIoJmluZm8sICZrYSwgcmVncywgTlVMTCk7CisJaWYgKHNpZ25yID4gMCkgeworCQkvKiBSZWVuYWJsZSBhbnkgd2F0Y2hwb2ludHMgYmVmb3JlIGRlbGl2ZXJpbmcgdGhlCisJCSAqIHNpZ25hbCB0byB1c2VyIHNwYWNlLiBUaGUgcHJvY2Vzc29yIHJlZ2lzdGVyIHdpbGwKKwkJICogaGF2ZSBiZWVuIGNsZWFyZWQgaWYgdGhlIHdhdGNocG9pbnQgdHJpZ2dlcmVkCisJCSAqIGluc2lkZSB0aGUga2VybmVsLgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KGN1cnJlbnQtPnRocmVhZC5kZWJ1Z3JlZ1s3XSkpIHsKKwkJCV9fYXNtX18oIm1vdmwgJTAsJSVkYjciCTogOiAiciIgKGN1cnJlbnQtPnRocmVhZC5kZWJ1Z3JlZ1s3XSkpOworCQl9CisKKwkJLyogV2hlZSEgIEFjdHVhbGx5IGRlbGl2ZXIgdGhlIHNpZ25hbC4gICovCisJCWhhbmRsZV9zaWduYWwoc2lnbnIsICZpbmZvLCAma2EsIG9sZHNldCwgcmVncyk7CisJCXJldHVybiAxOworCX0KKworIG5vX3NpZ25hbDoKKwkvKiBEaWQgd2UgY29tZSBmcm9tIGEgc3lzdGVtIGNhbGw/ICovCisJaWYgKHJlZ3MtPm9yaWdfZWF4ID49IDApIHsKKwkJLyogUmVzdGFydCB0aGUgc3lzdGVtIGNhbGwgLSBubyBoYW5kbGVycyBwcmVzZW50ICovCisJCWlmIChyZWdzLT5lYXggPT0gLUVSRVNUQVJUTk9IQU5EIHx8CisJCSAgICByZWdzLT5lYXggPT0gLUVSRVNUQVJUU1lTIHx8CisJCSAgICByZWdzLT5lYXggPT0gLUVSRVNUQVJUTk9JTlRSKSB7CisJCQlyZWdzLT5lYXggPSByZWdzLT5vcmlnX2VheDsKKwkJCXJlZ3MtPmVpcCAtPSAyOworCQl9CisJCWlmIChyZWdzLT5lYXggPT0gLUVSRVNUQVJUX1JFU1RBUlRCTE9DSyl7CisJCQlyZWdzLT5lYXggPSBfX05SX3Jlc3RhcnRfc3lzY2FsbDsKKwkJCXJlZ3MtPmVpcCAtPSAyOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKgorICogbm90aWZpY2F0aW9uIG9mIHVzZXJzcGFjZSBleGVjdXRpb24gcmVzdW1wdGlvbgorICogLSB0cmlnZ2VyZWQgYnkgY3VycmVudC0+d29yay5ub3RpZnlfcmVzdW1lCisgKi8KK19fYXR0cmlidXRlX18oKHJlZ3Bhcm0oMykpKQordm9pZCBkb19ub3RpZnlfcmVzdW1lKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzaWdzZXRfdCAqb2xkc2V0LAorCQkgICAgICBfX3UzMiB0aHJlYWRfaW5mb19mbGFncykKK3sKKwkvKiBQZW5kaW5nIHNpbmdsZS1zdGVwPyAqLworCWlmICh0aHJlYWRfaW5mb19mbGFncyAmIF9USUZfU0lOR0xFU1RFUCkgeworCQlyZWdzLT5lZmxhZ3MgfD0gVEZfTUFTSzsKKwkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1NJTkdMRVNURVApOworCX0KKwkvKiBkZWFsIHdpdGggcGVuZGluZyBzaWduYWwgZGVsaXZlcnkgKi8KKwlpZiAodGhyZWFkX2luZm9fZmxhZ3MgJiBfVElGX1NJR1BFTkRJTkcpCisJCWRvX3NpZ25hbChyZWdzLG9sZHNldCk7CisJCisJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX0lSRVQpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zbXAuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIyM2MzMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvc21wLmMKQEAgLTAsMCArMSw2MTIgQEAKKy8qCisgKglJbnRlbCBTTVAgc3VwcG9ydCByb3V0aW5lcy4KKyAqCisgKgkoYykgMTk5NSBBbGFuIENveCwgQnVpbGRpbmcgIzMgPGFsYW5AcmVkaGF0LmNvbT4KKyAqCShjKSAxOTk4LTk5LCAyMDAwIEluZ28gTW9sbmFyIDxtaW5nb0ByZWRoYXQuY29tPgorICoKKyAqCVRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9yCisgKglsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+CisjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgPGFzbS9tdHJyLmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisjaW5jbHVkZSA8bWFjaF9hcGljLmg+CisKKy8qCisgKglTb21lIG5vdGVzIG9uIHg4NiBwcm9jZXNzb3IgYnVncyBhZmZlY3RpbmcgU01QIG9wZXJhdGlvbjoKKyAqCisgKglQZW50aXVtLCBQZW50aXVtIFBybywgSUksIElJSSAoYW5kIGFsbCBDUFVzKSBoYXZlIGJ1Z3MuCisgKglUaGUgTGludXggaW1wbGljYXRpb25zIGZvciBTTVAgYXJlIGhhbmRsZWQgYXMgZm9sbG93czoKKyAqCisgKglQZW50aXVtIElJSSAvIFtYZW9uXQorICoJCU5vbmUgb2YgdGhlIEUxQVAtRTNBUCBlcnJhdGEgYXJlIHZpc2libGUgdG8gdGhlIHVzZXIuCisgKgorICoJRTFBUC4Jc2VlIFBJSSBBMUFQCisgKglFMkFQLglzZWUgUElJIEEyQVAKKyAqCUUzQVAuCXNlZSBQSUkgQTNBUAorICoKKyAqCVBlbnRpdW0gSUkgLyBbWGVvbl0KKyAqCQlOb25lIG9mIHRoZSBBMUFQLUEzQVAgZXJyYXRhIGFyZSB2aXNpYmxlIHRvIHRoZSB1c2VyLgorICoKKyAqCUExQVAuCXNlZSBQUHJvIDFBUAorICoJQTJBUC4Jc2VlIFBQcm8gMkFQCisgKglBM0FQLglzZWUgUFBybyA3QVAKKyAqCisgKglQZW50aXVtIFBybworICoJCU5vbmUgb2YgMUFQLTlBUCBlcnJhdGEgYXJlIHZpc2libGUgdG8gdGhlIG5vcm1hbCB1c2VyLAorICoJZXhjZXB0IG9jY2FzaW9uYWwgZGVsaXZlcnkgb2YgJ3NwdXJpb3VzIGludGVycnVwdCcgYXMgdHJhcCAjMTUuCisgKglUaGlzIGlzIHZlcnkgcmFyZSBhbmQgYSBub24tcHJvYmxlbS4KKyAqCisgKgkxQVAuCUxpbnV4IG1hcHMgQVBJQyBhcyBub24tY2FjaGVhYmxlCisgKgkyQVAuCXdvcmtlZCBhcm91bmQgaW4gaGFyZHdhcmUKKyAqCTNBUC4JZml4ZWQgaW4gQzAgYW5kIGFib3ZlIHN0ZXBwaW5ncyBtaWNyb2NvZGUgdXBkYXRlLgorICoJCUxpbnV4IGRvZXMgbm90IHVzZSBleGNlc3NpdmUgU1RBUlRVUF9JUElzLgorICoJNEFQLgl3b3JrZWQgYXJvdW5kIGluIGhhcmR3YXJlCisgKgk1QVAuCXN5bW1ldHJpYyBJTyBtb2RlIChub3JtYWwgTGludXggb3BlcmF0aW9uKSBub3QgYWZmZWN0ZWQuCisgKgkJJ25vYXBpYycgbW9kZSBoYXMgdmVjdG9yIDB4ZiBmaWxsZWQgb3V0IHByb3Blcmx5LgorICoJNkFQLgknbm9hcGljJyBtb2RlIG1pZ2h0IGJlIGFmZmVjdGVkIC0gZml4ZWQgaW4gbGF0ZXIgc3RlcHBpbmdzCisgKgk3QVAuCVdlIGRvIG5vdCBhc3N1bWUgd3JpdGVzIHRvIHRoZSBMVlQgZGVhc3NlcmluZyBJUlFzCisgKgk4QVAuCVdlIGRvIG5vdCBlbmFibGUgbG93IHBvd2VyIG1vZGUgKGRlZXAgc2xlZXApIGR1cmluZyBNUCBib290dXAKKyAqCTlBUC4JV2UgZG8gbm90IHVzZSBtaXhlZCBtb2RlCisgKgorICoJUGVudGl1bQorICoJCVRoZXJlIGlzIGEgbWFyZ2luYWwgY2FzZSB3aGVyZSBSRVAgTU9WUyBvbiAxMDBNSHogU01QCisgKgltYWNoaW5lcyB3aXRoIEIgc3RlcHBpbmcgcHJvY2Vzc29ycyBjYW4gZmFpbC4gWFhYIHNob3VsZCBwcm92aWRlCisgKglhbiBMMWNhY2hlPVdyaXRldGhyb3VnaCBvciBMMWNhY2hlPW9mZiBvcHRpb24uCisgKgorICoJCUIgc3RlcHBpbmcgQ1BVcyBtYXkgaGFuZy4gVGhlcmUgYXJlIGhhcmR3YXJlIHdvcmsgYXJvdW5kcworICoJZm9yIHRoaXMuIFdlIHdhcm4gYWJvdXQgaXQgaW4gY2FzZSB5b3VyIGJvYXJkIGRvZXNuJ3QgaGF2ZSB0aGUgd29yaworICoJYXJvdW5kcy4gQmFzaWNhbGx5IHRoYXRzIHNvIEkgY2FuIHRlbGwgYW55b25lIHdpdGggYSBCIHN0ZXBwaW5nCisgKglDUFUgYW5kIFNNUCBwcm9ibGVtcyAidG91Z2giLgorICoKKyAqCVNwZWNpZmljIGl0ZW1zIFtGcm9tIFBlbnRpdW0gUHJvY2Vzc29yIFNwZWNpZmljYXRpb24gVXBkYXRlXQorICoKKyAqCTFBUC4JTGludXggZG9lc24ndCB1c2UgcmVtb3RlIHJlYWQKKyAqCTJBUC4JTGludXggZG9lc24ndCB0cnVzdCBBUElDIGVycm9ycworICoJM0FQLglXZSB3b3JrIGFyb3VuZCB0aGlzCisgKgk0QVAuCUxpbnV4IG5ldmVyIGdlbmVyYXRlZCAzIGludGVycnVwdHMgb2YgdGhlIHNhbWUgcHJpb3JpdHkKKyAqCQl0byBjYXVzZSBhIGxvc3QgbG9jYWwgaW50ZXJydXB0LgorICoJNUFQLglSZW1vdGUgcmVhZCBpcyBuZXZlciB1c2VkCisgKgk2QVAuCW5vdCBhZmZlY3RlZCAtIHdvcmtlZCBhcm91bmQgaW4gaGFyZHdhcmUKKyAqCTdBUC4Jbm90IGFmZmVjdGVkIC0gd29ya2VkIGFyb3VuZCBpbiBoYXJkd2FyZQorICoJOEFQLgl3b3JrZWQgYXJvdW5kIGluIGhhcmR3YXJlIC0gd2UgZ2V0IGV4cGxpY2l0IENTIGVycm9ycyBpZiBub3QKKyAqCTlBUC4Jb25seSAnbm9hcGljJyBtb2RlIGFmZmVjdGVkLiBNaWdodCBnZW5lcmF0ZSBzcHVyaW91cworICoJCWludGVycnVwdHMsIHdlIGxvZyBvbmx5IHRoZSBmaXJzdCBvbmUgYW5kIGNvdW50IHRoZQorICoJCXJlc3Qgc2lsZW50bHkuCisgKgkxMEFQLglub3QgYWZmZWN0ZWQgLSB3b3JrZWQgYXJvdW5kIGluIGhhcmR3YXJlCisgKgkxMUFQLglMaW51eCByZWFkcyB0aGUgQVBJQyBiZXR3ZWVuIHdyaXRlcyB0byBhdm9pZCB0aGlzLCBhcyBwZXIKKyAqCQl0aGUgZG9jdW1lbnRhdGlvbi4gTWFrZSBzdXJlIHlvdSBwcmVzZXJ2ZSB0aGlzIGFzIGl0IGFmZmVjdHMKKyAqCQl0aGUgQyBzdGVwcGluZyBjaGlwcyB0b28uCisgKgkxMkFQLglub3QgYWZmZWN0ZWQgLSB3b3JrZWQgYXJvdW5kIGluIGhhcmR3YXJlCisgKgkxM0FQLglub3QgYWZmZWN0ZWQgLSB3b3JrZWQgYXJvdW5kIGluIGhhcmR3YXJlCisgKgkxNEFQLgl3ZSBhbHdheXMgZGVhc3NlcnQgSU5JVCBkdXJpbmcgYm9vdHVwCisgKgkxNUFQLglub3QgYWZmZWN0ZWQgLSB3b3JrZWQgYXJvdW5kIGluIGhhcmR3YXJlCisgKgkxNkFQLglub3QgYWZmZWN0ZWQgLSB3b3JrZWQgYXJvdW5kIGluIGhhcmR3YXJlCisgKgkxN0FQLglub3QgYWZmZWN0ZWQgLSB3b3JrZWQgYXJvdW5kIGluIGhhcmR3YXJlCisgKgkxOEFQLglub3QgYWZmZWN0ZWQgLSB3b3JrZWQgYXJvdW5kIGluIGhhcmR3YXJlCisgKgkxOUFQLglub3QgYWZmZWN0ZWQgLSB3b3JrZWQgYXJvdW5kIGluIEJJT1MKKyAqCisgKglJZiB0aGlzIHNvdW5kcyB3b3JyeWluZyBiZWxpZXZlIG1lIHRoZXNlIGJ1Z3MgYXJlIGVpdGhlciBfX19SQVJFX19fLAorICoJb3IgYXJlIHNpZ25hbCB0aW1pbmcgYnVncyB3b3JrZWQgYXJvdW5kIGluIGhhcmR3YXJlIGFuZCB0aGVyZSdzCisgKglhYm91dCBub3RoaW5nIG9mIG5vdGUgd2l0aCBDIHN0ZXBwaW5nIHVwd2FyZHMuCisgKi8KKworREVGSU5FX1BFUl9DUFUoc3RydWN0IHRsYl9zdGF0ZSwgY3B1X3RsYnN0YXRlKSBfX19fY2FjaGVsaW5lX2FsaWduZWQgPSB7ICZpbml0X21tLCAwLCB9OworCisvKgorICogdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgZGVhbCB3aXRoIHNlbmRpbmcgSVBJcyBiZXR3ZWVuIENQVXMuCisgKgorICogV2UgdXNlICdicm9hZGNhc3QnLCBDUFUtPkNQVSBJUElzIGFuZCBzZWxmLUlQSXMgdG9vLgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IF9fcHJlcGFyZV9JQ1IgKHVuc2lnbmVkIGludCBzaG9ydGN1dCwgaW50IHZlY3RvcikKK3sKKwlyZXR1cm4gQVBJQ19ETV9GSVhFRCB8IHNob3J0Y3V0IHwgdmVjdG9yIHwgQVBJQ19ERVNUX0xPR0lDQUw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fcHJlcGFyZV9JQ1IyICh1bnNpZ25lZCBpbnQgbWFzaykKK3sKKwlyZXR1cm4gU0VUX0FQSUNfREVTVF9GSUVMRChtYXNrKTsKK30KKwordm9pZCBfX3NlbmRfSVBJX3Nob3J0Y3V0KHVuc2lnbmVkIGludCBzaG9ydGN1dCwgaW50IHZlY3RvcikKK3sKKwkvKgorCSAqIFN1YnRsZS4gSW4gdGhlIGNhc2Ugb2YgdGhlICduZXZlciBkbyBkb3VibGUgd3JpdGVzJyB3b3JrYXJvdW5kCisJICogd2UgaGF2ZSB0byBsb2NrIG91dCBpbnRlcnJ1cHRzIHRvIGJlIHNhZmUuICBBcyB3ZSBkb24ndCBjYXJlCisJICogb2YgdGhlIHZhbHVlIHJlYWQgd2UgdXNlIGFuIGF0b21pYyBybXcgYWNjZXNzIHRvIGF2b2lkIGNvc3RseQorCSAqIGNsaS9zdGkuICBPdGhlcndpc2Ugd2UgdXNlIGFuIGV2ZW4gY2hlYXBlciBzaW5nbGUgYXRvbWljIHdyaXRlCisJICogdG8gdGhlIEFQSUMuCisJICovCisJdW5zaWduZWQgaW50IGNmZzsKKworCS8qCisJICogV2FpdCBmb3IgaWRsZS4KKwkgKi8KKwlhcGljX3dhaXRfaWNyX2lkbGUoKTsKKworCS8qCisJICogTm8gbmVlZCB0byB0b3VjaCB0aGUgdGFyZ2V0IGNoaXAgZmllbGQKKwkgKi8KKwljZmcgPSBfX3ByZXBhcmVfSUNSKHNob3J0Y3V0LCB2ZWN0b3IpOworCisJLyoKKwkgKiBTZW5kIHRoZSBJUEkuIFRoZSB3cml0ZSB0byBBUElDX0lDUiBmaXJlcyB0aGlzIG9mZi4KKwkgKi8KKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0lDUiwgY2ZnKTsKK30KKwordm9pZCBmYXN0Y2FsbCBzZW5kX0lQSV9zZWxmKGludCB2ZWN0b3IpCit7CisJX19zZW5kX0lQSV9zaG9ydGN1dChBUElDX0RFU1RfU0VMRiwgdmVjdG9yKTsKK30KKworLyoKKyAqIFRoaXMgaXMgb25seSB1c2VkIG9uIHNtYWxsZXIgbWFjaGluZXMuCisgKi8KK3ZvaWQgc2VuZF9JUElfbWFza19iaXRtYXNrKGNwdW1hc2tfdCBjcHVtYXNrLCBpbnQgdmVjdG9yKQoreworCXVuc2lnbmVkIGxvbmcgbWFzayA9IGNwdXNfYWRkcihjcHVtYXNrKVswXTsKKwl1bnNpZ25lZCBsb25nIGNmZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQkKKwkvKgorCSAqIFdhaXQgZm9yIGlkbGUuCisJICovCisJYXBpY193YWl0X2ljcl9pZGxlKCk7CisJCQorCS8qCisJICogcHJlcGFyZSB0YXJnZXQgY2hpcCBmaWVsZAorCSAqLworCWNmZyA9IF9fcHJlcGFyZV9JQ1IyKG1hc2spOworCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfSUNSMiwgY2ZnKTsKKwkJCisJLyoKKwkgKiBwcm9ncmFtIHRoZSBJQ1IgCisJICovCisJY2ZnID0gX19wcmVwYXJlX0lDUigwLCB2ZWN0b3IpOworCQkJCisJLyoKKwkgKiBTZW5kIHRoZSBJUEkuIFRoZSB3cml0ZSB0byBBUElDX0lDUiBmaXJlcyB0aGlzIG9mZi4KKwkgKi8KKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0lDUiwgY2ZnKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKwordm9pZCBzZW5kX0lQSV9tYXNrX3NlcXVlbmNlKGNwdW1hc2tfdCBtYXNrLCBpbnQgdmVjdG9yKQoreworCXVuc2lnbmVkIGxvbmcgY2ZnLCBmbGFnczsKKwl1bnNpZ25lZCBpbnQgcXVlcnlfY3B1OworCisJLyoKKwkgKiBIYWNrLiBUaGUgY2x1c3RlcmVkIEFQSUMgYWRkcmVzc2luZyBtb2RlIGRvZXNuJ3QgYWxsb3cgdXMgdG8gc2VuZCAKKwkgKiB0byBhbiBhcmJpdHJhcnkgbWFzaywgc28gSSBkbyBhIHVuaWNhc3RzIHRvIGVhY2ggQ1BVIGluc3RlYWQuIFRoaXMgCisJICogc2hvdWxkIGJlIG1vZGlmaWVkIHRvIGRvIDEgbWVzc2FnZSBwZXIgY2x1c3RlciBJRCAtIG1ibGlnaAorCSAqLyAKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWZvciAocXVlcnlfY3B1ID0gMDsgcXVlcnlfY3B1IDwgTlJfQ1BVUzsgKytxdWVyeV9jcHUpIHsKKwkJaWYgKGNwdV9pc3NldChxdWVyeV9jcHUsIG1hc2spKSB7CisJCQorCQkJLyoKKwkJCSAqIFdhaXQgZm9yIGlkbGUuCisJCQkgKi8KKwkJCWFwaWNfd2FpdF9pY3JfaWRsZSgpOworCQkKKwkJCS8qCisJCQkgKiBwcmVwYXJlIHRhcmdldCBjaGlwIGZpZWxkCisJCQkgKi8KKwkJCWNmZyA9IF9fcHJlcGFyZV9JQ1IyKGNwdV90b19sb2dpY2FsX2FwaWNpZChxdWVyeV9jcHUpKTsKKwkJCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfSUNSMiwgY2ZnKTsKKwkJCisJCQkvKgorCQkJICogcHJvZ3JhbSB0aGUgSUNSIAorCQkJICovCisJCQljZmcgPSBfX3ByZXBhcmVfSUNSKDAsIHZlY3Rvcik7CisJCQkKKwkJCS8qCisJCQkgKiBTZW5kIHRoZSBJUEkuIFRoZSB3cml0ZSB0byBBUElDX0lDUiBmaXJlcyB0aGlzIG9mZi4KKwkJCSAqLworCQkJYXBpY193cml0ZV9hcm91bmQoQVBJQ19JQ1IsIGNmZyk7CisJCX0KKwl9CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisjaW5jbHVkZSA8bWFjaF9pcGkuaD4gLyogbXVzdCBjb21lIGFmdGVyIHRoZSBzZW5kX0lQSSBmdW5jdGlvbnMgYWJvdmUgZm9yIGlubGluaW5nICovCisKKy8qCisgKglTbWFydGVyIFNNUCBmbHVzaGluZyBtYWNyb3MuIAorICoJCWMvbyBMaW51cyBUb3J2YWxkcy4KKyAqCisgKglUaGVzZSBtZWFuIHlvdSBjYW4gcmVhbGx5IGRlZmluaXRlbHkgdXR0ZXJseSBmb3JnZXQgYWJvdXQKKyAqCXdyaXRpbmcgdG8gdXNlciBzcGFjZSBmcm9tIGludGVycnVwdHMuIChJdHMgbm90IGFsbG93ZWQgYW55d2F5KS4KKyAqCisgKglPcHRpbWl6YXRpb25zIE1hbmZyZWQgU3ByYXVsIDxtYW5mcmVkQGNvbG9yZnVsbGlmZS5jb20+CisgKi8KKworc3RhdGljIGNwdW1hc2tfdCBmbHVzaF9jcHVtYXNrOworc3RhdGljIHN0cnVjdCBtbV9zdHJ1Y3QgKiBmbHVzaF9tbTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZsdXNoX3ZhOworc3RhdGljIERFRklORV9TUElOTE9DSyh0bGJzdGF0ZV9sb2NrKTsKKyNkZWZpbmUgRkxVU0hfQUxMCTB4ZmZmZmZmZmYKKworLyoKKyAqIFdlIGNhbm5vdCBjYWxsIG1tZHJvcCgpIGJlY2F1c2Ugd2UgYXJlIGluIGludGVycnVwdCBjb250ZXh0LCAKKyAqIGluc3RlYWQgdXBkYXRlIG1tLT5jcHVfdm1fbWFzay4KKyAqCisgKiBXZSBuZWVkIHRvIHJlbG9hZCAlY3IzIHNpbmNlIHRoZSBwYWdlIHRhYmxlcyBtYXkgYmUgZ29pbmcKKyAqIGF3YXkgZnJvbSB1bmRlciB1cy4uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBsZWF2ZV9tbSAodW5zaWduZWQgbG9uZyBjcHUpCit7CisJaWYgKHBlcl9jcHUoY3B1X3RsYnN0YXRlLCBjcHUpLnN0YXRlID09IFRMQlNUQVRFX09LKQorCQlCVUcoKTsKKwljcHVfY2xlYXIoY3B1LCBwZXJfY3B1KGNwdV90bGJzdGF0ZSwgY3B1KS5hY3RpdmVfbW0tPmNwdV92bV9tYXNrKTsKKwlsb2FkX2NyMyhzd2FwcGVyX3BnX2Rpcik7Cit9CisKKy8qCisgKgorICogVGhlIGZsdXNoIElQSSBhc3N1bWVzIHRoYXQgYSB0aHJlYWQgc3dpdGNoIGhhcHBlbnMgaW4gdGhpcyBvcmRlcjoKKyAqIFtjcHUwOiB0aGUgY3B1IHRoYXQgc3dpdGNoZXNdCisgKiAxKSBzd2l0Y2hfbW0oKSBlaXRoZXIgMWEpIG9yIDFiKQorICogMWEpIHRocmVhZCBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQgbW0KKyAqIDFhMSkgY3B1X2NsZWFyKGNwdSwgb2xkX21tLT5jcHVfdm1fbWFzayk7CisgKiAJU3RvcCBpcGkgZGVsaXZlcnkgZm9yIHRoZSBvbGQgbW0uIFRoaXMgaXMgbm90IHN5bmNocm9uaXplZCB3aXRoCisgKiAJdGhlIG90aGVyIGNwdXMsIGJ1dCBzbXBfaW52YWxpZGF0ZV9pbnRlcnJ1cHQgaWdub3JlIGZsdXNoIGlwaXMKKyAqIAlmb3IgdGhlIHdyb25nIG1tLCBhbmQgaW4gdGhlIHdvcnN0IGNhc2Ugd2UgcGVyZm9ybSBhIHN1cGVyZmxvdXMKKyAqIAl0bGIgZmx1c2guCisgKiAxYTIpIHNldCBjcHVfdGxic3RhdGUgdG8gVExCU1RBVEVfT0sKKyAqIAlOb3cgdGhlIHNtcF9pbnZhbGlkYXRlX2ludGVycnVwdCB3b24ndCBjYWxsIGxlYXZlX21tIGlmIGNwdTAKKyAqCXdhcyBpbiBsYXp5IHRsYiBtb2RlLgorICogMWEzKSB1cGRhdGUgY3B1X3RsYnN0YXRlW10uYWN0aXZlX21tCisgKiAJTm93IGNwdTAgYWNjZXB0cyB0bGIgZmx1c2hlcyBmb3IgdGhlIG5ldyBtbS4KKyAqIDFhNCkgY3B1X3NldChjcHUsIG5ld19tbS0+Y3B1X3ZtX21hc2spOworICogCU5vdyB0aGUgb3RoZXIgY3B1cyB3aWxsIHNlbmQgdGxiIGZsdXNoIGlwaXMuCisgKiAxYTQpIGNoYW5nZSBjcjMuCisgKiAxYikgdGhyZWFkIHN3aXRjaCB3aXRob3V0IG1tIGNoYW5nZQorICoJY3B1X3RsYnN0YXRlW10uYWN0aXZlX21tIGlzIGNvcnJlY3QsIGNwdTAgYWxyZWFkeSBoYW5kbGVzCisgKglmbHVzaCBpcGlzLgorICogMWIxKSBzZXQgY3B1X3RsYnN0YXRlIHRvIFRMQlNUQVRFX09LCisgKiAxYjIpIHRlc3RfYW5kX3NldCB0aGUgY3B1IGJpdCBpbiBjcHVfdm1fbWFzay4KKyAqIAlBdG9taWNhbGx5IHNldCB0aGUgYml0IFtvdGhlciBjcHVzIHdpbGwgc3RhcnQgc2VuZGluZyBmbHVzaCBpcGlzXSwKKyAqIAlhbmQgdGVzdCB0aGUgYml0LgorICogMWIzKSBpZiB0aGUgYml0IHdhcyAwOiBsZWF2ZV9tbSB3YXMgY2FsbGVkLCBmbHVzaCB0aGUgdGxiLgorICogMikgc3dpdGNoICUlZXNwLCBpZSBjdXJyZW50CisgKgorICogVGhlIGludGVycnVwdCBtdXN0IGhhbmRsZSAyIHNwZWNpYWwgY2FzZXM6CisgKiAtIGNyMyBpcyBjaGFuZ2VkIGJlZm9yZSAlJWVzcCwgaWUuIGl0IGNhbm5vdCB1c2UgY3VycmVudC0+e2FjdGl2ZV8sfW1tLgorICogLSB0aGUgY3B1IHBlcmZvcm1zIHNwZWN1bGF0aXZlIHRsYiByZWFkcywgaS5lLiBldmVuIGlmIHRoZSBjcHUgb25seQorICogICBydW5zIGluIGtlcm5lbCBzcGFjZSwgdGhlIGNwdSBjb3VsZCBsb2FkIHRsYiBlbnRyaWVzIGZvciB1c2VyIHNwYWNlCisgKiAgIHBhZ2VzLgorICoKKyAqIFRoZSBnb29kIG5ld3MgaXMgdGhhdCBjcHVfdGxic3RhdGUgaXMgbG9jYWwgdG8gZWFjaCBjcHUsIG5vCisgKiB3cml0ZS9yZWFkIG9yZGVyaW5nIHByb2JsZW1zLgorICovCisKKy8qCisgKiBUTEIgZmx1c2ggSVBJOgorICoKKyAqIDEpIEZsdXNoIHRoZSB0bGIgZW50cmllcyBpZiB0aGUgY3B1IHVzZXMgdGhlIG1tIHRoYXQncyBiZWluZyBmbHVzaGVkLgorICogMikgTGVhdmUgdGhlIG1tIGlmIHdlIGFyZSBpbiB0aGUgbGF6eSB0bGIgbW9kZS4KKyAqLworCitmYXN0Y2FsbCB2b2lkIHNtcF9pbnZhbGlkYXRlX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGNwdTsKKworCWNwdSA9IGdldF9jcHUoKTsKKworCWlmICghY3B1X2lzc2V0KGNwdSwgZmx1c2hfY3B1bWFzaykpCisJCWdvdG8gb3V0OworCQkvKiAKKwkJICogVGhpcyB3YXMgYSBCVUcoKSBidXQgdW50aWwgc29tZW9uZSBjYW4gcXVvdGUgbWUgdGhlCisJCSAqIGxpbmUgZnJvbSB0aGUgaW50ZWwgbWFudWFsIHRoYXQgZ3VhcmFudGVlcyBhbiBJUEkgdG8KKwkJICogbXVsdGlwbGUgQ1BVcyBpcyByZXRyaWVkIF9vbmx5XyBvbiB0aGUgZXJyb3JpbmcgQ1BVcworCQkgKiBpdHMgc3RheWluZyBhcyBhIHJldHVybgorCQkgKgorCQkgKiBCVUcoKTsKKwkJICovCisJCSAKKwlpZiAoZmx1c2hfbW0gPT0gcGVyX2NwdShjcHVfdGxic3RhdGUsIGNwdSkuYWN0aXZlX21tKSB7CisJCWlmIChwZXJfY3B1KGNwdV90bGJzdGF0ZSwgY3B1KS5zdGF0ZSA9PSBUTEJTVEFURV9PSykgeworCQkJaWYgKGZsdXNoX3ZhID09IEZMVVNIX0FMTCkKKwkJCQlsb2NhbF9mbHVzaF90bGIoKTsKKwkJCWVsc2UKKwkJCQlfX2ZsdXNoX3RsYl9vbmUoZmx1c2hfdmEpOworCQl9IGVsc2UKKwkJCWxlYXZlX21tKGNwdSk7CisJfQorCWFja19BUElDX2lycSgpOworCXNtcF9tYl9fYmVmb3JlX2NsZWFyX2JpdCgpOworCWNwdV9jbGVhcihjcHUsIGZsdXNoX2NwdW1hc2spOworCXNtcF9tYl9fYWZ0ZXJfY2xlYXJfYml0KCk7CitvdXQ6CisJcHV0X2NwdV9ub19yZXNjaGVkKCk7Cit9CisKK3N0YXRpYyB2b2lkIGZsdXNoX3RsYl9vdGhlcnMoY3B1bWFza190IGNwdW1hc2ssIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJCQkJdW5zaWduZWQgbG9uZyB2YSkKK3sKKwljcHVtYXNrX3QgdG1wOworCS8qCisJICogQSBjb3VwbGUgb2YgKHRvIGJlIHJlbW92ZWQpIHNhbml0eSBjaGVja3M6CisJICoKKwkgKiAtIHdlIGRvIG5vdCBzZW5kIElQSXMgdG8gbm90LXlldCBib290ZWQgQ1BVcy4KKwkgKiAtIGN1cnJlbnQgQ1BVIG11c3Qgbm90IGJlIGluIG1hc2sKKwkgKiAtIG1hc2sgbXVzdCBleGlzdCA6KQorCSAqLworCUJVR19PTihjcHVzX2VtcHR5KGNwdW1hc2spKTsKKworCWNwdXNfYW5kKHRtcCwgY3B1bWFzaywgY3B1X29ubGluZV9tYXApOworCUJVR19PTighY3B1c19lcXVhbChjcHVtYXNrLCB0bXApKTsKKwlCVUdfT04oY3B1X2lzc2V0KHNtcF9wcm9jZXNzb3JfaWQoKSwgY3B1bWFzaykpOworCUJVR19PTighbW0pOworCisJLyoKKwkgKiBpJ20gbm90IGhhcHB5IGFib3V0IHRoaXMgZ2xvYmFsIHNoYXJlZCBzcGlubG9jayBpbiB0aGUKKwkgKiBNTSBob3QgcGF0aCwgYnV0IHdlJ2xsIHNlZSBob3cgY29udGVuZGVkIGl0IGlzLgorCSAqIFRlbXBvcmFyaWx5IHRoaXMgdHVybnMgSVJRcyBvZmYsIHNvIHRoYXQgbG9ja3VwcyBhcmUKKwkgKiBkZXRlY3RlZCBieSB0aGUgTk1JIHdhdGNoZG9nLgorCSAqLworCXNwaW5fbG9jaygmdGxic3RhdGVfbG9jayk7CisJCisJZmx1c2hfbW0gPSBtbTsKKwlmbHVzaF92YSA9IHZhOworI2lmIE5SX0NQVVMgPD0gQklUU19QRVJfTE9ORworCWF0b21pY19zZXRfbWFzayhjcHVtYXNrLCAmZmx1c2hfY3B1bWFzayk7CisjZWxzZQorCXsKKwkJaW50IGs7CisJCXVuc2lnbmVkIGxvbmcgKmZsdXNoX21hc2sgPSAodW5zaWduZWQgbG9uZyAqKSZmbHVzaF9jcHVtYXNrOworCQl1bnNpZ25lZCBsb25nICpjcHVfbWFzayA9ICh1bnNpZ25lZCBsb25nICopJmNwdW1hc2s7CisJCWZvciAoayA9IDA7IGsgPCBCSVRTX1RPX0xPTkdTKE5SX0NQVVMpOyArK2spCisJCQlhdG9taWNfc2V0X21hc2soY3B1X21hc2tba10sICZmbHVzaF9tYXNrW2tdKTsKKwl9CisjZW5kaWYKKwkvKgorCSAqIFdlIGhhdmUgdG8gc2VuZCB0aGUgSVBJIG9ubHkgdG8KKwkgKiBDUFVzIGFmZmVjdGVkLgorCSAqLworCXNlbmRfSVBJX21hc2soY3B1bWFzaywgSU5WQUxJREFURV9UTEJfVkVDVE9SKTsKKworCXdoaWxlICghY3B1c19lbXB0eShmbHVzaF9jcHVtYXNrKSkKKwkJLyogbm90aGluZy4gbG9ja3VwIGRldGVjdGlvbiBkb2VzIG5vdCBiZWxvbmcgaGVyZSAqLworCQltYigpOworCisJZmx1c2hfbW0gPSBOVUxMOworCWZsdXNoX3ZhID0gMDsKKwlzcGluX3VubG9jaygmdGxic3RhdGVfbG9jayk7Cit9CisJCit2b2lkIGZsdXNoX3RsYl9jdXJyZW50X3Rhc2sodm9pZCkKK3sKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOworCWNwdW1hc2tfdCBjcHVfbWFzazsKKworCXByZWVtcHRfZGlzYWJsZSgpOworCWNwdV9tYXNrID0gbW0tPmNwdV92bV9tYXNrOworCWNwdV9jbGVhcihzbXBfcHJvY2Vzc29yX2lkKCksIGNwdV9tYXNrKTsKKworCWxvY2FsX2ZsdXNoX3RsYigpOworCWlmICghY3B1c19lbXB0eShjcHVfbWFzaykpCisJCWZsdXNoX3RsYl9vdGhlcnMoY3B1X21hc2ssIG1tLCBGTFVTSF9BTEwpOworCXByZWVtcHRfZW5hYmxlKCk7Cit9CisKK3ZvaWQgZmx1c2hfdGxiX21tIChzdHJ1Y3QgbW1fc3RydWN0ICogbW0pCit7CisJY3B1bWFza190IGNwdV9tYXNrOworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisJY3B1X21hc2sgPSBtbS0+Y3B1X3ZtX21hc2s7CisJY3B1X2NsZWFyKHNtcF9wcm9jZXNzb3JfaWQoKSwgY3B1X21hc2spOworCisJaWYgKGN1cnJlbnQtPmFjdGl2ZV9tbSA9PSBtbSkgeworCQlpZiAoY3VycmVudC0+bW0pCisJCQlsb2NhbF9mbHVzaF90bGIoKTsKKwkJZWxzZQorCQkJbGVhdmVfbW0oc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwl9CisJaWYgKCFjcHVzX2VtcHR5KGNwdV9tYXNrKSkKKwkJZmx1c2hfdGxiX290aGVycyhjcHVfbWFzaywgbW0sIEZMVVNIX0FMTCk7CisKKwlwcmVlbXB0X2VuYWJsZSgpOworfQorCit2b2lkIGZsdXNoX3RsYl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYSwgdW5zaWduZWQgbG9uZyB2YSkKK3sKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0+dm1fbW07CisJY3B1bWFza190IGNwdV9tYXNrOworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisJY3B1X21hc2sgPSBtbS0+Y3B1X3ZtX21hc2s7CisJY3B1X2NsZWFyKHNtcF9wcm9jZXNzb3JfaWQoKSwgY3B1X21hc2spOworCisJaWYgKGN1cnJlbnQtPmFjdGl2ZV9tbSA9PSBtbSkgeworCQlpZihjdXJyZW50LT5tbSkKKwkJCV9fZmx1c2hfdGxiX29uZSh2YSk7CisJCSBlbHNlCisJCSAJbGVhdmVfbW0oc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwl9CisKKwlpZiAoIWNwdXNfZW1wdHkoY3B1X21hc2spKQorCQlmbHVzaF90bGJfb3RoZXJzKGNwdV9tYXNrLCBtbSwgdmEpOworCisJcHJlZW1wdF9lbmFibGUoKTsKK30KKworc3RhdGljIHZvaWQgZG9fZmx1c2hfdGxiX2FsbCh2b2lkKiBpbmZvKQoreworCXVuc2lnbmVkIGxvbmcgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJX19mbHVzaF90bGJfYWxsKCk7CisJaWYgKHBlcl9jcHUoY3B1X3RsYnN0YXRlLCBjcHUpLnN0YXRlID09IFRMQlNUQVRFX0xBWlkpCisJCWxlYXZlX21tKGNwdSk7Cit9CisKK3ZvaWQgZmx1c2hfdGxiX2FsbCh2b2lkKQoreworCW9uX2VhY2hfY3B1KGRvX2ZsdXNoX3RsYl9hbGwsIE5VTEwsIDEsIDEpOworfQorCisvKgorICogdGhpcyBmdW5jdGlvbiBzZW5kcyBhICdyZXNjaGVkdWxlJyBJUEkgdG8gYW5vdGhlciBDUFUuCisgKiBpdCBnb2VzIHN0cmFpZ2h0IHRocm91Z2ggYW5kIHdhc3RlcyBubyB0aW1lIHNlcmlhbGl6aW5nCisgKiBhbnl0aGluZy4gV29yc3QgY2FzZSBpcyB0aGF0IHdlIGxvc2UgYSByZXNjaGVkdWxlIC4uLgorICovCit2b2lkIHNtcF9zZW5kX3Jlc2NoZWR1bGUoaW50IGNwdSkKK3sKKwlzZW5kX0lQSV9tYXNrKGNwdW1hc2tfb2ZfY3B1KGNwdSksIFJFU0NIRURVTEVfVkVDVE9SKTsKK30KKworLyoKKyAqIFN0cnVjdHVyZSBhbmQgZGF0YSBmb3Igc21wX2NhbGxfZnVuY3Rpb24oKS4gVGhpcyBpcyBkZXNpZ25lZCB0byBtaW5pbWlzZQorICogc3RhdGljIG1lbW9yeSByZXF1aXJlbWVudHMuIEl0IGFsc28gbG9va3MgY2xlYW5lci4KKyAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhjYWxsX2xvY2spOworCitzdHJ1Y3QgY2FsbF9kYXRhX3N0cnVjdCB7CisJdm9pZCAoKmZ1bmMpICh2b2lkICppbmZvKTsKKwl2b2lkICppbmZvOworCWF0b21pY190IHN0YXJ0ZWQ7CisJYXRvbWljX3QgZmluaXNoZWQ7CisJaW50IHdhaXQ7Cit9OworCitzdGF0aWMgc3RydWN0IGNhbGxfZGF0YV9zdHJ1Y3QgKiBjYWxsX2RhdGE7CisKKy8qCisgKiB0aGlzIGZ1bmN0aW9uIHNlbmRzIGEgJ2dlbmVyaWMgY2FsbCBmdW5jdGlvbicgSVBJIHRvIGFsbCBvdGhlciBDUFVzCisgKiBpbiB0aGUgc3lzdGVtLgorICovCisKK2ludCBzbXBfY2FsbF9mdW5jdGlvbiAodm9pZCAoKmZ1bmMpICh2b2lkICppbmZvKSwgdm9pZCAqaW5mbywgaW50IG5vbmF0b21pYywKKwkJCWludCB3YWl0KQorLyoKKyAqIFtTVU1NQVJZXSBSdW4gYSBmdW5jdGlvbiBvbiBhbGwgb3RoZXIgQ1BVcy4KKyAqIDxmdW5jPiBUaGUgZnVuY3Rpb24gdG8gcnVuLiBUaGlzIG11c3QgYmUgZmFzdCBhbmQgbm9uLWJsb2NraW5nLgorICogPGluZm8+IEFuIGFyYml0cmFyeSBwb2ludGVyIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uLgorICogPG5vbmF0b21pYz4gY3VycmVudGx5IHVudXNlZC4KKyAqIDx3YWl0PiBJZiB0cnVlLCB3YWl0IChhdG9taWNhbGx5KSB1bnRpbCBmdW5jdGlvbiBoYXMgY29tcGxldGVkIG9uIG90aGVyIENQVXMuCisgKiBbUkVUVVJOU10gMCBvbiBzdWNjZXNzLCBlbHNlIGEgbmVnYXRpdmUgc3RhdHVzIGNvZGUuIERvZXMgbm90IHJldHVybiB1bnRpbAorICogcmVtb3RlIENQVXMgYXJlIG5lYXJseSByZWFkeSB0byBleGVjdXRlIDw8ZnVuYz4+IG9yIGFyZSBvciBoYXZlIGV4ZWN1dGVkLgorICoKKyAqIFlvdSBtdXN0IG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCBkaXNhYmxlZCBpbnRlcnJ1cHRzIG9yIGZyb20gYQorICogaGFyZHdhcmUgaW50ZXJydXB0IGhhbmRsZXIgb3IgZnJvbSBhIGJvdHRvbSBoYWxmIGhhbmRsZXIuCisgKi8KK3sKKwlzdHJ1Y3QgY2FsbF9kYXRhX3N0cnVjdCBkYXRhOworCWludCBjcHVzID0gbnVtX29ubGluZV9jcHVzKCktMTsKKworCWlmICghY3B1cykKKwkJcmV0dXJuIDA7CisKKwkvKiBDYW4gZGVhZGxvY2sgd2hlbiBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkICovCisJV0FSTl9PTihpcnFzX2Rpc2FibGVkKCkpOworCisJZGF0YS5mdW5jID0gZnVuYzsKKwlkYXRhLmluZm8gPSBpbmZvOworCWF0b21pY19zZXQoJmRhdGEuc3RhcnRlZCwgMCk7CisJZGF0YS53YWl0ID0gd2FpdDsKKwlpZiAod2FpdCkKKwkJYXRvbWljX3NldCgmZGF0YS5maW5pc2hlZCwgMCk7CisKKwlzcGluX2xvY2soJmNhbGxfbG9jayk7CisJY2FsbF9kYXRhID0gJmRhdGE7CisJbWIoKTsKKwkKKwkvKiBTZW5kIGEgbWVzc2FnZSB0byBhbGwgb3RoZXIgQ1BVcyBhbmQgd2FpdCBmb3IgdGhlbSB0byByZXNwb25kICovCisJc2VuZF9JUElfYWxsYnV0c2VsZihDQUxMX0ZVTkNUSU9OX1ZFQ1RPUik7CisKKwkvKiBXYWl0IGZvciByZXNwb25zZSAqLworCXdoaWxlIChhdG9taWNfcmVhZCgmZGF0YS5zdGFydGVkKSAhPSBjcHVzKQorCQljcHVfcmVsYXgoKTsKKworCWlmICh3YWl0KQorCQl3aGlsZSAoYXRvbWljX3JlYWQoJmRhdGEuZmluaXNoZWQpICE9IGNwdXMpCisJCQljcHVfcmVsYXgoKTsKKwlzcGluX3VubG9jaygmY2FsbF9sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzdG9wX3RoaXNfY3B1ICh2b2lkICogZHVtbXkpCit7CisJLyoKKwkgKiBSZW1vdmUgdGhpcyBDUFU6CisJICovCisJY3B1X2NsZWFyKHNtcF9wcm9jZXNzb3JfaWQoKSwgY3B1X29ubGluZV9tYXApOworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJZGlzYWJsZV9sb2NhbF9BUElDKCk7CisJaWYgKGNwdV9kYXRhW3NtcF9wcm9jZXNzb3JfaWQoKV0uaGx0X3dvcmtzX29rKQorCQlmb3IoOzspIF9fYXNtX18oImhsdCIpOworCWZvciAoOzspOworfQorCisvKgorICogdGhpcyBmdW5jdGlvbiBjYWxscyB0aGUgJ3N0b3AnIGZ1bmN0aW9uIG9uIGFsbCBvdGhlciBDUFVzIGluIHRoZSBzeXN0ZW0uCisgKi8KKwordm9pZCBzbXBfc2VuZF9zdG9wKHZvaWQpCit7CisJc21wX2NhbGxfZnVuY3Rpb24oc3RvcF90aGlzX2NwdSwgTlVMTCwgMSwgMCk7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWRpc2FibGVfbG9jYWxfQVBJQygpOworCWxvY2FsX2lycV9lbmFibGUoKTsKK30KKworLyoKKyAqIFJlc2NoZWR1bGUgY2FsbCBiYWNrLiBOb3RoaW5nIHRvIGRvLAorICogYWxsIHRoZSB3b3JrIGlzIGRvbmUgYXV0b21hdGljYWxseSB3aGVuCisgKiB3ZSByZXR1cm4gZnJvbSB0aGUgaW50ZXJydXB0LgorICovCitmYXN0Y2FsbCB2b2lkIHNtcF9yZXNjaGVkdWxlX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlhY2tfQVBJQ19pcnEoKTsKK30KKworZmFzdGNhbGwgdm9pZCBzbXBfY2FsbF9mdW5jdGlvbl9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdm9pZCAoKmZ1bmMpICh2b2lkICppbmZvKSA9IGNhbGxfZGF0YS0+ZnVuYzsKKwl2b2lkICppbmZvID0gY2FsbF9kYXRhLT5pbmZvOworCWludCB3YWl0ID0gY2FsbF9kYXRhLT53YWl0OworCisJYWNrX0FQSUNfaXJxKCk7CisJLyoKKwkgKiBOb3RpZnkgaW5pdGlhdGluZyBDUFUgdGhhdCBJJ3ZlIGdyYWJiZWQgdGhlIGRhdGEgYW5kIGFtCisJICogYWJvdXQgdG8gZXhlY3V0ZSB0aGUgZnVuY3Rpb24KKwkgKi8KKwltYigpOworCWF0b21pY19pbmMoJmNhbGxfZGF0YS0+c3RhcnRlZCk7CisJLyoKKwkgKiBBdCB0aGlzIHBvaW50IHRoZSBpbmZvIHN0cnVjdHVyZSBtYXkgYmUgb3V0IG9mIHNjb3BlIHVubGVzcyB3YWl0PT0xCisJICovCisJaXJxX2VudGVyKCk7CisJKCpmdW5jKShpbmZvKTsKKwlpcnFfZXhpdCgpOworCisJaWYgKHdhaXQpIHsKKwkJbWIoKTsKKwkJYXRvbWljX2luYygmY2FsbF9kYXRhLT5maW5pc2hlZCk7CisJfQorfQorCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3NtcGJvb3QuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc21wYm9vdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMmVlN2EKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3NtcGJvb3QuYwpAQCAtMCwwICsxLDExNDUgQEAKKy8qCisgKgl4ODYgU01QIGJvb3RpbmcgZnVuY3Rpb25zCisgKgorICoJKGMpIDE5OTUgQWxhbiBDb3gsIEJ1aWxkaW5nICMzIDxhbGFuQHJlZGhhdC5jb20+CisgKgkoYykgMTk5OCwgMTk5OSwgMjAwMCBJbmdvIE1vbG5hciA8bWluZ29AcmVkaGF0LmNvbT4KKyAqCisgKglNdWNoIG9mIHRoZSBjb3JlIFNNUCB3b3JrIGlzIGJhc2VkIG9uIHByZXZpb3VzIHdvcmsgYnkgVGhvbWFzIFJhZGtlLCB0bworICoJd2hvbSBhIGdyZWF0IG1hbnkgdGhhbmtzIGFyZSBleHRlbmRlZC4KKyAqCisgKglUaGFua3MgdG8gSW50ZWwgZm9yIG1ha2luZyBhdmFpbGFibGUgc2V2ZXJhbCBkaWZmZXJlbnQgUGVudGl1bSwKKyAqCVBlbnRpdW0gUHJvIGFuZCBQZW50aXVtLUlJL1hlb24gTVAgbWFjaGluZXMuCisgKglPcmlnaW5hbCBkZXZlbG9wbWVudCBvZiBMaW51eCBTTVAgY29kZSBzdXBwb3J0ZWQgYnkgQ2FsZGVyYS4KKyAqCisgKglUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvcgorICoJbGF0ZXIuCisgKgorICoJRml4ZXMKKyAqCQlGZWxpeCBLb29wCToJTlJfQ1BVUyB1c2VkIHByb3Blcmx5CisgKgkJSm9zZSBSZW5hdQk6CUhhbmRsZSBzaW5nbGUgQ1BVIGNhc2UuCisgKgkJQWxhbiBDb3gJOglCeSByZXBlYXRlZCByZXF1ZXN0IDgpIC0gVG90YWwgQm9nb01JUFMgcmVwb3J0LgorICoJCUdyZWcgV3JpZ2h0CToJRml4IGZvciBrZXJuZWwgc3RhY2tzIHBhbmljLgorICoJCUVyaWNoIEJvbGV5bgk6CU1QIHYxLjQgYW5kIGFkZGl0aW9uYWwgY2hhbmdlcy4KKyAqCU1hdHRoaWFzIFNhdHRsZXIJOglDaGFuZ2VzIGZvciAyLjEga2VybmVsIG1hcC4KKyAqCU1pY2hlbCBMZXNwaW5hc3NlCToJQ2hhbmdlcyBmb3IgMi4xIGtlcm5lbCBtYXAuCisgKglNaWNoYWVsIENoYXN0YWluCToJQ2hhbmdlIHRyYW1wb2xpbmUuUyB0byBnbnUgYXMuCisgKgkJQWxhbiBDb3gJOglEdW1iIGJ1ZzogJ0InIHN0ZXAgUFBybydzIGFyZSBmaW5lCisgKgkJSW5nbyBNb2xuYXIJOglBZGRlZCBBUElDIHRpbWVycywgYmFzZWQgb24gY29kZQorICoJCQkJCWZyb20gSm9zZSBSZW5hdQorICoJCUluZ28gTW9sbmFyCToJdmFyaW91cyBjbGVhbnVwcyBhbmQgcmV3cml0ZXMKKyAqCQlUaWdyYW4gQWl2YXppYW4JOglmaXhlZCAiMC4wMCBpbiAvcHJvYy91cHRpbWUgb24gU01QIiBidWcuCisgKglNYWNpZWogVy4gUm96eWNraQk6CUJpdHMgZm9yIGdlbnVpbmUgODI0ODlEWCBBUElDcworICoJCU1hcnRpbiBKLiBCbGlnaAk6IAlBZGRlZCBzdXBwb3J0IGZvciBtdWx0aS1xdWFkIHN5c3RlbXMKKyAqCQlEYXZlIEpvbmVzCToJUmVwb3J0IGludmFsaWQgY29tYmluYXRpb25zIG9mIEF0aGxvbiBDUFVzLgorKgkJUnVzdHkgUnVzc2VsbAk6CUhhY2tlZCBpbnRvIHNoYXBlIGZvciBuZXcgImhvdHBsdWciIGJvb3QgcHJvY2Vzcy4gKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgorI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9kZXNjLmg+CisjaW5jbHVkZSA8YXNtL2FyY2hfaG9va3MuaD4KKworI2luY2x1ZGUgPG1hY2hfYXBpYy5oPgorI2luY2x1ZGUgPG1hY2hfd2FrZWNwdS5oPgorI2luY2x1ZGUgPHNtcGJvb3RfaG9va3MuaD4KKworLyogU2V0IGlmIHdlIGZpbmQgYSBCIHN0ZXBwaW5nIENQVSAqLworc3RhdGljIGludCBfX2luaXRkYXRhIHNtcF9iX3N0ZXBwaW5nOworCisvKiBOdW1iZXIgb2Ygc2libGluZ3MgcGVyIENQVSBwYWNrYWdlICovCitpbnQgc21wX251bV9zaWJsaW5ncyA9IDE7CitpbnQgcGh5c19wcm9jX2lkW05SX0NQVVNdOyAvKiBQYWNrYWdlIElEIG9mIGVhY2ggbG9naWNhbCBDUFUgKi8KK0VYUE9SVF9TWU1CT0wocGh5c19wcm9jX2lkKTsKKworLyogYml0bWFwIG9mIG9ubGluZSBjcHVzICovCitjcHVtYXNrX3QgY3B1X29ubGluZV9tYXA7CisKK2NwdW1hc2tfdCBjcHVfY2FsbGluX21hcDsKK2NwdW1hc2tfdCBjcHVfY2FsbG91dF9tYXA7CitzdGF0aWMgY3B1bWFza190IHNtcF9jb21tZW5jZWRfbWFzazsKKworLyogUGVyIENQVSBib2dvbWlwcyBhbmQgb3RoZXIgcGFyYW1ldGVycyAqLworc3RydWN0IGNwdWluZm9feDg2IGNwdV9kYXRhW05SX0NQVVNdIF9fY2FjaGVsaW5lX2FsaWduZWQ7CisKK3U4IHg4Nl9jcHVfdG9fYXBpY2lkW05SX0NQVVNdID0KKwkJCXsgWzAgLi4uIE5SX0NQVVMtMV0gPSAweGZmIH07CitFWFBPUlRfU1lNQk9MKHg4Nl9jcHVfdG9fYXBpY2lkKTsKKworLyoKKyAqIFRyYW1wb2xpbmUgODB4ODYgcHJvZ3JhbSBhcyBhbiBhcnJheS4KKyAqLworCitleHRlcm4gdW5zaWduZWQgY2hhciB0cmFtcG9saW5lX2RhdGEgW107CitleHRlcm4gdW5zaWduZWQgY2hhciB0cmFtcG9saW5lX2VuZCAgW107CitzdGF0aWMgdW5zaWduZWQgY2hhciAqdHJhbXBvbGluZV9iYXNlOworc3RhdGljIGludCB0cmFtcG9saW5lX2V4ZWM7CisKK3N0YXRpYyB2b2lkIG1hcF9jcHVfdG9fbG9naWNhbF9hcGljaWQodm9pZCk7CisKKy8qCisgKiBDdXJyZW50bHkgdHJpdmlhbC4gV3JpdGUgdGhlIHJlYWwtPnByb3RlY3RlZCBtb2RlCisgKiBib290c3RyYXAgaW50byB0aGUgcGFnZSBjb25jZXJuZWQuIFRoZSBjYWxsZXIKKyAqIGhhcyBtYWRlIHN1cmUgaXQncyBzdWl0YWJseSBhbGlnbmVkLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCBzZXR1cF90cmFtcG9saW5lKHZvaWQpCit7CisJbWVtY3B5KHRyYW1wb2xpbmVfYmFzZSwgdHJhbXBvbGluZV9kYXRhLCB0cmFtcG9saW5lX2VuZCAtIHRyYW1wb2xpbmVfZGF0YSk7CisJcmV0dXJuIHZpcnRfdG9fcGh5cyh0cmFtcG9saW5lX2Jhc2UpOworfQorCisvKgorICogV2UgYXJlIGNhbGxlZCB2ZXJ5IGVhcmx5IHRvIGdldCB0aGUgbG93IG1lbW9yeSBmb3IgdGhlCisgKiBTTVAgYm9vdHVwIHRyYW1wb2xpbmUgcGFnZS4KKyAqLwordm9pZCBfX2luaXQgc21wX2FsbG9jX21lbW9yeSh2b2lkKQoreworCXRyYW1wb2xpbmVfYmFzZSA9ICh2b2lkICopIGFsbG9jX2Jvb3RtZW1fbG93X3BhZ2VzKFBBR0VfU0laRSk7CisJLyoKKwkgKiBIYXMgdG8gYmUgaW4gdmVyeSBsb3cgbWVtb3J5IHNvIHdlIGNhbiBleGVjdXRlCisJICogcmVhbC1tb2RlIEFQIGNvZGUuCisJICovCisJaWYgKF9fcGEodHJhbXBvbGluZV9iYXNlKSA+PSAweDlGMDAwKQorCQlCVUcoKTsKKwkvKgorCSAqIE1ha2UgdGhlIFNNUCB0cmFtcG9saW5lIGV4ZWN1dGFibGU6CisJICovCisJdHJhbXBvbGluZV9leGVjID0gc2V0X2tlcm5lbF9leGVjKCh1bnNpZ25lZCBsb25nKXRyYW1wb2xpbmVfYmFzZSwgMSk7Cit9CisKKy8qCisgKiBUaGUgYm9vdHN0cmFwIGtlcm5lbCBlbnRyeSBjb2RlIGhhcyBzZXQgdGhlc2UgdXAuIFNhdmUgdGhlbSBmb3IKKyAqIGEgZ2l2ZW4gQ1BVCisgKi8KKworc3RhdGljIHZvaWQgX19pbml0IHNtcF9zdG9yZV9jcHVfaW5mbyhpbnQgaWQpCit7CisJc3RydWN0IGNwdWluZm9feDg2ICpjID0gY3B1X2RhdGEgKyBpZDsKKworCSpjID0gYm9vdF9jcHVfZGF0YTsKKwlpZiAoaWQhPTApCisJCWlkZW50aWZ5X2NwdShjKTsKKwkvKgorCSAqIE1hc2sgQiwgUGVudGl1bSwgYnV0IG5vdCBQZW50aXVtIE1NWAorCSAqLworCWlmIChjLT54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfSU5URUwgJiYKKwkgICAgYy0+eDg2ID09IDUgJiYKKwkgICAgYy0+eDg2X21hc2sgPj0gMSAmJiBjLT54ODZfbWFzayA8PSA0ICYmCisJICAgIGMtPng4Nl9tb2RlbCA8PSAzKQorCQkvKgorCQkgKiBSZW1lbWJlciB3ZSBoYXZlIEIgc3RlcCBQZW50aWEgd2l0aCBidWdzCisJCSAqLworCQlzbXBfYl9zdGVwcGluZyA9IDE7CisKKwkvKgorCSAqIENlcnRhaW4gQXRobG9ucyBtaWdodCB3b3JrIChmb3IgdmFyaW91cyB2YWx1ZXMgb2YgJ3dvcmsnKSBpbiBTTVAKKwkgKiBidXQgdGhleSBhcmUgbm90IGNlcnRpZmllZCBhcyBNUCBjYXBhYmxlLgorCSAqLworCWlmICgoYy0+eDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0FNRCkgJiYgKGMtPng4NiA9PSA2KSkgeworCisJCS8qIEF0aGxvbiA2NjAvNjYxIGlzIHZhbGlkLiAqLwkKKwkJaWYgKChjLT54ODZfbW9kZWw9PTYpICYmICgoYy0+eDg2X21hc2s9PTApIHx8IChjLT54ODZfbWFzaz09MSkpKQorCQkJZ290byB2YWxpZF9rNzsKKworCQkvKiBEdXJvbiA2NzAgaXMgdmFsaWQgKi8KKwkJaWYgKChjLT54ODZfbW9kZWw9PTcpICYmIChjLT54ODZfbWFzaz09MCkpCisJCQlnb3RvIHZhbGlkX2s3OworCisJCS8qCisJCSAqIEF0aGxvbiA2NjIsIER1cm9uIDY3MSwgYW5kIEF0aGxvbiA+bW9kZWwgNyBoYXZlIGNhcGFiaWxpdHkgYml0LgorCQkgKiBJdCdzIHdvcnRoIG5vdGluZyB0aGF0IHRoZSBBNSBzdGVwcGluZyAoNjYyKSBvZiBzb21lIEF0aGxvbiBYUCdzCisJCSAqIGhhdmUgdGhlIE1QIGJpdCBzZXQuCisJCSAqIFNlZSBodHRwOi8vd3d3LmhlaXNlLmRlL25ld3N0aWNrZXIvZGF0YS9qb3ctMTguMTAuMDEtMDAwIGZvciBtb3JlLgorCQkgKi8KKwkJaWYgKCgoYy0+eDg2X21vZGVsPT02KSAmJiAoYy0+eDg2X21hc2s+PTIpKSB8fAorCQkgICAgKChjLT54ODZfbW9kZWw9PTcpICYmIChjLT54ODZfbWFzaz49MSkpIHx8CisJCSAgICAgKGMtPng4Nl9tb2RlbD4gNykpCisJCQlpZiAoY3B1X2hhc19tcCkKKwkJCQlnb3RvIHZhbGlkX2s3OworCisJCS8qIElmIHdlIGdldCBoZXJlLCBpdCdzIG5vdCBhIGNlcnRpZmllZCBTTVAgY2FwYWJsZSBBTUQgc3lzdGVtLiAqLworCQl0YWludGVkIHw9IFRBSU5UX1VOU0FGRV9TTVA7CisJfQorCit2YWxpZF9rNzoKKwk7Cit9CisKKy8qCisgKiBUU0Mgc3luY2hyb25pemF0aW9uLgorICoKKyAqIFdlIGZpcnN0IGNoZWNrIHdoZXRoZXIgYWxsIENQVXMgaGF2ZSB0aGVpciBUU0MncyBzeW5jaHJvbml6ZWQsCisgKiB0aGVuIHdlIHByaW50IGEgd2FybmluZyBpZiBub3QsIGFuZCBhbHdheXMgcmVzeW5jLgorICovCisKK3N0YXRpYyBhdG9taWNfdCB0c2Nfc3RhcnRfZmxhZyA9IEFUT01JQ19JTklUKDApOworc3RhdGljIGF0b21pY190IHRzY19jb3VudF9zdGFydCA9IEFUT01JQ19JTklUKDApOworc3RhdGljIGF0b21pY190IHRzY19jb3VudF9zdG9wID0gQVRPTUlDX0lOSVQoMCk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIHRzY192YWx1ZXNbTlJfQ1BVU107CisKKyNkZWZpbmUgTlJfTE9PUFMgNQorCitzdGF0aWMgdm9pZCBfX2luaXQgc3luY2hyb25pemVfdHNjX2JwICh2b2lkKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgbG9uZyB0MDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgc3VtLCBhdmc7CisJbG9uZyBsb25nIGRlbHRhOworCXVuc2lnbmVkIGxvbmcgb25lX3VzZWM7CisJaW50IGJ1Z2d5ID0gMDsKKworCXByaW50ayhLRVJOX0lORk8gImNoZWNraW5nIFRTQyBzeW5jaHJvbml6YXRpb24gYWNyb3NzICV1IENQVXM6ICIsIG51bV9ib290aW5nX2NwdXMoKSk7CisKKwkvKiBjb252ZXJ0IGZyb20ga2N5Yy9zZWMgdG8gY3ljL3VzZWMgKi8KKwlvbmVfdXNlYyA9IGNwdV9raHogLyAxMDAwOworCisJYXRvbWljX3NldCgmdHNjX3N0YXJ0X2ZsYWcsIDEpOworCXdtYigpOworCisJLyoKKwkgKiBXZSBsb29wIGEgZmV3IHRpbWVzIHRvIGdldCBhIHByaW1lZCBpbnN0cnVjdGlvbiBjYWNoZSwKKwkgKiB0aGVuIHRoZSBsYXN0IHBhc3MgaXMgbW9yZSBvciBsZXNzIHN5bmNocm9uaXplZCBhbmQKKwkgKiB0aGUgQlAgYW5kIEFQcyBzZXQgdGhlaXIgY3ljbGUgY291bnRlcnMgdG8gemVybyBhbGwgYXQKKwkgKiBvbmNlLiBUaGlzIHJlZHVjZXMgdGhlIGNoYW5jZSBvZiBoYXZpbmcgcmFuZG9tIG9mZnNldHMKKwkgKiBiZXR3ZWVuIHRoZSBwcm9jZXNzb3JzLCBhbmQgZ3VhcmFudGVlcyB0aGF0IHRoZSBtYXhpbXVtCisJICogZGVsYXkgYmV0d2VlbiB0aGUgY3ljbGUgY291bnRlcnMgaXMgbmV2ZXIgYmlnZ2VyIHRoYW4KKwkgKiB0aGUgbGF0ZW5jeSBvZiBpbmZvcm1hdGlvbi1wYXNzaW5nIChjYWNoZWxpbmVzKSBiZXR3ZWVuCisJICogdHdvIENQVXMuCisJICovCisJZm9yIChpID0gMDsgaSA8IE5SX0xPT1BTOyBpKyspIHsKKwkJLyoKKwkJICogYWxsIEFQcyBzeW5jaHJvbml6ZSBidXQgdGhleSBsb29wIG9uICc9PSBudW1fY3B1cycKKwkJICovCisJCXdoaWxlIChhdG9taWNfcmVhZCgmdHNjX2NvdW50X3N0YXJ0KSAhPSBudW1fYm9vdGluZ19jcHVzKCktMSkKKwkJCW1iKCk7CisJCWF0b21pY19zZXQoJnRzY19jb3VudF9zdG9wLCAwKTsKKwkJd21iKCk7CisJCS8qCisJCSAqIHRoaXMgbGV0cyB0aGUgQVBzIHNhdmUgdGhlaXIgY3VycmVudCBUU0M6CisJCSAqLworCQlhdG9taWNfaW5jKCZ0c2NfY291bnRfc3RhcnQpOworCisJCXJkdHNjbGwodHNjX3ZhbHVlc1tzbXBfcHJvY2Vzc29yX2lkKCldKTsKKwkJLyoKKwkJICogV2UgY2xlYXIgdGhlIFRTQyBpbiB0aGUgbGFzdCBsb29wOgorCQkgKi8KKwkJaWYgKGkgPT0gTlJfTE9PUFMtMSkKKwkJCXdyaXRlX3RzYygwLCAwKTsKKworCQkvKgorCQkgKiBXYWl0IGZvciBhbGwgQVBzIHRvIGxlYXZlIHRoZSBzeW5jaHJvbml6YXRpb24gcG9pbnQ6CisJCSAqLworCQl3aGlsZSAoYXRvbWljX3JlYWQoJnRzY19jb3VudF9zdG9wKSAhPSBudW1fYm9vdGluZ19jcHVzKCktMSkKKwkJCW1iKCk7CisJCWF0b21pY19zZXQoJnRzY19jb3VudF9zdGFydCwgMCk7CisJCXdtYigpOworCQlhdG9taWNfaW5jKCZ0c2NfY291bnRfc3RvcCk7CisJfQorCisJc3VtID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKSB7CisJCWlmIChjcHVfaXNzZXQoaSwgY3B1X2NhbGxvdXRfbWFwKSkgeworCQkJdDAgPSB0c2NfdmFsdWVzW2ldOworCQkJc3VtICs9IHQwOworCQl9CisJfQorCWF2ZyA9IHN1bTsKKwlkb19kaXYoYXZnLCBudW1fYm9vdGluZ19jcHVzKCkpOworCisJc3VtID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKSB7CisJCWlmICghY3B1X2lzc2V0KGksIGNwdV9jYWxsb3V0X21hcCkpCisJCQljb250aW51ZTsKKwkJZGVsdGEgPSB0c2NfdmFsdWVzW2ldIC0gYXZnOworCQlpZiAoZGVsdGEgPCAwKQorCQkJZGVsdGEgPSAtZGVsdGE7CisJCS8qCisJCSAqIFdlIHJlcG9ydCBiaWdnZXIgdGhhbiAyIG1pY3Jvc2Vjb25kcyBjbG9jayBkaWZmZXJlbmNlcy4KKwkJICovCisJCWlmIChkZWx0YSA+IDIqb25lX3VzZWMpIHsKKwkJCWxvbmcgcmVhbGRlbHRhOworCQkJaWYgKCFidWdneSkgeworCQkJCWJ1Z2d5ID0gMTsKKwkJCQlwcmludGsoIlxuIik7CisJCQl9CisJCQlyZWFsZGVsdGEgPSBkZWx0YTsKKwkJCWRvX2RpdihyZWFsZGVsdGEsIG9uZV91c2VjKTsKKwkJCWlmICh0c2NfdmFsdWVzW2ldIDwgYXZnKQorCQkJCXJlYWxkZWx0YSA9IC1yZWFsZGVsdGE7CisKKwkJCXByaW50ayhLRVJOX0lORk8gIkNQVSMlZCBoYWQgJWxkIHVzZWNzIFRTQyBza2V3LCBmaXhlZCBpdCB1cC5cbiIsIGksIHJlYWxkZWx0YSk7CisJCX0KKworCQlzdW0gKz0gZGVsdGE7CisJfQorCWlmICghYnVnZ3kpCisJCXByaW50aygicGFzc2VkLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzeW5jaHJvbml6ZV90c2NfYXAgKHZvaWQpCit7CisJaW50IGk7CisKKwkvKgorCSAqIE5vdCBldmVyeSBjcHUgaXMgb25saW5lIGF0IHRoZSB0aW1lCisJICogdGhpcyBnZXRzIGNhbGxlZCwgc28gd2UgZmlyc3Qgd2FpdCBmb3IgdGhlIEJQIHRvCisJICogZmluaXNoIFNNUCBpbml0aWFsaXphdGlvbjoKKwkgKi8KKwl3aGlsZSAoIWF0b21pY19yZWFkKCZ0c2Nfc3RhcnRfZmxhZykpIG1iKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfTE9PUFM7IGkrKykgeworCQlhdG9taWNfaW5jKCZ0c2NfY291bnRfc3RhcnQpOworCQl3aGlsZSAoYXRvbWljX3JlYWQoJnRzY19jb3VudF9zdGFydCkgIT0gbnVtX2Jvb3RpbmdfY3B1cygpKQorCQkJbWIoKTsKKworCQlyZHRzY2xsKHRzY192YWx1ZXNbc21wX3Byb2Nlc3Nvcl9pZCgpXSk7CisJCWlmIChpID09IE5SX0xPT1BTLTEpCisJCQl3cml0ZV90c2MoMCwgMCk7CisKKwkJYXRvbWljX2luYygmdHNjX2NvdW50X3N0b3ApOworCQl3aGlsZSAoYXRvbWljX3JlYWQoJnRzY19jb3VudF9zdG9wKSAhPSBudW1fYm9vdGluZ19jcHVzKCkpIG1iKCk7CisJfQorfQorI3VuZGVmIE5SX0xPT1BTCisKK2V4dGVybiB2b2lkIGNhbGlicmF0ZV9kZWxheSh2b2lkKTsKKworc3RhdGljIGF0b21pY190IGluaXRfZGVhc3NlcnRlZDsKKworc3RhdGljIHZvaWQgX19pbml0IHNtcF9jYWxsaW4odm9pZCkKK3sKKwlpbnQgY3B1aWQsIHBoeXNfaWQ7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJLyoKKwkgKiBJZiB3YWtlbiB1cCBieSBhbiBJTklUIGluIGFuIDgyNDg5RFggY29uZmlndXJhdGlvbgorCSAqIHdlIG1heSBnZXQgaGVyZSBiZWZvcmUgYW4gSU5JVC1kZWFzc2VydCBJUEkgcmVhY2hlcworCSAqIG91ciBsb2NhbCBBUElDLiAgV2UgaGF2ZSB0byB3YWl0IGZvciB0aGUgSVBJIG9yIHdlJ2xsCisJICogbG9jayB1cCBvbiBhbiBBUElDIGFjY2Vzcy4KKwkgKi8KKwl3YWl0X2Zvcl9pbml0X2RlYXNzZXJ0KCZpbml0X2RlYXNzZXJ0ZWQpOworCisJLyoKKwkgKiAoVGhpcyB3b3JrcyBldmVuIGlmIHRoZSBBUElDIGlzIG5vdCBlbmFibGVkLikKKwkgKi8KKwlwaHlzX2lkID0gR0VUX0FQSUNfSUQoYXBpY19yZWFkKEFQSUNfSUQpKTsKKwljcHVpZCA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlpZiAoY3B1X2lzc2V0KGNwdWlkLCBjcHVfY2FsbGluX21hcCkpIHsKKwkJcHJpbnRrKCJodWgsIHBoeXMgQ1BVIyVkLCBDUFUjJWQgYWxyZWFkeSBwcmVzZW50Pz9cbiIsCisJCQkJCXBoeXNfaWQsIGNwdWlkKTsKKwkJQlVHKCk7CisJfQorCURwcmludGsoIkNQVSMlZCAocGh5cyBJRDogJWQpIHdhaXRpbmcgZm9yIENBTExPVVRcbiIsIGNwdWlkLCBwaHlzX2lkKTsKKworCS8qCisJICogU1RBUlRVUCBJUElzIGFyZSBmcmFnaWxlIGJlYXN0cyBhcyB0aGV5IG1pZ2h0IHNvbWV0aW1lcworCSAqIHRyaWdnZXIgc29tZSBnbHVlIG1vdGhlcmJvYXJkIGxvZ2ljLiBDb21wbGV0ZSBBUElDIGJ1cworCSAqIHNpbGVuY2UgZm9yIDEgc2Vjb25kLCB0aGlzIG92ZXJlc3RpbWF0ZXMgdGhlIHRpbWUgdGhlCisJICogYm9vdCBDUFUgaXMgc3BlbmRpbmcgdG8gc2VuZCB0aGUgdXAgdG8gMiBTVEFSVFVQIElQSXMKKwkgKiBieSBhIGZhY3RvciBvZiB0d28uIFRoaXMgc2hvdWxkIGJlIGVub3VnaC4KKwkgKi8KKworCS8qCisJICogV2FpdGluZyAycyB0b3RhbCBmb3Igc3RhcnR1cCAodWRlbGF5IGlzIG5vdCB5ZXQgd29ya2luZykKKwkgKi8KKwl0aW1lb3V0ID0gamlmZmllcyArIDIqSFo7CisJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCS8qCisJCSAqIEhhcyB0aGUgYm9vdCBDUFUgZmluaXNoZWQgaXQncyBTVEFSVFVQIHNlcXVlbmNlPworCQkgKi8KKwkJaWYgKGNwdV9pc3NldChjcHVpZCwgY3B1X2NhbGxvdXRfbWFwKSkKKwkJCWJyZWFrOworCQlyZXBfbm9wKCk7CisJfQorCisJaWYgKCF0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQlwcmludGsoIkJVRzogQ1BVJWQgc3RhcnRlZCB1cCBidXQgZGlkIG5vdCBnZXQgYSBjYWxsb3V0IVxuIiwKKwkJCWNwdWlkKTsKKwkJQlVHKCk7CisJfQorCisJLyoKKwkgKiB0aGUgYm9vdCBDUFUgaGFzIGZpbmlzaGVkIHRoZSBpbml0IHN0YWdlIGFuZCBpcyBzcGlubmluZworCSAqIG9uIGNhbGxpbl9tYXAgdW50aWwgd2UgZmluaXNoLiBXZSBhcmUgZnJlZSB0byBzZXQgdXAgdGhpcworCSAqIENQVSwgZmlyc3QgdGhlIEFQSUMuICh0aGlzIGlzIHByb2JhYmx5IHJlZHVuZGFudCBvbiBtb3N0CisJICogYm9hcmRzKQorCSAqLworCisJRHByaW50aygiQ0FMTElOLCBiZWZvcmUgc2V0dXBfbG9jYWxfQVBJQygpLlxuIik7CisJc21wX2NhbGxpbl9jbGVhcl9sb2NhbF9hcGljKCk7CisJc2V0dXBfbG9jYWxfQVBJQygpOworCW1hcF9jcHVfdG9fbG9naWNhbF9hcGljaWQoKTsKKworCS8qCisJICogR2V0IG91ciBib2dvbWlwcy4KKwkgKi8KKwljYWxpYnJhdGVfZGVsYXkoKTsKKwlEcHJpbnRrKCJTdGFjayBhdCBhYm91dCAlcFxuIiwmY3B1aWQpOworCisJLyoKKwkgKiBTYXZlIG91ciBwcm9jZXNzb3IgcGFyYW1ldGVycworCSAqLworIAlzbXBfc3RvcmVfY3B1X2luZm8oY3B1aWQpOworCisJZGlzYWJsZV9BUElDX3RpbWVyKCk7CisKKwkvKgorCSAqIEFsbG93IHRoZSBtYXN0ZXIgdG8gY29udGludWUuCisJICovCisJY3B1X3NldChjcHVpZCwgY3B1X2NhbGxpbl9tYXApOworCisJLyoKKwkgKiAgICAgIFN5bmNocm9uaXplIHRoZSBUU0Mgd2l0aCB0aGUgQlAKKwkgKi8KKwlpZiAoY3B1X2hhc190c2MgJiYgY3B1X2toeikKKwkJc3luY2hyb25pemVfdHNjX2FwKCk7Cit9CisKK3N0YXRpYyBpbnQgY3B1Y291bnQ7CisKKy8qCisgKiBBY3RpdmF0ZSBhIHNlY29uZGFyeSBwcm9jZXNzb3IuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBzdGFydF9zZWNvbmRhcnkodm9pZCAqdW51c2VkKQoreworCS8qCisJICogRG9udCBwdXQgYW55dGhpbmcgYmVmb3JlIHNtcF9jYWxsaW4oKSwgU01QCisJICogYm9vdGluZyBpcyB0b28gZnJhZ2lsZSB0aGF0IHdlIHdhbnQgdG8gbGltaXQgdGhlCisJICogdGhpbmdzIGRvbmUgaGVyZSB0byB0aGUgbW9zdCBuZWNlc3NhcnkgdGhpbmdzLgorCSAqLworCWNwdV9pbml0KCk7CisJc21wX2NhbGxpbigpOworCXdoaWxlICghY3B1X2lzc2V0KHNtcF9wcm9jZXNzb3JfaWQoKSwgc21wX2NvbW1lbmNlZF9tYXNrKSkKKwkJcmVwX25vcCgpOworCXNldHVwX3NlY29uZGFyeV9BUElDX2Nsb2NrKCk7CisJaWYgKG5taV93YXRjaGRvZyA9PSBOTUlfSU9fQVBJQykgeworCQlkaXNhYmxlXzgyNTlBX2lycSgwKTsKKwkJZW5hYmxlX05NSV90aHJvdWdoX0xWVDAoTlVMTCk7CisJCWVuYWJsZV84MjU5QV9pcnEoMCk7CisJfQorCWVuYWJsZV9BUElDX3RpbWVyKCk7CisJLyoKKwkgKiBsb3ctbWVtb3J5IG1hcHBpbmdzIGhhdmUgYmVlbiBjbGVhcmVkLCBmbHVzaCB0aGVtIGZyb20KKwkgKiB0aGUgbG9jYWwgVExCcyB0b28uCisJICovCisJbG9jYWxfZmx1c2hfdGxiKCk7CisJY3B1X3NldChzbXBfcHJvY2Vzc29yX2lkKCksIGNwdV9vbmxpbmVfbWFwKTsKKworCS8qIFdlIGNhbiB0YWtlIGludGVycnVwdHMgbm93OiB3ZSdyZSBvZmZpY2lhbGx5ICJ1cCIuICovCisJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJd21iKCk7CisJY3B1X2lkbGUoKTsKK30KKworLyoKKyAqIEV2ZXJ5dGhpbmcgaGFzIGJlZW4gc2V0IHVwIGZvciB0aGUgc2Vjb25kYXJ5CisgKiBDUFVzIC0gdGhleSBqdXN0IG5lZWQgdG8gcmVsb2FkIGV2ZXJ5dGhpbmcKKyAqIGZyb20gdGhlIHRhc2sgc3RydWN0dXJlCisgKiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IHJldHVybi4KKyAqLwordm9pZCBfX2luaXQgaW5pdGlhbGl6ZV9zZWNvbmRhcnkodm9pZCkKK3sKKwkvKgorCSAqIFdlIGRvbid0IGFjdHVhbGx5IG5lZWQgdG8gbG9hZCB0aGUgZnVsbCBUU1MsCisJICogYmFzaWNhbGx5IGp1c3QgdGhlIHN0YWNrIHBvaW50ZXIgYW5kIHRoZSBlaXAuCisJICovCisKKwlhc20gdm9sYXRpbGUoCisJCSJtb3ZsICUwLCUlZXNwXG5cdCIKKwkJImptcCAqJTEiCisJCToKKwkJOiJyIiAoY3VycmVudC0+dGhyZWFkLmVzcCksInIiIChjdXJyZW50LT50aHJlYWQuZWlwKSk7Cit9CisKK2V4dGVybiBzdHJ1Y3QgeworCXZvaWQgKiBlc3A7CisJdW5zaWduZWQgc2hvcnQgc3M7Cit9IHN0YWNrX3N0YXJ0OworCisjaWZkZWYgQ09ORklHX05VTUEKKworLyogd2hpY2ggbG9naWNhbCBDUFVzIGFyZSBvbiB3aGljaCBub2RlcyAqLworY3B1bWFza190IG5vZGVfMl9jcHVfbWFza1tNQVhfTlVNTk9ERVNdID0KKwkJCQl7IFswIC4uLiBNQVhfTlVNTk9ERVMtMV0gPSBDUFVfTUFTS19OT05FIH07CisvKiB3aGljaCBub2RlIGVhY2ggbG9naWNhbCBDUFUgaXMgb24gKi8KK2ludCBjcHVfMl9ub2RlW05SX0NQVVNdID0geyBbMCAuLi4gTlJfQ1BVUy0xXSA9IDAgfTsKK0VYUE9SVF9TWU1CT0woY3B1XzJfbm9kZSk7CisKKy8qIHNldCB1cCBhIG1hcHBpbmcgYmV0d2VlbiBjcHUgYW5kIG5vZGUuICovCitzdGF0aWMgaW5saW5lIHZvaWQgbWFwX2NwdV90b19ub2RlKGludCBjcHUsIGludCBub2RlKQoreworCXByaW50aygiTWFwcGluZyBjcHUgJWQgdG8gbm9kZSAlZFxuIiwgY3B1LCBub2RlKTsKKwljcHVfc2V0KGNwdSwgbm9kZV8yX2NwdV9tYXNrW25vZGVdKTsKKwljcHVfMl9ub2RlW2NwdV0gPSBub2RlOworfQorCisvKiB1bmRvIGEgbWFwcGluZyBiZXR3ZWVuIGNwdSBhbmQgbm9kZS4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB1bm1hcF9jcHVfdG9fbm9kZShpbnQgY3B1KQoreworCWludCBub2RlOworCisJcHJpbnRrKCJVbm1hcHBpbmcgY3B1ICVkIGZyb20gYWxsIG5vZGVzXG4iLCBjcHUpOworCWZvciAobm9kZSA9IDA7IG5vZGUgPCBNQVhfTlVNTk9ERVM7IG5vZGUgKyspCisJCWNwdV9jbGVhcihjcHUsIG5vZGVfMl9jcHVfbWFza1tub2RlXSk7CisJY3B1XzJfbm9kZVtjcHVdID0gMDsKK30KKyNlbHNlIC8qICFDT05GSUdfTlVNQSAqLworCisjZGVmaW5lIG1hcF9jcHVfdG9fbm9kZShjcHUsIG5vZGUpCSh7fSkKKyNkZWZpbmUgdW5tYXBfY3B1X3RvX25vZGUoY3B1KQkoe30pCisKKyNlbmRpZiAvKiBDT05GSUdfTlVNQSAqLworCit1OCBjcHVfMl9sb2dpY2FsX2FwaWNpZFtOUl9DUFVTXSA9IHsgWzAgLi4uIE5SX0NQVVMtMV0gPSBCQURfQVBJQ0lEIH07CisKK3N0YXRpYyB2b2lkIG1hcF9jcHVfdG9fbG9naWNhbF9hcGljaWQodm9pZCkKK3sKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCWludCBhcGljaWQgPSBsb2dpY2FsX3NtcF9wcm9jZXNzb3JfaWQoKTsKKworCWNwdV8yX2xvZ2ljYWxfYXBpY2lkW2NwdV0gPSBhcGljaWQ7CisJbWFwX2NwdV90b19ub2RlKGNwdSwgYXBpY2lkX3RvX25vZGUoYXBpY2lkKSk7Cit9CisKK3N0YXRpYyB2b2lkIHVubWFwX2NwdV90b19sb2dpY2FsX2FwaWNpZChpbnQgY3B1KQoreworCWNwdV8yX2xvZ2ljYWxfYXBpY2lkW2NwdV0gPSBCQURfQVBJQ0lEOworCXVubWFwX2NwdV90b19ub2RlKGNwdSk7Cit9CisKKyNpZiBBUElDX0RFQlVHCitzdGF0aWMgaW5saW5lIHZvaWQgX19pbnF1aXJlX3JlbW90ZV9hcGljKGludCBhcGljaWQpCit7CisJaW50IGksIHJlZ3NbXSA9IHsgQVBJQ19JRCA+PiA0LCBBUElDX0xWUiA+PiA0LCBBUElDX1NQSVYgPj4gNCB9OworCWNoYXIgKm5hbWVzW10gPSB7ICJJRCIsICJWRVJTSU9OIiwgIlNQSVYiIH07CisJaW50IHRpbWVvdXQsIHN0YXR1czsKKworCXByaW50aygiSW5xdWlyaW5nIHJlbW90ZSBBUElDICMlZC4uLlxuIiwgYXBpY2lkKTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YocmVncykgLyBzaXplb2YoKnJlZ3MpOyBpKyspIHsKKwkJcHJpbnRrKCIuLi4gQVBJQyAjJWQgJXM6ICIsIGFwaWNpZCwgbmFtZXNbaV0pOworCisJCS8qCisJCSAqIFdhaXQgZm9yIGlkbGUuCisJCSAqLworCQlhcGljX3dhaXRfaWNyX2lkbGUoKTsKKworCQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0lDUjIsIFNFVF9BUElDX0RFU1RfRklFTEQoYXBpY2lkKSk7CisJCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfSUNSLCBBUElDX0RNX1JFTVJEIHwgcmVnc1tpXSk7CisKKwkJdGltZW91dCA9IDA7CisJCWRvIHsKKwkJCXVkZWxheSgxMDApOworCQkJc3RhdHVzID0gYXBpY19yZWFkKEFQSUNfSUNSKSAmIEFQSUNfSUNSX1JSX01BU0s7CisJCX0gd2hpbGUgKHN0YXR1cyA9PSBBUElDX0lDUl9SUl9JTlBST0cgJiYgdGltZW91dCsrIDwgMTAwMCk7CisKKwkJc3dpdGNoIChzdGF0dXMpIHsKKwkJY2FzZSBBUElDX0lDUl9SUl9WQUxJRDoKKwkJCXN0YXR1cyA9IGFwaWNfcmVhZChBUElDX1JSUik7CisJCQlwcmludGsoIiUwOHhcbiIsIHN0YXR1cyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50aygiZmFpbGVkXG4iKTsKKwkJfQorCX0KK30KKyNlbmRpZgorCisjaWZkZWYgV0FLRV9TRUNPTkRBUllfVklBX05NSQorLyogCisgKiBQb2tlIHRoZSBvdGhlciBDUFUgaW4gdGhlIGV5ZSB2aWEgTk1JIHRvIHdha2UgaXQgdXAuIFJlbWVtYmVyIHRoYXQgdGhlIG5vcm1hbAorICogSU5JVCwgSU5JVCwgU1RBUlRVUCBzZXF1ZW5jZSB3aWxsIHJlc2V0IHRoZSBjaGlwIGhhcmQgZm9yIHVzLCBhbmQgdGhpcworICogd29uJ3QgLi4uIHJlbWVtYmVyIHRvIGNsZWFyIGRvd24gdGhlIEFQSUMsIGV0YyBsYXRlci4KKyAqLworc3RhdGljIGludCBfX2luaXQKK3dha2V1cF9zZWNvbmRhcnlfY3B1KGludCBsb2dpY2FsX2FwaWNpZCwgdW5zaWduZWQgbG9uZyBzdGFydF9laXApCit7CisJdW5zaWduZWQgbG9uZyBzZW5kX3N0YXR1cyA9IDAsIGFjY2VwdF9zdGF0dXMgPSAwOworCWludCB0aW1lb3V0LCBtYXhsdnQ7CisKKwkvKiBUYXJnZXQgY2hpcCAqLworCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfSUNSMiwgU0VUX0FQSUNfREVTVF9GSUVMRChsb2dpY2FsX2FwaWNpZCkpOworCisJLyogQm9vdCBvbiB0aGUgc3RhY2sgKi8KKwkvKiBLaWNrIHRoZSBzZWNvbmQgKi8KKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0lDUiwgQVBJQ19ETV9OTUkgfCBBUElDX0RFU1RfTE9HSUNBTCk7CisKKwlEcHJpbnRrKCJXYWl0aW5nIGZvciBzZW5kIHRvIGZpbmlzaC4uLlxuIik7CisJdGltZW91dCA9IDA7CisJZG8geworCQlEcHJpbnRrKCIrIik7CisJCXVkZWxheSgxMDApOworCQlzZW5kX3N0YXR1cyA9IGFwaWNfcmVhZChBUElDX0lDUikgJiBBUElDX0lDUl9CVVNZOworCX0gd2hpbGUgKHNlbmRfc3RhdHVzICYmICh0aW1lb3V0KysgPCAxMDAwKSk7CisKKwkvKgorCSAqIEdpdmUgdGhlIG90aGVyIENQVSBzb21lIHRpbWUgdG8gYWNjZXB0IHRoZSBJUEkuCisJICovCisJdWRlbGF5KDIwMCk7CisJLyoKKwkgKiBEdWUgdG8gdGhlIFBlbnRpdW0gZXJyYXR1bSAzQVAuCisJICovCisJbWF4bHZ0ID0gZ2V0X21heGx2dCgpOworCWlmIChtYXhsdnQgPiAzKSB7CisJCWFwaWNfcmVhZF9hcm91bmQoQVBJQ19TUElWKTsKKwkJYXBpY193cml0ZShBUElDX0VTUiwgMCk7CisJfQorCWFjY2VwdF9zdGF0dXMgPSAoYXBpY19yZWFkKEFQSUNfRVNSKSAmIDB4RUYpOworCURwcmludGsoIk5NSSBzZW50LlxuIik7CisKKwlpZiAoc2VuZF9zdGF0dXMpCisJCXByaW50aygiQVBJQyBuZXZlciBkZWxpdmVyZWQ/Pz9cbiIpOworCWlmIChhY2NlcHRfc3RhdHVzKQorCQlwcmludGsoIkFQSUMgZGVsaXZlcnkgZXJyb3IgKCVseCkuXG4iLCBhY2NlcHRfc3RhdHVzKTsKKworCXJldHVybiAoc2VuZF9zdGF0dXMgfCBhY2NlcHRfc3RhdHVzKTsKK30KKyNlbmRpZgkvKiBXQUtFX1NFQ09OREFSWV9WSUFfTk1JICovCisKKyNpZmRlZiBXQUtFX1NFQ09OREFSWV9WSUFfSU5JVAorc3RhdGljIGludCBfX2luaXQKK3dha2V1cF9zZWNvbmRhcnlfY3B1KGludCBwaHlzX2FwaWNpZCwgdW5zaWduZWQgbG9uZyBzdGFydF9laXApCit7CisJdW5zaWduZWQgbG9uZyBzZW5kX3N0YXR1cyA9IDAsIGFjY2VwdF9zdGF0dXMgPSAwOworCWludCBtYXhsdnQsIHRpbWVvdXQsIG51bV9zdGFydHMsIGo7CisKKwkvKgorCSAqIEJlIHBhcmFub2lkIGFib3V0IGNsZWFyaW5nIEFQSUMgZXJyb3JzLgorCSAqLworCWlmIChBUElDX0lOVEVHUkFURUQoYXBpY192ZXJzaW9uW3BoeXNfYXBpY2lkXSkpIHsKKwkJYXBpY19yZWFkX2Fyb3VuZChBUElDX1NQSVYpOworCQlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKKwkJYXBpY19yZWFkKEFQSUNfRVNSKTsKKwl9CisKKwlEcHJpbnRrKCJBc3NlcnRpbmcgSU5JVC5cbiIpOworCisJLyoKKwkgKiBUdXJuIElOSVQgb24gdGFyZ2V0IGNoaXAKKwkgKi8KKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0lDUjIsIFNFVF9BUElDX0RFU1RfRklFTEQocGh5c19hcGljaWQpKTsKKworCS8qCisJICogU2VuZCBJUEkKKwkgKi8KKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0lDUiwgQVBJQ19JTlRfTEVWRUxUUklHIHwgQVBJQ19JTlRfQVNTRVJUCisJCQkJfCBBUElDX0RNX0lOSVQpOworCisJRHByaW50aygiV2FpdGluZyBmb3Igc2VuZCB0byBmaW5pc2guLi5cbiIpOworCXRpbWVvdXQgPSAwOworCWRvIHsKKwkJRHByaW50aygiKyIpOworCQl1ZGVsYXkoMTAwKTsKKwkJc2VuZF9zdGF0dXMgPSBhcGljX3JlYWQoQVBJQ19JQ1IpICYgQVBJQ19JQ1JfQlVTWTsKKwl9IHdoaWxlIChzZW5kX3N0YXR1cyAmJiAodGltZW91dCsrIDwgMTAwMCkpOworCisJbWRlbGF5KDEwKTsKKworCURwcmludGsoIkRlYXNzZXJ0aW5nIElOSVQuXG4iKTsKKworCS8qIFRhcmdldCBjaGlwICovCisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19JQ1IyLCBTRVRfQVBJQ19ERVNUX0ZJRUxEKHBoeXNfYXBpY2lkKSk7CisKKwkvKiBTZW5kIElQSSAqLworCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfSUNSLCBBUElDX0lOVF9MRVZFTFRSSUcgfCBBUElDX0RNX0lOSVQpOworCisJRHByaW50aygiV2FpdGluZyBmb3Igc2VuZCB0byBmaW5pc2guLi5cbiIpOworCXRpbWVvdXQgPSAwOworCWRvIHsKKwkJRHByaW50aygiKyIpOworCQl1ZGVsYXkoMTAwKTsKKwkJc2VuZF9zdGF0dXMgPSBhcGljX3JlYWQoQVBJQ19JQ1IpICYgQVBJQ19JQ1JfQlVTWTsKKwl9IHdoaWxlIChzZW5kX3N0YXR1cyAmJiAodGltZW91dCsrIDwgMTAwMCkpOworCisJYXRvbWljX3NldCgmaW5pdF9kZWFzc2VydGVkLCAxKTsKKworCS8qCisJICogU2hvdWxkIHdlIHNlbmQgU1RBUlRVUCBJUElzID8KKwkgKgorCSAqIERldGVybWluZSB0aGlzIGJhc2VkIG9uIHRoZSBBUElDIHZlcnNpb24uCisJICogSWYgd2UgZG9uJ3QgaGF2ZSBhbiBpbnRlZ3JhdGVkIEFQSUMsIGRvbid0IHNlbmQgdGhlIFNUQVJUVVAgSVBJcy4KKwkgKi8KKwlpZiAoQVBJQ19JTlRFR1JBVEVEKGFwaWNfdmVyc2lvbltwaHlzX2FwaWNpZF0pKQorCQludW1fc3RhcnRzID0gMjsKKwllbHNlCisJCW51bV9zdGFydHMgPSAwOworCisJLyoKKwkgKiBSdW4gU1RBUlRVUCBJUEkgbG9vcC4KKwkgKi8KKwlEcHJpbnRrKCIjc3RhcnR1cCBsb29wczogJWQuXG4iLCBudW1fc3RhcnRzKTsKKworCW1heGx2dCA9IGdldF9tYXhsdnQoKTsKKworCWZvciAoaiA9IDE7IGogPD0gbnVtX3N0YXJ0czsgaisrKSB7CisJCURwcmludGsoIlNlbmRpbmcgU1RBUlRVUCAjJWQuXG4iLGopOworCQlhcGljX3JlYWRfYXJvdW5kKEFQSUNfU1BJVik7CisJCWFwaWNfd3JpdGUoQVBJQ19FU1IsIDApOworCQlhcGljX3JlYWQoQVBJQ19FU1IpOworCQlEcHJpbnRrKCJBZnRlciBhcGljX3dyaXRlLlxuIik7CisKKwkJLyoKKwkJICogU1RBUlRVUCBJUEkKKwkJICovCisKKwkJLyogVGFyZ2V0IGNoaXAgKi8KKwkJYXBpY193cml0ZV9hcm91bmQoQVBJQ19JQ1IyLCBTRVRfQVBJQ19ERVNUX0ZJRUxEKHBoeXNfYXBpY2lkKSk7CisKKwkJLyogQm9vdCBvbiB0aGUgc3RhY2sgKi8KKwkJLyogS2ljayB0aGUgc2Vjb25kICovCisJCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfSUNSLCBBUElDX0RNX1NUQVJUVVAKKwkJCQkJfCAoc3RhcnRfZWlwID4+IDEyKSk7CisKKwkJLyoKKwkJICogR2l2ZSB0aGUgb3RoZXIgQ1BVIHNvbWUgdGltZSB0byBhY2NlcHQgdGhlIElQSS4KKwkJICovCisJCXVkZWxheSgzMDApOworCisJCURwcmludGsoIlN0YXJ0dXAgcG9pbnQgMS5cbiIpOworCisJCURwcmludGsoIldhaXRpbmcgZm9yIHNlbmQgdG8gZmluaXNoLi4uXG4iKTsKKwkJdGltZW91dCA9IDA7CisJCWRvIHsKKwkJCURwcmludGsoIisiKTsKKwkJCXVkZWxheSgxMDApOworCQkJc2VuZF9zdGF0dXMgPSBhcGljX3JlYWQoQVBJQ19JQ1IpICYgQVBJQ19JQ1JfQlVTWTsKKwkJfSB3aGlsZSAoc2VuZF9zdGF0dXMgJiYgKHRpbWVvdXQrKyA8IDEwMDApKTsKKworCQkvKgorCQkgKiBHaXZlIHRoZSBvdGhlciBDUFUgc29tZSB0aW1lIHRvIGFjY2VwdCB0aGUgSVBJLgorCQkgKi8KKwkJdWRlbGF5KDIwMCk7CisJCS8qCisJCSAqIER1ZSB0byB0aGUgUGVudGl1bSBlcnJhdHVtIDNBUC4KKwkJICovCisJCWlmIChtYXhsdnQgPiAzKSB7CisJCQlhcGljX3JlYWRfYXJvdW5kKEFQSUNfU1BJVik7CisJCQlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKKwkJfQorCQlhY2NlcHRfc3RhdHVzID0gKGFwaWNfcmVhZChBUElDX0VTUikgJiAweEVGKTsKKwkJaWYgKHNlbmRfc3RhdHVzIHx8IGFjY2VwdF9zdGF0dXMpCisJCQlicmVhazsKKwl9CisJRHByaW50aygiQWZ0ZXIgU3RhcnR1cC5cbiIpOworCisJaWYgKHNlbmRfc3RhdHVzKQorCQlwcmludGsoIkFQSUMgbmV2ZXIgZGVsaXZlcmVkPz8/XG4iKTsKKwlpZiAoYWNjZXB0X3N0YXR1cykKKwkJcHJpbnRrKCJBUElDIGRlbGl2ZXJ5IGVycm9yICglbHgpLlxuIiwgYWNjZXB0X3N0YXR1cyk7CisKKwlyZXR1cm4gKHNlbmRfc3RhdHVzIHwgYWNjZXB0X3N0YXR1cyk7Cit9CisjZW5kaWYJLyogV0FLRV9TRUNPTkRBUllfVklBX0lOSVQgKi8KKworZXh0ZXJuIGNwdW1hc2tfdCBjcHVfaW5pdGlhbGl6ZWQ7CisKK3N0YXRpYyBpbnQgX19pbml0IGRvX2Jvb3RfY3B1KGludCBhcGljaWQpCisvKgorICogTk9URSAtIG9uIG1vc3Qgc3lzdGVtcyB0aGlzIGlzIGEgUEhZU0lDQUwgYXBpYyBJRCwgYnV0IG9uIG11bHRpcXVhZAorICogKGllIGNsdXN0ZXJlZCBhcGljIGFkZHJlc3NpbmcgbW9kZSksIHRoaXMgaXMgYSBMT0dJQ0FMIGFwaWMgSUQuCisgKiBSZXR1cm5zIHplcm8gaWYgQ1BVIGJvb3RlZCBPSywgZWxzZSBlcnJvciBjb2RlIGZyb20gd2FrZXVwX3NlY29uZGFyeV9jcHUuCisgKi8KK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGU7CisJdW5zaWduZWQgbG9uZyBib290X2Vycm9yOworCWludCB0aW1lb3V0LCBjcHU7CisJdW5zaWduZWQgbG9uZyBzdGFydF9laXA7CisJdW5zaWduZWQgc2hvcnQgbm1pX2hpZ2ggPSAwLCBubWlfbG93ID0gMDsKKworCWNwdSA9ICsrY3B1Y291bnQ7CisJLyoKKwkgKiBXZSBjYW4ndCB1c2Uga2VybmVsX3RocmVhZCBzaW5jZSB3ZSBtdXN0IGF2b2lkIHRvCisJICogcmVzY2hlZHVsZSB0aGUgY2hpbGQuCisJICovCisJaWRsZSA9IGZvcmtfaWRsZShjcHUpOworCWlmIChJU19FUlIoaWRsZSkpCisJCXBhbmljKCJmYWlsZWQgZm9yayBmb3IgQ1BVICVkIiwgY3B1KTsKKwlpZGxlLT50aHJlYWQuZWlwID0gKHVuc2lnbmVkIGxvbmcpIHN0YXJ0X3NlY29uZGFyeTsKKwkvKiBzdGFydF9laXAgaGFkIGJldHRlciBiZSBwYWdlLWFsaWduZWQhICovCisJc3RhcnRfZWlwID0gc2V0dXBfdHJhbXBvbGluZSgpOworCisJLyogU28gd2Ugc2VlIHdoYXQncyB1cCAgICovCisJcHJpbnRrKCJCb290aW5nIHByb2Nlc3NvciAlZC8lZCBlaXAgJWx4XG4iLCBjcHUsIGFwaWNpZCwgc3RhcnRfZWlwKTsKKwkvKiBTdGFjayBmb3Igc3RhcnR1cF8zMiBjYW4gYmUganVzdCBhcyBmb3Igc3RhcnRfc2Vjb25kYXJ5IG9ud2FyZHMgKi8KKwlzdGFja19zdGFydC5lc3AgPSAodm9pZCAqKSBpZGxlLT50aHJlYWQuZXNwOworCisJaXJxX2N0eF9pbml0KGNwdSk7CisKKwkvKgorCSAqIFRoaXMgZ3J1bmdlIHJ1bnMgdGhlIHN0YXJ0dXAgcHJvY2VzcyBmb3IKKwkgKiB0aGUgdGFyZ2V0ZWQgcHJvY2Vzc29yLgorCSAqLworCisJYXRvbWljX3NldCgmaW5pdF9kZWFzc2VydGVkLCAwKTsKKworCURwcmludGsoIlNldHRpbmcgd2FybSByZXNldCBjb2RlIGFuZCB2ZWN0b3IuXG4iKTsKKworCXN0b3JlX05NSV92ZWN0b3IoJm5taV9oaWdoLCAmbm1pX2xvdyk7CisKKwlzbXBib290X3NldHVwX3dhcm1fcmVzZXRfdmVjdG9yKHN0YXJ0X2VpcCk7CisKKwkvKgorCSAqIFN0YXJ0aW5nIGFjdHVhbCBJUEkgc2VxdWVuY2UuLi4KKwkgKi8KKwlib290X2Vycm9yID0gd2FrZXVwX3NlY29uZGFyeV9jcHUoYXBpY2lkLCBzdGFydF9laXApOworCisJaWYgKCFib290X2Vycm9yKSB7CisJCS8qCisJCSAqIGFsbG93IEFQcyB0byBzdGFydCBpbml0aWFsaXppbmcuCisJCSAqLworCQlEcHJpbnRrKCJCZWZvcmUgQ2FsbG91dCAlZC5cbiIsIGNwdSk7CisJCWNwdV9zZXQoY3B1LCBjcHVfY2FsbG91dF9tYXApOworCQlEcHJpbnRrKCJBZnRlciBDYWxsb3V0ICVkLlxuIiwgY3B1KTsKKworCQkvKgorCQkgKiBXYWl0IDVzIHRvdGFsIGZvciBhIHJlc3BvbnNlCisJCSAqLworCQlmb3IgKHRpbWVvdXQgPSAwOyB0aW1lb3V0IDwgNTAwMDA7IHRpbWVvdXQrKykgeworCQkJaWYgKGNwdV9pc3NldChjcHUsIGNwdV9jYWxsaW5fbWFwKSkKKwkJCQlicmVhazsJLyogSXQgaGFzIGJvb3RlZCAqLworCQkJdWRlbGF5KDEwMCk7CisJCX0KKworCQlpZiAoY3B1X2lzc2V0KGNwdSwgY3B1X2NhbGxpbl9tYXApKSB7CisJCQkvKiBudW1iZXIgQ1BVcyBsb2dpY2FsbHksIHN0YXJ0aW5nIGZyb20gMSAoQlNQIGlzIDApICovCisJCQlEcHJpbnRrKCJPSy5cbiIpOworCQkJcHJpbnRrKCJDUFUlZDogIiwgY3B1KTsKKwkJCXByaW50X2NwdV9pbmZvKCZjcHVfZGF0YVtjcHVdKTsKKwkJCURwcmludGsoIkNQVSBoYXMgYm9vdGVkLlxuIik7CisJCX0gZWxzZSB7CisJCQlib290X2Vycm9yPSAxOworCQkJaWYgKCooKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKil0cmFtcG9saW5lX2Jhc2UpCisJCQkJCT09IDB4QTUpCisJCQkJLyogdHJhbXBvbGluZSBzdGFydGVkIGJ1dC4uLj8gKi8KKwkJCQlwcmludGsoIlN0dWNrID8/XG4iKTsKKwkJCWVsc2UKKwkJCQkvKiB0cmFtcG9saW5lIGNvZGUgbm90IHJ1biAqLworCQkJCXByaW50aygiTm90IHJlc3BvbmRpbmcuXG4iKTsKKwkJCWlucXVpcmVfcmVtb3RlX2FwaWMoYXBpY2lkKTsKKwkJfQorCX0KKwl4ODZfY3B1X3RvX2FwaWNpZFtjcHVdID0gYXBpY2lkOworCWlmIChib290X2Vycm9yKSB7CisJCS8qIFRyeSB0byBwdXQgdGhpbmdzIGJhY2sgdGhlIHdheSB0aGV5IHdlcmUgYmVmb3JlIC4uLiAqLworCQl1bm1hcF9jcHVfdG9fbG9naWNhbF9hcGljaWQoY3B1KTsKKwkJY3B1X2NsZWFyKGNwdSwgY3B1X2NhbGxvdXRfbWFwKTsgLyogd2FzIHNldCBoZXJlIChkb19ib290X2NwdSgpKSAqLworCQljcHVfY2xlYXIoY3B1LCBjcHVfaW5pdGlhbGl6ZWQpOyAvKiB3YXMgc2V0IGJ5IGNwdV9pbml0KCkgKi8KKwkJY3B1Y291bnQtLTsKKwl9CisKKwkvKiBtYXJrICJzdHVjayIgYXJlYSBhcyBub3Qgc3R1Y2sgKi8KKwkqKCh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopdHJhbXBvbGluZV9iYXNlKSA9IDA7CisKKwlyZXR1cm4gYm9vdF9lcnJvcjsKK30KKworc3RhdGljIHZvaWQgc21wX3R1bmVfc2NoZWR1bGluZyAodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGNhY2hlc2l6ZTsgICAgICAgLyoga0IgICAqLworCXVuc2lnbmVkIGxvbmcgYmFuZHdpZHRoID0gMzUwOyAvKiBNQi9zICovCisJLyoKKwkgKiBSb3VnaCBlc3RpbWF0aW9uIGZvciBTTVAgc2NoZWR1bGluZywgdGhpcyBpcyB0aGUgbnVtYmVyIG9mCisJICogY3ljbGVzIGl0IHRha2VzIGZvciBhIGZ1bGx5IG1lbW9yeS1saW1pdGVkIHByb2Nlc3MgdG8gZmx1c2gKKwkgKiB0aGUgU01QLWxvY2FsIGNhY2hlLgorCSAqCisJICogKEZvciBhIFA1IHRoaXMgcHJldHR5IG11Y2ggbWVhbnMgd2Ugd2lsbCBjaG9vc2UgYW5vdGhlciBpZGxlCisJICogIENQVSBhbG1vc3QgYWx3YXlzIGF0IHdha2V1cCB0aW1lICh0aGlzIGlzIGR1ZSB0byB0aGUgc21hbGwKKwkgKiAgTDEgY2FjaGUpLCBvbiBQSUlzIGl0J3MgYXJvdW5kIDUwLTEwMCB1c2VjcywgZGVwZW5kaW5nIG9uCisJICogIHRoZSBjYWNoZSBzaXplKQorCSAqLworCisJaWYgKCFjcHVfa2h6KSB7CisJCS8qCisJCSAqIHRoaXMgYmFzaWNhbGx5IGRpc2FibGVzIHByb2Nlc3Nvci1hZmZpbml0eQorCQkgKiBzY2hlZHVsaW5nIG9uIFNNUCB3aXRob3V0IGEgVFNDLgorCQkgKi8KKwkJcmV0dXJuOworCX0gZWxzZSB7CisJCWNhY2hlc2l6ZSA9IGJvb3RfY3B1X2RhdGEueDg2X2NhY2hlX3NpemU7CisJCWlmIChjYWNoZXNpemUgPT0gLTEpIHsKKwkJCWNhY2hlc2l6ZSA9IDE2OyAvKiBQZW50aXVtcywgMng4a0IgY2FjaGUgKi8KKwkJCWJhbmR3aWR0aCA9IDEwMDsKKwkJfQorCX0KK30KKworLyoKKyAqIEN5Y2xlIHRocm91Z2ggdGhlIHByb2Nlc3NvcnMgc2VuZGluZyBBUElDIElQSXMgdG8gYm9vdCBlYWNoLgorICovCisKK3N0YXRpYyBpbnQgYm9vdF9jcHVfbG9naWNhbF9hcGljaWQ7CisvKiBXaGVyZSB0aGUgSU8gYXJlYSB3YXMgbWFwcGVkIG9uIG11bHRpcXVhZCwgYWx3YXlzIDAgb3RoZXJ3aXNlICovCit2b2lkICp4cXVhZF9wb3J0aW87CisKK2NwdW1hc2tfdCBjcHVfc2libGluZ19tYXBbTlJfQ1BVU10gX19jYWNoZWxpbmVfYWxpZ25lZDsKKworc3RhdGljIHZvaWQgX19pbml0IHNtcF9ib290X2NwdXModW5zaWduZWQgaW50IG1heF9jcHVzKQoreworCWludCBhcGljaWQsIGNwdSwgYml0LCBraWNrZWQ7CisJdW5zaWduZWQgbG9uZyBib2dvc3VtID0gMDsKKworCS8qCisJICogU2V0dXAgYm9vdCBDUFUgaW5mb3JtYXRpb24KKwkgKi8KKwlzbXBfc3RvcmVfY3B1X2luZm8oMCk7IC8qIEZpbmFsIGZ1bGwgdmVyc2lvbiBvZiB0aGUgZGF0YSAqLworCXByaW50aygiQ1BVJWQ6ICIsIDApOworCXByaW50X2NwdV9pbmZvKCZjcHVfZGF0YVswXSk7CisKKwlib290X2NwdV9waHlzaWNhbF9hcGljaWQgPSBHRVRfQVBJQ19JRChhcGljX3JlYWQoQVBJQ19JRCkpOworCWJvb3RfY3B1X2xvZ2ljYWxfYXBpY2lkID0gbG9naWNhbF9zbXBfcHJvY2Vzc29yX2lkKCk7CisJeDg2X2NwdV90b19hcGljaWRbMF0gPSBib290X2NwdV9waHlzaWNhbF9hcGljaWQ7CisKKwljdXJyZW50X3RocmVhZF9pbmZvKCktPmNwdSA9IDA7CisJc21wX3R1bmVfc2NoZWR1bGluZygpOworCWNwdXNfY2xlYXIoY3B1X3NpYmxpbmdfbWFwWzBdKTsKKwljcHVfc2V0KDAsIGNwdV9zaWJsaW5nX21hcFswXSk7CisKKwkvKgorCSAqIElmIHdlIGNvdWxkbid0IGZpbmQgYW4gU01QIGNvbmZpZ3VyYXRpb24gYXQgYm9vdCB0aW1lLAorCSAqIGdldCBvdXQgb2YgaGVyZSBub3chCisJICovCisJaWYgKCFzbXBfZm91bmRfY29uZmlnICYmICFhY3BpX2xhcGljKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiU01QIG1vdGhlcmJvYXJkIG5vdCBkZXRlY3RlZC5cbiIpOworCQlzbXBib290X2NsZWFyX2lvX2FwaWNfaXJxcygpOworCQlwaHlzX2NwdV9wcmVzZW50X21hcCA9IHBoeXNpZF9tYXNrX29mX3BoeXNpZCgwKTsKKwkJaWYgKEFQSUNfaW5pdF91bmlwcm9jZXNzb3IoKSkKKwkJCXByaW50ayhLRVJOX05PVElDRSAiTG9jYWwgQVBJQyBub3QgZGV0ZWN0ZWQuIgorCQkJCQkgICAiIFVzaW5nIGR1bW15IEFQSUMgZW11bGF0aW9uLlxuIik7CisJCW1hcF9jcHVfdG9fbG9naWNhbF9hcGljaWQoKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogU2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgTVAgdGFibGUgc2hvdWxkIGxpc3QgdGhlIGJvb3QKKwkgKiBDUFUgdG9vLCBidXQgd2UgZG8gaXQgZm9yIHRoZSBzYWtlIG9mIHJvYnVzdG5lc3MgYW55d2F5LgorCSAqIE1ha2VzIG5vIHNlbnNlIHRvIGRvIHRoaXMgY2hlY2sgaW4gY2x1c3RlcmVkIGFwaWMgbW9kZSwgc28gc2tpcCBpdAorCSAqLworCWlmICghY2hlY2tfcGh5c19hcGljaWRfcHJlc2VudChib290X2NwdV9waHlzaWNhbF9hcGljaWQpKSB7CisJCXByaW50aygid2VpcmQsIGJvb3QgQ1BVICgjJWQpIG5vdCBsaXN0ZWQgYnkgdGhlIEJJT1MuXG4iLAorCQkJCWJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCk7CisJCXBoeXNpZF9zZXQoaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCksIHBoeXNfY3B1X3ByZXNlbnRfbWFwKTsKKwl9CisKKwkvKgorCSAqIElmIHdlIGNvdWxkbid0IGZpbmQgYSBsb2NhbCBBUElDLCB0aGVuIGdldCBvdXQgb2YgaGVyZSBub3chCisJICovCisJaWYgKEFQSUNfSU5URUdSQVRFRChhcGljX3ZlcnNpb25bYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkXSkgJiYgIWNwdV9oYXNfYXBpYykgeworCQlwcmludGsoS0VSTl9FUlIgIkJJT1MgYnVnLCBsb2NhbCBBUElDICMlZCBub3QgZGV0ZWN0ZWQhLi4uXG4iLAorCQkJYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkKTsKKwkJcHJpbnRrKEtFUk5fRVJSICIuLi4gZm9yY2luZyB1c2Ugb2YgZHVtbXkgQVBJQyBlbXVsYXRpb24uICh0ZWxsIHlvdXIgaHcgdmVuZG9yKVxuIik7CisJCXNtcGJvb3RfY2xlYXJfaW9fYXBpY19pcnFzKCk7CisJCXBoeXNfY3B1X3ByZXNlbnRfbWFwID0gcGh5c2lkX21hc2tfb2ZfcGh5c2lkKDApOworCQlyZXR1cm47CisJfQorCisJdmVyaWZ5X2xvY2FsX0FQSUMoKTsKKworCS8qCisJICogSWYgU01QIHNob3VsZCBiZSBkaXNhYmxlZCwgdGhlbiByZWFsbHkgZGlzYWJsZSBpdCEKKwkgKi8KKwlpZiAoIW1heF9jcHVzKSB7CisJCXNtcF9mb3VuZF9jb25maWcgPSAwOworCQlwcmludGsoS0VSTl9JTkZPICJTTVAgbW9kZSBkZWFjdGl2YXRlZCwgZm9yY2luZyB1c2Ugb2YgZHVtbXkgQVBJQyBlbXVsYXRpb24uXG4iKTsKKwkJc21wYm9vdF9jbGVhcl9pb19hcGljX2lycXMoKTsKKwkJcGh5c19jcHVfcHJlc2VudF9tYXAgPSBwaHlzaWRfbWFza19vZl9waHlzaWQoMCk7CisJCXJldHVybjsKKwl9CisKKwljb25uZWN0X2JzcF9BUElDKCk7CisJc2V0dXBfbG9jYWxfQVBJQygpOworCW1hcF9jcHVfdG9fbG9naWNhbF9hcGljaWQoKTsKKworCisJc2V0dXBfcG9ydGlvX3JlbWFwKCk7CisKKwkvKgorCSAqIFNjYW4gdGhlIENQVSBwcmVzZW50IG1hcCBhbmQgZmlyZSB1cCB0aGUgb3RoZXIgQ1BVcyB2aWEgZG9fYm9vdF9jcHUKKwkgKgorCSAqIEluIGNsdXN0ZXJlZCBhcGljIG1vZGUsIHBoeXNfY3B1X3ByZXNlbnRfbWFwIGlzIGEgY29uc3RydWN0ZWQgdGh1czoKKwkgKiBiaXRzIDAtMyBhcmUgcXVhZDAsIDQtNyBhcmUgcXVhZDEsIGV0Yy4gQSBwZXJ2ZXJzZSB0d2lzdCBvbiB0aGUgCisJICogY2x1c3RlcmVkIGFwaWMgSUQuCisJICovCisJRHByaW50aygiQ1BVIHByZXNlbnQgbWFwOiAlbHhcbiIsIHBoeXNpZHNfY29lcmNlKHBoeXNfY3B1X3ByZXNlbnRfbWFwKSk7CisKKwlraWNrZWQgPSAxOworCWZvciAoYml0ID0gMDsga2lja2VkIDwgTlJfQ1BVUyAmJiBiaXQgPCBNQVhfQVBJQ1M7IGJpdCsrKSB7CisJCWFwaWNpZCA9IGNwdV9wcmVzZW50X3RvX2FwaWNpZChiaXQpOworCQkvKgorCQkgKiBEb24ndCBldmVuIGF0dGVtcHQgdG8gc3RhcnQgdGhlIGJvb3QgQ1BVIQorCQkgKi8KKwkJaWYgKChhcGljaWQgPT0gYm9vdF9jcHVfYXBpY2lkKSB8fCAoYXBpY2lkID09IEJBRF9BUElDSUQpKQorCQkJY29udGludWU7CisKKwkJaWYgKCFjaGVja19hcGljaWRfcHJlc2VudChiaXQpKQorCQkJY29udGludWU7CisJCWlmIChtYXhfY3B1cyA8PSBjcHVjb3VudCsxKQorCQkJY29udGludWU7CisKKwkJaWYgKGRvX2Jvb3RfY3B1KGFwaWNpZCkpCisJCQlwcmludGsoIkNQVSAjJWQgbm90IHJlc3BvbmRpbmcgLSBjYW5ub3QgdXNlIGl0LlxuIiwKKwkJCQkJCQkJYXBpY2lkKTsKKwkJZWxzZQorCQkJKytraWNrZWQ7CisJfQorCisJLyoKKwkgKiBDbGVhbnVwIHBvc3NpYmxlIGRhbmdsaW5nIGVuZHMuLi4KKwkgKi8KKwlzbXBib290X3Jlc3RvcmVfd2FybV9yZXNldF92ZWN0b3IoKTsKKworCS8qCisJICogQWxsb3cgdGhlIHVzZXIgdG8gaW1wcmVzcyBmcmllbmRzLgorCSAqLworCURwcmludGsoIkJlZm9yZSBib2dvbWlwcy5cbiIpOworCWZvciAoY3B1ID0gMDsgY3B1IDwgTlJfQ1BVUzsgY3B1KyspCisJCWlmIChjcHVfaXNzZXQoY3B1LCBjcHVfY2FsbG91dF9tYXApKQorCQkJYm9nb3N1bSArPSBjcHVfZGF0YVtjcHVdLmxvb3BzX3Blcl9qaWZmeTsKKwlwcmludGsoS0VSTl9JTkZPCisJCSJUb3RhbCBvZiAlZCBwcm9jZXNzb3JzIGFjdGl2YXRlZCAoJWx1LiUwMmx1IEJvZ29NSVBTKS5cbiIsCisJCWNwdWNvdW50KzEsCisJCWJvZ29zdW0vKDUwMDAwMC9IWiksCisJCShib2dvc3VtLyg1MDAwL0haKSklMTAwKTsKKwkKKwlEcHJpbnRrKCJCZWZvcmUgYm9nb2NvdW50IC0gc2V0dGluZyBhY3RpdmF0ZWQ9MS5cbiIpOworCisJaWYgKHNtcF9iX3N0ZXBwaW5nKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJXQVJOSU5HOiBTTVAgb3BlcmF0aW9uIG1heSBiZSB1bnJlbGlhYmxlIHdpdGggQiBzdGVwcGluZyBwcm9jZXNzb3JzLlxuIik7CisKKwkvKgorCSAqIERvbid0IHRhaW50IGlmIHdlIGFyZSBydW5uaW5nIFNNUCBrZXJuZWwgb24gYSBzaW5nbGUgbm9uLU1QCisJICogYXBwcm92ZWQgQXRobG9uCisJICovCisJaWYgKHRhaW50ZWQgJiBUQUlOVF9VTlNBRkVfU01QKSB7CisJCWlmIChjcHVjb3VudCkKKwkJCXByaW50ayAoS0VSTl9JTkZPICJXQVJOSU5HOiBUaGlzIGNvbWJpbmF0aW9uIG9mIEFNRCBwcm9jZXNzb3JzIGlzIG5vdCBzdWl0YWJsZSBmb3IgU01QLlxuIik7CisJCWVsc2UKKwkJCXRhaW50ZWQgJj0gflRBSU5UX1VOU0FGRV9TTVA7CisJfQorCisJRHByaW50aygiQm9vdCBkb25lLlxuIik7CisKKwkvKgorCSAqIGNvbnN0cnVjdCBjcHVfc2libGluZ19tYXBbXSwgc28gdGhhdCB3ZSBjYW4gdGVsbCBzaWJsaW5nIENQVXMKKwkgKiBlZmZpY2llbnRseS4KKwkgKi8KKwlmb3IgKGNwdSA9IDA7IGNwdSA8IE5SX0NQVVM7IGNwdSsrKQorCQljcHVzX2NsZWFyKGNwdV9zaWJsaW5nX21hcFtjcHVdKTsKKworCWZvciAoY3B1ID0gMDsgY3B1IDwgTlJfQ1BVUzsgY3B1KyspIHsKKwkJaW50IHNpYmxpbmdzID0gMDsKKwkJaW50IGk7CisJCWlmICghY3B1X2lzc2V0KGNwdSwgY3B1X2NhbGxvdXRfbWFwKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChzbXBfbnVtX3NpYmxpbmdzID4gMSkgeworCQkJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgeworCQkJCWlmICghY3B1X2lzc2V0KGksIGNwdV9jYWxsb3V0X21hcCkpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChwaHlzX3Byb2NfaWRbY3B1XSA9PSBwaHlzX3Byb2NfaWRbaV0pIHsKKwkJCQkJc2libGluZ3MrKzsKKwkJCQkJY3B1X3NldChpLCBjcHVfc2libGluZ19tYXBbY3B1XSk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJc2libGluZ3MrKzsKKwkJCWNwdV9zZXQoY3B1LCBjcHVfc2libGluZ19tYXBbY3B1XSk7CisJCX0KKworCQlpZiAoc2libGluZ3MgIT0gc21wX251bV9zaWJsaW5ncykKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIldBUk5JTkc6ICVkIHNpYmxpbmdzIGZvdW5kIGZvciBDUFUlZCwgc2hvdWxkIGJlICVkXG4iLCBzaWJsaW5ncywgY3B1LCBzbXBfbnVtX3NpYmxpbmdzKTsKKwl9CisKKwlpZiAobm1pX3dhdGNoZG9nID09IE5NSV9MT0NBTF9BUElDKQorCQljaGVja19ubWlfd2F0Y2hkb2coKTsKKworCXNtcGJvb3Rfc2V0dXBfaW9fYXBpYygpOworCisJc2V0dXBfYm9vdF9BUElDX2Nsb2NrKCk7CisKKwkvKgorCSAqIFN5bmNocm9uaXplIHRoZSBUU0Mgd2l0aCB0aGUgQVAKKwkgKi8KKwlpZiAoY3B1X2hhc190c2MgJiYgY3B1Y291bnQgJiYgY3B1X2toeikKKwkJc3luY2hyb25pemVfdHNjX2JwKCk7Cit9CisKKy8qIFRoZXNlIGFyZSB3cmFwcGVycyB0byBpbnRlcmZhY2UgdG8gdGhlIG5ldyBib290IHByb2Nlc3MuICBTb21lb25lCisgICB3aG8gdW5kZXJzdGFuZHMgYWxsIHRoaXMgc3R1ZmYgc2hvdWxkIHJld3JpdGUgaXQgcHJvcGVybHkuIC0tUlIgMTUvSnVsLzAyICovCit2b2lkIF9faW5pdCBzbXBfcHJlcGFyZV9jcHVzKHVuc2lnbmVkIGludCBtYXhfY3B1cykKK3sKKwlzbXBfYm9vdF9jcHVzKG1heF9jcHVzKTsKK30KKwordm9pZCBfX2RldmluaXQgc21wX3ByZXBhcmVfYm9vdF9jcHUodm9pZCkKK3sKKwljcHVfc2V0KHNtcF9wcm9jZXNzb3JfaWQoKSwgY3B1X29ubGluZV9tYXApOworCWNwdV9zZXQoc21wX3Byb2Nlc3Nvcl9pZCgpLCBjcHVfY2FsbG91dF9tYXApOworfQorCitpbnQgX19kZXZpbml0IF9fY3B1X3VwKHVuc2lnbmVkIGludCBjcHUpCit7CisJLyogVGhpcyBvbmx5IHdvcmtzIGF0IGJvb3QgZm9yIHg4Ni4gIFNlZSAicmV3cml0ZSIgYWJvdmUuICovCisJaWYgKGNwdV9pc3NldChjcHUsIHNtcF9jb21tZW5jZWRfbWFzaykpIHsKKwkJbG9jYWxfaXJxX2VuYWJsZSgpOworCQlyZXR1cm4gLUVOT1NZUzsKKwl9CisKKwkvKiBJbiBjYXNlIG9uZSBkaWRuJ3QgY29tZSB1cCAqLworCWlmICghY3B1X2lzc2V0KGNwdSwgY3B1X2NhbGxpbl9tYXApKSB7CisJCWxvY2FsX2lycV9lbmFibGUoKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJbG9jYWxfaXJxX2VuYWJsZSgpOworCS8qIFVubGVhc2ggdGhlIENQVSEgKi8KKwljcHVfc2V0KGNwdSwgc21wX2NvbW1lbmNlZF9tYXNrKTsKKwl3aGlsZSAoIWNwdV9pc3NldChjcHUsIGNwdV9vbmxpbmVfbWFwKSkKKwkJbWIoKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBfX2luaXQgc21wX2NwdXNfZG9uZSh1bnNpZ25lZCBpbnQgbWF4X2NwdXMpCit7CisjaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCisJc2V0dXBfaW9hcGljX2Rlc3QoKTsKKyNlbmRpZgorCXphcF9sb3dfbWFwcGluZ3MoKTsKKwkvKgorCSAqIERpc2FibGUgZXhlY3V0YWJpbGl0eSBvZiB0aGUgU01QIHRyYW1wb2xpbmU6CisJICovCisJc2V0X2tlcm5lbF9leGVjKCh1bnNpZ25lZCBsb25nKXRyYW1wb2xpbmVfYmFzZSwgdHJhbXBvbGluZV9leGVjKTsKK30KKwordm9pZCBfX2luaXQgc21wX2ludHJfaW5pdCh2b2lkKQoreworCS8qCisJICogSVJRMCBtdXN0IGJlIGdpdmVuIGEgZml4ZWQgYXNzaWdubWVudCBhbmQgaW5pdGlhbGl6ZWQsCisJICogYmVjYXVzZSBpdCdzIHVzZWQgYmVmb3JlIHRoZSBJTy1BUElDIGlzIHNldCB1cC4KKwkgKi8KKwlzZXRfaW50cl9nYXRlKEZJUlNUX0RFVklDRV9WRUNUT1IsIGludGVycnVwdFswXSk7CisKKwkvKgorCSAqIFRoZSByZXNjaGVkdWxlIGludGVycnVwdCBpcyBhIENQVS10by1DUFUgcmVzY2hlZHVsZS1oZWxwZXIKKwkgKiBJUEksIGRyaXZlbiBieSB3YWtldXAuCisJICovCisJc2V0X2ludHJfZ2F0ZShSRVNDSEVEVUxFX1ZFQ1RPUiwgcmVzY2hlZHVsZV9pbnRlcnJ1cHQpOworCisJLyogSVBJIGZvciBpbnZhbGlkYXRpb24gKi8KKwlzZXRfaW50cl9nYXRlKElOVkFMSURBVEVfVExCX1ZFQ1RPUiwgaW52YWxpZGF0ZV9pbnRlcnJ1cHQpOworCisJLyogSVBJIGZvciBnZW5lcmljIGZ1bmN0aW9uIGNhbGwgKi8KKwlzZXRfaW50cl9nYXRlKENBTExfRlVOQ1RJT05fVkVDVE9SLCBjYWxsX2Z1bmN0aW9uX2ludGVycnVwdCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3NyYXQuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc3JhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiM2IyN2QKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3NyYXQuYwpAQCAtMCwwICsxLDQ1NiBAQAorLyoKKyAqIFNvbWUgb2YgdGhlIGNvZGUgaW4gdGhpcyBmaWxlIGhhcyBiZWVuIGdsZWFuZWQgZnJvbSB0aGUgNjQgYml0IAorICogZGlzY29udGlnbWVtIHN1cHBvcnQgY29kZSBiYXNlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgSUJNIENvcnAuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAgICAgICAgCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogU2VuZCBmZWVkYmFjayB0byBQYXQgR2F1Z2hlbiA8Z29uZUB1cy5pYm0uY29tPgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvbW16b25lLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L25vZGVtYXNrLmg+CisjaW5jbHVkZSA8YXNtL3NyYXQuaD4KKyNpbmNsdWRlIDxhc20vdG9wb2xvZ3kuaD4KKworLyoKKyAqIHByb3hpbWl0eSBtYWNyb3MgYW5kIGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgTk9ERV9BUlJBWV9JTkRFWCh4KQkoKHgpIC8gOCkJLyogOCBiaXRzL2NoYXIgKi8KKyNkZWZpbmUgTk9ERV9BUlJBWV9PRkZTRVQoeCkJKCh4KSAlIDgpCS8qIDggYml0cy9jaGFyICovCisjZGVmaW5lIEJNQVBfU0VUKGJtYXAsIGJpdCkJKChibWFwKVtOT0RFX0FSUkFZX0lOREVYKGJpdCldIHw9IDEgPDwgTk9ERV9BUlJBWV9PRkZTRVQoYml0KSkKKyNkZWZpbmUgQk1BUF9URVNUKGJtYXAsIGJpdCkJKChibWFwKVtOT0RFX0FSUkFZX0lOREVYKGJpdCldICYgKDEgPDwgTk9ERV9BUlJBWV9PRkZTRVQoYml0KSkpCisjZGVmaW5lIE1BWF9QWE1fRE9NQUlOUwkJMjU2CS8qIDEgYnl0ZSBhbmQgbm8gcHJvbWlzZXMgYWJvdXQgdmFsdWVzICovCisvKiBiaXRtYXAgbGVuZ3RoOyBfUFhNIGlzIGF0IG1vc3QgMjU1ICovCisjZGVmaW5lIFBYTV9CSVRNQVBfTEVOIChNQVhfUFhNX0RPTUFJTlMgLyA4KSAKK3N0YXRpYyB1OCBweG1fYml0bWFwW1BYTV9CSVRNQVBfTEVOXTsJLyogYml0bWFwIG9mIHByb3hpbWl0eSBkb21haW5zICovCisKKyNkZWZpbmUgTUFYX0NIVU5LU19QRVJfTk9ERQk0CisjZGVmaW5lIE1BWENIVU5LUwkJKE1BWF9DSFVOS1NfUEVSX05PREUgKiBNQVhfTlVNTk9ERVMpCitzdHJ1Y3Qgbm9kZV9tZW1vcnlfY2h1bmtfcyB7CisJdW5zaWduZWQgbG9uZwlzdGFydF9wZm47CisJdW5zaWduZWQgbG9uZwllbmRfcGZuOworCXU4CXB4bTsJCS8vIHByb3hpbWl0eSBkb21haW4gb2Ygbm9kZQorCXU4CW5pZDsJCS8vIHdoaWNoIGNub2RlIGNvbnRhaW5zIHRoaXMgY2h1bms/CisJdTgJYmFuazsJCS8vIHdoaWNoIG1lbSBiYW5rIG9uIHRoaXMgbm9kZQorfTsKK3N0YXRpYyBzdHJ1Y3Qgbm9kZV9tZW1vcnlfY2h1bmtfcyBub2RlX21lbW9yeV9jaHVua1tNQVhDSFVOS1NdOworCitzdGF0aWMgaW50IG51bV9tZW1vcnlfY2h1bmtzOwkJLyogdG90YWwgbnVtYmVyIG9mIG1lbW9yeSBjaHVua3MgKi8KK3N0YXRpYyBpbnQgemhvbGVzX3NpemVfaW5pdDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHpob2xlc19zaXplW01BWF9OVU1OT0RFUyAqIE1BWF9OUl9aT05FU107CisKK2V4dGVybiB2b2lkICogYm9vdF9pb3JlbWFwKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOworCisvKiBJZGVudGlmeSBDUFUgcHJveGltaXR5IGRvbWFpbnMgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBwYXJzZV9jcHVfYWZmaW5pdHlfc3RydWN0dXJlKGNoYXIgKnApCit7CisJc3RydWN0IGFjcGlfdGFibGVfcHJvY2Vzc29yX2FmZmluaXR5ICpjcHVfYWZmaW5pdHkgPSAKKwkJCQkoc3RydWN0IGFjcGlfdGFibGVfcHJvY2Vzc29yX2FmZmluaXR5ICopIHA7CisKKwlpZiAoIWNwdV9hZmZpbml0eS0+ZmxhZ3MuZW5hYmxlZCkKKwkJcmV0dXJuOwkJLyogZW1wdHkgZW50cnkgKi8KKworCS8qIG1hcmsgdGhpcyBub2RlIGFzICJzZWVuIiBpbiBub2RlIGJpdG1hcCAqLworCUJNQVBfU0VUKHB4bV9iaXRtYXAsIGNwdV9hZmZpbml0eS0+cHJveGltaXR5X2RvbWFpbik7CisKKwlwcmludGsoIkNQVSAweCUwMlggaW4gcHJveGltaXR5IGRvbWFpbiAweCUwMlhcbiIsCisJCWNwdV9hZmZpbml0eS0+YXBpY19pZCwgY3B1X2FmZmluaXR5LT5wcm94aW1pdHlfZG9tYWluKTsKK30KKworLyoKKyAqIElkZW50aWZ5IG1lbW9yeSBwcm94aW1pdHkgZG9tYWlucyBhbmQgaG90LXJlbW92ZSBjYXBhYmlsaXRpZXMuCisgKiBGaWxsIG5vZGUgbWVtb3J5IGNodW5rIGxpc3Qgc3RydWN0dXJlLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgcGFyc2VfbWVtb3J5X2FmZmluaXR5X3N0cnVjdHVyZSAoY2hhciAqc3JhdHApCit7CisJdW5zaWduZWQgbG9uZyBsb25nIHBhZGRyLCBzaXplOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCBlbmRfcGZuOyAKKwl1OCBweG07CisJc3RydWN0IG5vZGVfbWVtb3J5X2NodW5rX3MgKnAsICpxLCAqcGVuZDsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9tZW1vcnlfYWZmaW5pdHkgKm1lbW9yeV9hZmZpbml0eSA9CisJCQkoc3RydWN0IGFjcGlfdGFibGVfbWVtb3J5X2FmZmluaXR5ICopIHNyYXRwOworCisJaWYgKCFtZW1vcnlfYWZmaW5pdHktPmZsYWdzLmVuYWJsZWQpCisJCXJldHVybjsJCS8qIGVtcHR5IGVudHJ5ICovCisKKwkvKiBtYXJrIHRoaXMgbm9kZSBhcyAic2VlbiIgaW4gbm9kZSBiaXRtYXAgKi8KKwlCTUFQX1NFVChweG1fYml0bWFwLCBtZW1vcnlfYWZmaW5pdHktPnByb3hpbWl0eV9kb21haW4pOworCisJLyogY2FsY3VsYXRlIGluZm8gZm9yIG1lbW9yeSBjaHVuayBzdHJ1Y3R1cmUgKi8KKwlwYWRkciA9IG1lbW9yeV9hZmZpbml0eS0+YmFzZV9hZGRyX2hpOworCXBhZGRyID0gKHBhZGRyIDw8IDMyKSB8IG1lbW9yeV9hZmZpbml0eS0+YmFzZV9hZGRyX2xvOworCXNpemUgPSBtZW1vcnlfYWZmaW5pdHktPmxlbmd0aF9oaTsKKwlzaXplID0gKHNpemUgPDwgMzIpIHwgbWVtb3J5X2FmZmluaXR5LT5sZW5ndGhfbG87CisJCisJc3RhcnRfcGZuID0gcGFkZHIgPj4gUEFHRV9TSElGVDsKKwllbmRfcGZuID0gKHBhZGRyICsgc2l6ZSkgPj4gUEFHRV9TSElGVDsKKwkKKwlweG0gPSBtZW1vcnlfYWZmaW5pdHktPnByb3hpbWl0eV9kb21haW47CisKKwlpZiAobnVtX21lbW9yeV9jaHVua3MgPj0gTUFYQ0hVTktTKSB7CisJCXByaW50aygiVG9vIG1hbnkgbWVtIGNodW5rcyBpbiBTUkFULiBJZ25vcmluZyAlbGxkIE1CeXRlcyBhdCAlbGx4XG4iLAorCQkJc2l6ZS8oMTAyNCoxMDI0KSwgcGFkZHIpOworCQlyZXR1cm47CisJfQorCisJLyogSW5zZXJ0aW9uIHNvcnQgYmFzZWQgb24gYmFzZSBhZGRyZXNzICovCisJcGVuZCA9ICZub2RlX21lbW9yeV9jaHVua1tudW1fbWVtb3J5X2NodW5rc107CisJZm9yIChwID0gJm5vZGVfbWVtb3J5X2NodW5rWzBdOyBwIDwgcGVuZDsgcCsrKSB7CisJCWlmIChzdGFydF9wZm4gPCBwLT5zdGFydF9wZm4pCisJCQlicmVhazsKKwl9CisJaWYgKHAgPCBwZW5kKSB7CisJCWZvciAocSA9IHBlbmQ7IHEgPj0gcDsgcS0tKQorCQkJKihxICsgMSkgPSAqcTsKKwl9CisJcC0+c3RhcnRfcGZuID0gc3RhcnRfcGZuOworCXAtPmVuZF9wZm4gPSBlbmRfcGZuOworCXAtPnB4bSA9IHB4bTsKKworCW51bV9tZW1vcnlfY2h1bmtzKys7CisKKwlwcmludGsoIk1lbW9yeSByYW5nZSAweCVsWCB0byAweCVsWCAodHlwZSAweCVYKSBpbiBwcm94aW1pdHkgZG9tYWluIDB4JTAyWCAlc1xuIiwKKwkJc3RhcnRfcGZuLCBlbmRfcGZuLAorCQltZW1vcnlfYWZmaW5pdHktPm1lbW9yeV90eXBlLAorCQltZW1vcnlfYWZmaW5pdHktPnByb3hpbWl0eV9kb21haW4sCisJCShtZW1vcnlfYWZmaW5pdHktPmZsYWdzLmhvdF9wbHVnZ2FibGUgPworCQkgImVuYWJsZWQgYW5kIHJlbW92YWJsZSIgOiAiZW5hYmxlZCIgKSApOworfQorCisjaWYgTUFYX05SX1pPTkVTICE9IDMKKyNlcnJvciAiTUFYX05SX1pPTkVTICE9IDMsIGNodW5rX3RvX3pvbmUgcmVxdWlyZXMgcmV2aWV3IgorI2VuZGlmCisvKiBUYWtlIGEgY2h1bmsgb2YgcGFnZXMgZnJvbSBwYWdlIGZyYW1lIGNzdGFydCB0byBjZW5kIGFuZCBjb3VudCB0aGUgbnVtYmVyCisgKiBvZiBwYWdlcyBpbiBlYWNoIHpvbmUsIHJldHVybmVkIHZpYSB6b25lc1tdLgorICovCitzdGF0aWMgX19pbml0IHZvaWQgY2h1bmtfdG9fem9uZXModW5zaWduZWQgbG9uZyBjc3RhcnQsIHVuc2lnbmVkIGxvbmcgY2VuZCwgCisJCXVuc2lnbmVkIGxvbmcgKnpvbmVzKQoreworCXVuc2lnbmVkIGxvbmcgbWF4X2RtYTsKKwlleHRlcm4gdW5zaWduZWQgbG9uZyBtYXhfbG93X3BmbjsKKworCWludCB6OworCXVuc2lnbmVkIGxvbmcgcmVuZDsKKworCS8qIEZJWE1FOiBNQVhfRE1BX0FERFJFU1MgYW5kIG1heF9sb3dfcGZuIGFyZSB0cnlpbmcgdG8gcHJvdmlkZQorCSAqIHNpbWlsYXJseSBzY29wZWQgaW5mb3JtYXRpb24gYW5kIHNob3VsZCBiZSBoYW5kbGVkIGluIGEgY29uc2lzdGFudAorCSAqIG1hbm5lci4KKwkgKi8KKwltYXhfZG1hID0gdmlydF90b19waHlzKChjaGFyICopTUFYX0RNQV9BRERSRVNTKSA+PiBQQUdFX1NISUZUOworCisJLyogU3BsaXQgdGhlIGhvbGUgaW50byB0aGUgem9uZXMgaW4gd2hpY2ggaXQgZmFsbHMuICBSZXBlYXRlZGx5CisJICogdGFrZSB0aGUgc2VnbWVudCBpbiB3aGljaCB0aGUgcmVtYWluaW5nIGhvbGUgc3RhcnRzLCByb3VuZCBpdAorCSAqIHRvIHRoZSBlbmQgb2YgdGhhdCB6b25lLgorCSAqLworCW1lbXNldCh6b25lcywgMCwgTUFYX05SX1pPTkVTICogc2l6ZW9mKGxvbmcpKTsKKwl3aGlsZSAoY3N0YXJ0IDwgY2VuZCkgeworCQlpZiAoY3N0YXJ0IDwgbWF4X2RtYSkgeworCQkJeiA9IFpPTkVfRE1BOworCQkJcmVuZCA9IChjZW5kIDwgbWF4X2RtYSk/IGNlbmQgOiBtYXhfZG1hOworCisJCX0gZWxzZSBpZiAoY3N0YXJ0IDwgbWF4X2xvd19wZm4pIHsKKwkJCXogPSBaT05FX05PUk1BTDsKKwkJCXJlbmQgPSAoY2VuZCA8IG1heF9sb3dfcGZuKT8gY2VuZCA6IG1heF9sb3dfcGZuOworCisJCX0gZWxzZSB7CisJCQl6ID0gWk9ORV9ISUdITUVNOworCQkJcmVuZCA9IGNlbmQ7CisJCX0KKwkJem9uZXNbel0gKz0gcmVuZCAtIGNzdGFydDsKKwkJY3N0YXJ0ID0gcmVuZDsKKwl9Cit9CisKKy8qCisgKiBUaGUgU1JBVCB0YWJsZSBhbHdheXMgbGlzdHMgYXNjZW5kaW5nIGFkZHJlc3Nlcywgc28gY2FuIGFsd2F5cworICogYXNzdW1lIHRoYXQgdGhlIGZpcnN0ICJzdGFydCIgYWRkcmVzcyB0aGF0IHlvdSBzZWUgaXMgdGhlIHJlYWwKKyAqIHN0YXJ0IG9mIHRoZSBub2RlLCBhbmQgdGhhdCB0aGUgY3VycmVudCAiZW5kIiBhZGRyZXNzIGlzIGFmdGVyCisgKiB0aGUgcHJldmlvdXMgb25lLgorICovCitzdGF0aWMgX19pbml0IHZvaWQgbm9kZV9yZWFkX2NodW5rKGludCBuaWQsIHN0cnVjdCBub2RlX21lbW9yeV9jaHVua19zICptZW1vcnlfY2h1bmspCit7CisJLyoKKwkgKiBPbmx5IGFkZCBwcmVzZW50IG1lbW9yeSBhcyB0b2xkIGJ5IHRoZSBlODIwLgorCSAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSBmcm9tIHRoZSBTUkFUIHRoYXQgdGhlIG1lbW9yeSBpdAorCSAqIGVudW1lcmF0ZXMgaXMgcHJlc2VudCBhdCBib290IHRpbWUgYmVjYXVzZSBpdCByZXByZXNlbnRzCisJICogKnBvc3NpYmxlKiBtZW1vcnkgaG90cGx1ZyBhcmVhcyB0aGUgc2FtZSBhcyBub3JtYWwgUkFNLgorCSAqLworCWlmIChtZW1vcnlfY2h1bmstPnN0YXJ0X3BmbiA+PSBtYXhfcGZuKSB7CisJCXByaW50ayAoS0VSTl9JTkZPICJJZ25vcmluZyBTUkFUIHBmbnM6IDB4JTA4bHggLT4gJTA4bHhcbiIsCisJCQltZW1vcnlfY2h1bmstPnN0YXJ0X3BmbiwgbWVtb3J5X2NodW5rLT5lbmRfcGZuKTsKKwkJcmV0dXJuOworCX0KKwlpZiAobWVtb3J5X2NodW5rLT5uaWQgIT0gbmlkKQorCQlyZXR1cm47CisKKwlpZiAoIW5vZGVfaGFzX29ubGluZV9tZW0obmlkKSkKKwkJbm9kZV9zdGFydF9wZm5bbmlkXSA9IG1lbW9yeV9jaHVuay0+c3RhcnRfcGZuOworCisJaWYgKG5vZGVfc3RhcnRfcGZuW25pZF0gPiBtZW1vcnlfY2h1bmstPnN0YXJ0X3BmbikKKwkJbm9kZV9zdGFydF9wZm5bbmlkXSA9IG1lbW9yeV9jaHVuay0+c3RhcnRfcGZuOworCisJaWYgKG5vZGVfZW5kX3BmbltuaWRdIDwgbWVtb3J5X2NodW5rLT5lbmRfcGZuKQorCQlub2RlX2VuZF9wZm5bbmlkXSA9IG1lbW9yeV9jaHVuay0+ZW5kX3BmbjsKK30KKworLyogUGFyc2UgdGhlIEFDUEkgU3RhdGljIFJlc291cmNlIEFmZmluaXR5IFRhYmxlICovCitzdGF0aWMgaW50IF9faW5pdCBhY3BpMjBfcGFyc2Vfc3JhdChzdHJ1Y3QgYWNwaV90YWJsZV9zcmF0ICpzcmF0cCkKK3sKKwl1OCAqc3RhcnQsICplbmQsICpwOworCWludCBpLCBqLCBuaWQ7CisJdTggcHhtX3RvX25pZF9tYXBbTUFYX1BYTV9ET01BSU5TXTsvKiBfUFhNIHRvIGxvZ2ljYWwgbm9kZSBJRCBtYXAgKi8KKwl1OCBuaWRfdG9fcHhtX21hcFtNQVhfTlVNTk9ERVNdOy8qIGxvZ2ljYWwgbm9kZSBJRCB0byBfUFhNIG1hcCAqLworCisJc3RhcnQgPSAodTggKikoJihzcmF0cC0+cmVzZXJ2ZWQpICsgMSk7CS8qIHNraXAgaGVhZGVyICovCisJcCA9IHN0YXJ0OworCWVuZCA9ICh1OCAqKXNyYXRwICsgc3JhdHAtPmhlYWRlci5sZW5ndGg7CisKKwltZW1zZXQocHhtX2JpdG1hcCwgMCwgc2l6ZW9mKHB4bV9iaXRtYXApKTsJLyogaW5pdCBwcm94aW1pdHkgZG9tYWluIGJpdG1hcCAqLworCW1lbXNldChub2RlX21lbW9yeV9jaHVuaywgMCwgc2l6ZW9mKG5vZGVfbWVtb3J5X2NodW5rKSk7CisJbWVtc2V0KHpob2xlc19zaXplLCAwLCBzaXplb2YoemhvbGVzX3NpemUpKTsKKworCS8qIC0xIGluIHRoZXNlIG1hcHMgbWVhbnMgbm90IGF2YWlsYWJsZSAqLworCW1lbXNldChweG1fdG9fbmlkX21hcCwgLTEsIHNpemVvZihweG1fdG9fbmlkX21hcCkpOworCW1lbXNldChuaWRfdG9fcHhtX21hcCwgLTEsIHNpemVvZihuaWRfdG9fcHhtX21hcCkpOworCisJbnVtX21lbW9yeV9jaHVua3MgPSAwOworCXdoaWxlIChwIDwgZW5kKSB7CisJCXN3aXRjaCAoKnApIHsKKwkJY2FzZSBBQ1BJX1NSQVRfUFJPQ0VTU09SX0FGRklOSVRZOgorCQkJcGFyc2VfY3B1X2FmZmluaXR5X3N0cnVjdHVyZShwKTsKKwkJCWJyZWFrOworCQljYXNlIEFDUElfU1JBVF9NRU1PUllfQUZGSU5JVFk6CisJCQlwYXJzZV9tZW1vcnlfYWZmaW5pdHlfc3RydWN0dXJlKHApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoIkFDUEkgMi4wIFNSQVQ6IHVua25vd24gZW50cnkgc2tpcHBlZDogdHlwZT0weCUwMlgsIGxlbj0lZFxuIiwgcFswXSwgcFsxXSk7CisJCQlicmVhazsKKwkJfQorCQlwICs9IHBbMV07CisJCWlmIChwWzFdID09IDApIHsKKwkJCXByaW50aygiYWNwaTIwX3BhcnNlX3NyYXQ6IEVudHJ5IGxlbmd0aCB2YWx1ZSBpcyB6ZXJvOyIKKwkJCQkiIGNhbid0IHBhcnNlIGFueSBmdXJ0aGVyIVxuIik7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChudW1fbWVtb3J5X2NodW5rcyA9PSAwKSB7CisJCXByaW50aygiY291bGQgbm90IGZpbnkgYW55IEFDUEkgU1JBVCBtZW1vcnkgYXJlYXMuXG4iKTsKKwkJZ290byBvdXRfZmFpbDsKKwl9CisKKwkvKiBDYWxjdWxhdGUgdG90YWwgbnVtYmVyIG9mIG5vZGVzIGluIHN5c3RlbSBmcm9tIFBYTSBiaXRtYXAgYW5kIGNyZWF0ZQorCSAqIGEgc2V0IG9mIHNlcXVlbnRpYWwgbm9kZSBJRHMgc3RhcnRpbmcgYXQgemVyby4gIChBQ1BJIGRvZXNuJ3Qgc2VlbQorCSAqIHRvIHNwZWNpZnkgdGhlIHJhbmdlIG9mIF9QWE0gdmFsdWVzLikKKwkgKi8KKwkvKgorCSAqIE1DRCAtIHdlIG5vIGxvbmdlciBIQVZFIHRvIG51bWJlciBub2RlcyBzZXF1ZW50aWFsbHkuICBQWE0gZG9tYWluCisJICogbnVtYmVycyBjb3VsZCBnbyBhcyBoaWdoIGFzIDI1NiwgYW5kIE1BWF9OVU1OT0RFUyBmb3IgaTM4NiBpcyB0eXBpY2FsbHkKKwkgKiAzMiwgc28gd2Ugd2lsbCBjb250aW51ZSBudW1iZXJpbmcgdGhlbSBpbiB0aGlzIG1hbm5lciB1bnRpbCBNQVhfTlVNTk9ERVMKKwkgKiBhcHByb2FjaGVzIE1BWF9QWE1fRE9NQUlOUyBmb3IgaTM4Ni4KKwkgKi8KKwlub2Rlc19jbGVhcihub2RlX29ubGluZV9tYXApOworCWZvciAoaSA9IDA7IGkgPCBNQVhfUFhNX0RPTUFJTlM7IGkrKykgeworCQlpZiAoQk1BUF9URVNUKHB4bV9iaXRtYXAsIGkpKSB7CisJCQluaWQgPSBudW1fb25saW5lX25vZGVzKCk7CisJCQlweG1fdG9fbmlkX21hcFtpXSA9IG5pZDsKKwkJCW5pZF90b19weG1fbWFwW25pZF0gPSBpOworCQkJbm9kZV9zZXRfb25saW5lKG5pZCk7CisJCX0KKwl9CisJQlVHX09OKG51bV9vbmxpbmVfbm9kZXMoKSA9PSAwKTsKKworCS8qIHNldCBjbm9kZSBpZCBpbiBtZW1vcnkgY2h1bmsgc3RydWN0dXJlICovCisJZm9yIChpID0gMDsgaSA8IG51bV9tZW1vcnlfY2h1bmtzOyBpKyspCisJCW5vZGVfbWVtb3J5X2NodW5rW2ldLm5pZCA9IHB4bV90b19uaWRfbWFwW25vZGVfbWVtb3J5X2NodW5rW2ldLnB4bV07CisKKwlwcmludGsoInB4bSBiaXRtYXA6ICIpOworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YocHhtX2JpdG1hcCk7IGkrKykgeworCQlwcmludGsoIiUwMlggIiwgcHhtX2JpdG1hcFtpXSk7CisJfQorCXByaW50aygiXG4iKTsKKwlwcmludGsoIk51bWJlciBvZiBsb2dpY2FsIG5vZGVzIGluIHN5c3RlbSA9ICVkXG4iLCBudW1fb25saW5lX25vZGVzKCkpOworCXByaW50aygiTnVtYmVyIG9mIG1lbW9yeSBjaHVua3MgaW4gc3lzdGVtID0gJWRcbiIsIG51bV9tZW1vcnlfY2h1bmtzKTsKKworCWZvciAoaiA9IDA7IGogPCBudW1fbWVtb3J5X2NodW5rczsgaisrKXsKKwkJc3RydWN0IG5vZGVfbWVtb3J5X2NodW5rX3MgKiBjaHVuayA9ICZub2RlX21lbW9yeV9jaHVua1tqXTsKKwkJcHJpbnRrKCJjaHVuayAlZCBuaWQgJWQgc3RhcnRfcGZuICUwOGx4IGVuZF9wZm4gJTA4bHhcbiIsCisJCSAgICAgICBqLCBjaHVuay0+bmlkLCBjaHVuay0+c3RhcnRfcGZuLCBjaHVuay0+ZW5kX3Bmbik7CisJCW5vZGVfcmVhZF9jaHVuayhjaHVuay0+bmlkLCBjaHVuayk7CisJfQorIAorCWZvcl9lYWNoX29ubGluZV9ub2RlKG5pZCkgeworCQl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gbm9kZV9zdGFydF9wZm5bbmlkXTsKKwkJdW5zaWduZWQgbG9uZyBlbmQgPSBub2RlX2VuZF9wZm5bbmlkXTsKKworCQltZW1vcnlfcHJlc2VudChuaWQsIHN0YXJ0LCBlbmQpOworCQlub2RlX3JlbWFwX3NpemVbbmlkXSA9IG5vZGVfbWVtbWFwX3NpemVfYnl0ZXMobmlkLCBzdGFydCwgZW5kKTsKKwl9CisJcmV0dXJuIDE7CitvdXRfZmFpbDoKKwlyZXR1cm4gMDsKK30KKworaW50IF9faW5pdCBnZXRfbWVtY2ZnX2Zyb21fc3JhdCh2b2lkKQoreworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqaGVhZGVyID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9yc2RwICpyc2RwID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9yc2R0ICpyc2R0ID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9wb2ludGVyICpyc2RwX2FkZHJlc3MgPSBOVUxMOworCXN0cnVjdCBhY3BpX3RhYmxlX3JzZHQgc2F2ZWRfcnNkdDsKKwlpbnQgdGFibGVzID0gMDsKKwlpbnQgaSA9IDA7CisKKwlhY3BpX2ZpbmRfcm9vdF9wb2ludGVyKEFDUElfUEhZU0lDQUxfQUREUkVTU0lORywgcnNkcF9hZGRyZXNzKTsKKworCWlmIChyc2RwX2FkZHJlc3MtPnBvaW50ZXJfdHlwZSA9PSBBQ1BJX1BIWVNJQ0FMX1BPSU5URVIpIHsKKwkJcHJpbnRrKCIlczogYXNzaWduaW5nIGFkZHJlc3MgdG8gcnNkcFxuIiwgX19GVU5DVElPTl9fKTsKKwkJcnNkcCA9IChzdHJ1Y3QgYWNwaV90YWJsZV9yc2RwICopCisJCQkJKHUzMilyc2RwX2FkZHJlc3MtPnBvaW50ZXIucGh5c2ljYWw7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCIlczogcnNkcF9hZGRyZXNzIGlzIG5vdCBhIHBoeXNpY2FsIHBvaW50ZXJcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gb3V0X2VycjsKKwl9CisJaWYgKCFyc2RwKSB7CisJCXByaW50aygiJXM6IERpZG4ndCBmaW5kIEFDUEkgcm9vdCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIlLjhzIHYlZCBbJS42c11cbiIsIHJzZHAtPnNpZ25hdHVyZSwgcnNkcC0+cmV2aXNpb24sCisJCXJzZHAtPm9lbV9pZCk7CisKKwlpZiAoc3RybmNtcChyc2RwLT5zaWduYXR1cmUsIFJTRFBfU0lHLHN0cmxlbihSU0RQX1NJRykpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSU0RQIHRhYmxlIHNpZ25hdHVyZSBpbmNvcnJlY3RcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlyc2R0ID0gKHN0cnVjdCBhY3BpX3RhYmxlX3JzZHQgKikKKwkgICAgYm9vdF9pb3JlbWFwKHJzZHAtPnJzZHRfYWRkcmVzcywgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX3JzZHQpKTsKKworCWlmICghcnNkdCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiJXM6IEFDUEk6IEludmFsaWQgcm9vdCBzeXN0ZW0gZGVzY3JpcHRpb24gdGFibGVzIChSU0RUKVxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwloZWFkZXIgPSAmIHJzZHQtPmhlYWRlcjsKKworCWlmIChzdHJuY21wKGhlYWRlci0+c2lnbmF0dXJlLCBSU0RUX1NJRywgc3RybGVuKFJTRFRfU0lHKSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQUNQSTogUlNEVCBzaWduYXR1cmUgaW5jb3JyZWN0XG4iKTsKKwkJZ290byBvdXRfZXJyOworCX0KKworCS8qIAorCSAqIFRoZSBudW1iZXIgb2YgdGFibGVzIGlzIGNvbXB1dGVkIGJ5IHRha2luZyB0aGUgCisJICogc2l6ZSBvZiBhbGwgZW50cmllcyAoaGVhZGVyIHNpemUgbWludXMgdG90YWwgCisJICogc2l6ZSBvZiBSU0RUKSBkaXZpZGVkIGJ5IHRoZSBzaXplIG9mIGVhY2ggZW50cnkKKwkgKiAoNC1ieXRlIHRhYmxlIHBvaW50ZXJzKS4KKwkgKi8KKwl0YWJsZXMgPSAoaGVhZGVyLT5sZW5ndGggLSBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSkgLyA0OworCisJaWYgKCF0YWJsZXMpCisJCWdvdG8gb3V0X2VycjsKKworCW1lbWNweSgmc2F2ZWRfcnNkdCwgcnNkdCwgc2l6ZW9mKHNhdmVkX3JzZHQpKTsKKworCWlmIChzYXZlZF9yc2R0LmhlYWRlci5sZW5ndGggPiBzaXplb2Yoc2F2ZWRfcnNkdCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQUNQSTogVG9vIGJpZyBsZW5ndGggaW4gUlNEVDogJWRcbiIsCisJCSAgICAgICBzYXZlZF9yc2R0LmhlYWRlci5sZW5ndGgpOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJcHJpbnRrKCJCZWdpbiBTUkFUIHRhYmxlIHNjYW4uLi4uXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCB0YWJsZXM7IGkrKykgeworCQkvKiBNYXAgaW4gaGVhZGVyLCB0aGVuIG1hcCBpbiBmdWxsIHRhYmxlIGxlbmd0aC4gKi8KKwkJaGVhZGVyID0gKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKQorCQkJYm9vdF9pb3JlbWFwKHNhdmVkX3JzZHQuZW50cnlbaV0sIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKKwkJaWYgKCFoZWFkZXIpCisJCQlicmVhazsKKwkJaGVhZGVyID0gKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKQorCQkJYm9vdF9pb3JlbWFwKHNhdmVkX3JzZHQuZW50cnlbaV0sIGhlYWRlci0+bGVuZ3RoKTsKKwkJaWYgKCFoZWFkZXIpCisJCQlicmVhazsKKworCQlpZiAoc3RybmNtcCgoY2hhciAqKSAmaGVhZGVyLT5zaWduYXR1cmUsICJTUkFUIiwgNCkpCisJCQljb250aW51ZTsKKworCQkvKiB3ZSd2ZSBmb3VuZCB0aGUgc3JhdCB0YWJsZS4gZG9uJ3QgbmVlZCB0byBsb29rIGF0IGFueSBtb3JlIHRhYmxlcyAqLworCQlyZXR1cm4gYWNwaTIwX3BhcnNlX3NyYXQoKHN0cnVjdCBhY3BpX3RhYmxlX3NyYXQgKiloZWFkZXIpOworCX0KK291dF9lcnI6CisJcHJpbnRrKCJmYWlsZWQgdG8gZ2V0IE5VTUEgbWVtb3J5IGluZm9ybWF0aW9uIGZyb20gU1JBVCB0YWJsZVxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qIEZvciBlYWNoIG5vZGUgcnVuIHRoZSBtZW1vcnkgbGlzdCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGVyZSBhcmUKKyAqIGFueSBtZW1vcnkgaG9sZXMuICBGb3IgZWFjaCBob2xlIGRldGVybWluZSB3aGljaCBaT05FIHRoZXkgZmFsbAorICogaW50by4KKyAqCisgKiBOT1RFIzE6IHRoaXMgcmVxdWlyZXMga25vd2xlZGdlIG9mIHRoZSB6b25lIGJvdW5kcmllcyBhbmQgc28KKyAqIF9jYW5ub3RfIGJlIHBlcmZvcm1lZCBiZWZvcmUgdGhvc2UgYXJlIGNhbGN1bGF0ZWQgaW4gc2V0dXBfbWVtb3J5LgorICogCisgKiBOT1RFIzI6IHdlIHJlbHkgb24gdGhlIGZhY3QgdGhhdCB0aGUgbWVtb3J5IGNodW5rcyBhcmUgb3JkZXJlZCBieQorICogc3RhcnQgcGZuIG51bWJlciBkdXJpbmcgc2V0dXAuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBnZXRfemhvbGVzX2luaXQodm9pZCkKK3sKKwlpbnQgbmlkOworCWludCBjOworCWludCBmaXJzdDsKKwl1bnNpZ25lZCBsb25nIGVuZCA9IDA7CisKKwlmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpIHsKKwkJZmlyc3QgPSAxOworCQlmb3IgKGMgPSAwOyBjIDwgbnVtX21lbW9yeV9jaHVua3M7IGMrKyl7CisJCQlpZiAobm9kZV9tZW1vcnlfY2h1bmtbY10ubmlkID09IG5pZCkgeworCQkJCWlmIChmaXJzdCkgeworCQkJCQllbmQgPSBub2RlX21lbW9yeV9jaHVua1tjXS5lbmRfcGZuOworCQkJCQlmaXJzdCA9IDA7CisKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBSZWNvcmQgYW55IGdhcCBiZXR3ZWVuIHRoaXMgY2h1bmsKKwkJCQkJICogYW5kIHRoZSBwcmV2aW91cyBjaHVuayBvbiB0aGlzIG5vZGUKKwkJCQkJICogYWdhaW5zdCB0aGUgem9uZXMgaXQgc3BhbnMuCisJCQkJCSAqLworCQkJCQljaHVua190b196b25lcyhlbmQsCisJCQkJCQlub2RlX21lbW9yeV9jaHVua1tjXS5zdGFydF9wZm4sCisJCQkJCQkmemhvbGVzX3NpemVbbmlkICogTUFYX05SX1pPTkVTXSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCit1bnNpZ25lZCBsb25nICogX19pbml0IGdldF96aG9sZXNfc2l6ZShpbnQgbmlkKQoreworCWlmICghemhvbGVzX3NpemVfaW5pdCkgeworCQl6aG9sZXNfc2l6ZV9pbml0Kys7CisJCWdldF96aG9sZXNfaW5pdCgpOworCX0KKwlpZiAobmlkID49IE1BWF9OVU1OT0RFUyB8fCAhbm9kZV9vbmxpbmUobmlkKSkKKwkJcHJpbnRrKCIlczogbmlkID0gJWQgaXMgaW52YWxpZC9vZmZsaW5lLiBudW1fb25saW5lX25vZGVzID0gJWQiLAorCQkgICAgICAgX19GVU5DVElPTl9fLCBuaWQsIG51bV9vbmxpbmVfbm9kZXMoKSk7CisJcmV0dXJuICZ6aG9sZXNfc2l6ZVtuaWQgKiBNQVhfTlJfWk9ORVNdOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zdW1taXQuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc3VtbWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBlMDFhMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvc3VtbWl0LmMKQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiBhcmNoL2kzODYva2VybmVsL3N1bW1pdC5jIC0gSUJNIFN1bW1pdC1TcGVjaWZpYyBDb2RlCisgKgorICogV3JpdHRlbiBCeTogTWF0dGhldyBEb2Jzb24sIElCTSBDb3Jwb3JhdGlvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBJQk0gQ29ycC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIFNlbmQgZmVlZGJhY2sgdG8gPGNvbHBhdGNoQHVzLmlibS5jb20+CisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1zdW1taXQvbWFjaF9tcHBhcnNlLmg+CisKK3N0YXRpYyBzdHJ1Y3QgcmlvX3RhYmxlX2hkciAqcmlvX3RhYmxlX2hkciBfX2luaXRkYXRhOworc3RhdGljIHN0cnVjdCBzY2FsX2RldGFpbCAgICpzY2FsX2RldnNbTUFYX05VTU5PREVTXSBfX2luaXRkYXRhOworc3RhdGljIHN0cnVjdCByaW9fZGV0YWlsICAgICpyaW9fZGV2c1tNQVhfTlVNTk9ERVMqNF0gX19pbml0ZGF0YTsKKworc3RhdGljIGludCBfX2luaXQgc2V0dXBfcGNpX25vZGVfbWFwX2Zvcl93cGVnKGludCB3cGVnX251bSwgaW50IGxhc3RfYnVzKQoreworCWludCB0d2lzdGVyID0gMCwgbm9kZSA9IDA7CisJaW50IGksIGJ1cywgbnVtX2J1c2VzOworCisJZm9yKGkgPSAwOyBpIDwgcmlvX3RhYmxlX2hkci0+bnVtX3Jpb19kZXY7IGkrKyl7CisJCWlmIChyaW9fZGV2c1tpXS0+bm9kZV9pZCA9PSByaW9fZGV2c1t3cGVnX251bV0tPm93bmVyX2lkKXsKKwkJCXR3aXN0ZXIgPSByaW9fZGV2c1tpXS0+b3duZXJfaWQ7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoaSA9PSByaW9fdGFibGVfaGRyLT5udW1fcmlvX2Rldil7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENvdWxkbid0IGZpbmQgb3duZXIgQ3ljbG9uZSBmb3IgV2lubmlwZWchXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gbGFzdF9idXM7CisJfQorCisJZm9yKGkgPSAwOyBpIDwgcmlvX3RhYmxlX2hkci0+bnVtX3NjYWxfZGV2OyBpKyspeworCQlpZiAoc2NhbF9kZXZzW2ldLT5ub2RlX2lkID09IHR3aXN0ZXIpeworCQkJbm9kZSA9IHNjYWxfZGV2c1tpXS0+bm9kZV9pZDsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChpID09IHJpb190YWJsZV9oZHItPm51bV9zY2FsX2Rldil7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENvdWxkbid0IGZpbmQgb3duZXIgVHdpc3RlciBmb3IgQ3ljbG9uZSFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBsYXN0X2J1czsKKwl9CisKKwlzd2l0Y2ggKHJpb19kZXZzW3dwZWdfbnVtXS0+dHlwZSl7CisJY2FzZSBDb21wYXRXUEVHOgorCQkvKiBUaGUgQ29tcGF0YWJpbGl0eSBXaW5uaXBlZyBjb250cm9scyB0aGUgMiBsZWdhY3kgYnVzZXMsCisJCSAqIHRoZSA2Nk1IeiBQQ0kgYnVzIFsyIHNsb3RzXSBhbmQgdGhlIDIgImV4dHJhIiBidXNlcyBpbiBjYXNlCisJCSAqIGEgUENJLVBDSSBicmlkZ2UgY2FyZCBpcyB1c2VkIGluIGVpdGhlciBzbG90OiB0b3RhbCA1IGJ1c2VzLgorCQkgKi8KKwkJbnVtX2J1c2VzID0gNTsKKwkJYnJlYWs7CisJY2FzZSBBbHRXUEVHOgorCQkvKiBUaGUgQWx0ZXJuYXRlIFdpbm5pcGVnIGNvbnRyb2xzIHRoZSAyIDEzM01IeiBidXNlcyBbMSBzbG90CisJCSAqIGVhY2hdLCB0aGVpciAyICJleHRyYSIgYnVzZXMsIHRoZSAxMDBNSHogYnVzIFsyIHNsb3RzXSBhbmQKKwkJICogdGhlICJleHRyYSIgYnVzZXMgZm9yIGVhY2ggb2YgdGhvc2Ugc2xvdHM6IHRvdGFsIDcgYnVzZXMuCisJCSAqLworCQludW1fYnVzZXMgPSA3OworCQlicmVhazsKKwljYXNlIExvb2tPdXRBV1BFRzoKKwljYXNlIExvb2tPdXRCV1BFRzoKKwkJLyogQSBMb29rb3V0IFdpbm5pcGVnIGNvbnRyb2xzIDMgMTAwTUh6IGJ1c2VzIFsyIHNsb3RzIGVhY2hdCisJCSAqICYgdGhlICJleHRyYSIgYnVzZXMgZm9yIGVhY2ggb2YgdGhvc2Ugc2xvdHM6IHRvdGFsIDkgYnVzZXMuCisJCSAqLworCQludW1fYnVzZXMgPSA5OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9JTkZPICIlczogVW5zdXBwb3J0ZWQgV2lubmlwZWcgdHlwZSFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBsYXN0X2J1czsKKwl9CisKKwlmb3IoYnVzID0gbGFzdF9idXM7IGJ1cyA8IGxhc3RfYnVzICsgbnVtX2J1c2VzOyBidXMrKykKKwkJbXBfYnVzX2lkX3RvX25vZGVbYnVzXSA9IG5vZGU7CisJcmV0dXJuIGJ1czsKK30KKworc3RhdGljIGludCBfX2luaXQgYnVpbGRfZGV0YWlsX2FycmF5cyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgcHRyOworCWludCBpLCBzY2FsX2RldGFpbF9zaXplLCByaW9fZGV0YWlsX3NpemU7CisKKwlpZiAocmlvX3RhYmxlX2hkci0+bnVtX3NjYWxfZGV2ID4gTUFYX05VTU5PREVTKXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE1BWF9OVU1OT0RFUyB0b28gbG93ISAgRGVmaW5lZCBhcyAlZCwgYnV0IHN5c3RlbSBoYXMgJWQgbm9kZXMuXG4iLCBfX0ZVTkNUSU9OX18sIE1BWF9OVU1OT0RFUywgcmlvX3RhYmxlX2hkci0+bnVtX3NjYWxfZGV2KTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3dpdGNoIChyaW9fdGFibGVfaGRyLT52ZXJzaW9uKXsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogSW52YWxpZCBSaW8gR3JhbmRlIFRhYmxlIFZlcnNpb246ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJpb190YWJsZV9oZHItPnZlcnNpb24pOworCQlyZXR1cm4gMDsKKwljYXNlIDI6CisJCXNjYWxfZGV0YWlsX3NpemUgPSAxMTsKKwkJcmlvX2RldGFpbF9zaXplID0gMTM7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJc2NhbF9kZXRhaWxfc2l6ZSA9IDEyOworCQlyaW9fZGV0YWlsX3NpemUgPSAxNTsKKwkJYnJlYWs7CisJfQorCisJcHRyID0gKHVuc2lnbmVkIGxvbmcpcmlvX3RhYmxlX2hkciArIDM7CisJZm9yKGkgPSAwOyBpIDwgcmlvX3RhYmxlX2hkci0+bnVtX3NjYWxfZGV2OyBpKyssIHB0ciArPSBzY2FsX2RldGFpbF9zaXplKQorCQlzY2FsX2RldnNbaV0gPSAoc3RydWN0IHNjYWxfZGV0YWlsICopcHRyOworCisJZm9yKGkgPSAwOyBpIDwgcmlvX3RhYmxlX2hkci0+bnVtX3Jpb19kZXY7IGkrKywgcHRyICs9IHJpb19kZXRhaWxfc2l6ZSkKKwkJcmlvX2RldnNbaV0gPSAoc3RydWN0IHJpb19kZXRhaWwgKilwdHI7CisKKwlyZXR1cm4gMTsKK30KKwordm9pZCBfX2luaXQgc2V0dXBfc3VtbWl0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZwkJcHRyOworCXVuc2lnbmVkIHNob3J0CQlvZmZzZXQ7CisJaW50CQkJaSwgbmV4dF93cGVnLCBuZXh0X2J1cyA9IDA7CisKKwkvKiBUaGUgcG9pbnRlciB0byB0aGUgRUJEQSBpcyBzdG9yZWQgaW4gdGhlIHdvcmQgQCBwaHlzIDB4NDBFKDQwOjBFKSAqLworCXB0ciA9ICoodW5zaWduZWQgc2hvcnQgKilwaHlzX3RvX3ZpcnQoMHg0MEV1bCk7CisJcHRyID0gKHVuc2lnbmVkIGxvbmcpcGh5c190b192aXJ0KHB0ciA8PCA0KTsKKworCXJpb190YWJsZV9oZHIgPSBOVUxMOworCW9mZnNldCA9IDB4MTgwOworCXdoaWxlIChvZmZzZXQpeworCQkvKiBUaGUgYmxvY2sgaWQgaXMgc3RvcmVkIGluIHRoZSAybmQgd29yZCAqLworCQlpZiAoKigodW5zaWduZWQgc2hvcnQgKikocHRyICsgb2Zmc2V0ICsgMikpID09IDB4NDc1Mil7CisJCQkvKiBzZXQgdGhlIHBvaW50ZXIgcGFzdCB0aGUgb2Zmc2V0ICYgYmxvY2sgaWQgKi8KKwkJCXJpb190YWJsZV9oZHIgPSAoc3RydWN0IHJpb190YWJsZV9oZHIgKikocHRyICsgb2Zmc2V0ICsgNCk7CisJCQlicmVhazsKKwkJfQorCQkvKiBUaGUgbmV4dCBvZmZzZXQgaXMgc3RvcmVkIGluIHRoZSAxc3Qgd29yZC4gIDAgbWVhbnMgbm8gbW9yZSAqLworCQlvZmZzZXQgPSAqKCh1bnNpZ25lZCBzaG9ydCAqKShwdHIgKyBvZmZzZXQpKTsKKwl9CisJaWYgKCFyaW9fdGFibGVfaGRyKXsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIGxvY2F0ZSBSaW8gR3JhbmRlIFRhYmxlIGluIEVCREEgLSBiYWlsaW5nIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghYnVpbGRfZGV0YWlsX2FycmF5cygpKQorCQlyZXR1cm47CisKKwkvKiBUaGUgZmlyc3QgV2lubmlwZWcgd2UncmUgbG9va2luZyBmb3IgaGFzIGFuIGluZGV4IG9mIDAgKi8KKwluZXh0X3dwZWcgPSAwOworCWRvIHsKKwkJZm9yKGkgPSAwOyBpIDwgcmlvX3RhYmxlX2hkci0+bnVtX3Jpb19kZXY7IGkrKyl7CisJCQlpZiAoaXNfV1BFRyhyaW9fZGV2c1tpXSkgJiYgcmlvX2RldnNbaV0tPldQX2luZGV4ID09IG5leHRfd3BlZyl7CisJCQkJLyogSXQncyB0aGUgV2lubmlwZWcgd2UncmUgbG9va2luZyBmb3IhICovCisJCQkJbmV4dF9idXMgPSBzZXR1cF9wY2lfbm9kZV9tYXBfZm9yX3dwZWcoaSwgbmV4dF9idXMpOworCQkJCW5leHRfd3BlZysrOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCS8qCisJCSAqIElmIHdlIGdvIHRocm91Z2ggYWxsIFJpbyBkZXZpY2VzIGFuZCBkb24ndCBmaW5kIG9uZSB3aXRoCisJCSAqIHRoZSBuZXh0IGluZGV4LCBpdCBtZWFucyB3ZSd2ZSBmb3VuZCBhbGwgdGhlIFdpbm5pcGVncywKKwkJICogYW5kIHRodXMgYWxsIHRoZSBQQ0kgYnVzZXMuCisJCSAqLworCQlpZiAoaSA9PSByaW9fdGFibGVfaGRyLT5udW1fcmlvX2RldikKKwkJCW5leHRfd3BlZyA9IDA7CisJfSB3aGlsZSAobmV4dF93cGVnICE9IDApOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zeXNfaTM4Ni5jIGIvYXJjaC9pMzg2L2tlcm5lbC9zeXNfaTM4Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YTYxOTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3N5c19pMzg2LmMKQEAgLTAsMCArMSwyNTIgQEAKKy8qCisgKiBsaW51eC9hcmNoL2kzODYva2VybmVsL3N5c19pMzg2LmMKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdmFyaW91cyByYW5kb20gc3lzdGVtIGNhbGxzIHRoYXQKKyAqIGhhdmUgYSBub24tc3RhbmRhcmQgY2FsbGluZyBzZXF1ZW5jZSBvbiB0aGUgTGludXgvaTM4NgorICogcGxhdGZvcm0uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2VtLmg+CisjaW5jbHVkZSA8bGludXgvbXNnLmg+CisjaW5jbHVkZSA8bGludXgvc2htLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvbW1hbi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pcGMuaD4KKworLyoKKyAqIHN5c19waXBlKCkgaXMgdGhlIG5vcm1hbCBDIGNhbGxpbmcgc3RhbmRhcmQgZm9yIGNyZWF0aW5nCisgKiBhIHBpcGUuIEl0J3Mgbm90IHRoZSB3YXkgVW5peCB0cmFkaXRpb25hbGx5IGRvZXMgdGhpcywgdGhvdWdoLgorICovCithc21saW5rYWdlIGludCBzeXNfcGlwZSh1bnNpZ25lZCBsb25nIF9fdXNlciAqIGZpbGRlcykKK3sKKwlpbnQgZmRbMl07CisJaW50IGVycm9yOworCisJZXJyb3IgPSBkb19waXBlKGZkKTsKKwlpZiAoIWVycm9yKSB7CisJCWlmIChjb3B5X3RvX3VzZXIoZmlsZGVzLCBmZCwgMipzaXplb2YoaW50KSkpCisJCQllcnJvciA9IC1FRkFVTFQ7CisJfQorCXJldHVybiBlcnJvcjsKK30KKworLyogY29tbW9uIGNvZGUgZm9yIG9sZCBhbmQgbmV3IG1tYXBzICovCitzdGF0aWMgaW5saW5lIGxvbmcgZG9fbW1hcDIoCisJdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKKwl1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJdW5zaWduZWQgbG9uZyBmZCwgdW5zaWduZWQgbG9uZyBwZ29mZikKK3sKKwlpbnQgZXJyb3IgPSAtRUJBREY7CisJc3RydWN0IGZpbGUgKiBmaWxlID0gTlVMTDsKKworCWZsYWdzICY9IH4oTUFQX0VYRUNVVEFCTEUgfCBNQVBfREVOWVdSSVRFKTsKKwlpZiAoIShmbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7CisJCWZpbGUgPSBmZ2V0KGZkKTsKKwkJaWYgKCFmaWxlKQorCQkJZ290byBvdXQ7CisJfQorCisJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwllcnJvciA9IGRvX21tYXBfcGdvZmYoZmlsZSwgYWRkciwgbGVuLCBwcm90LCBmbGFncywgcGdvZmYpOworCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCisJaWYgKGZpbGUpCisJCWZwdXQoZmlsZSk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCithc21saW5rYWdlIGxvbmcgc3lzX21tYXAyKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCisJdW5zaWduZWQgbG9uZyBwcm90LCB1bnNpZ25lZCBsb25nIGZsYWdzLAorCXVuc2lnbmVkIGxvbmcgZmQsIHVuc2lnbmVkIGxvbmcgcGdvZmYpCit7CisJcmV0dXJuIGRvX21tYXAyKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLCBwZ29mZik7Cit9CisKKy8qCisgKiBQZXJmb3JtIHRoZSBzZWxlY3QobmQsIGluLCBvdXQsIGV4LCB0dikgYW5kIG1tYXAoKSBzeXN0ZW0KKyAqIGNhbGxzLiBMaW51eC9pMzg2IGRpZG4ndCB1c2UgdG8gYmUgYWJsZSB0byBoYW5kbGUgbW9yZSB0aGFuCisgKiA0IHN5c3RlbSBjYWxsIHBhcmFtZXRlcnMsIHNvIHRoZXNlIHN5c3RlbSBjYWxscyB1c2VkIGEgbWVtb3J5CisgKiBibG9jayBmb3IgcGFyYW1ldGVyIHBhc3NpbmcuLgorICovCisKK3N0cnVjdCBtbWFwX2FyZ19zdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwl1bnNpZ25lZCBsb25nIGxlbjsKKwl1bnNpZ25lZCBsb25nIHByb3Q7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIGZkOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworfTsKKworYXNtbGlua2FnZSBpbnQgb2xkX21tYXAoc3RydWN0IG1tYXBfYXJnX3N0cnVjdCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0IGE7CisJaW50IGVyciA9IC1FRkFVTFQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmEsIGFyZywgc2l6ZW9mKGEpKSkKKwkJZ290byBvdXQ7CisKKwllcnIgPSAtRUlOVkFMOworCWlmIChhLm9mZnNldCAmIH5QQUdFX01BU0spCisJCWdvdG8gb3V0OworCisJZXJyID0gZG9fbW1hcDIoYS5hZGRyLCBhLmxlbiwgYS5wcm90LCBhLmZsYWdzLCBhLmZkLCBhLm9mZnNldCA+PiBQQUdFX1NISUZUKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCisKK3N0cnVjdCBzZWxfYXJnX3N0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBuOworCWZkX3NldCBfX3VzZXIgKmlucCwgKm91dHAsICpleHA7CisJc3RydWN0IHRpbWV2YWwgX191c2VyICp0dnA7Cit9OworCithc21saW5rYWdlIGludCBvbGRfc2VsZWN0KHN0cnVjdCBzZWxfYXJnX3N0cnVjdCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3Qgc2VsX2FyZ19zdHJ1Y3QgYTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmYSwgYXJnLCBzaXplb2YoYSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkvKiBzeXNfc2VsZWN0KCkgZG9lcyB0aGUgYXBwcm9wcmlhdGUga2VybmVsIGxvY2tpbmcgKi8KKwlyZXR1cm4gc3lzX3NlbGVjdChhLm4sIGEuaW5wLCBhLm91dHAsIGEuZXhwLCBhLnR2cCk7Cit9CisKKy8qCisgKiBzeXNfaXBjKCkgaXMgdGhlIGRlLW11bHRpcGxleGVyIGZvciB0aGUgU3lzViBJUEMgY2FsbHMuLgorICoKKyAqIFRoaXMgaXMgcmVhbGx5IGhvcnJpYmx5IHVnbHkuCisgKi8KK2FzbWxpbmthZ2UgaW50IHN5c19pcGMgKHVpbnQgY2FsbCwgaW50IGZpcnN0LCBpbnQgc2Vjb25kLAorCQkJaW50IHRoaXJkLCB2b2lkIF9fdXNlciAqcHRyLCBsb25nIGZpZnRoKQoreworCWludCB2ZXJzaW9uLCByZXQ7CisKKwl2ZXJzaW9uID0gY2FsbCA+PiAxNjsgLyogaGFjayBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLworCWNhbGwgJj0gMHhmZmZmOworCisJc3dpdGNoIChjYWxsKSB7CisJY2FzZSBTRU1PUDoKKwkJcmV0dXJuIHN5c19zZW10aW1lZG9wIChmaXJzdCwgKHN0cnVjdCBzZW1idWYgX191c2VyICopcHRyLCBzZWNvbmQsIE5VTEwpOworCWNhc2UgU0VNVElNRURPUDoKKwkJcmV0dXJuIHN5c19zZW10aW1lZG9wKGZpcnN0LCAoc3RydWN0IHNlbWJ1ZiBfX3VzZXIgKilwdHIsIHNlY29uZCwKKwkJCQkJKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKilmaWZ0aCk7CisKKwljYXNlIFNFTUdFVDoKKwkJcmV0dXJuIHN5c19zZW1nZXQgKGZpcnN0LCBzZWNvbmQsIHRoaXJkKTsKKwljYXNlIFNFTUNUTDogeworCQl1bmlvbiBzZW11biBmb3VydGg7CisJCWlmICghcHRyKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChnZXRfdXNlcihmb3VydGguX19wYWQsICh2b2lkIF9fdXNlciAqIF9fdXNlciAqKSBwdHIpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiBzeXNfc2VtY3RsIChmaXJzdCwgc2Vjb25kLCB0aGlyZCwgZm91cnRoKTsKKwl9CisKKwljYXNlIE1TR1NORDoKKwkJcmV0dXJuIHN5c19tc2dzbmQgKGZpcnN0LCAoc3RydWN0IG1zZ2J1ZiBfX3VzZXIgKikgcHRyLCAKKwkJCQkgICBzZWNvbmQsIHRoaXJkKTsKKwljYXNlIE1TR1JDVjoKKwkJc3dpdGNoICh2ZXJzaW9uKSB7CisJCWNhc2UgMDogeworCQkJc3RydWN0IGlwY19rbHVkZ2UgdG1wOworCQkJaWYgKCFwdHIpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmdG1wLAorCQkJCQkgICAoc3RydWN0IGlwY19rbHVkZ2UgX191c2VyICopIHB0ciwgCisJCQkJCSAgIHNpemVvZiAodG1wKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gc3lzX21zZ3JjdiAoZmlyc3QsIHRtcC5tc2dwLCBzZWNvbmQsCisJCQkJCSAgIHRtcC5tc2d0eXAsIHRoaXJkKTsKKwkJfQorCQlkZWZhdWx0OgorCQkJcmV0dXJuIHN5c19tc2dyY3YgKGZpcnN0LAorCQkJCQkgICAoc3RydWN0IG1zZ2J1ZiBfX3VzZXIgKikgcHRyLAorCQkJCQkgICBzZWNvbmQsIGZpZnRoLCB0aGlyZCk7CisJCX0KKwljYXNlIE1TR0dFVDoKKwkJcmV0dXJuIHN5c19tc2dnZXQgKChrZXlfdCkgZmlyc3QsIHNlY29uZCk7CisJY2FzZSBNU0dDVEw6CisJCXJldHVybiBzeXNfbXNnY3RsIChmaXJzdCwgc2Vjb25kLCAoc3RydWN0IG1zcWlkX2RzIF9fdXNlciAqKSBwdHIpOworCisJY2FzZSBTSE1BVDoKKwkJc3dpdGNoICh2ZXJzaW9uKSB7CisJCWRlZmF1bHQ6IHsKKwkJCXVsb25nIHJhZGRyOworCQkJcmV0ID0gZG9fc2htYXQgKGZpcnN0LCAoY2hhciBfX3VzZXIgKikgcHRyLCBzZWNvbmQsICZyYWRkcik7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCQlyZXR1cm4gcHV0X3VzZXIgKHJhZGRyLCAodWxvbmcgX191c2VyICopIHRoaXJkKTsKKwkJfQorCQljYXNlIDE6CS8qIGlCQ1MyIGVtdWxhdG9yIGVudHJ5IHBvaW50ICovCisJCQlpZiAoIXNlZ21lbnRfZXEoZ2V0X2ZzKCksIGdldF9kcygpKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCS8qIFRoZSAiKHVsb25nICopIHRoaXJkIiBpcyB2YWxpZCBfb25seV8gYmVjYXVzZSBvZiB0aGUga2VybmVsIHNlZ21lbnQgdGhpbmcgKi8KKwkJCXJldHVybiBkb19zaG1hdCAoZmlyc3QsIChjaGFyIF9fdXNlciAqKSBwdHIsIHNlY29uZCwgKHVsb25nICopIHRoaXJkKTsKKwkJfQorCWNhc2UgU0hNRFQ6IAorCQlyZXR1cm4gc3lzX3NobWR0ICgoY2hhciBfX3VzZXIgKilwdHIpOworCWNhc2UgU0hNR0VUOgorCQlyZXR1cm4gc3lzX3NobWdldCAoZmlyc3QsIHNlY29uZCwgdGhpcmQpOworCWNhc2UgU0hNQ1RMOgorCQlyZXR1cm4gc3lzX3NobWN0bCAoZmlyc3QsIHNlY29uZCwKKwkJCQkgICAoc3RydWN0IHNobWlkX2RzIF9fdXNlciAqKSBwdHIpOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PU1lTOworCX0KK30KKworLyoKKyAqIE9sZCBjcnVmdAorICovCithc21saW5rYWdlIGludCBzeXNfdW5hbWUoc3RydWN0IG9sZF91dHNuYW1lIF9fdXNlciAqIG5hbWUpCit7CisJaW50IGVycjsKKwlpZiAoIW5hbWUpCisJCXJldHVybiAtRUZBVUxUOworCWRvd25fcmVhZCgmdXRzX3NlbSk7CisJZXJyPWNvcHlfdG9fdXNlcihuYW1lLCAmc3lzdGVtX3V0c25hbWUsIHNpemVvZiAoKm5hbWUpKTsKKwl1cF9yZWFkKCZ1dHNfc2VtKTsKKwlyZXR1cm4gZXJyPy1FRkFVTFQ6MDsKK30KKworYXNtbGlua2FnZSBpbnQgc3lzX29sZHVuYW1lKHN0cnVjdCBvbGRvbGRfdXRzbmFtZSBfX3VzZXIgKiBuYW1lKQoreworCWludCBlcnJvcjsKKworCWlmICghbmFtZSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLG5hbWUsc2l6ZW9mKHN0cnVjdCBvbGRvbGRfdXRzbmFtZSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKyAgCisgIAlkb3duX3JlYWQoJnV0c19zZW0pOworCQorCWVycm9yID0gX19jb3B5X3RvX3VzZXIoJm5hbWUtPnN5c25hbWUsJnN5c3RlbV91dHNuYW1lLnN5c25hbWUsX19PTERfVVRTX0xFTik7CisJZXJyb3IgfD0gX19wdXRfdXNlcigwLG5hbWUtPnN5c25hbWUrX19PTERfVVRTX0xFTik7CisJZXJyb3IgfD0gX19jb3B5X3RvX3VzZXIoJm5hbWUtPm5vZGVuYW1lLCZzeXN0ZW1fdXRzbmFtZS5ub2RlbmFtZSxfX09MRF9VVFNfTEVOKTsKKwllcnJvciB8PSBfX3B1dF91c2VyKDAsbmFtZS0+bm9kZW5hbWUrX19PTERfVVRTX0xFTik7CisJZXJyb3IgfD0gX19jb3B5X3RvX3VzZXIoJm5hbWUtPnJlbGVhc2UsJnN5c3RlbV91dHNuYW1lLnJlbGVhc2UsX19PTERfVVRTX0xFTik7CisJZXJyb3IgfD0gX19wdXRfdXNlcigwLG5hbWUtPnJlbGVhc2UrX19PTERfVVRTX0xFTik7CisJZXJyb3IgfD0gX19jb3B5X3RvX3VzZXIoJm5hbWUtPnZlcnNpb24sJnN5c3RlbV91dHNuYW1lLnZlcnNpb24sX19PTERfVVRTX0xFTik7CisJZXJyb3IgfD0gX19wdXRfdXNlcigwLG5hbWUtPnZlcnNpb24rX19PTERfVVRTX0xFTik7CisJZXJyb3IgfD0gX19jb3B5X3RvX3VzZXIoJm5hbWUtPm1hY2hpbmUsJnN5c3RlbV91dHNuYW1lLm1hY2hpbmUsX19PTERfVVRTX0xFTik7CisJZXJyb3IgfD0gX19wdXRfdXNlcigwLG5hbWUtPm1hY2hpbmUrX19PTERfVVRTX0xFTik7CisJCisJdXBfcmVhZCgmdXRzX3NlbSk7CisJCisJZXJyb3IgPSBlcnJvciA/IC1FRkFVTFQgOiAwOworCisJcmV0dXJuIGVycm9yOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zeXNlbnRlci5jIGIvYXJjaC9pMzg2L2tlcm5lbC9zeXNlbnRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MGQ4YmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3N5c2VudGVyLmMKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIGxpbnV4L2FyY2gvaTM4Ni9rZXJuZWwvc3lzZW50ZXIuYworICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMiBMaW51cyBUb3J2YWxkcworICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbmVlZGVkIGluaXRpYWxpemF0aW9ucyB0byBzdXBwb3J0IHN5c2VudGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvdGhyZWFkX2luZm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgorCisjaW5jbHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4KKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgc3lzZW50ZXJfZW50cnkodm9pZCk7CisKK3ZvaWQgZW5hYmxlX3NlcF9jcHUodm9pZCAqaW5mbykKK3sKKwlpbnQgY3B1ID0gZ2V0X2NwdSgpOworCXN0cnVjdCB0c3Nfc3RydWN0ICp0c3MgPSAmcGVyX2NwdShpbml0X3RzcywgY3B1KTsKKworCXRzcy0+c3MxID0gX19LRVJORUxfQ1M7CisJdHNzLT5lc3AxID0gc2l6ZW9mKHN0cnVjdCB0c3Nfc3RydWN0KSArICh1bnNpZ25lZCBsb25nKSB0c3M7CisJd3Jtc3IoTVNSX0lBMzJfU1lTRU5URVJfQ1MsIF9fS0VSTkVMX0NTLCAwKTsKKwl3cm1zcihNU1JfSUEzMl9TWVNFTlRFUl9FU1AsIHRzcy0+ZXNwMSwgMCk7CisJd3Jtc3IoTVNSX0lBMzJfU1lTRU5URVJfRUlQLCAodW5zaWduZWQgbG9uZykgc3lzZW50ZXJfZW50cnksIDApOworCXB1dF9jcHUoKTsJCit9CisKKy8qCisgKiBUaGVzZSBzeW1ib2xzIGFyZSBkZWZpbmVkIGJ5IHZzeXNjYWxsLm8gdG8gbWFyayB0aGUgYm91bmRzCisgKiBvZiB0aGUgRUxGIERTTyBpbWFnZXMgaW5jbHVkZWQgdGhlcmVpbi4KKyAqLworZXh0ZXJuIGNvbnN0IGNoYXIgdnN5c2NhbGxfaW50ODBfc3RhcnQsIHZzeXNjYWxsX2ludDgwX2VuZDsKK2V4dGVybiBjb25zdCBjaGFyIHZzeXNjYWxsX3N5c2VudGVyX3N0YXJ0LCB2c3lzY2FsbF9zeXNlbnRlcl9lbmQ7CisKK3N0YXRpYyBpbnQgX19pbml0IHN5c2VudGVyX3NldHVwKHZvaWQpCit7CisJdm9pZCAqcGFnZSA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9BVE9NSUMpOworCisJX19zZXRfZml4bWFwKEZJWF9WU1lTQ0FMTCwgX19wYShwYWdlKSwgUEFHRV9SRUFET05MWV9FWEVDKTsKKworCWlmICghYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX1NFUCkpIHsKKwkJbWVtY3B5KHBhZ2UsCisJCSAgICAgICAmdnN5c2NhbGxfaW50ODBfc3RhcnQsCisJCSAgICAgICAmdnN5c2NhbGxfaW50ODBfZW5kIC0gJnZzeXNjYWxsX2ludDgwX3N0YXJ0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJbWVtY3B5KHBhZ2UsCisJICAgICAgICZ2c3lzY2FsbF9zeXNlbnRlcl9zdGFydCwKKwkgICAgICAgJnZzeXNjYWxsX3N5c2VudGVyX2VuZCAtICZ2c3lzY2FsbF9zeXNlbnRlcl9zdGFydCk7CisKKwlvbl9lYWNoX2NwdShlbmFibGVfc2VwX2NwdSwgTlVMTCwgMSwgMSk7CisJcmV0dXJuIDA7Cit9CisKK19faW5pdGNhbGwoc3lzZW50ZXJfc2V0dXApOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lLmMgYi9hcmNoL2kzODYva2VybmVsL3RpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjU1ZTMwZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZS5jCkBAIC0wLDAgKzEsNDc2IEBACisvKgorICogIGxpbnV4L2FyY2gvaTM4Ni9rZXJuZWwvdGltZS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5NSAgTGludXMgVG9ydmFsZHMKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIFBDLXNwZWNpZmljIHRpbWUgaGFuZGxpbmcgZGV0YWlsczoKKyAqIHJlYWRpbmcgdGhlIFJUQyBhdCBib290dXAsIGV0Yy4uCisgKiAxOTk0LTA3LTAyICAgIEFsYW4gTW9kcmEKKyAqCWZpeGVkIHNldF9ydGNfbW1zcywgZml4ZWQgdGltZS55ZWFyIGZvciA+PSAyMDAwLCBuZXcgbWt0aW1lCisgKiAxOTk1LTAzLTI2ICAgIE1hcmt1cyBLdWhuCisgKiAgICAgIGZpeGVkIDUwMCBtcyBidWcgYXQgY2FsbCB0byBzZXRfcnRjX21tc3MsIGZpeGVkIERTMTI4ODcKKyAqICAgICAgcHJlY2lzaW9uIENNT1MgY2xvY2sgdXBkYXRlCisgKiAxOTk2LTA1LTAzICAgIEluZ28gTW9sbmFyCisgKiAgICAgIGZpeGVkIHRpbWUgd2FycHMgaW4gZG9fW3Nsb3d8ZmFzdF1fZ2V0dGltZW9mZnNldCgpCisgKiAxOTk3LTA5LTEwCVVwZGF0ZWQgTlRQIGNvZGUgYWNjb3JkaW5nIHRvIHRlY2huaWNhbCBtZW1vcmFuZHVtIEphbiAnOTYKKyAqCQkiQSBLZXJuZWwgTW9kZWwgZm9yIFByZWNpc2lvbiBUaW1la2VlcGluZyIgYnkgRGF2ZSBNaWxscworICogMTk5OC0wOS0wNSAgICAoVmFyaW91cykKKyAqCU1vcmUgcm9idXN0IGRvX2Zhc3RfZ2V0dGltZW9mZnNldCgpIGFsZ29yaXRobSBpbXBsZW1lbnRlZAorICoJKHdvcmtzIHdpdGggQVBNLCBDeXJpeCA2eDg2TVggYW5kIENlbnRhdXIgQzYpLAorICoJbW9ub3RvbmljIGdldHRpbWVvZmRheSgpIHdpdGggZmFzdF9nZXRfdGltZW9mZnNldCgpLAorICoJZHJpZnQtcHJvb2YgcHJlY2lzaW9uIFRTQyBjYWxpYnJhdGlvbiBvbiBib290CisgKgkoQy4gU2NvdHQgQW5hbmlhbiA8Y2FuYW5pYW5AYWx1bW5pLnByaW5jZXRvbi5lZHU+LCBBbmRyZXcgRC4KKyAqCUJhbHNhIDxhbmRyZWJhbHNhQGFsdGVybi5vcmc+LCBQaGlsaXAgR2xhZHN0b25lIDxwaGlsaXBAcmFwdG9yLmNvbT47CisgKglwb3J0ZWQgZnJvbSAyLjAuMzUgSnVtYm8tOSBieSBNaWNoYWVsIEtyYXVzZSA8bS5rcmF1c2VAdHUtaGFyYnVyZy5kZT4pLgorICogMTk5OC0xMi0xNiAgICBBbmRyZWEgQXJjYW5nZWxpCisgKglGaXhlZCBKdW1iby05IGNvZGUgaW4gMi4xLjEzMTogZG9fZ2V0dGltZW9mZGF5IHdhcyBtaXNzaW5nIDEgamlmZnkKKyAqCWJlY2F1c2Ugd2FzIG5vdCBhY2NvdW50aW5nIGxvc3RfdGlja3MuCisgKiAxOTk4LTEyLTI0IENvcHlyaWdodCAoQykgMTk5OCAgQW5kcmVhIEFyY2FuZ2VsaQorICoJRml4ZWQgYSB4dGltZSBTTVAgcmFjZSAod2UgbmVlZCB0aGUgeHRpbWVfbG9jayBydyBzcGlubG9jayB0bworICoJc2VyaWFsaXplIGFjY2Vzc2VzIHRvIHh0aW1lL2xvc3RfdGlja3MpLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9lZmkuaD4KKyNpbmNsdWRlIDxsaW51eC9tY2EuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zbXAuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgPGFzbS9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9tcHNwZWMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vdGltZXIuaD4KKworI2luY2x1ZGUgIm1hY2hfdGltZS5oIgorCisjaW5jbHVkZSA8bGludXgvdGltZXguaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2luY2x1ZGUgPGFzbS9ocGV0Lmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaF9ob29rcy5oPgorCisjaW5jbHVkZSAiaW9fcG9ydHMuaCIKKworZXh0ZXJuIHNwaW5sb2NrX3QgaTgyNTlBX2xvY2s7CitpbnQgcGl0X2xhdGNoX2J1Z2d5OyAgICAgICAgICAgICAgLyogZXh0ZXJuICovCisKKyNpbmNsdWRlICJkb190aW1lci5oIgorCit1NjQgamlmZmllc182NCA9IElOSVRJQUxfSklGRklFUzsKKworRVhQT1JUX1NZTUJPTChqaWZmaWVzXzY0KTsKKwordW5zaWduZWQgbG9uZyBjcHVfa2h6OwkvKiBEZXRlY3RlZCBhcyB3ZSBjYWxpYnJhdGUgdGhlIFRTQyAqLworCitleHRlcm4gdW5zaWduZWQgbG9uZyB3YWxsX2ppZmZpZXM7CisKK0RFRklORV9TUElOTE9DSyhydGNfbG9jayk7CisKK0RFRklORV9TUElOTE9DSyhpODI1M19sb2NrKTsKK0VYUE9SVF9TWU1CT0woaTgyNTNfbG9jayk7CisKK3N0cnVjdCB0aW1lcl9vcHRzICpjdXJfdGltZXIgPSAmdGltZXJfbm9uZTsKKworLyoKKyAqIFRoaXMgaXMgYSBzcGVjaWFsIGxvY2sgdGhhdCBpcyBvd25lZCBieSB0aGUgQ1BVIGFuZCBob2xkcyB0aGUgaW5kZXgKKyAqIHJlZ2lzdGVyIHdlIGFyZSB3b3JraW5nIHdpdGguICBJdCBpcyByZXF1aXJlZCBmb3IgTk1JIGFjY2VzcyB0byB0aGUKKyAqIENNT1MvUlRDIHJlZ2lzdGVycy4gIFNlZSBpbmNsdWRlL2FzbS1pMzg2L21jMTQ2ODE4cnRjLmggZm9yIGRldGFpbHMuCisgKi8KK3ZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgY21vc19sb2NrID0gMDsKK0VYUE9SVF9TWU1CT0woY21vc19sb2NrKTsKKworLyogUm91dGluZXMgZm9yIGFjY2Vzc2luZyB0aGUgQ01PUyBSQU0vUlRDLiAqLwordW5zaWduZWQgY2hhciBydGNfY21vc19yZWFkKHVuc2lnbmVkIGNoYXIgYWRkcikKK3sKKwl1bnNpZ25lZCBjaGFyIHZhbDsKKwlsb2NrX2Ntb3NfcHJlZml4KGFkZHIpOworCW91dGJfcChhZGRyLCBSVENfUE9SVCgwKSk7CisJdmFsID0gaW5iX3AoUlRDX1BPUlQoMSkpOworCWxvY2tfY21vc19zdWZmaXgoYWRkcik7CisJcmV0dXJuIHZhbDsKK30KK0VYUE9SVF9TWU1CT0wocnRjX2Ntb3NfcmVhZCk7CisKK3ZvaWQgcnRjX2Ntb3Nfd3JpdGUodW5zaWduZWQgY2hhciB2YWwsIHVuc2lnbmVkIGNoYXIgYWRkcikKK3sKKwlsb2NrX2Ntb3NfcHJlZml4KGFkZHIpOworCW91dGJfcChhZGRyLCBSVENfUE9SVCgwKSk7CisJb3V0Yl9wKHZhbCwgUlRDX1BPUlQoMSkpOworCWxvY2tfY21vc19zdWZmaXgoYWRkcik7Cit9CitFWFBPUlRfU1lNQk9MKHJ0Y19jbW9zX3dyaXRlKTsKKworLyoKKyAqIFRoaXMgdmVyc2lvbiBvZiBnZXR0aW1lb2ZkYXkgaGFzIG1pY3Jvc2Vjb25kIHJlc29sdXRpb24KKyAqIGFuZCBiZXR0ZXIgdGhhbiBtaWNyb3NlY29uZCBwcmVjaXNpb24gb24gZmFzdCB4ODYgbWFjaGluZXMgd2l0aCBUU0MuCisgKi8KK3ZvaWQgZG9fZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICp0dikKK3sKKwl1bnNpZ25lZCBsb25nIHNlcTsKKwl1bnNpZ25lZCBsb25nIHVzZWMsIHNlYzsKKwl1bnNpZ25lZCBsb25nIG1heF9udHBfdGljazsKKworCWRvIHsKKwkJdW5zaWduZWQgbG9uZyBsb3N0OworCisJCXNlcSA9IHJlYWRfc2VxYmVnaW4oJnh0aW1lX2xvY2spOworCisJCXVzZWMgPSBjdXJfdGltZXItPmdldF9vZmZzZXQoKTsKKwkJbG9zdCA9IGppZmZpZXMgLSB3YWxsX2ppZmZpZXM7CisKKwkJLyoKKwkJICogSWYgdGltZV9hZGp1c3QgaXMgbmVnYXRpdmUgdGhlbiBOVFAgaXMgc2xvd2luZyB0aGUgY2xvY2sKKwkJICogc28gbWFrZSBzdXJlIG5vdCB0byBnbyBpbnRvIG5leHQgcG9zc2libGUgaW50ZXJ2YWwuCisJCSAqIEJldHRlciB0byBsb3NlIHNvbWUgYWNjdXJhY3kgdGhhbiBoYXZlIHRpbWUgZ28gYmFja3dhcmRzLi4KKwkJICovCisJCWlmICh1bmxpa2VseSh0aW1lX2FkanVzdCA8IDApKSB7CisJCQltYXhfbnRwX3RpY2sgPSAoVVNFQ19QRVJfU0VDIC8gSFopIC0gdGlja2FkajsKKwkJCXVzZWMgPSBtaW4odXNlYywgbWF4X250cF90aWNrKTsKKworCQkJaWYgKGxvc3QpCisJCQkJdXNlYyArPSBsb3N0ICogbWF4X250cF90aWNrOworCQl9CisJCWVsc2UgaWYgKHVubGlrZWx5KGxvc3QpKQorCQkJdXNlYyArPSBsb3N0ICogKFVTRUNfUEVSX1NFQyAvIEhaKTsKKworCQlzZWMgPSB4dGltZS50dl9zZWM7CisJCXVzZWMgKz0gKHh0aW1lLnR2X25zZWMgLyAxMDAwKTsKKwl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZ4dGltZV9sb2NrLCBzZXEpKTsKKworCXdoaWxlICh1c2VjID49IDEwMDAwMDApIHsKKwkJdXNlYyAtPSAxMDAwMDAwOworCQlzZWMrKzsKKwl9CisKKwl0di0+dHZfc2VjID0gc2VjOworCXR2LT50dl91c2VjID0gdXNlYzsKK30KKworRVhQT1JUX1NZTUJPTChkb19nZXR0aW1lb2ZkYXkpOworCitpbnQgZG9fc2V0dGltZW9mZGF5KHN0cnVjdCB0aW1lc3BlYyAqdHYpCit7CisJdGltZV90IHd0bV9zZWMsIHNlYyA9IHR2LT50dl9zZWM7CisJbG9uZyB3dG1fbnNlYywgbnNlYyA9IHR2LT50dl9uc2VjOworCisJaWYgKCh1bnNpZ25lZCBsb25nKXR2LT50dl9uc2VjID49IE5TRUNfUEVSX1NFQykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3cml0ZV9zZXFsb2NrX2lycSgmeHRpbWVfbG9jayk7CisJLyoKKwkgKiBUaGlzIGlzIHJldm9sdGluZy4gV2UgbmVlZCB0byBzZXQgInh0aW1lIiBjb3JyZWN0bHkuIEhvd2V2ZXIsIHRoZQorCSAqIHZhbHVlIGluIHRoaXMgbG9jYXRpb24gaXMgdGhlIHZhbHVlIGF0IHRoZSBtb3N0IHJlY2VudCB1cGRhdGUgb2YKKwkgKiB3YWxsIHRpbWUuICBEaXNjb3ZlciB3aGF0IGNvcnJlY3Rpb24gZ2V0dGltZW9mZGF5KCkgd291bGQgaGF2ZQorCSAqIG1hZGUsIGFuZCB0aGVuIHVuZG8gaXQhCisJICovCisJbnNlYyAtPSBjdXJfdGltZXItPmdldF9vZmZzZXQoKSAqIE5TRUNfUEVSX1VTRUM7CisJbnNlYyAtPSAoamlmZmllcyAtIHdhbGxfamlmZmllcykgKiBUSUNLX05TRUM7CisKKwl3dG1fc2VjICA9IHdhbGxfdG9fbW9ub3RvbmljLnR2X3NlYyArICh4dGltZS50dl9zZWMgLSBzZWMpOworCXd0bV9uc2VjID0gd2FsbF90b19tb25vdG9uaWMudHZfbnNlYyArICh4dGltZS50dl9uc2VjIC0gbnNlYyk7CisKKwlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmeHRpbWUsIHNlYywgbnNlYyk7CisJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJndhbGxfdG9fbW9ub3RvbmljLCB3dG1fc2VjLCB3dG1fbnNlYyk7CisKKwl0aW1lX2FkanVzdCA9IDA7CQkvKiBzdG9wIGFjdGl2ZSBhZGp0aW1lKCkgKi8KKwl0aW1lX3N0YXR1cyB8PSBTVEFfVU5TWU5DOworCXRpbWVfbWF4ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7CisJdGltZV9lc3RlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKKwl3cml0ZV9zZXF1bmxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKKwljbG9ja193YXNfc2V0KCk7CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woZG9fc2V0dGltZW9mZGF5KTsKKworc3RhdGljIGludCBzZXRfcnRjX21tc3ModW5zaWduZWQgbG9uZyBub3d0aW1lKQoreworCWludCByZXR2YWw7CisKKwlXQVJOX09OKGlycXNfZGlzYWJsZWQoKSk7CisKKwkvKiBnZXRzIHJlY2FsbGVkIHdpdGggaXJxIGxvY2FsbHkgZGlzYWJsZWQgKi8KKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJaWYgKGVmaV9lbmFibGVkKQorCQlyZXR2YWwgPSBlZmlfc2V0X3J0Y19tbXNzKG5vd3RpbWUpOworCWVsc2UKKwkJcmV0dmFsID0gbWFjaF9zZXRfcnRjX21tc3Mobm93dGltZSk7CisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisKK2ludCB0aW1lcl9hY2s7CisKKy8qIG1vbm90b25pY19jbG9jaygpOiByZXR1cm5zICMgb2YgbmFub3NlY29uZHMgcGFzc2VkIHNpbmNlIHRpbWVfaW5pdCgpCisgKgkJTm90ZTogVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCB0byByZXR1cm4gYWNjdXJhdGUKKyAqCQl0aW1lIGV2ZW4gaW4gdGhlIGFic2VuY2Ugb2YgbXVsdGlwbGUgdGltZXIgdGlja3MuCisgKi8KK3Vuc2lnbmVkIGxvbmcgbG9uZyBtb25vdG9uaWNfY2xvY2sodm9pZCkKK3sKKwlyZXR1cm4gY3VyX3RpbWVyLT5tb25vdG9uaWNfY2xvY2soKTsKK30KK0VYUE9SVF9TWU1CT0wobW9ub3RvbmljX2Nsb2NrKTsKKworI2lmIGRlZmluZWQoQ09ORklHX1NNUCkgJiYgZGVmaW5lZChDT05GSUdfRlJBTUVfUE9JTlRFUikKK3Vuc2lnbmVkIGxvbmcgcHJvZmlsZV9wYyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIHBjID0gaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKTsKKworCWlmIChpbl9sb2NrX2Z1bmN0aW9ucyhwYykpCisJCXJldHVybiAqKHVuc2lnbmVkIGxvbmcgKikocmVncy0+ZWJwICsgNCk7CisKKwlyZXR1cm4gcGM7Cit9CitFWFBPUlRfU1lNQk9MKHByb2ZpbGVfcGMpOworI2VuZGlmCisKKy8qCisgKiB0aW1lcl9pbnRlcnJ1cHQoKSBuZWVkcyB0byBrZWVwIHVwIHRoZSByZWFsLXRpbWUgY2xvY2ssCisgKiBhcyB3ZWxsIGFzIGNhbGwgdGhlICJkb190aW1lcigpIiByb3V0aW5lIGV2ZXJ5IGNsb2NrdGljaworICovCitzdGF0aWMgaW5saW5lIHZvaWQgZG9fdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisjaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCisJaWYgKHRpbWVyX2FjaykgeworCQkvKgorCQkgKiBTdWJ0bGUsIHdoZW4gSS9PIEFQSUNzIGFyZSB1c2VkIHdlIGhhdmUgdG8gYWNrIHRpbWVyIElSUQorCQkgKiBtYW51YWxseSB0byByZXNldCB0aGUgSVJSIGJpdCBmb3IgZG9fc2xvd19nZXR0aW1lb2Zmc2V0KCkuCisJCSAqIFRoaXMgd2lsbCBhbHNvIGRlYXNzZXJ0IE5NSSBsaW5lcyBmb3IgdGhlIHdhdGNoZG9nIGlmIHJ1bgorCQkgKiBvbiBhbiA4MjQ4OURYLWJhc2VkIHN5c3RlbS4KKwkJICovCisJCXNwaW5fbG9jaygmaTgyNTlBX2xvY2spOworCQlvdXRiKDB4MGMsIFBJQ19NQVNURVJfT0NXMyk7CisJCS8qIEFjayB0aGUgSVJROyBBRU9JIHdpbGwgZW5kIGl0IGF1dG9tYXRpY2FsbHkuICovCisJCWluYihQSUNfTUFTVEVSX1BPTEwpOworCQlzcGluX3VubG9jaygmaTgyNTlBX2xvY2spOworCX0KKyNlbmRpZgorCisJZG9fdGltZXJfaW50ZXJydXB0X2hvb2socmVncyk7CisKKworCWlmIChNQ0FfYnVzKSB7CisJCS8qIFRoZSBQUy8yIHVzZXMgbGV2ZWwtdHJpZ2dlcmVkIGludGVycnVwdHMuICBZb3UgY2FuJ3QKKwkJdHVybiB0aGVtIG9mZiwgbm9yIHdvdWxkIHlvdSB3YW50IHRvIChhbnkgYXR0ZW1wdCB0bworCQllbmFibGUgZWRnZS10cmlnZ2VyZWQgaW50ZXJydXB0cyB1c3VhbGx5IGdldHMgaW50ZXJjZXB0ZWQgYnkgYQorCQlzcGVjaWFsIGhhcmR3YXJlIGNpcmN1aXQpLiAgSGVuY2Ugd2UgaGF2ZSB0byBhY2tub3dsZWRnZQorCQl0aGUgdGltZXIgaW50ZXJydXB0LiAgVGhyb3VnaCBzb21lIGluY3JlZGlibHkgc3R1cGlkCisJCWRlc2lnbiBpZGVhLCB0aGUgcmVzZXQgZm9yIElSUSAwIGlzIGRvbmUgYnkgc2V0dGluZyB0aGUKKwkJaGlnaCBiaXQgb2YgdGhlIFBQSSBwb3J0IEIgKDB4NjEpLiAgTm90ZSB0aGF0IHNvbWUgUFMvMnMsCisJCW5vdGFibHkgdGhlIDU1U1gsIHdvcmsgZmluZSBpZiB0aGlzIGlzIHJlbW92ZWQuICAqLworCisJCWlycSA9IGluYl9wKCAweDYxICk7CS8qIHJlYWQgdGhlIGN1cnJlbnQgc3RhdGUgKi8KKwkJb3V0Yl9wKCBpcnF8MHg4MCwgMHg2MSApOwkvKiByZXNldCB0aGUgSVJRICovCisJfQorfQorCisvKgorICogVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgYWJvdmUsIGV4Y2VwdCB3ZSBfYWxzb18gc2F2ZSB0aGUgY3VycmVudAorICogVGltZSBTdGFtcCBDb3VudGVyIHZhbHVlIGF0IHRoZSB0aW1lIG9mIHRoZSB0aW1lciBpbnRlcnJ1cHQsIHNvIHRoYXQKKyAqIHdlIGxhdGVyIG9uIGNhbiBlc3RpbWF0ZSB0aGUgdGltZSBvZiBkYXkgbW9yZSBleGFjdGx5LgorICovCitpcnFyZXR1cm5fdCB0aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwkvKgorCSAqIEhlcmUgd2UgYXJlIGluIHRoZSB0aW1lciBpcnEgaGFuZGxlci4gV2UganVzdCBoYXZlIGlycXMgbG9jYWxseQorCSAqIGRpc2FibGVkIGJ1dCB3ZSBkb24ndCBrbm93IGlmIHRoZSB0aW1lcl9iaCBpcyBydW5uaW5nIG9uIHRoZSBvdGhlcgorCSAqIENQVS4gV2UgbmVlZCB0byBhdm9pZCB0byBTTVAgcmFjZSB3aXRoIGl0LiBOT1RFOiB3ZSBkb24nIHQgbmVlZAorCSAqIHRoZSBpcnEgdmVyc2lvbiBvZiB3cml0ZV9sb2NrIGJlY2F1c2UgYXMganVzdCBzYWlkIHdlIGhhdmUgaXJxCisJICogbG9jYWxseSBkaXNhYmxlZC4gLWFyY2EKKwkgKi8KKwl3cml0ZV9zZXFsb2NrKCZ4dGltZV9sb2NrKTsKKworCWN1cl90aW1lci0+bWFya19vZmZzZXQoKTsKKyAKKwlkb190aW1lcl9pbnRlcnJ1cHQoaXJxLCBOVUxMLCByZWdzKTsKKworCXdyaXRlX3NlcXVubG9jaygmeHRpbWVfbG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiBub3Qgc3RhdGljOiBuZWVkZWQgYnkgQVBNICovCit1bnNpZ25lZCBsb25nIGdldF9jbW9zX3RpbWUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHJldHZhbDsKKworCXNwaW5fbG9jaygmcnRjX2xvY2spOworCisJaWYgKGVmaV9lbmFibGVkKQorCQlyZXR2YWwgPSBlZmlfZ2V0X3RpbWUoKTsKKwllbHNlCisJCXJldHZhbCA9IG1hY2hfZ2V0X2Ntb3NfdGltZSgpOworCisJc3Bpbl91bmxvY2soJnJ0Y19sb2NrKTsKKworCXJldHVybiByZXR2YWw7Cit9CitzdGF0aWMgdm9pZCBzeW5jX2Ntb3NfY2xvY2sodW5zaWduZWQgbG9uZyBkdW1teSk7CisKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBzeW5jX2Ntb3NfdGltZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FUl9JTklUSUFMSVpFUihzeW5jX2Ntb3NfY2xvY2ssIDAsIDApOworCitzdGF0aWMgdm9pZCBzeW5jX2Ntb3NfY2xvY2sodW5zaWduZWQgbG9uZyBkdW1teSkKK3sKKwlzdHJ1Y3QgdGltZXZhbCBub3csIG5leHQ7CisJaW50IGZhaWwgPSAxOworCisJLyoKKwkgKiBJZiB3ZSBoYXZlIGFuIGV4dGVybmFsbHkgc3luY2hyb25pemVkIExpbnV4IGNsb2NrLCB0aGVuIHVwZGF0ZQorCSAqIENNT1MgY2xvY2sgYWNjb3JkaW5nbHkgZXZlcnkgfjExIG1pbnV0ZXMuIFNldF9ydGNfbW1zcygpIGhhcyB0byBiZQorCSAqIGNhbGxlZCBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byA1MDAgbXMgYmVmb3JlIHRoZSBuZXcgc2Vjb25kIHN0YXJ0cy4KKwkgKiBUaGlzIGNvZGUgaXMgcnVuIG9uIGEgdGltZXIuICBJZiB0aGUgY2xvY2sgaXMgc2V0LCB0aGF0IHRpbWVyCisJICogbWF5IG5vdCBleHBpcmUgYXQgdGhlIGNvcnJlY3QgdGltZS4gIFRodXMsIHdlIGFkanVzdC4uLgorCSAqLworCWlmICgodGltZV9zdGF0dXMgJiBTVEFfVU5TWU5DKSAhPSAwKQorCQkvKgorCQkgKiBOb3Qgc3luY2VkLCBleGl0LCBkbyBub3QgcmVzdGFydCBhIHRpbWVyIChpZiBvbmUgaXMKKwkJICogcnVubmluZywgbGV0IGl0IHJ1biBvdXQpLgorCQkgKi8KKwkJcmV0dXJuOworCisJZG9fZ2V0dGltZW9mZGF5KCZub3cpOworCWlmIChub3cudHZfdXNlYyA+PSBVU0VDX0FGVEVSIC0gKCh1bnNpZ25lZCkgVElDS19TSVpFKSAvIDIgJiYKKwkgICAgbm93LnR2X3VzZWMgPD0gVVNFQ19CRUZPUkUgKyAoKHVuc2lnbmVkKSBUSUNLX1NJWkUpIC8gMikKKwkJZmFpbCA9IHNldF9ydGNfbW1zcyhub3cudHZfc2VjKTsKKworCW5leHQudHZfdXNlYyA9IFVTRUNfQUZURVIgLSBub3cudHZfdXNlYzsKKwlpZiAobmV4dC50dl91c2VjIDw9IDApCisJCW5leHQudHZfdXNlYyArPSBVU0VDX1BFUl9TRUM7CisKKwlpZiAoIWZhaWwpCisJCW5leHQudHZfc2VjID0gNjU5OworCWVsc2UKKwkJbmV4dC50dl9zZWMgPSAwOworCisJaWYgKG5leHQudHZfdXNlYyA+PSBVU0VDX1BFUl9TRUMpIHsKKwkJbmV4dC50dl9zZWMrKzsKKwkJbmV4dC50dl91c2VjIC09IFVTRUNfUEVSX1NFQzsKKwl9CisJbW9kX3RpbWVyKCZzeW5jX2Ntb3NfdGltZXIsIGppZmZpZXMgKyB0aW1ldmFsX3RvX2ppZmZpZXMoJm5leHQpKTsKK30KKwordm9pZCBub3RpZnlfYXJjaF9jbW9zX3RpbWVyKHZvaWQpCit7CisJbW9kX3RpbWVyKCZzeW5jX2Ntb3NfdGltZXIsIGppZmZpZXMgKyAxKTsKK30KKworc3RhdGljIGxvbmcgY2xvY2tfY21vc19kaWZmLCBzbGVlcF9zdGFydDsKKworc3RhdGljIGludCB0aW1lcl9zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIHUzMiBzdGF0ZSkKK3sKKwkvKgorCSAqIEVzdGltYXRlIHRpbWUgem9uZSBzbyB0aGF0IHNldF90aW1lIGNhbiB1cGRhdGUgdGhlIGNsb2NrCisJICovCisJY2xvY2tfY21vc19kaWZmID0gLWdldF9jbW9zX3RpbWUoKTsKKwljbG9ja19jbW9zX2RpZmYgKz0gZ2V0X3NlY29uZHMoKTsKKwlzbGVlcF9zdGFydCA9IGdldF9jbW9zX3RpbWUoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0aW1lcl9yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgc2VjOworCXVuc2lnbmVkIGxvbmcgc2xlZXBfbGVuZ3RoOworCisjaWZkZWYgQ09ORklHX0hQRVRfVElNRVIKKwlpZiAoaXNfaHBldF9lbmFibGVkKCkpCisJCWhwZXRfcmVlbmFibGUoKTsKKyNlbmRpZgorCXNlYyA9IGdldF9jbW9zX3RpbWUoKSArIGNsb2NrX2Ntb3NfZGlmZjsKKwlzbGVlcF9sZW5ndGggPSAoZ2V0X2Ntb3NfdGltZSgpIC0gc2xlZXBfc3RhcnQpICogSFo7CisJd3JpdGVfc2VxbG9ja19pcnFzYXZlKCZ4dGltZV9sb2NrLCBmbGFncyk7CisJeHRpbWUudHZfc2VjID0gc2VjOworCXh0aW1lLnR2X25zZWMgPSAwOworCXdyaXRlX3NlcXVubG9ja19pcnFyZXN0b3JlKCZ4dGltZV9sb2NrLCBmbGFncyk7CisJamlmZmllcyArPSBzbGVlcF9sZW5ndGg7CisJd2FsbF9qaWZmaWVzICs9IHNsZWVwX2xlbmd0aDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3MgdGltZXJfc3lzY2xhc3MgPSB7CisJLnJlc3VtZSA9IHRpbWVyX3Jlc3VtZSwKKwkuc3VzcGVuZCA9IHRpbWVyX3N1c3BlbmQsCisJc2V0X2tzZXRfbmFtZSgidGltZXIiKSwKK307CisKKworLyogWFhYIHRoaXMgZHJpdmVyZnMgc3R1ZmYgc2hvdWxkIHByb2JhYmx5IGdvIGVsc2V3aGVyZSBsYXRlciAtam9obiAqLworc3RhdGljIHN0cnVjdCBzeXNfZGV2aWNlIGRldmljZV90aW1lciA9IHsKKwkuaWQJPSAwLAorCS5jbHMJPSAmdGltZXJfc3lzY2xhc3MsCit9OworCitzdGF0aWMgaW50IHRpbWVfaW5pdF9kZXZpY2Uodm9pZCkKK3sKKwlpbnQgZXJyb3IgPSBzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJnRpbWVyX3N5c2NsYXNzKTsKKwlpZiAoIWVycm9yKQorCQllcnJvciA9IHN5c2Rldl9yZWdpc3RlcigmZGV2aWNlX3RpbWVyKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2RldmljZV9pbml0Y2FsbCh0aW1lX2luaXRfZGV2aWNlKTsKKworI2lmZGVmIENPTkZJR19IUEVUX1RJTUVSCitleHRlcm4gdm9pZCAoKmxhdGVfdGltZV9pbml0KSh2b2lkKTsKKy8qIER1cGxpY2F0ZSBvZiB0aW1lX2luaXQoKSBiZWxvdywgd2l0aCBocGV0X2VuYWJsZSBwYXJ0IGFkZGVkICovCitzdGF0aWMgdm9pZCBfX2luaXQgaHBldF90aW1lX2luaXQodm9pZCkKK3sKKwl4dGltZS50dl9zZWMgPSBnZXRfY21vc190aW1lKCk7CisJeHRpbWUudHZfbnNlYyA9IChJTklUSUFMX0pJRkZJRVMgJSBIWikgKiAoTlNFQ19QRVJfU0VDIC8gSFopOworCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZ3YWxsX3RvX21vbm90b25pYywKKwkJLXh0aW1lLnR2X3NlYywgLXh0aW1lLnR2X25zZWMpOworCisJaWYgKGhwZXRfZW5hYmxlKCkgPj0gMCkgeworCQlwcmludGsoIlVzaW5nIEhQRVQgZm9yIGJhc2UtdGltZXJcbiIpOworCX0KKworCWN1cl90aW1lciA9IHNlbGVjdF90aW1lcigpOworCXByaW50ayhLRVJOX0lORk8gIlVzaW5nICVzIGZvciBoaWdoLXJlcyB0aW1lc291cmNlXG4iLGN1cl90aW1lci0+bmFtZSk7CisKKwl0aW1lX2luaXRfaG9vaygpOworfQorI2VuZGlmCisKK3ZvaWQgX19pbml0IHRpbWVfaW5pdCh2b2lkKQoreworI2lmZGVmIENPTkZJR19IUEVUX1RJTUVSCisJaWYgKGlzX2hwZXRfY2FwYWJsZSgpKSB7CisJCS8qCisJCSAqIEhQRVQgaW5pdGlhbGl6YXRpb24gbmVlZHMgdG8gZG8gbWVtb3J5LW1hcHBlZCBpby4gU28sIGxldAorCQkgKiB1cyBkbyBhIGxhdGUgaW5pdGlhbGl6YXRpb24gYWZ0ZXIgbWVtX2luaXQoKS4KKwkJICovCisJCWxhdGVfdGltZV9pbml0ID0gaHBldF90aW1lX2luaXQ7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKwl4dGltZS50dl9zZWMgPSBnZXRfY21vc190aW1lKCk7CisJeHRpbWUudHZfbnNlYyA9IChJTklUSUFMX0pJRkZJRVMgJSBIWikgKiAoTlNFQ19QRVJfU0VDIC8gSFopOworCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZ3YWxsX3RvX21vbm90b25pYywKKwkJLXh0aW1lLnR2X3NlYywgLXh0aW1lLnR2X25zZWMpOworCisJY3VyX3RpbWVyID0gc2VsZWN0X3RpbWVyKCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiVXNpbmcgJXMgZm9yIGhpZ2gtcmVzIHRpbWVzb3VyY2VcbiIsY3VyX3RpbWVyLT5uYW1lKTsKKworCXRpbWVfaW5pdF9ob29rKCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RpbWVfaHBldC5jIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lX2hwZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDRhMzFiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lX2hwZXQuYwpAQCAtMCwwICsxLDQ1OCBAQAorLyoKKyAqICBsaW51eC9hcmNoL2kzODYva2VybmVsL3RpbWVfaHBldC5jCisgKiAgVGhpcyBjb2RlIGxhcmdlbHkgY29waWVkIGZyb20gYXJjaC94ODZfNjQva2VybmVsL3RpbWUuYworICogIFNlZSB0aGF0IGZpbGUgZm9yIGNyZWRpdHMuCisgKgorICogIDIwMDMtMDYtMzAgICAgVmVua2F0ZXNoIFBhbGxpcGFkaSAtIEFkZGl0aW9uYWwgY2hhbmdlcyBmb3IgSFBFVCBzdXBwb3J0CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisKKyNpbmNsdWRlIDxhc20vdGltZXIuaD4KKyNpbmNsdWRlIDxhc20vZml4bWFwLmg+CisjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKworI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxhc20vaHBldC5oPgorI2luY2x1ZGUgPGxpbnV4L2hwZXQuaD4KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF9wZXJpb2Q7CS8qIGZzZWNzIC8gSFBFVCBjbG9jayAqLwordW5zaWduZWQgbG9uZyBocGV0X3RpY2s7CQkvKiBocGV0IGNsa3MgY291bnQgcGVyIHRpY2sgKi8KK3Vuc2lnbmVkIGxvbmcgaHBldF9hZGRyZXNzOwkJLyogaHBldCBtZW1vcnkgbWFwIHBoeXNpY2FsIGFkZHJlc3MgKi8KKworc3RhdGljIGludCB1c2VfaHBldDsgCQkvKiBjYW4gYmUgdXNlZCBmb3IgcnVudGltZSBjaGVjayBvZiBocGV0ICovCitzdGF0aWMgaW50IGJvb3RfaHBldF9kaXNhYmxlOyAJLyogYm9vdHRpbWUgb3ZlcnJpZGUgZm9yIEhQRVQgdGltZXIgKi8KK3N0YXRpYyB2b2lkIF9faW9tZW0gKiBocGV0X3ZpcnRfYWRkcmVzczsJLyogaHBldCBrZXJuZWwgdmlydHVhbCBhZGRyZXNzICovCisKKyNkZWZpbmUgRlNFQ19UT19VU0VDICgxMDAwMDAwMDAwVUwpCisKK2ludCBocGV0X3JlYWRsKHVuc2lnbmVkIGxvbmcgYSkKK3sKKwlyZXR1cm4gcmVhZGwoaHBldF92aXJ0X2FkZHJlc3MgKyBhKTsKK30KKworc3RhdGljIHZvaWQgaHBldF93cml0ZWwodW5zaWduZWQgbG9uZyBkLCB1bnNpZ25lZCBsb25nIGEpCit7CisJd3JpdGVsKGQsIGhwZXRfdmlydF9hZGRyZXNzICsgYSk7Cit9CisKKyNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKKy8qCisgKiBIUEVUIGNvdW50ZXJzIGRvbnQgd3JhcCBhcm91bmQgb24gZXZlcnkgdGljay4gVGhleSBqdXN0IGNoYW5nZSB0aGUKKyAqIGNvbXBhcmF0b3IgdmFsdWUgYW5kIGNvbnRpbnVlLiBOZXh0IHRpY2sgY2FuIGJlIGNhdWdodCBieSBjaGVja2luZworICogZm9yIGEgY2hhbmdlIGluIHRoZSBjb21wYXJhdG9yIHZhbHVlLiBVc2VkIGluIGFwaWMuYy4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IHdhaXRfaHBldF90aWNrKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHN0YXJ0X2NtcF92YWwsIGVuZF9jbXBfdmFsOworCisJc3RhcnRfY21wX3ZhbCA9IGhwZXRfcmVhZGwoSFBFVF9UMF9DTVApOworCWRvIHsKKwkJZW5kX2NtcF92YWwgPSBocGV0X3JlYWRsKEhQRVRfVDBfQ01QKTsKKwl9IHdoaWxlIChzdGFydF9jbXBfdmFsID09IGVuZF9jbXBfdmFsKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGhwZXRfdGltZXJfc3RvcF9zZXRfZ28odW5zaWduZWQgbG9uZyB0aWNrKQoreworCXVuc2lnbmVkIGludCBjZmc7CisKKwkvKgorCSAqIFN0b3AgdGhlIHRpbWVycyBhbmQgcmVzZXQgdGhlIG1haW4gY291bnRlci4KKwkgKi8KKwljZmcgPSBocGV0X3JlYWRsKEhQRVRfQ0ZHKTsKKwljZmcgJj0gfkhQRVRfQ0ZHX0VOQUJMRTsKKwlocGV0X3dyaXRlbChjZmcsIEhQRVRfQ0ZHKTsKKwlocGV0X3dyaXRlbCgwLCBIUEVUX0NPVU5URVIpOworCWhwZXRfd3JpdGVsKDAsIEhQRVRfQ09VTlRFUiArIDQpOworCisJLyoKKwkgKiBTZXQgdXAgdGltZXIgMCwgYXMgcGVyaW9kaWMgd2l0aCBmaXJzdCBpbnRlcnJ1cHQgdG8gaGFwcGVuIGF0CisJICogaHBldF90aWNrLCBhbmQgcGVyaW9kIGFsc28gaHBldF90aWNrLgorCSAqLworCWNmZyA9IGhwZXRfcmVhZGwoSFBFVF9UMF9DRkcpOworCWNmZyB8PSBIUEVUX1ROX0VOQUJMRSB8IEhQRVRfVE5fUEVSSU9ESUMgfAorCSAgICAgICBIUEVUX1ROX1NFVFZBTCB8IEhQRVRfVE5fMzJCSVQ7CisJaHBldF93cml0ZWwoY2ZnLCBIUEVUX1QwX0NGRyk7CisKKwkvKgorCSAqIFRoZSBmaXJzdCB3cml0ZSBhZnRlciB3cml0aW5nIFROX1NFVFZBTCB0byB0aGUgY29uZmlnIHJlZ2lzdGVyIHNldHMKKwkgKiB0aGUgY291bnRlciB2YWx1ZSwgdGhlIHNlY29uZCB3cml0ZSBzZXRzIHRoZSB0aHJlc2hvbGQuCisJICovCisJaHBldF93cml0ZWwodGljaywgSFBFVF9UMF9DTVApOworCWhwZXRfd3JpdGVsKHRpY2ssIEhQRVRfVDBfQ01QKTsKKworCS8qCisgCSAqIEdvIQorIAkgKi8KKwljZmcgPSBocGV0X3JlYWRsKEhQRVRfQ0ZHKTsKKwljZmcgfD0gSFBFVF9DRkdfRU5BQkxFIHwgSFBFVF9DRkdfTEVHQUNZOworCWhwZXRfd3JpdGVsKGNmZywgSFBFVF9DRkcpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDaGVjayB3aGV0aGVyIEhQRVQgd2FzIGZvdW5kIGJ5IEFDUEkgYm9vdCBwYXJzZS4gSWYgeWVzIHNldHVwIEhQRVQKKyAqIGNvdW50ZXIgMCBmb3Iga2VybmVsIGJhc2UgdGltZXIuCisgKi8KK2ludCBfX2luaXQgaHBldF9lbmFibGUodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaWQ7CisJdW5zaWduZWQgbG9uZyB0aWNrX2ZzZWNfbG93LCB0aWNrX2ZzZWNfaGlnaDsgLyogdGljayBpbiBmZW10byBzZWMgKi8KKwl1bnNpZ25lZCBsb25nIGhwZXRfdGlja19yZW07CisKKwlpZiAoYm9vdF9ocGV0X2Rpc2FibGUpCisJCXJldHVybiAtMTsKKworCWlmICghaHBldF9hZGRyZXNzKSB7CisJCXJldHVybiAtMTsKKwl9CisJaHBldF92aXJ0X2FkZHJlc3MgPSBpb3JlbWFwX25vY2FjaGUoaHBldF9hZGRyZXNzLCBIUEVUX01NQVBfU0laRSk7CisJLyoKKwkgKiBSZWFkIHRoZSBwZXJpb2QsIGNvbXB1dGUgdGljayBhbmQgcXVvdGllbnQuCisJICovCisJaWQgPSBocGV0X3JlYWRsKEhQRVRfSUQpOworCisJLyoKKwkgKiBXZSBhcmUgY2hlY2tpbmcgZm9yIHZhbHVlICcxJyBvciBtb3JlIGluIG51bWJlciBmaWVsZCBpZgorCSAqIENPTkZJR19IUEVUX0VNVUxBVEVfUlRDIGlzIHNldCBiZWNhdXNlIHdlIHdpbGwgbmVlZCBhbgorCSAqIGFkZGl0aW9uYWwgdGltZXIgZm9yIFJUQyBlbXVsYXRpb24uCisJICogSG93ZXZlciwgd2UgY2FuIGRvIHdpdGggb25lIHRpbWVyIG90aGVyd2lzZSB1c2luZyB0aGUKKwkgKiB0aGUgc2luZ2xlIEhQRVQgdGltZXIgZm9yIHN5c3RlbSB0aW1lLgorCSAqLworCWlmICgKKyNpZmRlZiBDT05GSUdfSFBFVF9FTVVMQVRFX1JUQworCQkhKGlkICYgSFBFVF9JRF9OVU1CRVIpIHx8CisjZW5kaWYKKwkgICAgIShpZCAmIEhQRVRfSURfTEVHU1VQKSkKKwkJcmV0dXJuIC0xOworCisJaHBldF9wZXJpb2QgPSBocGV0X3JlYWRsKEhQRVRfUEVSSU9EKTsKKwlpZiAoKGhwZXRfcGVyaW9kIDwgSFBFVF9NSU5fUEVSSU9EKSB8fCAoaHBldF9wZXJpb2QgPiBIUEVUX01BWF9QRVJJT0QpKQorCQlyZXR1cm4gLTE7CisKKwkvKgorCSAqIDY0IGJpdCBtYXRoCisJICogRmlyc3QgY2hhbmdpbmcgdGljayBpbnRvIGZzZWMKKwkgKiBUaGVuIDY0IGJpdCBkaXYgdG8gZmluZCBudW1iZXIgb2YgaHBldCBjbGsgcGVyIHRpY2sKKwkgKi8KKwlBU01fTVVMNjRfUkVHKHRpY2tfZnNlY19sb3csIHRpY2tfZnNlY19oaWdoLAorCQkJS0VSTkVMX1RJQ0tfVVNFQywgRlNFQ19UT19VU0VDKTsKKwlBU01fRElWNjRfUkVHKGhwZXRfdGljaywgaHBldF90aWNrX3JlbSwKKwkJCWhwZXRfcGVyaW9kLCB0aWNrX2ZzZWNfbG93LCB0aWNrX2ZzZWNfaGlnaCk7CisKKwlpZiAoaHBldF90aWNrX3JlbSA+IChocGV0X3BlcmlvZCA+PiAxKSkKKwkJaHBldF90aWNrKys7IC8qIHJvdW5kaW5nIHRoZSByZXN1bHQgKi8KKworCWlmIChocGV0X3RpbWVyX3N0b3Bfc2V0X2dvKGhwZXRfdGljaykpCisJCXJldHVybiAtMTsKKworCXVzZV9ocGV0ID0gMTsKKworI2lmZGVmCUNPTkZJR19IUEVUCisJeworCQlzdHJ1Y3QgaHBldF9kYXRhCWhkOworCQl1bnNpZ25lZCBpbnQgCQludGltZXI7CisKKwkJbWVtc2V0KCZoZCwgMCwgc2l6ZW9mIChoZCkpOworCisJCW50aW1lciA9IGhwZXRfcmVhZGwoSFBFVF9JRCk7CisJCW50aW1lciA9IChudGltZXIgJiBIUEVUX0lEX05VTUJFUikgPj4gSFBFVF9JRF9OVU1CRVJfU0hJRlQ7CisJCW50aW1lcisrOworCisJCS8qCisJCSAqIFJlZ2lzdGVyIHdpdGggZHJpdmVyLgorCQkgKiBUaW1lcjAgYW5kIFRpbWVyMSBpcyB1c2VkIGJ5IHBsYXRmb3JtLgorCQkgKi8KKwkJaGQuaGRfcGh5c19hZGRyZXNzID0gaHBldF9hZGRyZXNzOworCQloZC5oZF9hZGRyZXNzID0gaHBldF92aXJ0X2FkZHJlc3M7CisJCWhkLmhkX25pcnFzID0gbnRpbWVyOworCQloZC5oZF9mbGFncyA9IEhQRVRfREFUQV9QTEFURk9STTsKKwkJaHBldF9yZXNlcnZlX3RpbWVyKCZoZCwgMCk7CisjaWZkZWYJQ09ORklHX0hQRVRfRU1VTEFURV9SVEMKKwkJaHBldF9yZXNlcnZlX3RpbWVyKCZoZCwgMSk7CisjZW5kaWYKKwkJaGQuaGRfaXJxWzBdID0gSFBFVF9MRUdBQ1lfODI1NDsKKwkJaGQuaGRfaXJxWzFdID0gSFBFVF9MRUdBQ1lfUlRDOworCQlpZiAobnRpbWVyID4gMikgeworCQkJc3RydWN0IGhwZXQgX19pb21lbQkqaHBldDsKKwkJCXN0cnVjdCBocGV0X3RpbWVyIF9faW9tZW0gKnRpbWVyOworCQkJaW50CQkJaTsKKworCQkJaHBldCA9IGhwZXRfdmlydF9hZGRyZXNzOworCisJCQlmb3IgKGkgPSAyLCB0aW1lciA9ICZocGV0LT5ocGV0X3RpbWVyc1syXTsgaSA8IG50aW1lcjsKKwkJCQl0aW1lcisrLCBpKyspCisJCQkJaGQuaGRfaXJxW2ldID0gKHRpbWVyLT5ocGV0X2NvbmZpZyAmCisJCQkJCVRuX0lOVF9ST1VURV9DTkZfTUFTSykgPj4KKwkJCQkJVG5fSU5UX1JPVVRFX0NORl9TSElGVDsKKworCQl9CisKKwkJaHBldF9hbGxvYygmaGQpOworCX0KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCisJd2FpdF90aW1lcl90aWNrID0gd2FpdF9ocGV0X3RpY2s7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworaW50IGhwZXRfcmVlbmFibGUodm9pZCkKK3sKKwlyZXR1cm4gaHBldF90aW1lcl9zdG9wX3NldF9nbyhocGV0X3RpY2spOworfQorCitpbnQgaXNfaHBldF9lbmFibGVkKHZvaWQpCit7CisJcmV0dXJuIHVzZV9ocGV0OworfQorCitpbnQgaXNfaHBldF9jYXBhYmxlKHZvaWQpCit7CisJaWYgKCFib290X2hwZXRfZGlzYWJsZSAmJiBocGV0X2FkZHJlc3MpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBocGV0X3NldHVwKGNoYXIqIHN0cikKK3sKKwlpZiAoc3RyKSB7CisJCWlmICghc3RybmNtcCgiZGlzYWJsZSIsIHN0ciwgNykpCisJCQlib290X2hwZXRfZGlzYWJsZSA9IDE7CisJfQorCXJldHVybiAxOworfQorCitfX3NldHVwKCJocGV0PSIsIGhwZXRfc2V0dXApOworCisjaWZkZWYgQ09ORklHX0hQRVRfRU1VTEFURV9SVEMKKy8qIEhQRVQgaW4gTGVnYWN5UmVwbGFjZW1lbnQgTW9kZSBlYXRzIHVwIFJUQyBpbnRlcnJ1cHQgbGluZS4gV2hlbiwgSFBFVAorICogaXMgZW5hYmxlZCwgd2Ugc3VwcG9ydCBSVEMgaW50ZXJydXB0IGZ1bmN0aW9uYWxpdHkgaW4gc29mdHdhcmUuCisgKiBSVEMgaGFzIDMga2luZHMgb2YgaW50ZXJydXB0czoKKyAqIDEpIFVwZGF0ZSBJbnRlcnJ1cHQgLSBnZW5lcmF0ZSBhbiBpbnRlcnJ1cHQsIGV2ZXJ5IHNlYywgd2hlbiBSVEMgY2xvY2sKKyAqICAgIGlzIHVwZGF0ZWQKKyAqIDIpIEFsYXJtIEludGVycnVwdCAtIGdlbmVyYXRlIGFuIGludGVycnVwdCBhdCBhIHNwZWNpZmljIHRpbWUgb2YgZGF5CisgKiAzKSBQZXJpb2RpYyBJbnRlcnJ1cHQgLSBnZW5lcmF0ZSBwZXJpb2RpYyBpbnRlcnJ1cHQsIHdpdGggZnJlcXVlbmNpZXMKKyAqICAgIDJIei04MTkySHogKDJIei02NEh6IGZvciBub24tcm9vdCB1c2VyKSAoYWxsIGZyZXFzIGluIHBvd2VycyBvZiAyKQorICogKDEpIGFuZCAoMikgYWJvdmUgYXJlIGltcGxlbWVudGVkIHVzaW5nIHBvbGxpbmcgYXQgYSBmcmVxdWVuY3kgb2YKKyAqIDY0IEh6LiBUaGUgZXhhY3QgZnJlcXVlbmN5IGlzIGEgdHJhZGVvZmYgYmV0d2VlbiBhY2N1cmFjeSBhbmQgaW50ZXJydXB0CisgKiBvdmVyaGVhZC4gKERFRkFVTFRfUlRDX0lOVF9GUkVRKQorICogRm9yICgzKSwgd2UgdXNlIGludGVycnVwdHMgYXQgNjRIeiBvciB1c2VyIHNwZWNpZmllZCBwZXJpb2RpYworICogZnJlcXVlbmN5LCB3aGljaGV2ZXIgaXMgaGlnaGVyLgorICovCisjaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKworZXh0ZXJuIGlycXJldHVybl90IHJ0Y19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKKyNkZWZpbmUgREVGQVVMVF9SVENfSU5UX0ZSRVEgCTY0CisjZGVmaW5lIFJUQ19OVU1fSU5UUyAJCTEKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgVUlFX29uOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcHJldl91cGRhdGVfc2VjOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBBSUVfb247CitzdGF0aWMgc3RydWN0IHJ0Y190aW1lIGFsYXJtX3RpbWU7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIFBJRV9vbjsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIFBJRV9mcmVxID0gREVGQVVMVF9SVENfSU5UX0ZSRVE7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBQSUVfY291bnQ7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGhwZXRfcnRjX2ludF9mcmVxOyAvKiBSVEMgaW50ZXJydXB0IGZyZXF1ZW5jeSAqLworCisvKgorICogVGltZXIgMSBmb3IgUlRDLCB3ZSBkbyBub3QgdXNlIHBlcmlvZGljIGludGVycnVwdCBmZWF0dXJlLAorICogZXZlbiBpZiBIUEVUIHN1cHBvcnRzIHBlcmlvZGljIGludGVycnVwdHMgb24gVGltZXIgMS4KKyAqIFRoZSByZWFzb24gYmVpbmcsIHRvIHNldCB1cCBhIHBlcmlvZGljIGludGVycnVwdCBpbiBIUEVULCB3ZSBuZWVkIHRvCisgKiBzdG9wIHRoZSBtYWluIGNvdW50ZXIuIEFuZCBpZiB3ZSBkbyB0aGF0IGV2ZXJ5dGltZSBzb21lb25lIGRpYWJsZXMvZW5hYmxlcworICogUlRDLCB3ZSB3aWxsIGhhdmUgYWR2ZXJzZSBlZmZlY3Qgb24gbWFpbiBrZXJuZWwgdGltZXIgcnVubmluZyBvbiBUaW1lciAwLgorICogU28sIGZvciB0aGUgdGltZSBiZWluZywgc2ltdWxhdGUgdGhlIHBlcmlvZGljIGludGVycnVwdCBpbiBzb2Z0d2FyZS4KKyAqCisgKiBocGV0X3J0Y190aW1lcl9pbml0KCkgaXMgY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZSBhbmQgZHVyaW5nIHN1YnNlcXVlbnQKKyAqIGludGVydXBwdHMgcmVpbml0IGhhcHBlbnMgdGhyb3VnaCBocGV0X3J0Y190aW1lcl9yZWluaXQoKS4KKyAqLworaW50IGhwZXRfcnRjX3RpbWVyX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgY2ZnLCBjbnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghaXNfaHBldF9lbmFibGVkKCkpCisJCXJldHVybiAwOworCS8qCisJICogU2V0IHRoZSBjb3VudGVyIDEgYW5kIGVuYWJsZSB0aGUgaW50ZXJydXB0cy4KKwkgKi8KKwlpZiAoUElFX29uICYmIChQSUVfZnJlcSA+IERFRkFVTFRfUlRDX0lOVF9GUkVRKSkKKwkJaHBldF9ydGNfaW50X2ZyZXEgPSBQSUVfZnJlcTsKKwllbHNlCisJCWhwZXRfcnRjX2ludF9mcmVxID0gREVGQVVMVF9SVENfSU5UX0ZSRVE7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJY250ID0gaHBldF9yZWFkbChIUEVUX0NPVU5URVIpOworCWNudCArPSAoKGhwZXRfdGljaypIWikvaHBldF9ydGNfaW50X2ZyZXEpOworCWhwZXRfd3JpdGVsKGNudCwgSFBFVF9UMV9DTVApOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCWNmZyA9IGhwZXRfcmVhZGwoSFBFVF9UMV9DRkcpOworCWNmZyB8PSBIUEVUX1ROX0VOQUJMRSB8IEhQRVRfVE5fU0VUVkFMIHwgSFBFVF9UTl8zMkJJVDsKKwlocGV0X3dyaXRlbChjZmcsIEhQRVRfVDFfQ0ZHKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBocGV0X3J0Y190aW1lcl9yZWluaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgY2ZnLCBjbnQ7CisKKwlpZiAoIShQSUVfb24gfCBBSUVfb24gfCBVSUVfb24pKQorCQlyZXR1cm47CisKKwlpZiAoUElFX29uICYmIChQSUVfZnJlcSA+IERFRkFVTFRfUlRDX0lOVF9GUkVRKSkKKwkJaHBldF9ydGNfaW50X2ZyZXEgPSBQSUVfZnJlcTsKKwllbHNlCisJCWhwZXRfcnRjX2ludF9mcmVxID0gREVGQVVMVF9SVENfSU5UX0ZSRVE7CisKKwkvKiBJdCBpcyBtb3JlIGFjY3VyYXRlIHRvIHVzZSB0aGUgY29tcGFyYXRvciB2YWx1ZSB0aGFuIGN1cnJlbnQgY291bnQuKi8KKwljbnQgPSBocGV0X3JlYWRsKEhQRVRfVDFfQ01QKTsKKwljbnQgKz0gaHBldF90aWNrKkhaL2hwZXRfcnRjX2ludF9mcmVxOworCWhwZXRfd3JpdGVsKGNudCwgSFBFVF9UMV9DTVApOworCisJY2ZnID0gaHBldF9yZWFkbChIUEVUX1QxX0NGRyk7CisJY2ZnIHw9IEhQRVRfVE5fRU5BQkxFIHwgSFBFVF9UTl9TRVRWQUwgfCBIUEVUX1ROXzMyQklUOworCWhwZXRfd3JpdGVsKGNmZywgSFBFVF9UMV9DRkcpOworCisJcmV0dXJuOworfQorCisvKgorICogVGhlIGZ1bmN0aW9ucyBiZWxvdyBhcmUgY2FsbGVkIGZyb20gcnRjIGRyaXZlci4KKyAqIFJldHVybiAwIGlmIEhQRVQgaXMgbm90IGJlaW5nIHVzZWQuCisgKiBPdGhlcndpc2UgZG8gdGhlIG5lY2Vzc2FyeSBjaGFuZ2VzIGFuZCByZXR1cm4gMS4KKyAqLworaW50IGhwZXRfbWFza19ydGNfaXJxX2JpdCh1bnNpZ25lZCBsb25nIGJpdF9tYXNrKQoreworCWlmICghaXNfaHBldF9lbmFibGVkKCkpCisJCXJldHVybiAwOworCisJaWYgKGJpdF9tYXNrICYgUlRDX1VJRSkKKwkJVUlFX29uID0gMDsKKwlpZiAoYml0X21hc2sgJiBSVENfUElFKQorCQlQSUVfb24gPSAwOworCWlmIChiaXRfbWFzayAmIFJUQ19BSUUpCisJCUFJRV9vbiA9IDA7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGhwZXRfc2V0X3J0Y19pcnFfYml0KHVuc2lnbmVkIGxvbmcgYml0X21hc2spCit7CisJaW50IHRpbWVyX2luaXRfcmVxZCA9IDA7CisKKwlpZiAoIWlzX2hwZXRfZW5hYmxlZCgpKQorCQlyZXR1cm4gMDsKKworCWlmICghKFBJRV9vbiB8IEFJRV9vbiB8IFVJRV9vbikpCisJCXRpbWVyX2luaXRfcmVxZCA9IDE7CisKKwlpZiAoYml0X21hc2sgJiBSVENfVUlFKSB7CisJCVVJRV9vbiA9IDE7CisJfQorCWlmIChiaXRfbWFzayAmIFJUQ19QSUUpIHsKKwkJUElFX29uID0gMTsKKwkJUElFX2NvdW50ID0gMDsKKwl9CisJaWYgKGJpdF9tYXNrICYgUlRDX0FJRSkgeworCQlBSUVfb24gPSAxOworCX0KKworCWlmICh0aW1lcl9pbml0X3JlcWQpCisJCWhwZXRfcnRjX3RpbWVyX2luaXQoKTsKKworCXJldHVybiAxOworfQorCitpbnQgaHBldF9zZXRfYWxhcm1fdGltZSh1bnNpZ25lZCBjaGFyIGhycywgdW5zaWduZWQgY2hhciBtaW4sIHVuc2lnbmVkIGNoYXIgc2VjKQoreworCWlmICghaXNfaHBldF9lbmFibGVkKCkpCisJCXJldHVybiAwOworCisJYWxhcm1fdGltZS50bV9ob3VyID0gaHJzOworCWFsYXJtX3RpbWUudG1fbWluID0gbWluOworCWFsYXJtX3RpbWUudG1fc2VjID0gc2VjOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBocGV0X3NldF9wZXJpb2RpY19mcmVxKHVuc2lnbmVkIGxvbmcgZnJlcSkKK3sKKwlpZiAoIWlzX2hwZXRfZW5hYmxlZCgpKQorCQlyZXR1cm4gMDsKKworCVBJRV9mcmVxID0gZnJlcTsKKwlQSUVfY291bnQgPSAwOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBocGV0X3J0Y19kcm9wcGVkX2lycSh2b2lkKQoreworCWlmICghaXNfaHBldF9lbmFibGVkKCkpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK2lycXJldHVybl90IGhwZXRfcnRjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBydGNfdGltZSBjdXJyX3RpbWU7CisJdW5zaWduZWQgbG9uZyBydGNfaW50X2ZsYWcgPSAwOworCWludCBjYWxsX3J0Y19pbnRlcnJ1cHQgPSAwOworCisJaHBldF9ydGNfdGltZXJfcmVpbml0KCk7CisKKwlpZiAoVUlFX29uIHwgQUlFX29uKSB7CisJCXJ0Y19nZXRfcnRjX3RpbWUoJmN1cnJfdGltZSk7CisJfQorCWlmIChVSUVfb24pIHsKKwkJaWYgKGN1cnJfdGltZS50bV9zZWMgIT0gcHJldl91cGRhdGVfc2VjKSB7CisJCQkvKiBTZXQgdXBkYXRlIGludCBpbmZvLCBjYWxsIHJlYWwgcnRjIGludCByb3V0aW5lICovCisJCQljYWxsX3J0Y19pbnRlcnJ1cHQgPSAxOworCQkJcnRjX2ludF9mbGFnID0gUlRDX1VGOworCQkJcHJldl91cGRhdGVfc2VjID0gY3Vycl90aW1lLnRtX3NlYzsKKwkJfQorCX0KKwlpZiAoUElFX29uKSB7CisJCVBJRV9jb3VudCsrOworCQlpZiAoUElFX2NvdW50ID49IGhwZXRfcnRjX2ludF9mcmVxL1BJRV9mcmVxKSB7CisJCQkvKiBTZXQgcGVyaW9kaWMgaW50IGluZm8sIGNhbGwgcmVhbCBydGMgaW50IHJvdXRpbmUgKi8KKwkJCWNhbGxfcnRjX2ludGVycnVwdCA9IDE7CisJCQlydGNfaW50X2ZsYWcgfD0gUlRDX1BGOworCQkJUElFX2NvdW50ID0gMDsKKwkJfQorCX0KKwlpZiAoQUlFX29uKSB7CisJCWlmICgoY3Vycl90aW1lLnRtX3NlYyA9PSBhbGFybV90aW1lLnRtX3NlYykgJiYKKwkJICAgIChjdXJyX3RpbWUudG1fbWluID09IGFsYXJtX3RpbWUudG1fbWluKSAmJgorCQkgICAgKGN1cnJfdGltZS50bV9ob3VyID09IGFsYXJtX3RpbWUudG1faG91cikpIHsKKwkJCS8qIFNldCBhbGFybSBpbnQgaW5mbywgY2FsbCByZWFsIHJ0YyBpbnQgcm91dGluZSAqLworCQkJY2FsbF9ydGNfaW50ZXJydXB0ID0gMTsKKwkJCXJ0Y19pbnRfZmxhZyB8PSBSVENfQUY7CisJCX0KKwl9CisJaWYgKGNhbGxfcnRjX2ludGVycnVwdCkgeworCQlydGNfaW50X2ZsYWcgfD0gKFJUQ19JUlFGIHwgKFJUQ19OVU1fSU5UUyA8PCA4KSk7CisJCXJ0Y19pbnRlcnJ1cHQocnRjX2ludF9mbGFnLCBkZXZfaWQsIHJlZ3MpOworCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvTWFrZWZpbGUgYi9hcmNoL2kzODYva2VybmVsL3RpbWVycy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmExMmJlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvTWFrZWZpbGUKQEAgLTAsMCArMSw5IEBACisjCisjIE1ha2VmaWxlIGZvciB4ODYgdGltZXJzCisjCisKK29iai15IDo9IHRpbWVyLm8gdGltZXJfbm9uZS5vIHRpbWVyX3RzYy5vIHRpbWVyX3BpdC5vIGNvbW1vbi5vCisKK29iai0kKENPTkZJR19YODZfQ1lDTE9ORV9USU1FUikJKz0gdGltZXJfY3ljbG9uZS5vCitvYmotJChDT05GSUdfSFBFVF9USU1FUikJKz0gdGltZXJfaHBldC5vCitvYmotJChDT05GSUdfWDg2X1BNX1RJTUVSKQkrPSB0aW1lcl9wbS5vCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RpbWVycy9jb21tb24uYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZjkwMDAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3RpbWVycy9jb21tb24uYwpAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqCUNvbW1vbiBmdW5jdGlvbnMgdXNlZCBhY3Jvc3MgdGhlIHRpbWVycyBnbyBoZXJlCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1leC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CisjaW5jbHVkZSA8YXNtL2hwZXQuaD4KKworI2luY2x1ZGUgIm1hY2hfdGltZXIuaCIKKworLyogLS0tLS0tIENhbGlicmF0ZSB0aGUgVFNDIC0tLS0tLS0KKyAqIFJldHVybiAyXjMyICogKDEgLyAoVFNDIGNsb2NrcyBwZXIgdXNlYykpIGZvciBkb19mYXN0X2dldHRpbWVvZmZzZXQoKS4KKyAqIFRvbyBtdWNoIDY0LWJpdCBhcml0aG1ldGljIGhlcmUgdG8gZG8gdGhpcyBjbGVhbmx5IGluIEMsIGFuZCBmb3IKKyAqIGFjY3VyYWN5J3Mgc2FrZSB3ZSB3YW50IHRvIGtlZXAgdGhlIG92ZXJoZWFkIG9uIHRoZSBDVEMgc3BlYWtlciAoY2hhbm5lbCAyKQorICogb3V0cHV0IGJ1c3kgbG9vcCBhcyBsb3cgYXMgcG9zc2libGUuIFdlIGF2b2lkIHJlYWRpbmcgdGhlIENUQyByZWdpc3RlcnMKKyAqIGRpcmVjdGx5IGJlY2F1c2Ugb2YgdGhlIGF3a3dhcmQgOC1iaXQgYWNjZXNzIG1lY2hhbmlzbSBvZiB0aGUgODJDNTQKKyAqIGRldmljZS4KKyAqLworCisjZGVmaW5lIENBTElCUkFURV9USU1FCSg1ICogMTAwMDAyMC9IWikKKwordW5zaWduZWQgbG9uZyBfX2luaXQgY2FsaWJyYXRlX3RzYyh2b2lkKQoreworCW1hY2hfcHJlcGFyZV9jb3VudGVyKCk7CisKKwl7CisJCXVuc2lnbmVkIGxvbmcgc3RhcnRsb3csIHN0YXJ0aGlnaDsKKwkJdW5zaWduZWQgbG9uZyBlbmRsb3csIGVuZGhpZ2g7CisJCXVuc2lnbmVkIGxvbmcgY291bnQ7CisKKwkJcmR0c2Moc3RhcnRsb3csc3RhcnRoaWdoKTsKKwkJbWFjaF9jb3VudHVwKCZjb3VudCk7CisJCXJkdHNjKGVuZGxvdyxlbmRoaWdoKTsKKworCisJCS8qIEVycm9yOiBFQ1RDTkVWRVJTRVQgKi8KKwkJaWYgKGNvdW50IDw9IDEpCisJCQlnb3RvIGJhZF9jdGM7CisKKwkJLyogNjQtYml0IHN1YnRyYWN0IC0gZ2NjIGp1c3QgbWVzc2VzIHVwIHdpdGggbG9uZyBsb25ncyAqLworCQlfX2FzbV9fKCJzdWJsICUyLCUwXG5cdCIKKwkJCSJzYmJsICUzLCUxIgorCQkJOiI9YSIgKGVuZGxvdyksICI9ZCIgKGVuZGhpZ2gpCisJCQk6ImciIChzdGFydGxvdyksICJnIiAoc3RhcnRoaWdoKSwKKwkJCSAiMCIgKGVuZGxvdyksICIxIiAoZW5kaGlnaCkpOworCisJCS8qIEVycm9yOiBFQ1BVVE9PRkFTVCAqLworCQlpZiAoZW5kaGlnaCkKKwkJCWdvdG8gYmFkX2N0YzsKKworCQkvKiBFcnJvcjogRUNQVVRPT1NMT1cgKi8KKwkJaWYgKGVuZGxvdyA8PSBDQUxJQlJBVEVfVElNRSkKKwkJCWdvdG8gYmFkX2N0YzsKKworCQlfX2FzbV9fKCJkaXZsICUyIgorCQkJOiI9YSIgKGVuZGxvdyksICI9ZCIgKGVuZGhpZ2gpCisJCQk6InIiIChlbmRsb3cpLCAiMCIgKDApLCAiMSIgKENBTElCUkFURV9USU1FKSk7CisKKwkJcmV0dXJuIGVuZGxvdzsKKwl9CisKKwkvKgorCSAqIFRoZSBDVEMgd2Fzbid0IHJlbGlhYmxlOiB3ZSBnb3QgYSBoaXQgb24gdGhlIHZlcnkgZmlyc3QgcmVhZCwKKwkgKiBvciB0aGUgQ1BVIHdhcyBzbyBmYXN0L3Nsb3cgdGhhdCB0aGUgcXVvdGllbnQgd291bGRuJ3QgZml0IGluCisJICogMzIgYml0cy4uCisJICovCitiYWRfY3RjOgorCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX0hQRVRfVElNRVIKKy8qIC0tLS0tLSBDYWxpYnJhdGUgdGhlIFRTQyB1c2luZyBIUEVUIC0tLS0tLS0KKyAqIFJldHVybiAyXjMyICogKDEgLyAoVFNDIGNsb2NrcyBwZXIgdXNlYykpIGZvciBnZXR0aW5nIHRoZSBDUFUgZnJlcS4KKyAqIFNlY29uZCBvdXRwdXQgaXMgcGFyYW1ldGVyIDEgKHdoZW4gbm9uIE5VTEwpCisgKiBTZXQgMl4zMiAqICgxIC8gKHRzYyBwZXIgSFBFVCBjbGspKSBmb3IgZGVsYXlfaHBldCgpLgorICogY2FsaWJyYXRlX3RzYygpIGNhbGlicmF0ZXMgdGhlIHByb2Nlc3NvciBUU0MgYnkgY29tcGFyaW5nCisgKiBpdCB0byB0aGUgSFBFVCB0aW1lciBvZiBrbm93biBmcmVxdWVuY3kuCisgKiBUb28gbXVjaCA2NC1iaXQgYXJpdGhtZXRpYyBoZXJlIHRvIGRvIHRoaXMgY2xlYW5seSBpbiBDCisgKi8KKyNkZWZpbmUgQ0FMSUJSQVRFX0NOVF9IUEVUIAkoNSAqIGhwZXRfdGljaykKKyNkZWZpbmUgQ0FMSUJSQVRFX1RJTUVfSFBFVCAJKDUgKiBLRVJORUxfVElDS19VU0VDKQorCit1bnNpZ25lZCBsb25nIF9faW5pdCBjYWxpYnJhdGVfdHNjX2hwZXQodW5zaWduZWQgbG9uZyAqdHNjX2hwZXRfcXVvdGllbnRfcHRyKQoreworCXVuc2lnbmVkIGxvbmcgdHNjX3N0YXJ0bG93LCB0c2Nfc3RhcnRoaWdoOworCXVuc2lnbmVkIGxvbmcgdHNjX2VuZGxvdywgdHNjX2VuZGhpZ2g7CisJdW5zaWduZWQgbG9uZyBocGV0X3N0YXJ0LCBocGV0X2VuZDsKKwl1bnNpZ25lZCBsb25nIHJlc3VsdCwgcmVtYWluOworCisJaHBldF9zdGFydCA9IGhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKTsKKwlyZHRzYyh0c2Nfc3RhcnRsb3csIHRzY19zdGFydGhpZ2gpOworCWRvIHsKKwkJaHBldF9lbmQgPSBocGV0X3JlYWRsKEhQRVRfQ09VTlRFUik7CisJfSB3aGlsZSAoKGhwZXRfZW5kIC0gaHBldF9zdGFydCkgPCBDQUxJQlJBVEVfQ05UX0hQRVQpOworCXJkdHNjKHRzY19lbmRsb3csIHRzY19lbmRoaWdoKTsKKworCS8qIDY0LWJpdCBzdWJ0cmFjdCAtIGdjYyBqdXN0IG1lc3NlcyB1cCB3aXRoIGxvbmcgbG9uZ3MgKi8KKwlfX2FzbV9fKCJzdWJsICUyLCUwXG5cdCIKKwkJInNiYmwgJTMsJTEiCisJCToiPWEiICh0c2NfZW5kbG93KSwgIj1kIiAodHNjX2VuZGhpZ2gpCisJCToiZyIgKHRzY19zdGFydGxvdyksICJnIiAodHNjX3N0YXJ0aGlnaCksCisJCSAiMCIgKHRzY19lbmRsb3cpLCAiMSIgKHRzY19lbmRoaWdoKSk7CisKKwkvKiBFcnJvcjogRUNQVVRPT0ZBU1QgKi8KKwlpZiAodHNjX2VuZGhpZ2gpCisJCWdvdG8gYmFkX2NhbGlicmF0aW9uOworCisJLyogRXJyb3I6IEVDUFVUT09TTE9XICovCisJaWYgKHRzY19lbmRsb3cgPD0gQ0FMSUJSQVRFX1RJTUVfSFBFVCkKKwkJZ290byBiYWRfY2FsaWJyYXRpb247CisKKwlBU01fRElWNjRfUkVHKHJlc3VsdCwgcmVtYWluLCB0c2NfZW5kbG93LCAwLCBDQUxJQlJBVEVfVElNRV9IUEVUKTsKKwlpZiAocmVtYWluID4gKHRzY19lbmRsb3cgPj4gMSkpCisJCXJlc3VsdCsrOyAvKiByb3VuZGluZyB0aGUgcmVzdWx0ICovCisKKwlpZiAodHNjX2hwZXRfcXVvdGllbnRfcHRyKSB7CisJCXVuc2lnbmVkIGxvbmcgdHNjX2hwZXRfcXVvdGllbnQ7CisKKwkJQVNNX0RJVjY0X1JFRyh0c2NfaHBldF9xdW90aWVudCwgcmVtYWluLCB0c2NfZW5kbG93LCAwLAorCQkJQ0FMSUJSQVRFX0NOVF9IUEVUKTsKKwkJaWYgKHJlbWFpbiA+ICh0c2NfZW5kbG93ID4+IDEpKQorCQkJdHNjX2hwZXRfcXVvdGllbnQrKzsgLyogcm91bmRpbmcgdGhlIHJlc3VsdCAqLworCQkqdHNjX2hwZXRfcXVvdGllbnRfcHRyID0gdHNjX2hwZXRfcXVvdGllbnQ7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK2JhZF9jYWxpYnJhdGlvbjoKKwkvKgorCSAqIHRoZSBDUFUgd2FzIHNvIGZhc3Qvc2xvdyB0aGF0IHRoZSBxdW90aWVudCB3b3VsZG4ndCBmaXQgaW4KKwkgKiAzMiBiaXRzLi4KKwkgKi8KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKiBjYWxjdWxhdGUgY3B1X2toeiAqLwordm9pZCBfX2luaXQgaW5pdF9jcHVfa2h6KHZvaWQpCit7CisJaWYgKGNwdV9oYXNfdHNjKSB7CisJCXVuc2lnbmVkIGxvbmcgdHNjX3F1b3RpZW50ID0gY2FsaWJyYXRlX3RzYygpOworCQlpZiAodHNjX3F1b3RpZW50KSB7CisJCQkvKiByZXBvcnQgQ1BVIGNsb2NrIHJhdGUgaW4gSHouCisJCQkgKiBUaGUgZm9ybXVsYSBpcyAoMTBeNiAqIDJeMzIpIC8gKDJeMzIgKiAxIC8gKGNsb2Nrcy91cykpID0KKwkJCSAqIGNsb2NrL3NlY29uZC4gT3VyIHByZWNpc2lvbiBpcyBhYm91dCAxMDAgcHBtLgorCQkJICovCisJCQl7CXVuc2lnbmVkIGxvbmcgZWF4PTAsIGVkeD0xMDAwOworCQkJCV9fYXNtX18oImRpdmwgJTIiCisJCSAgICAgICAJCToiPWEiIChjcHVfa2h6KSwgIj1kIiAoZWR4KQorICAgICAgICAJICAgICAgIAkJOiJyIiAodHNjX3F1b3RpZW50KSwKKwkgICAgICAgICAgICAgICAgCSIwIiAoZWF4KSwgIjEiIChlZHgpKTsKKwkJCQlwcmludGsoIkRldGVjdGVkICVsdS4lMDNsdSBNSHogcHJvY2Vzc29yLlxuIiwgY3B1X2toeiAvIDEwMDAsIGNwdV9raHogJSAxMDAwKTsKKwkJCX0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyLmMgYi9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZDZhMjgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lci5jCkBAIC0wLDAgKzEsNjYgQEAKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CisKKyNpZmRlZiBDT05GSUdfSFBFVF9USU1FUgorLyoKKyAqIEhQRVQgbWVtb3J5IHJlYWQgaXMgc2xvd2VyIHRoYW4gdHNjIHJlYWRzLCBidXQgaXMgbW9yZSBkZXBlbmRhYmxlIGFzIGl0CisgKiBhbHdheXMgcnVucyBhdCBjb25zdGFudCBmcmVxdWVuY3kgYW5kIHJlZHVjZXMgY29tcGxleGl0eSBkdWUgdG8KKyAqIGNwdWZyZXEuIFNvLCB3ZSBwcmVmZXIgSFBFVCB0aW1lciB0byB0c2MgYmFzZWQgb25lLiBBbHNvLCB3ZSBjYW5ub3QgdXNlCisgKiB0aW1lcl9waXQgd2hlbiBIUEVUIGlzIGFjdGl2ZS4gU28sIHdlIGRlZmF1bHQgdG8gdGltZXJfdHNjLgorICovCisjZW5kaWYKKy8qIGxpc3Qgb2YgdGltZXJzLCBvcmRlcmVkIGJ5IHByZWZlcmVuY2UsIE5VTEwgdGVybWluYXRlZCAqLworc3RhdGljIHN0cnVjdCBpbml0X3RpbWVyX29wdHMqIF9faW5pdGRhdGEgdGltZXJzW10gPSB7CisjaWZkZWYgQ09ORklHX1g4Nl9DWUNMT05FX1RJTUVSCisJJnRpbWVyX2N5Y2xvbmVfaW5pdCwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19IUEVUX1RJTUVSCisJJnRpbWVyX2hwZXRfaW5pdCwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19YODZfUE1fVElNRVIKKwkmdGltZXJfcG10bXJfaW5pdCwKKyNlbmRpZgorCSZ0aW1lcl90c2NfaW5pdCwKKwkmdGltZXJfcGl0X2luaXQsCisJTlVMTCwKK307CisKK3N0YXRpYyBjaGFyIGNsb2NrX292ZXJyaWRlWzEwXSBfX2luaXRkYXRhOworCitzdGF0aWMgaW50IF9faW5pdCBjbG9ja19zZXR1cChjaGFyKiBzdHIpCit7CisJaWYgKHN0cikKKwkJc3RybGNweShjbG9ja19vdmVycmlkZSwgc3RyLCBzaXplb2YoY2xvY2tfb3ZlcnJpZGUpKTsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoImNsb2NrPSIsIGNsb2NrX3NldHVwKTsKKworCisvKiBUaGUgY2hvc2VuIHRpbWVzb3VyY2UgaGFzIGJlZW4gZm91bmQgdG8gYmUgYmFkLgorICogRmFsbCBiYWNrIHRvIGEga25vd24gZ29vZCB0aW1lc291cmNlICh0aGUgUElUKQorICovCit2b2lkIGNsb2NrX2ZhbGxiYWNrKHZvaWQpCit7CisJY3VyX3RpbWVyID0gJnRpbWVyX3BpdDsKK30KKworLyogaXRlcmF0ZXMgdGhyb3VnaCB0aGUgbGlzdCBvZiB0aW1lcnMsIHJldHVybmluZyB0aGUgZmlyc3QgCisgKiBvbmUgdGhhdCBpbml0aWFsaXplcyBzdWNjZXNzZnVsbHkuCisgKi8KK3N0cnVjdCB0aW1lcl9vcHRzKiBfX2luaXQgc2VsZWN0X3RpbWVyKHZvaWQpCit7CisJaW50IGkgPSAwOworCQorCS8qIGZpbmQgbW9zdCBwcmVmZXJyZWQgd29ya2luZyB0aW1lciAqLworCXdoaWxlICh0aW1lcnNbaV0pIHsKKwkJaWYgKHRpbWVyc1tpXS0+aW5pdCkKKwkJCWlmICh0aW1lcnNbaV0tPmluaXQoY2xvY2tfb3ZlcnJpZGUpID09IDApCisJCQkJcmV0dXJuIHRpbWVyc1tpXS0+b3B0czsKKwkJKytpOworCX0KKwkJCisJcGFuaWMoInNlbGVjdF90aW1lcjogQ2Fubm90IGZpbmQgYSBzdWl0YWJsZSB0aW1lclxuIik7CisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9jeWNsb25lLmMgYi9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9jeWNsb25lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZmMTIwNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX2N5Y2xvbmUuYwpAQCAtMCwwICsxLDI1OSBAQAorLyoJQ3ljbG9uZS10aW1lcjogCisgKgkJVGhpcyBjb2RlIGltcGxlbWVudHMgdGltZXJfb3BzIGZvciB0aGUgY3ljbG9uZSBjb3VudGVyIGZvdW5kCisgKgkJb24gSUJNIHg0NDAsIHgzNjAsIGFuZCBvdGhlciBTdW1taXQgYmFzZWQgc3lzdGVtcy4KKyAqCisgKglDb3B5cmlnaHQgKEMpIDIwMDIgSUJNLCBKb2huIFN0dWx0eiAoam9obnN0dWxAdXMuaWJtLmNvbSkKKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1leC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorCisjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vZml4bWFwLmg+CisjaW5jbHVkZSAiaW9fcG9ydHMuaCIKKworZXh0ZXJuIHNwaW5sb2NrX3QgaTgyNTNfbG9jazsKKworLyogTnVtYmVyIG9mIHVzZWNzIHRoYXQgdGhlIGxhc3QgaW50ZXJydXB0IHdhcyBkZWxheWVkICovCitzdGF0aWMgaW50IGRlbGF5X2F0X2xhc3RfaW50ZXJydXB0OworCisjZGVmaW5lIENZQ0xPTkVfQ0JBUl9BRERSIDB4RkVCMDBDRDAKKyNkZWZpbmUgQ1lDTE9ORV9QTUNDX09GRlNFVCAweDUxQTAKKyNkZWZpbmUgQ1lDTE9ORV9NUE1DX09GRlNFVCAweDUxRDAKKyNkZWZpbmUgQ1lDTE9ORV9NUENTX09GRlNFVCAweDUxQTgKKyNkZWZpbmUgQ1lDTE9ORV9USU1FUl9GUkVRIDEwMDAwMDAwMAorI2RlZmluZSBDWUNMT05FX1RJTUVSX01BU0sgKCgodTY0KTE8PDQwKS0xKSAvKiA0MCBiaXQgbWFzayAqLworaW50IHVzZV9jeWNsb25lID0gMDsKKworc3RhdGljIHUzMiogdm9sYXRpbGUgY3ljbG9uZV90aW1lcjsJLyogQ3ljbG9uZSBNUE1DMCByZWdpc3RlciAqLworc3RhdGljIHUzMiBsYXN0X2N5Y2xvbmVfbG93Oworc3RhdGljIHUzMiBsYXN0X2N5Y2xvbmVfaGlnaDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgbW9ub3RvbmljX2Jhc2U7CitzdGF0aWMgc2VxbG9ja190IG1vbm90b25pY19sb2NrID0gU0VRTE9DS19VTkxPQ0tFRDsKKworLyogaGVscGVyIG1hY3JvIHRvIGF0b21pY2FsbHkgcmVhZCBib3RoIGN5Y2xvbmUgY291bnRlciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgcmVhZF9jeWNsb25lX2NvdW50ZXIobG93LGhpZ2gpIFwKKwlkb3sgXAorCQloaWdoID0gY3ljbG9uZV90aW1lclsxXTsgbG93ID0gY3ljbG9uZV90aW1lclswXTsgXAorCX0gd2hpbGUgKGhpZ2ggIT0gY3ljbG9uZV90aW1lclsxXSk7CisKKworc3RhdGljIHZvaWQgbWFya19vZmZzZXRfY3ljbG9uZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgbG9zdCwgZGVsYXk7CisJdW5zaWduZWQgbG9uZyBkZWx0YSA9IGxhc3RfY3ljbG9uZV9sb3c7CisJaW50IGNvdW50OworCXVuc2lnbmVkIGxvbmcgbG9uZyB0aGlzX29mZnNldCwgbGFzdF9vZmZzZXQ7CisKKwl3cml0ZV9zZXFsb2NrKCZtb25vdG9uaWNfbG9jayk7CisJbGFzdF9vZmZzZXQgPSAoKHVuc2lnbmVkIGxvbmcgbG9uZylsYXN0X2N5Y2xvbmVfaGlnaDw8MzIpfGxhc3RfY3ljbG9uZV9sb3c7CisJCisJc3Bpbl9sb2NrKCZpODI1M19sb2NrKTsKKwlyZWFkX2N5Y2xvbmVfY291bnRlcihsYXN0X2N5Y2xvbmVfbG93LGxhc3RfY3ljbG9uZV9oaWdoKTsKKworCS8qIHJlYWQgdmFsdWVzIGZvciBkZWxheV9hdF9sYXN0X2ludGVycnVwdCAqLworCW91dGJfcCgweDAwLCAweDQzKTsgICAgIC8qIGxhdGNoIHRoZSBjb3VudCBBU0FQICovCisKKwljb3VudCA9IGluYl9wKDB4NDApOyAgICAvKiByZWFkIHRoZSBsYXRjaGVkIGNvdW50ICovCisJY291bnQgfD0gaW5iKDB4NDApIDw8IDg7CisKKwkvKgorCSAqIFZJQTY4NmEgdGVzdCBjb2RlLi4uIHJlc2V0IHRoZSBsYXRjaCBpZiBjb3VudCA+IG1heCArIDEKKwkgKiBmcm9tIHRpbWVyX3BpdC5jIC0gY2piCisJICovCisJaWYgKGNvdW50ID4gTEFUQ0gpIHsKKwkJb3V0Yl9wKDB4MzQsIFBJVF9NT0RFKTsKKwkJb3V0Yl9wKExBVENIICYgMHhmZiwgUElUX0NIMCk7CisJCW91dGIoTEFUQ0ggPj4gOCwgUElUX0NIMCk7CisJCWNvdW50ID0gTEFUQ0ggLSAxOworCX0KKwlzcGluX3VubG9jaygmaTgyNTNfbG9jayk7CisKKwkvKiBsb3N0IHRpY2sgY29tcGVuc2F0aW9uICovCisJZGVsdGEgPSBsYXN0X2N5Y2xvbmVfbG93IC0gZGVsdGE7CQorCWRlbHRhIC89IChDWUNMT05FX1RJTUVSX0ZSRVEvMTAwMDAwMCk7CisJZGVsdGEgKz0gZGVsYXlfYXRfbGFzdF9pbnRlcnJ1cHQ7CisJbG9zdCA9IGRlbHRhLygxMDAwMDAwL0haKTsKKwlkZWxheSA9IGRlbHRhJSgxMDAwMDAwL0haKTsKKwlpZiAobG9zdCA+PSAyKQorCQlqaWZmaWVzXzY0ICs9IGxvc3QtMTsKKwkKKwkvKiB1cGRhdGUgdGhlIG1vbm90b25pYyBiYXNlIHZhbHVlICovCisJdGhpc19vZmZzZXQgPSAoKHVuc2lnbmVkIGxvbmcgbG9uZylsYXN0X2N5Y2xvbmVfaGlnaDw8MzIpfGxhc3RfY3ljbG9uZV9sb3c7CisJbW9ub3RvbmljX2Jhc2UgKz0gKHRoaXNfb2Zmc2V0IC0gbGFzdF9vZmZzZXQpICYgQ1lDTE9ORV9USU1FUl9NQVNLOworCXdyaXRlX3NlcXVubG9jaygmbW9ub3RvbmljX2xvY2spOworCisJLyogY2FsY3VsYXRlIGRlbGF5X2F0X2xhc3RfaW50ZXJydXB0ICovCisJY291bnQgPSAoKExBVENILTEpIC0gY291bnQpICogVElDS19TSVpFOworCWRlbGF5X2F0X2xhc3RfaW50ZXJydXB0ID0gKGNvdW50ICsgTEFUQ0gvMikgLyBMQVRDSDsKKworCisJLyogY2F0Y2ggY29ybmVyIGNhc2Ugd2hlcmUgdGljayByb2xsb3ZlciBvY2N1cmVkIAorCSAqIGJldHdlZW4gY3ljbG9uZSBhbmQgcGl0IHJlYWRzIChhcyBub3RlZCB3aGVuIAorCSAqIHVzZWMgZGVsdGEgaXMgPiA5MCUgIyBvZiB1c2Vjcy90aWNrKQorCSAqLworCWlmIChsb3N0ICYmIGFicyhkZWxheSAtIGRlbGF5X2F0X2xhc3RfaW50ZXJydXB0KSA+ICg5MDAwMDAvSFopKQorCQlqaWZmaWVzXzY0Kys7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9vZmZzZXRfY3ljbG9uZSh2b2lkKQoreworCXUzMiBvZmZzZXQ7CisKKwlpZighY3ljbG9uZV90aW1lcikKKwkJcmV0dXJuIGRlbGF5X2F0X2xhc3RfaW50ZXJydXB0OworCisJLyogUmVhZCB0aGUgY3ljbG9uZSB0aW1lciAqLworCW9mZnNldCA9IGN5Y2xvbmVfdGltZXJbMF07CisKKwkvKiAuLiByZWxhdGl2ZSB0byBwcmV2aW91cyBqaWZmeSAqLworCW9mZnNldCA9IG9mZnNldCAtIGxhc3RfY3ljbG9uZV9sb3c7CisKKwkvKiBjb252ZXJ0IGN5Y2xvbmUgdGlja3MgdG8gbWljcm9zZWNvbmRzICovCQorCS8qIFhYWCBzbG93LCBjYW4gd2Ugc3BlZWQgdGhpcyB1cD8gKi8KKwlvZmZzZXQgPSBvZmZzZXQvKENZQ0xPTkVfVElNRVJfRlJFUS8xMDAwMDAwKTsKKworCS8qIG91ciBhZGp1c3RlZCB0aW1lIG9mZnNldCBpbiBtaWNyb3NlY29uZHMgKi8KKwlyZXR1cm4gZGVsYXlfYXRfbGFzdF9pbnRlcnJ1cHQgKyBvZmZzZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgbW9ub3RvbmljX2Nsb2NrX2N5Y2xvbmUodm9pZCkKK3sKKwl1MzIgbm93X2xvdywgbm93X2hpZ2g7CisJdW5zaWduZWQgbG9uZyBsb25nIGxhc3Rfb2Zmc2V0LCB0aGlzX29mZnNldCwgYmFzZTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgcmV0OworCXVuc2lnbmVkIHNlcTsKKworCS8qIGF0b21pY2FsbHkgcmVhZCBtb25vdG9uaWMgYmFzZSAmIGxhc3Rfb2Zmc2V0ICovCisJZG8geworCQlzZXEgPSByZWFkX3NlcWJlZ2luKCZtb25vdG9uaWNfbG9jayk7CisJCWxhc3Rfb2Zmc2V0ID0gKCh1bnNpZ25lZCBsb25nIGxvbmcpbGFzdF9jeWNsb25lX2hpZ2g8PDMyKXxsYXN0X2N5Y2xvbmVfbG93OworCQliYXNlID0gbW9ub3RvbmljX2Jhc2U7CisJfSB3aGlsZSAocmVhZF9zZXFyZXRyeSgmbW9ub3RvbmljX2xvY2ssIHNlcSkpOworCisKKwkvKiBSZWFkIHRoZSBjeWNsb25lIGNvdW50ZXIgKi8KKwlyZWFkX2N5Y2xvbmVfY291bnRlcihub3dfbG93LG5vd19oaWdoKTsKKwl0aGlzX29mZnNldCA9ICgodW5zaWduZWQgbG9uZyBsb25nKW5vd19oaWdoPDwzMil8bm93X2xvdzsKKworCS8qIGNvbnZlcnQgdG8gbmFub3NlY29uZHMgKi8KKwlyZXQgPSBiYXNlICsgKCh0aGlzX29mZnNldCAtIGxhc3Rfb2Zmc2V0KSZDWUNMT05FX1RJTUVSX01BU0spOworCXJldHVybiByZXQgKiAoMTAwMDAwMDAwMCAvIENZQ0xPTkVfVElNRVJfRlJFUSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfY3ljbG9uZShjaGFyKiBvdmVycmlkZSkKK3sKKwl1MzIqIHJlZzsJCisJdTMyIGJhc2U7CQkvKiBzYXZlZCBjeWNsb25lIGJhc2UgYWRkcmVzcyAqLworCXUzMiBwYWdlYWRkcjsJLyogcGFnZSB0aGF0IGNvbnRhaW5zIGN5Y2xvbmVfdGltZXIgcmVnaXN0ZXIgKi8KKwl1MzIgb2Zmc2V0OwkJLyogb2Zmc2V0IGZyb20gcGFnZWFkZHIgdG8gY3ljbG9uZV90aW1lciByZWdpc3RlciAqLworCWludCBpOworCQorCS8qIGNoZWNrIGNsb2NrIG92ZXJyaWRlICovCisJaWYgKG92ZXJyaWRlWzBdICYmIHN0cm5jbXAob3ZlcnJpZGUsImN5Y2xvbmUiLDcpKQorCQkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKm1ha2Ugc3VyZSB3ZSdyZSBvbiBhIHN1bW1pdCBib3gqLworCWlmKCF1c2VfY3ljbG9uZSkgcmV0dXJuIC1FTk9ERVY7IAorCQorCXByaW50ayhLRVJOX0lORk8gIlN1bW1pdCBjaGlwc2V0OiBTdGFydGluZyBDeWNsb25lIENvdW50ZXIuXG4iKTsKKworCS8qIGZpbmQgYmFzZSBhZGRyZXNzICovCisJcGFnZWFkZHIgPSAoQ1lDTE9ORV9DQkFSX0FERFIpJlBBR0VfTUFTSzsKKwlvZmZzZXQgPSAoQ1lDTE9ORV9DQkFSX0FERFIpJih+UEFHRV9NQVNLKTsKKwlzZXRfZml4bWFwX25vY2FjaGUoRklYX0NZQ0xPTkVfVElNRVIsIHBhZ2VhZGRyKTsKKwlyZWcgPSAodTMyKikoZml4X3RvX3ZpcnQoRklYX0NZQ0xPTkVfVElNRVIpICsgb2Zmc2V0KTsKKwlpZighcmVnKXsKKwkJcHJpbnRrKEtFUk5fRVJSICJTdW1taXQgY2hpcHNldDogQ291bGQgbm90IGZpbmQgdmFsaWQgQ0JBUiByZWdpc3Rlci5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJYmFzZSA9ICpyZWc7CQorCWlmKCFiYXNlKXsKKwkJcHJpbnRrKEtFUk5fRVJSICJTdW1taXQgY2hpcHNldDogQ291bGQgbm90IGZpbmQgdmFsaWQgQ0JBUiB2YWx1ZS5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJCisJLyogc2V0dXAgUE1DQyAqLworCXBhZ2VhZGRyID0gKGJhc2UgKyBDWUNMT05FX1BNQ0NfT0ZGU0VUKSZQQUdFX01BU0s7CisJb2Zmc2V0ID0gKGJhc2UgKyBDWUNMT05FX1BNQ0NfT0ZGU0VUKSYoflBBR0VfTUFTSyk7CisJc2V0X2ZpeG1hcF9ub2NhY2hlKEZJWF9DWUNMT05FX1RJTUVSLCBwYWdlYWRkcik7CisJcmVnID0gKHUzMiopKGZpeF90b192aXJ0KEZJWF9DWUNMT05FX1RJTUVSKSArIG9mZnNldCk7CisJaWYoIXJlZyl7CisJCXByaW50ayhLRVJOX0VSUiAiU3VtbWl0IGNoaXBzZXQ6IENvdWxkIG5vdCBmaW5kIHZhbGlkIFBNQ0MgcmVnaXN0ZXIuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXJlZ1swXSA9IDB4MDAwMDAwMDE7CisKKwkvKiBzZXR1cCBNUENTICovCisJcGFnZWFkZHIgPSAoYmFzZSArIENZQ0xPTkVfTVBDU19PRkZTRVQpJlBBR0VfTUFTSzsKKwlvZmZzZXQgPSAoYmFzZSArIENZQ0xPTkVfTVBDU19PRkZTRVQpJih+UEFHRV9NQVNLKTsKKwlzZXRfZml4bWFwX25vY2FjaGUoRklYX0NZQ0xPTkVfVElNRVIsIHBhZ2VhZGRyKTsKKwlyZWcgPSAodTMyKikoZml4X3RvX3ZpcnQoRklYX0NZQ0xPTkVfVElNRVIpICsgb2Zmc2V0KTsKKwlpZighcmVnKXsKKwkJcHJpbnRrKEtFUk5fRVJSICJTdW1taXQgY2hpcHNldDogQ291bGQgbm90IGZpbmQgdmFsaWQgTVBDUyByZWdpc3Rlci5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmVnWzBdID0gMHgwMDAwMDAwMTsKKworCS8qIG1hcCBpbiBjeWNsb25lX3RpbWVyICovCisJcGFnZWFkZHIgPSAoYmFzZSArIENZQ0xPTkVfTVBNQ19PRkZTRVQpJlBBR0VfTUFTSzsKKwlvZmZzZXQgPSAoYmFzZSArIENZQ0xPTkVfTVBNQ19PRkZTRVQpJih+UEFHRV9NQVNLKTsKKwlzZXRfZml4bWFwX25vY2FjaGUoRklYX0NZQ0xPTkVfVElNRVIsIHBhZ2VhZGRyKTsKKwljeWNsb25lX3RpbWVyID0gKHUzMiopKGZpeF90b192aXJ0KEZJWF9DWUNMT05FX1RJTUVSKSArIG9mZnNldCk7CisJaWYoIWN5Y2xvbmVfdGltZXIpeworCQlwcmludGsoS0VSTl9FUlIgIlN1bW1pdCBjaGlwc2V0OiBDb3VsZCBub3QgZmluZCB2YWxpZCBNUE1DIHJlZ2lzdGVyLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qcXVpY2sgdGVzdCB0byBtYWtlIHN1cmUgaXRzIHRpY2tpbmcqLworCWZvcihpPTA7IGk8MzsgaSsrKXsKKwkJdTMyIG9sZCA9IGN5Y2xvbmVfdGltZXJbMF07CisJCWludCBzdGFsbCA9IDEwMDsKKwkJd2hpbGUoc3RhbGwtLSkgYmFycmllcigpOworCQlpZihjeWNsb25lX3RpbWVyWzBdID09IG9sZCl7CisJCQlwcmludGsoS0VSTl9FUlIgIlN1bW1pdCBjaGlwc2V0OiBDb3VudGVyIG5vdCBjb3VudGluZyEgRElTQUJMRURcbiIpOworCQkJY3ljbG9uZV90aW1lciA9IDA7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKworCWluaXRfY3B1X2toeigpOworCisJLyogRXZlcnl0aGluZyBsb29rcyBnb29kISAqLworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGRlbGF5X2N5Y2xvbmUodW5zaWduZWQgbG9uZyBsb29wcykKK3sKKwl1bnNpZ25lZCBsb25nIGJjbG9jaywgbm93OworCWlmKCFjeWNsb25lX3RpbWVyKQorCQlyZXR1cm47CisJYmNsb2NrID0gY3ljbG9uZV90aW1lclswXTsKKwlkbyB7CisJCXJlcF9ub3AoKTsKKwkJbm93ID0gY3ljbG9uZV90aW1lclswXTsKKwl9IHdoaWxlICgobm93LWJjbG9jaykgPCBsb29wcyk7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBjeWNsb25lIHRpbWVyX29wdHMgc3RydWN0ICovCitzdGF0aWMgc3RydWN0IHRpbWVyX29wdHMgdGltZXJfY3ljbG9uZSA9IHsKKwkubmFtZSA9ICJjeWNsb25lIiwKKwkubWFya19vZmZzZXQgPSBtYXJrX29mZnNldF9jeWNsb25lLCAKKwkuZ2V0X29mZnNldCA9IGdldF9vZmZzZXRfY3ljbG9uZSwKKwkubW9ub3RvbmljX2Nsb2NrID0JbW9ub3RvbmljX2Nsb2NrX2N5Y2xvbmUsCisJLmRlbGF5ID0gZGVsYXlfY3ljbG9uZSwKK307CisKK3N0cnVjdCBpbml0X3RpbWVyX29wdHMgX19pbml0ZGF0YSB0aW1lcl9jeWNsb25lX2luaXQgPSB7CisJLmluaXQgPSBpbml0X2N5Y2xvbmUsCisJLm9wdHMgPSAmdGltZXJfY3ljbG9uZSwKK307CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9ocGV0LmMgYi9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9ocGV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEzMTM0ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX2hwZXQuYwpAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIFRoaXMgY29kZSBsYXJnZWx5IG1vdmVkIGZyb20gYXJjaC9pMzg2L2tlcm5lbC90aW1lLmMuCisgKiBTZWUgY29tbWVudHMgdGhlcmUgZm9yIHByb3BlciBjcmVkaXRzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1leC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorCisjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorCisjaW5jbHVkZSAiaW9fcG9ydHMuaCIKKyNpbmNsdWRlICJtYWNoX3RpbWVyLmgiCisjaW5jbHVkZSA8YXNtL2hwZXQuaD4KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF91c2VjX3F1b3RpZW50OwkvKiBjb252ZXJ0IGhwZXQgY2xrcyB0byB1c2VjICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyB0c2NfaHBldF9xdW90aWVudDsJCS8qIGNvbnZlcnQgdHNjIHRvIGhwZXQgY2xrcyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF9sYXN0OyAJLyogaHBldCBjb3VudGVyIHZhbHVlIGF0IGxhc3QgdGljayovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0X3RzY19sb3c7CS8qIGxzYiAzMiBiaXRzIG9mIFRpbWUgU3RhbXAgQ291bnRlciAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdF90c2NfaGlnaDsgCS8qIG1zYiAzMiBiaXRzIG9mIFRpbWUgU3RhbXAgQ291bnRlciAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBtb25vdG9uaWNfYmFzZTsKK3N0YXRpYyBzZXFsb2NrX3QgbW9ub3RvbmljX2xvY2sgPSBTRVFMT0NLX1VOTE9DS0VEOworCisvKiBjb252ZXJ0IGZyb20gY3ljbGVzKDY0Yml0cykgPT4gbmFub3NlY29uZHMgKDY0Yml0cykKKyAqICBiYXNpYyBlcXVhdGlvbjoKKyAqCQlucyA9IGN5Y2xlcyAvIChmcmVxIC8gbnNfcGVyX3NlYykKKyAqCQlucyA9IGN5Y2xlcyAqIChuc19wZXJfc2VjIC8gZnJlcSkKKyAqCQlucyA9IGN5Y2xlcyAqICgxMF45IC8gKGNwdV9taHogKiAxMF42KSkKKyAqCQlucyA9IGN5Y2xlcyAqICgxMF4zIC8gY3B1X21oeikKKyAqCisgKglUaGVuIHdlIHVzZSBzY2FsaW5nIG1hdGggKHN1Z2dlc3RlZCBieSBnZW9yZ2VAbXZpc3RhLmNvbSkgdG8gZ2V0OgorICoJCW5zID0gY3ljbGVzICogKDEwXjMgKiBTQyAvIGNwdV9taHopIC8gU0MKKyAqCQlucyA9IGN5Y2xlcyAqIGN5YzJuc19zY2FsZSAvIFNDCisgKgorICoJQW5kIHNpbmNlIFNDIGlzIGEgY29uc3RhbnQgcG93ZXIgb2YgdHdvLCB3ZSBjYW4gY29udmVydCB0aGUgZGl2CisgKiAgaW50byBhIHNoaWZ0LgorICoJCQktam9obnN0dWxAdXMuaWJtLmNvbSAibWF0aCBpcyBoYXJkLCBsZXRzIGdvIHNob3BwaW5nISIKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgY3ljMm5zX3NjYWxlOworI2RlZmluZSBDWUMyTlNfU0NBTEVfRkFDVE9SIDEwIC8qIDJeMTAsIGNhcmVmdWxseSBjaG9zZW4gKi8KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9jeWMybnNfc2NhbGUodW5zaWduZWQgbG9uZyBjcHVfbWh6KQoreworCWN5YzJuc19zY2FsZSA9ICgxMDAwIDw8IENZQzJOU19TQ0FMRV9GQUNUT1IpL2NwdV9taHo7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIGN5Y2xlc18yX25zKHVuc2lnbmVkIGxvbmcgbG9uZyBjeWMpCit7CisJcmV0dXJuIChjeWMgKiBjeWMybnNfc2NhbGUpID4+IENZQzJOU19TQ0FMRV9GQUNUT1I7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgbW9ub3RvbmljX2Nsb2NrX2hwZXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgbGFzdF9vZmZzZXQsIHRoaXNfb2Zmc2V0LCBiYXNlOworCXVuc2lnbmVkIHNlcTsKKworCS8qIGF0b21pY2FsbHkgcmVhZCBtb25vdG9uaWMgYmFzZSAmIGxhc3Rfb2Zmc2V0ICovCisJZG8geworCQlzZXEgPSByZWFkX3NlcWJlZ2luKCZtb25vdG9uaWNfbG9jayk7CisJCWxhc3Rfb2Zmc2V0ID0gKCh1bnNpZ25lZCBsb25nIGxvbmcpbGFzdF90c2NfaGlnaDw8MzIpfGxhc3RfdHNjX2xvdzsKKwkJYmFzZSA9IG1vbm90b25pY19iYXNlOworCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnkoJm1vbm90b25pY19sb2NrLCBzZXEpKTsKKworCS8qIFJlYWQgdGhlIFRpbWUgU3RhbXAgQ291bnRlciAqLworCXJkdHNjbGwodGhpc19vZmZzZXQpOworCisJLyogcmV0dXJuIHRoZSB2YWx1ZSBpbiBucyAqLworCXJldHVybiBiYXNlICsgY3ljbGVzXzJfbnModGhpc19vZmZzZXQgLSBsYXN0X29mZnNldCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9vZmZzZXRfaHBldCh2b2lkKQoreworCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgZWF4LCBlZHg7CisKKwllYXggPSBocGV0X3JlYWRsKEhQRVRfQ09VTlRFUik7CisJZWF4IC09IGhwZXRfbGFzdDsJLyogaHBldCBkZWx0YSAqLworCisJLyoKKyAgICAgICAgICogVGltZSBvZmZzZXQgPSAoaHBldCBkZWx0YSkgKiAoIHVzZWNzIHBlciBIUEVUIGNsb2NrICkKKwkgKiAgICAgICAgICAgICA9IChocGV0IGRlbHRhKSAqICggdXNlY3MgcGVyIHRpY2sgLyBIUEVUIGNsb2NrcyBwZXIgdGljaykKKwkgKiAgICAgICAgICAgICA9IChocGV0IGRlbHRhKSAqICggaHBldF91c2VjX3F1b3RpZW50ICkgLyAoMl4zMikKKwkgKgorCSAqIFdoZXJlLAorCSAqIGhwZXRfdXNlY19xdW90aWVudCA9ICgyXjMyICogdXNlY3MgcGVyIHRpY2spL0hQRVQgY2xvY2tzIHBlciB0aWNrCisJICoKKwkgKiBVc2luZyBhIG11bGwgaW5zdGVhZCBvZiBhIGRpdmwgc2F2ZXMgc29tZSBjeWNsZXMgaW4gY3JpdGljYWwgcGF0aC4KKyAgICAgICAgICovCisJQVNNX01VTDY0X1JFRyhlYXgsIGVkeCwgaHBldF91c2VjX3F1b3RpZW50LCBlYXgpOworCisJLyogb3VyIGFkanVzdGVkIHRpbWUgb2Zmc2V0IGluIG1pY3Jvc2Vjb25kcyAqLworCXJldHVybiBlZHg7Cit9CisKK3N0YXRpYyB2b2lkIG1hcmtfb2Zmc2V0X2hwZXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgdGhpc19vZmZzZXQsIGxhc3Rfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCisJd3JpdGVfc2VxbG9jaygmbW9ub3RvbmljX2xvY2spOworCWxhc3Rfb2Zmc2V0ID0gKCh1bnNpZ25lZCBsb25nIGxvbmcpbGFzdF90c2NfaGlnaDw8MzIpfGxhc3RfdHNjX2xvdzsKKwlyZHRzYyhsYXN0X3RzY19sb3csIGxhc3RfdHNjX2hpZ2gpOworCisJb2Zmc2V0ID0gaHBldF9yZWFkbChIUEVUX1QwX0NNUCkgLSBocGV0X3RpY2s7CisJaWYgKHVubGlrZWx5KCgob2Zmc2V0IC0gaHBldF9sYXN0KSA+IGhwZXRfdGljaykgJiYgKGhwZXRfbGFzdCAhPSAwKSkpIHsKKwkJaW50IGxvc3RfdGlja3MgPSAob2Zmc2V0IC0gaHBldF9sYXN0KSAvIGhwZXRfdGljazsKKwkJamlmZmllc182NCArPSBsb3N0X3RpY2tzOworCX0KKwlocGV0X2xhc3QgPSBvZmZzZXQ7CisKKwkvKiB1cGRhdGUgdGhlIG1vbm90b25pYyBiYXNlIHZhbHVlICovCisJdGhpc19vZmZzZXQgPSAoKHVuc2lnbmVkIGxvbmcgbG9uZylsYXN0X3RzY19oaWdoPDwzMil8bGFzdF90c2NfbG93OworCW1vbm90b25pY19iYXNlICs9IGN5Y2xlc18yX25zKHRoaXNfb2Zmc2V0IC0gbGFzdF9vZmZzZXQpOworCXdyaXRlX3NlcXVubG9jaygmbW9ub3RvbmljX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBkZWxheV9ocGV0KHVuc2lnbmVkIGxvbmcgbG9vcHMpCit7CisJdW5zaWduZWQgbG9uZyBocGV0X3N0YXJ0LCBocGV0X2VuZDsKKwl1bnNpZ25lZCBsb25nIGVheDsKKworCS8qIGxvb3BzIGlzIHRoZSBudW1iZXIgb2YgY3B1IGN5Y2xlcy4gQ29udmVydCBpdCB0byBocGV0IGNsb2NrcyAqLworCUFTTV9NVUw2NF9SRUcoZWF4LCBsb29wcywgdHNjX2hwZXRfcXVvdGllbnQsIGxvb3BzKTsKKworCWhwZXRfc3RhcnQgPSBocGV0X3JlYWRsKEhQRVRfQ09VTlRFUik7CisJZG8geworCQlyZXBfbm9wKCk7CisJCWhwZXRfZW5kID0gaHBldF9yZWFkbChIUEVUX0NPVU5URVIpOworCX0gd2hpbGUgKChocGV0X2VuZCAtIGhwZXRfc3RhcnQpIDwgKGxvb3BzKSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfaHBldChjaGFyKiBvdmVycmlkZSkKK3sKKwl1bnNpZ25lZCBsb25nIHJlc3VsdCwgcmVtYWluOworCisJLyogY2hlY2sgY2xvY2sgb3ZlcnJpZGUgKi8KKwlpZiAob3ZlcnJpZGVbMF0gJiYgc3RybmNtcChvdmVycmlkZSwiaHBldCIsNCkpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwcmludGsoIlVzaW5nIEhQRVQgZm9yIGdldHRpbWVvZmRheVxuIik7CisJaWYgKGNwdV9oYXNfdHNjKSB7CisJCXVuc2lnbmVkIGxvbmcgdHNjX3F1b3RpZW50ID0gY2FsaWJyYXRlX3RzY19ocGV0KCZ0c2NfaHBldF9xdW90aWVudCk7CisJCWlmICh0c2NfcXVvdGllbnQpIHsKKwkJCS8qIHJlcG9ydCBDUFUgY2xvY2sgcmF0ZSBpbiBIei4KKwkJCSAqIFRoZSBmb3JtdWxhIGlzICgxMF42ICogMl4zMikgLyAoMl4zMiAqIDEgLyAoY2xvY2tzL3VzKSkgPQorCQkJICogY2xvY2svc2Vjb25kLiBPdXIgcHJlY2lzaW9uIGlzIGFib3V0IDEwMCBwcG0uCisJCQkgKi8KKwkJCXsJdW5zaWduZWQgbG9uZyBlYXg9MCwgZWR4PTEwMDA7CisJCQkJQVNNX0RJVjY0X1JFRyhjcHVfa2h6LCBlZHgsIHRzY19xdW90aWVudCwKKwkJCQkJCWVheCwgZWR4KTsKKwkJCQlwcmludGsoIkRldGVjdGVkICVsdS4lMDNsdSBNSHogcHJvY2Vzc29yLlxuIiwKKwkJCQkJY3B1X2toeiAvIDEwMDAsIGNwdV9raHogJSAxMDAwKTsKKwkJCX0KKwkJCXNldF9jeWMybnNfc2NhbGUoY3B1X2toei8xMDAwKTsKKwkJfQorCX0KKworCS8qCisJICogTWF0aCB0byBjYWxjdWxhdGUgaHBldCB0byB1c2VjIG11bHRpcGxpZXIKKwkgKiBMb29rIGZvciB0aGUgY29tbWVudHMgYXQgZ2V0X29mZnNldF9ocGV0KCkKKwkgKi8KKwlBU01fRElWNjRfUkVHKHJlc3VsdCwgcmVtYWluLCBocGV0X3RpY2ssIDAsIEtFUk5FTF9USUNLX1VTRUMpOworCWlmIChyZW1haW4gPiAoaHBldF90aWNrID4+IDEpKQorCQlyZXN1bHQrKzsgLyogcm91bmRpbmcgdGhlIHJlc3VsdCAqLworCWhwZXRfdXNlY19xdW90aWVudCA9IHJlc3VsdDsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiB0c2MgdGltZXJfb3B0cyBzdHJ1Y3QgKi8KK3N0YXRpYyBzdHJ1Y3QgdGltZXJfb3B0cyB0aW1lcl9ocGV0ID0geworCS5uYW1lID0gCQkiaHBldCIsCisJLm1hcmtfb2Zmc2V0ID0JCW1hcmtfb2Zmc2V0X2hwZXQsCisJLmdldF9vZmZzZXQgPQkJZ2V0X29mZnNldF9ocGV0LAorCS5tb25vdG9uaWNfY2xvY2sgPQltb25vdG9uaWNfY2xvY2tfaHBldCwKKwkuZGVsYXkgPSAJCWRlbGF5X2hwZXQsCit9OworCitzdHJ1Y3QgaW5pdF90aW1lcl9vcHRzIF9faW5pdGRhdGEgdGltZXJfaHBldF9pbml0ID0geworCS5pbml0ID0JaW5pdF9ocGV0LAorCS5vcHRzID0gJnRpbWVyX2hwZXQsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfbm9uZS5jIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfbm9uZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYTJmNDEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9ub25lLmMKQEAgLTAsMCArMSwzOSBAQAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vdGltZXIuaD4KKworc3RhdGljIHZvaWQgbWFya19vZmZzZXRfbm9uZSh2b2lkKQoreworCS8qIG5vdGhpbmcgbmVlZGVkICovCit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9vZmZzZXRfbm9uZSh2b2lkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIG1vbm90b25pY19jbG9ja19ub25lKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlbGF5X25vbmUodW5zaWduZWQgbG9uZyBsb29wcykKK3sKKwlpbnQgZDA7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSJcdGptcCAxZlxuIgorCQkiLmFsaWduIDE2XG4iCisJCSIxOlx0am1wIDJmXG4iCisJCSIuYWxpZ24gMTZcbiIKKwkJIjI6XHRkZWNsICUwXG5cdGpucyAyYiIKKwkJOiI9JmEiIChkMCkKKwkJOiIwIiAobG9vcHMpKTsKK30KKworLyogbm9uZSB0aW1lcl9vcHRzIHN0cnVjdCAqLworc3RydWN0IHRpbWVyX29wdHMgdGltZXJfbm9uZSA9IHsKKwkubmFtZSA9IAkibm9uZSIsCisJLm1hcmtfb2Zmc2V0ID0JbWFya19vZmZzZXRfbm9uZSwgCisJLmdldF9vZmZzZXQgPQlnZXRfb2Zmc2V0X25vbmUsCisJLm1vbm90b25pY19jbG9jayA9CW1vbm90b25pY19jbG9ja19ub25lLAorCS5kZWxheSA9IGRlbGF5X25vbmUsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfcGl0LmMgYi9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9waXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjdkNTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfcGl0LmMKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisgKiBUaGlzIGNvZGUgbGFyZ2VseSBtb3ZlZCBmcm9tIGFyY2gvaTM4Ni9rZXJuZWwvdGltZS5jLgorICogU2VlIGNvbW1lbnRzIHRoZXJlIGZvciBwcm9wZXIgY3JlZGl0cy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1leC5oPgorI2luY2x1ZGUgPGFzbS9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9tcHNwZWMuaD4KKyNpbmNsdWRlIDxhc20vdGltZXIuaD4KKyNpbmNsdWRlIDxhc20vc21wLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2hfaG9va3MuaD4KKworZXh0ZXJuIHNwaW5sb2NrX3QgaTgyNTlBX2xvY2s7CitleHRlcm4gc3BpbmxvY2tfdCBpODI1M19sb2NrOworI2luY2x1ZGUgImRvX3RpbWVyLmgiCisjaW5jbHVkZSAiaW9fcG9ydHMuaCIKKworc3RhdGljIGludCBjb3VudF9wOyAvKiBjb3VudGVyIGluIGdldF9vZmZzZXRfcGl0KCkgKi8KKworc3RhdGljIGludCBfX2luaXQgaW5pdF9waXQoY2hhciogb3ZlcnJpZGUpCit7CisgCS8qIGNoZWNrIGNsb2NrIG92ZXJyaWRlICovCisgCWlmIChvdmVycmlkZVswXSAmJiBzdHJuY21wKG92ZXJyaWRlLCJwaXQiLDMpKQorIAkJcHJpbnRrKEtFUk5fRVJSICJXYXJuaW5nOiBjbG9jaz0gb3ZlcnJpZGUgZmFpbGVkLiBEZWZhdWx0aW5nIHRvIFBJVFxuIik7CisgCisJY291bnRfcCA9IExBVENIOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtYXJrX29mZnNldF9waXQodm9pZCkKK3sKKwkvKiBub3RoaW5nIG5lZWRlZCAqLworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIG1vbm90b25pY19jbG9ja19waXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGVsYXlfcGl0KHVuc2lnbmVkIGxvbmcgbG9vcHMpCit7CisJaW50IGQwOworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkiXHRqbXAgMWZcbiIKKwkJIi5hbGlnbiAxNlxuIgorCQkiMTpcdGptcCAyZlxuIgorCQkiLmFsaWduIDE2XG4iCisJCSIyOlx0ZGVjbCAlMFxuXHRqbnMgMmIiCisJCToiPSZhIiAoZDApCisJCToiMCIgKGxvb3BzKSk7Cit9CisKKworLyogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aXRoIHh0aW1lX2xvY2sgaGVsZC4KKyAqIEl0IHdhcyBpbnNwaXJlZCBieSBTdGV2ZSBNY0Nhbm5lJ3MgbWljcm90aW1lLWkzODYgZm9yIEJTRC4gIC0tIGpycworICogCisgKiBIb3dldmVyLCB0aGUgcGMtYXVkaW8gc3BlYWtlciBkcml2ZXIgY2hhbmdlcyB0aGUgZGl2aXNvciBzbyB0aGF0CisgKiBpdCBnZXRzIGludGVycnVwdGVkIHJhdGhlciBtb3JlIG9mdGVuIC0gaXQgbG9hZHMgNjQgaW50byB0aGUKKyAqIGNvdW50ZXIgcmF0aGVyIHRoYW4gMTE5MzIhIFRoaXMgaGFzIGFuIGFkdmVyc2UgaW1wYWN0IG9uCisgKiBkb19nZXR0aW1lb2Zmc2V0KCkgLS0gaXQgc3RvcHMgd29ya2luZyEgV2hhdCBpcyBhbHNvIG5vdAorICogZ29vZCBpcyB0aGF0IHRoZSBpbnRlcnZhbCB0aGF0IG91ciB0aW1lciBmdW5jdGlvbiBnZXRzIGNhbGxlZAorICogaXMgbm8gbG9uZ2VyIDEwLjAwMDIgbXMsIGJ1dCA5Ljk3NjcgbXMuIFRvIGdldCBhcm91bmQgdGhpcworICogd291bGQgcmVxdWlyZSB1c2luZyBhIGRpZmZlcmVudCB0aW1pbmcgc291cmNlLiBNYXliZSBzb21lb25lCisgKiBjb3VsZCB1c2UgdGhlIFJUQyAtIEkga25vdyB0aGF0IHRoaXMgY2FuIGludGVycnVwdCBhdCBmcmVxdWVuY2llcworICogcmFuZ2luZyBmcm9tIDgxOTJIeiB0byAySHouIElmIEkgaGFkIHRoZSBlbmVyZ3ksIEknZCBzb21laG93IGZpeAorICogaXQgc28gdGhhdCBhdCBzdGFydHVwLCB0aGUgdGltZXIgY29kZSBpbiBzY2hlZC5jIHdvdWxkIHNlbGVjdAorICogdXNpbmcgZWl0aGVyIHRoZSBSVEMgb3IgdGhlIDgyNTMgdGltZXIuIFRoZSBkZWNpc2lvbiB3b3VsZCBiZQorICogYmFzZWQgb24gd2hldGhlciB0aGVyZSB3YXMgYW55IG90aGVyIGRldmljZSBhcm91bmQgdGhhdCBuZWVkZWQKKyAqIHRvIHRyYW1wbGUgb24gdGhlIDgyNTMuIEknZCBzZXQgdXAgdGhlIFJUQyB0byBpbnRlcnJ1cHQgYXQgMTAyNCBIeiwKKyAqIGFuZCB0aGVuIGRvIHNvbWUgamlnZ2VyeSB0byBoYXZlIGEgdmVyc2lvbiBvZiBkb190aW1lciB0aGF0IAorICogYWR2YW5jZWQgdGhlIGNsb2NrIGJ5IDEvMTAyNCBzLiBFdmVyeSB0aW1lIHRoYXQgcmVhY2hlZCBvdmVyIDEvMTAwCisgKiBvZiBhIHNlY29uZCwgdGhlbiBkbyBhbGwgdGhlIG9sZCBjb2RlLiBJZiB0aGUgdGltZSB3YXMga2VwdCBjb3JyZWN0CisgKiB0aGVuIGRvX2dldHRpbWVvZmZzZXQgY291bGQganVzdCByZXR1cm4gMCAtIHRoZXJlIGlzIG5vIGxvdyBvcmRlcgorICogZGl2aWRlciB0aGF0IGNhbiBiZSBhY2Nlc3NlZC4KKyAqCisgKiBJZGVhbGx5LCB5b3Ugd291bGQgYmUgYWJsZSB0byB1c2UgdGhlIFJUQyBmb3IgdGhlIHNwZWFrZXIgZHJpdmVyLAorICogYnV0IGl0IGFwcGVhcnMgdGhhdCB0aGUgc3BlYWtlciBkcml2ZXIgcmVhbGx5IG5lZWRzIGludGVycnVwdCBtb3JlCisgKiBvZnRlbiB0aGFuIGV2ZXJ5IDEyMCB1cyBvciBzby4KKyAqCisgKiBBbnl3YXksIHRoaXMgbmVlZHMgbW9yZSB0aG91Z2h0Li4uLgkJcGpzZyAoMTk5My0wOC0yOCkKKyAqIAorICogSWYgeW91IGFyZSByZWFsbHkgdGhhdCBpbnRlcmVzdGVkLCB5b3Ugc2hvdWxkIGJlIHJlYWRpbmcKKyAqIGNvbXAucHJvdG9jb2xzLnRpbWUubnRwIQorICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9vZmZzZXRfcGl0KHZvaWQpCit7CisJaW50IGNvdW50OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgamlmZmllc19wID0gMDsKKworCS8qCisJICogY2FjaGUgdm9sYXRpbGUgamlmZmllcyB0ZW1wb3JhcmlseTsgd2UgaGF2ZSB4dGltZV9sb2NrLiAKKwkgKi8KKwl1bnNpZ25lZCBsb25nIGppZmZpZXNfdDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpODI1M19sb2NrLCBmbGFncyk7CisJLyogdGltZXIgY291bnQgbWF5IHVuZGVyZmxvdyByaWdodCBoZXJlICovCisJb3V0Yl9wKDB4MDAsIFBJVF9NT0RFKTsJLyogbGF0Y2ggdGhlIGNvdW50IEFTQVAgKi8KKworCWNvdW50ID0gaW5iX3AoUElUX0NIMCk7CS8qIHJlYWQgdGhlIGxhdGNoZWQgY291bnQgKi8KKworCS8qCisJICogV2UgZG8gdGhpcyBndWFyYW50ZWVkIGRvdWJsZSBtZW1vcnkgYWNjZXNzIGluc3RlYWQgb2YgYSBfcCAKKwkgKiBwb3N0Zml4IGluIHRoZSBwcmV2aW91cyBwb3J0IGFjY2Vzcy4gV2hlZWUsIGhhY2thZHkgaGFjaworCSAqLworIAlqaWZmaWVzX3QgPSBqaWZmaWVzOworCisJY291bnQgfD0gaW5iX3AoUElUX0NIMCkgPDwgODsKKwkKKyAgICAgICAgLyogVklBNjg2YSB0ZXN0IGNvZGUuLi4gcmVzZXQgdGhlIGxhdGNoIGlmIGNvdW50ID4gbWF4ICsgMSAqLworICAgICAgICBpZiAoY291bnQgPiBMQVRDSCkgeworICAgICAgICAgICAgICAgIG91dGJfcCgweDM0LCBQSVRfTU9ERSk7CisgICAgICAgICAgICAgICAgb3V0Yl9wKExBVENIICYgMHhmZiwgUElUX0NIMCk7CisgICAgICAgICAgICAgICAgb3V0YihMQVRDSCA+PiA4LCBQSVRfQ0gwKTsKKyAgICAgICAgICAgICAgICBjb3VudCA9IExBVENIIC0gMTsKKyAgICAgICAgfQorCQorCS8qCisJICogYXZvaWRpbmcgdGltZXIgaW5jb25zaXN0ZW5jaWVzICh0aGV5IGFyZSByYXJlLCBidXQgdGhleSBoYXBwZW4pLi4uCisJICogdGhlcmUgYXJlIHR3byBraW5kcyBvZiBwcm9ibGVtcyB0aGF0IG11c3QgYmUgYXZvaWRlZCBoZXJlOgorCSAqICAxLiB0aGUgdGltZXIgY291bnRlciB1bmRlcmZsb3dzCisJICogIDIuIGhhcmR3YXJlIHByb2JsZW0gd2l0aCB0aGUgdGltZXIsIG5vdCBnaXZpbmcgdXMgY29udGludW91cyB0aW1lLAorCSAqICAgICB0aGUgY291bnRlciBkb2VzIHNtYWxsICJqdW1wcyIgdXB3YXJkcyBvbiBzb21lIFBlbnRpdW0gc3lzdGVtcywKKwkgKiAgICAgKHNlZSBjJ3QgOTUvMTAgcGFnZSAzMzUgZm9yIE5lcHR1biBidWcuKQorCSAqLworCisJaWYoIGppZmZpZXNfdCA9PSBqaWZmaWVzX3AgKSB7CisJCWlmKCBjb3VudCA+IGNvdW50X3AgKSB7CisJCQkvKiB0aGUgbnV0Y2FzZSAqLworCQkJY291bnQgPSBkb190aW1lcl9vdmVyZmxvdyhjb3VudCk7CisJCX0KKwl9IGVsc2UKKwkJamlmZmllc19wID0gamlmZmllc190OworCisJY291bnRfcCA9IGNvdW50OworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTgyNTNfbG9jaywgZmxhZ3MpOworCisJY291bnQgPSAoKExBVENILTEpIC0gY291bnQpICogVElDS19TSVpFOworCWNvdW50ID0gKGNvdW50ICsgTEFUQ0gvMikgLyBMQVRDSDsKKworCXJldHVybiBjb3VudDsKK30KKworCisvKiB0c2MgdGltZXJfb3B0cyBzdHJ1Y3QgKi8KK3N0cnVjdCB0aW1lcl9vcHRzIHRpbWVyX3BpdCA9IHsKKwkubmFtZSA9ICJwaXQiLAorCS5tYXJrX29mZnNldCA9IG1hcmtfb2Zmc2V0X3BpdCwgCisJLmdldF9vZmZzZXQgPSBnZXRfb2Zmc2V0X3BpdCwKKwkubW9ub3RvbmljX2Nsb2NrID0gbW9ub3RvbmljX2Nsb2NrX3BpdCwKKwkuZGVsYXkgPSBkZWxheV9waXQsCit9OworCitzdHJ1Y3QgaW5pdF90aW1lcl9vcHRzIF9faW5pdGRhdGEgdGltZXJfcGl0X2luaXQgPSB7CisJLmluaXQgPSBpbml0X3BpdCwgCisJLm9wdHMgPSAmdGltZXJfcGl0LAorfTsKKwordm9pZCBzZXR1cF9waXRfdGltZXIodm9pZCkKK3sKKwlleHRlcm4gc3BpbmxvY2tfdCBpODI1M19sb2NrOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTgyNTNfbG9jaywgZmxhZ3MpOworCW91dGJfcCgweDM0LFBJVF9NT0RFKTsJCS8qIGJpbmFyeSwgbW9kZSAyLCBMU0IvTVNCLCBjaCAwICovCisJdWRlbGF5KDEwKTsKKwlvdXRiX3AoTEFUQ0ggJiAweGZmICwgUElUX0NIMCk7CS8qIExTQiAqLworCXVkZWxheSgxMCk7CisJb3V0YihMQVRDSCA+PiA4ICwgUElUX0NIMCk7CS8qIE1TQiAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmk4MjUzX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCB0aW1lcl9yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKmRldikKK3sKKwlzZXR1cF9waXRfdGltZXIoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3MgdGltZXJfc3lzY2xhc3MgPSB7CisJc2V0X2tzZXRfbmFtZSgidGltZXJfcGl0IiksCisJLnJlc3VtZQk9IHRpbWVyX3Jlc3VtZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBkZXZpY2VfdGltZXIgPSB7CisJLmlkCT0gMCwKKwkuY2xzCT0gJnRpbWVyX3N5c2NsYXNzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF90aW1lcl9zeXNmcyh2b2lkKQoreworCWludCBlcnJvciA9IHN5c2Rldl9jbGFzc19yZWdpc3RlcigmdGltZXJfc3lzY2xhc3MpOworCWlmICghZXJyb3IpCisJCWVycm9yID0gc3lzZGV2X3JlZ2lzdGVyKCZkZXZpY2VfdGltZXIpOworCXJldHVybiBlcnJvcjsKK30KKworZGV2aWNlX2luaXRjYWxsKGluaXRfdGltZXJfc3lzZnMpOworCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9wbS5jIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfcG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzdmMjIwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfcG0uYwpAQCAtMCwwICsxLDI1OCBAQAorLyoKKyAqIChDKSBEb21pbmlrIEJyb2Rvd3NraSA8bGludXhAYnJvZG8uZGU+IDIwMDMKKyAqCisgKiBEcml2ZXIgdG8gdXNlIHRoZSBQb3dlciBNYW5hZ2VtZW50IFRpbWVyIChQTVRNUikgYXZhaWxhYmxlIGluIHNvbWUKKyAqIHNvdXRoYnJpZGdlcyBhcyBwcmltYXJ5IHRpbWluZyBzb3VyY2UgZm9yIHRoZSBMaW51eCBrZXJuZWwuCisgKgorICogQmFzZWQgb24gcGFydHMgb2YgbGludXgvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3dGltZXIuYywgdGltZXJfcGl0LmMsCisgKiB0aW1lcl9ocGV0LmMsIGFuZCBvbiBBcmphbiB2YW4gZGUgVmVuJ3MgaW1wbGVtZW50YXRpb24gZm9yIDIuNC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTCB2Mi4KKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CisjaW5jbHVkZSA8YXNtL3NtcC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoX2hvb2tzLmg+CisKKyNpbmNsdWRlIDxsaW51eC90aW1leC5oPgorI2luY2x1ZGUgIm1hY2hfdGltZXIuaCIKKworLyogTnVtYmVyIG9mIFBNVE1SIHRpY2tzIGV4cGVjdGVkIGR1cmluZyBjYWxpYnJhdGlvbiBydW4gKi8KKyNkZWZpbmUgUE1UTVJfVElDS1NfUEVSX1NFQyAzNTc5NTQ1CisjZGVmaW5lIFBNVE1SX0VYUEVDVEVEX1JBVEUgXAorICAoKENBTElCUkFURV9MQVRDSCAqIChQTVRNUl9USUNLU19QRVJfU0VDID4+IDEwKSkgLyAoQ0xPQ0tfVElDS19SQVRFPj4xMCkpCisKKworLyogVGhlIEkvTyBwb3J0IHRoZSBQTVRNUiByZXNpZGVzIGF0LgorICogVGhlIGxvY2F0aW9uIGlzIGRldGVjdGVkIGR1cmluZyBzZXR1cF9hcmNoKCksCisgKiBpbiBhcmNoL2kzODYvYWNwaS9ib290LmMgKi8KK3UzMiBwbXRtcl9pb3BvcnQgPSAwOworCisKKy8qIHZhbHVlIG9mIHRoZSBQb3dlciB0aW1lciBhdCBsYXN0IHRpbWVyIGludGVycnVwdCAqLworc3RhdGljIHUzMiBvZmZzZXRfdGljazsKK3N0YXRpYyB1MzIgb2Zmc2V0X2RlbGF5OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIG1vbm90b25pY19iYXNlOworc3RhdGljIHNlcWxvY2tfdCBtb25vdG9uaWNfbG9jayA9IFNFUUxPQ0tfVU5MT0NLRUQ7CisKKyNkZWZpbmUgQUNQSV9QTV9NQVNLIDB4RkZGRkZGIC8qIGxpbWl0IGl0IHRvIDI0IGJpdHMgKi8KKworLypoZWxwZXIgZnVuY3Rpb24gdG8gc2FmZWx5IHJlYWQgYWNwaSBwbSB0aW1lc291cmNlKi8KK3N0YXRpYyBpbmxpbmUgdTMyIHJlYWRfcG10bXIodm9pZCkKK3sKKwl1MzIgdjE9MCx2Mj0wLHYzPTA7CisJLyogSXQgaGFzIGJlZW4gcmVwb3J0ZWQgdGhhdCBiZWNhdXNlIG9mIHZhcmlvdXMgYnJva2VuCisJICogY2hpcHNldHMgKElDSDQsIFBJSVg0IGFuZCBQSUlYNEUpIHdoZXJlIHRoZSBBQ1BJIFBNIHRpbWUKKwkgKiBzb3VyY2UgaXMgbm90IGxhdGNoZWQsIHNvIHlvdSBtdXN0IHJlYWQgaXQgbXVsdGlwbGUKKwkgKiB0aW1lcyB0byBpbnN1cmUgYSBzYWZlIHZhbHVlIGlzIHJlYWQuCisJICovCisJZG8geworCQl2MSA9IGlubChwbXRtcl9pb3BvcnQpOworCQl2MiA9IGlubChwbXRtcl9pb3BvcnQpOworCQl2MyA9IGlubChwbXRtcl9pb3BvcnQpOworCX0gd2hpbGUgKCh2MSA+IHYyICYmIHYxIDwgdjMpIHx8ICh2MiA+IHYzICYmIHYyIDwgdjEpCisJCQl8fCAodjMgPiB2MSAmJiB2MyA8IHYyKSk7CisKKwkvKiBtYXNrIHRoZSBvdXRwdXQgdG8gMjQgYml0cyAqLworCXJldHVybiB2MiAmIEFDUElfUE1fTUFTSzsKK30KKworCisvKgorICogU29tZSBib2FyZHMgaGF2ZSB0aGUgUE1UTVIgcnVubmluZyB3YXkgdG9vIGZhc3QuIFdlIGNoZWNrCisgKiB0aGUgUE1UTVIgcmF0ZSBhZ2FpbnN0IFBJVCBjaGFubmVsIDIgdG8gY2F0Y2ggdGhlc2UgY2FzZXMuCisgKi8KK3N0YXRpYyBpbnQgdmVyaWZ5X3BtdG1yX3JhdGUodm9pZCkKK3sKKwl1MzIgdmFsdWUxLCB2YWx1ZTI7CisJdW5zaWduZWQgbG9uZyBjb3VudCwgZGVsdGE7CisKKwltYWNoX3ByZXBhcmVfY291bnRlcigpOworCXZhbHVlMSA9IHJlYWRfcG10bXIoKTsKKwltYWNoX2NvdW50dXAoJmNvdW50KTsKKwl2YWx1ZTIgPSByZWFkX3BtdG1yKCk7CisJZGVsdGEgPSAodmFsdWUyIC0gdmFsdWUxKSAmIEFDUElfUE1fTUFTSzsKKworCS8qIENoZWNrIHRoYXQgdGhlIFBNVE1SIGRlbHRhIGlzIHdpdGhpbiA1JSBvZiB3aGF0IHdlIGV4cGVjdCAqLworCWlmIChkZWx0YSA8IChQTVRNUl9FWFBFQ1RFRF9SQVRFICogMTkpIC8gMjAgfHwKKwkgICAgZGVsdGEgPiAoUE1UTVJfRVhQRUNURURfUkFURSAqIDIxKSAvIDIwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIlBNLVRpbWVyIHJ1bm5pbmcgYXQgaW52YWxpZCByYXRlOiAlbHUlJSBvZiBub3JtYWwgLSBhYm9ydGluZy5cbiIsIDEwMFVMICogZGVsdGEgLyBQTVRNUl9FWFBFQ1RFRF9SQVRFKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaW5pdF9wbXRtcihjaGFyKiBvdmVycmlkZSkKK3sKKwl1MzIgdmFsdWUxLCB2YWx1ZTI7CisJdW5zaWduZWQgaW50IGk7CisKKyAJaWYgKG92ZXJyaWRlWzBdICYmIHN0cm5jbXAob3ZlcnJpZGUsInBtdG1yIiw1KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIXBtdG1yX2lvcG9ydCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiB3ZSB1c2UgdGhlIFRTQyBmb3IgZGVsYXlfcG10bXIsIHNvIG1ha2Ugc3VyZSBpdCBleGlzdHMgKi8KKwlpZiAoIWNwdV9oYXNfdHNjKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qICJ2ZXJpZnkiIHRoaXMgdGltaW5nIHNvdXJjZSAqLworCXZhbHVlMSA9IHJlYWRfcG10bXIoKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgeworCQl2YWx1ZTIgPSByZWFkX3BtdG1yKCk7CisJCWlmICh2YWx1ZTIgPT0gdmFsdWUxKQorCQkJY29udGludWU7CisJCWlmICh2YWx1ZTIgPiB2YWx1ZTEpCisJCQlnb3RvIHBtX2dvb2Q7CisJCWlmICgodmFsdWUyIDwgdmFsdWUxKSAmJiAoKHZhbHVlMikgPCAweEZGRikpCisJCQlnb3RvIHBtX2dvb2Q7CisJCXByaW50ayhLRVJOX0lORk8gIlBNLVRpbWVyIGhhZCBpbmNvbnNpc3RlbnQgcmVzdWx0czogMHglI3gsIDB4JSN4IC0gYWJvcnRpbmcuXG4iLCB2YWx1ZTEsIHZhbHVlMik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwcmludGsoS0VSTl9JTkZPICJQTS1UaW1lciBoYWQgbm8gcmVhc29uYWJsZSByZXN1bHQ6IDB4JSN4IC0gYWJvcnRpbmcuXG4iLCB2YWx1ZTEpOworCXJldHVybiAtRU5PREVWOworCitwbV9nb29kOgorCWlmICh2ZXJpZnlfcG10bXJfcmF0ZSgpICE9IDApCisJCXJldHVybiAtRU5PREVWOworCisJaW5pdF9jcHVfa2h6KCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGN5YzJ1cyh1MzIgY3ljbGVzKQoreworCS8qIFRoZSBQb3dlciBNYW5hZ2VtZW50IFRpbWVyIHRpY2tzIGF0IDMuNTc5NTQ1IHRpY2tzIHBlciBtaWNyb3NlY29uZC4KKwkgKiAxIC8gUE1fVElNRVJfRlJFUVVFTkNZID09IDAuMjc5MzY1MTEgPX4gMjg2LzEwMjQgW2Vycm9yOiAwLjAyNCVdCisJICoKKwkgKiBFdmVuIHdpdGggSFogPSAxMDAsIGRlbHRhIGlzIGF0IG1heGltdW0gMzU3OTYgdGlja3MsIHNvIGl0IGNhbgorCSAqIGVhc2lseSBiZSBtdWx0aXBsaWVkIHdpdGggMjg2ICg9MHgxMUUpIHdpdGhvdXQgaGF2aW5nIHRvIGZlYXIKKwkgKiB1MzIgb3ZlcmZsb3dzLgorCSAqLworCWN5Y2xlcyAqPSAyODY7CisJcmV0dXJuIChjeWNsZXMgPj4gMTApOworfQorCisvKgorICogdGhpcyBnZXRzIGNhbGxlZCBkdXJpbmcgZWFjaCB0aW1lciBpbnRlcnJ1cHQKKyAqICAgLSBDYWxsZWQgd2hpbGUgaG9sZGluZyB0aGUgd3JpdGVyIHh0aW1lX2xvY2sKKyAqLworc3RhdGljIHZvaWQgbWFya19vZmZzZXRfcG10bXIodm9pZCkKK3sKKwl1MzIgbG9zdCwgZGVsdGEsIGxhc3Rfb2Zmc2V0OworCXN0YXRpYyBpbnQgZmlyc3RfcnVuID0gMTsKKwlsYXN0X29mZnNldCA9IG9mZnNldF90aWNrOworCisJd3JpdGVfc2VxbG9jaygmbW9ub3RvbmljX2xvY2spOworCisJb2Zmc2V0X3RpY2sgPSByZWFkX3BtdG1yKCk7CisKKwkvKiBjYWxjdWxhdGUgdGljayBpbnRlcnZhbCAqLworCWRlbHRhID0gKG9mZnNldF90aWNrIC0gbGFzdF9vZmZzZXQpICYgQUNQSV9QTV9NQVNLOworCisJLyogY29udmVydCB0byB1c2VjcyAqLworCWRlbHRhID0gY3ljMnVzKGRlbHRhKTsKKworCS8qIHVwZGF0ZSB0aGUgbW9ub3RvbmljIGJhc2UgdmFsdWUgKi8KKwltb25vdG9uaWNfYmFzZSArPSBkZWx0YSAqIE5TRUNfUEVSX1VTRUM7CisJd3JpdGVfc2VxdW5sb2NrKCZtb25vdG9uaWNfbG9jayk7CisKKwkvKiBjb252ZXJ0IHRvIHRpY2tzICovCisJZGVsdGEgKz0gb2Zmc2V0X2RlbGF5OworCWxvc3QgPSBkZWx0YSAvIChVU0VDX1BFUl9TRUMgLyBIWik7CisJb2Zmc2V0X2RlbGF5ID0gZGVsdGEgJSAoVVNFQ19QRVJfU0VDIC8gSFopOworCisKKwkvKiBjb21wZW5zYXRlIGZvciBsb3N0IHRpY2tzICovCisJaWYgKGxvc3QgPj0gMikKKwkJamlmZmllc182NCArPSBsb3N0IC0gMTsKKworCS8qIGRvbid0IGNhbGN1bGF0ZSBkZWxheSBmb3IgZmlyc3QgcnVuLAorCSAgIG9yIGlmIHdlJ3ZlIGdvdCBsZXNzIHRoZW4gYSB0aWNrICovCisJaWYgKGZpcnN0X3J1biB8fCAobG9zdCA8IDEpKSB7CisJCWZpcnN0X3J1biA9IDA7CisJCW9mZnNldF9kZWxheSA9IDA7CisJfQorfQorCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgbW9ub3RvbmljX2Nsb2NrX3BtdG1yKHZvaWQpCit7CisJdTMyIGxhc3Rfb2Zmc2V0LCB0aGlzX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgYmFzZSwgcmV0OworCXVuc2lnbmVkIHNlcTsKKworCisJLyogYXRvbWljYWxseSByZWFkIG1vbm90b25pYyBiYXNlICYgbGFzdF9vZmZzZXQgKi8KKwlkbyB7CisJCXNlcSA9IHJlYWRfc2VxYmVnaW4oJm1vbm90b25pY19sb2NrKTsKKwkJbGFzdF9vZmZzZXQgPSBvZmZzZXRfdGljazsKKwkJYmFzZSA9IG1vbm90b25pY19iYXNlOworCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnkoJm1vbm90b25pY19sb2NrLCBzZXEpKTsKKworCS8qIFJlYWQgdGhlIHBtdG1yICovCisJdGhpc19vZmZzZXQgPSAgcmVhZF9wbXRtcigpOworCisJLyogY29udmVydCB0byBuYW5vc2Vjb25kcyAqLworCXJldCA9ICh0aGlzX29mZnNldCAtIGxhc3Rfb2Zmc2V0KSAmIEFDUElfUE1fTUFTSzsKKwlyZXQgPSBiYXNlICsgKGN5YzJ1cyhyZXQpICogTlNFQ19QRVJfVVNFQyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZGVsYXlfcG10bXIodW5zaWduZWQgbG9uZyBsb29wcykKK3sKKwl1bnNpZ25lZCBsb25nIGJjbG9jaywgbm93OworCisJcmR0c2NsKGJjbG9jayk7CisJZG8KKwl7CisJCXJlcF9ub3AoKTsKKwkJcmR0c2NsKG5vdyk7CisJfSB3aGlsZSAoKG5vdy1iY2xvY2spIDwgbG9vcHMpOworfQorCisKKy8qCisgKiBnZXQgdGhlIG9mZnNldCAoaW4gbWljcm9zZWNvbmRzKSBmcm9tIHRoZSBsYXN0IGNhbGwgdG8gbWFya19vZmZzZXQoKQorICoJLSBDYWxsZWQgaG9sZGluZyBhIHJlYWRlciB4dGltZV9sb2NrCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9vZmZzZXRfcG10bXIodm9pZCkKK3sKKwl1MzIgbm93LCBvZmZzZXQsIGRlbHRhID0gMDsKKworCW9mZnNldCA9IG9mZnNldF90aWNrOworCW5vdyA9IHJlYWRfcG10bXIoKTsKKwlkZWx0YSA9IChub3cgLSBvZmZzZXQpJkFDUElfUE1fTUFTSzsKKworCXJldHVybiAodW5zaWduZWQgbG9uZykgb2Zmc2V0X2RlbGF5ICsgY3ljMnVzKGRlbHRhKTsKK30KKworCisvKiBhY3BpIHRpbWVyX29wdHMgc3RydWN0ICovCitzdGF0aWMgc3RydWN0IHRpbWVyX29wdHMgdGltZXJfcG10bXIgPSB7CisJLm5hbWUJCQk9ICJwbXRtciIsCisJLm1hcmtfb2Zmc2V0CQk9IG1hcmtfb2Zmc2V0X3BtdG1yLAorCS5nZXRfb2Zmc2V0CQk9IGdldF9vZmZzZXRfcG10bXIsCisJLm1vbm90b25pY19jbG9jayAJPSBtb25vdG9uaWNfY2xvY2tfcG10bXIsCisJLmRlbGF5IAkJCT0gZGVsYXlfcG10bXIsCit9OworCitzdHJ1Y3QgaW5pdF90aW1lcl9vcHRzIF9faW5pdGRhdGEgdGltZXJfcG10bXJfaW5pdCA9IHsKKwkuaW5pdCA9IGluaXRfcG10bXIsCisJLm9wdHMgPSAmdGltZXJfcG10bXIsCit9OworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJEb21pbmlrIEJyb2Rvd3NraSA8bGludXhAYnJvZG8uZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBvd2VyIE1hbmFnZW1lbnQgVGltZXIgKFBNVE1SKSBhcyBwcmltYXJ5IHRpbWluZyBzb3VyY2UgZm9yIHg4NiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfdHNjLmMgYi9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl90c2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjg1OTk0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfdHNjLmMKQEAgLTAsMCArMSw1NjAgQEAKKy8qCisgKiBUaGlzIGNvZGUgbGFyZ2VseSBtb3ZlZCBmcm9tIGFyY2gvaTM4Ni9rZXJuZWwvdGltZS5jLgorICogU2VlIGNvbW1lbnRzIHRoZXJlIGZvciBwcm9wZXIgY3JlZGl0cy4KKyAqCisgKiAyMDA0LTA2LTI1ICAgIEplc3BlciBKdWhsCisgKiAgICAgIG1vdmVkIG1hcmtfb2Zmc2V0X3RzYyBiZWxvdyBjcHVmcmVxX2RlbGF5ZWRfZ2V0IHRvIGF2b2lkIGdjYyAzLjQKKyAqICAgICAgZmFpbGluZyB0byBpbmxpbmUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorCisjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisvKiBwcm9jZXNzb3IuaCBmb3IgZGlzdGFibGVfdHNjIGZsYWcgKi8KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKKyNpbmNsdWRlICJpb19wb3J0cy5oIgorI2luY2x1ZGUgIm1hY2hfdGltZXIuaCIKKworI2luY2x1ZGUgPGFzbS9ocGV0Lmg+CisKKyNpZmRlZiBDT05GSUdfSFBFVF9USU1FUgorc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF91c2VjX3F1b3RpZW50Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF9sYXN0Oworc3RhdGljIHN0cnVjdCB0aW1lcl9vcHRzIHRpbWVyX3RzYzsKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1ZnJlcV9kZWxheWVkX2dldCh2b2lkKTsKKworaW50IHRzY19kaXNhYmxlIF9faW5pdGRhdGEgPSAwOworCitleHRlcm4gc3BpbmxvY2tfdCBpODI1M19sb2NrOworCitzdGF0aWMgaW50IHVzZV90c2M7CisvKiBOdW1iZXIgb2YgdXNlY3MgdGhhdCB0aGUgbGFzdCBpbnRlcnJ1cHQgd2FzIGRlbGF5ZWQgKi8KK3N0YXRpYyBpbnQgZGVsYXlfYXRfbGFzdF9pbnRlcnJ1cHQ7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3RfdHNjX2xvdzsgLyogbHNiIDMyIGJpdHMgb2YgVGltZSBTdGFtcCBDb3VudGVyICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0X3RzY19oaWdoOyAvKiBtc2IgMzIgYml0cyBvZiBUaW1lIFN0YW1wIENvdW50ZXIgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgbW9ub3RvbmljX2Jhc2U7CitzdGF0aWMgc2VxbG9ja190IG1vbm90b25pY19sb2NrID0gU0VRTE9DS19VTkxPQ0tFRDsKKworLyogY29udmVydCBmcm9tIGN5Y2xlcyg2NGJpdHMpID0+IG5hbm9zZWNvbmRzICg2NGJpdHMpCisgKiAgYmFzaWMgZXF1YXRpb246CisgKgkJbnMgPSBjeWNsZXMgLyAoZnJlcSAvIG5zX3Blcl9zZWMpCisgKgkJbnMgPSBjeWNsZXMgKiAobnNfcGVyX3NlYyAvIGZyZXEpCisgKgkJbnMgPSBjeWNsZXMgKiAoMTBeOSAvIChjcHVfbWh6ICogMTBeNikpCisgKgkJbnMgPSBjeWNsZXMgKiAoMTBeMyAvIGNwdV9taHopCisgKgorICoJVGhlbiB3ZSB1c2Ugc2NhbGluZyBtYXRoIChzdWdnZXN0ZWQgYnkgZ2VvcmdlQG12aXN0YS5jb20pIHRvIGdldDoKKyAqCQlucyA9IGN5Y2xlcyAqICgxMF4zICogU0MgLyBjcHVfbWh6KSAvIFNDCisgKgkJbnMgPSBjeWNsZXMgKiBjeWMybnNfc2NhbGUgLyBTQworICoKKyAqCUFuZCBzaW5jZSBTQyBpcyBhIGNvbnN0YW50IHBvd2VyIG9mIHR3bywgd2UgY2FuIGNvbnZlcnQgdGhlIGRpdgorICogIGludG8gYSBzaGlmdC4gICAKKyAqCQkJLWpvaG5zdHVsQHVzLmlibS5jb20gIm1hdGggaXMgaGFyZCwgbGV0cyBnbyBzaG9wcGluZyEiCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGN5YzJuc19zY2FsZTsgCisjZGVmaW5lIENZQzJOU19TQ0FMRV9GQUNUT1IgMTAgLyogMl4xMCwgY2FyZWZ1bGx5IGNob3NlbiAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2N5YzJuc19zY2FsZSh1bnNpZ25lZCBsb25nIGNwdV9taHopCit7CisJY3ljMm5zX3NjYWxlID0gKDEwMDAgPDwgQ1lDMk5TX1NDQUxFX0ZBQ1RPUikvY3B1X21oejsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgY3ljbGVzXzJfbnModW5zaWduZWQgbG9uZyBsb25nIGN5YykKK3sKKwlyZXR1cm4gKGN5YyAqIGN5YzJuc19zY2FsZSkgPj4gQ1lDMk5TX1NDQUxFX0ZBQ1RPUjsKK30KKworc3RhdGljIGludCBjb3VudDI7IC8qIGNvdW50ZXIgZm9yIG1hcmtfb2Zmc2V0X3RzYygpICovCisKKy8qIENhY2hlZCAqbXVsdGlwbGllciogdG8gY29udmVydCBUU0MgY291bnRzIHRvIG1pY3Jvc2Vjb25kcy4KKyAqIChzZWUgdGhlIGVxdWF0aW9uIGJlbG93KS4KKyAqIEVxdWFsIHRvIDJeMzIgKiAoMSAvIChjbG9ja3MgcGVyIHVzZWMpICkuCisgKiBJbml0aWFsaXplZCBpbiB0aW1lX2luaXQuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZhc3RfZ2V0dGltZW9mZnNldF9xdW90aWVudDsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X29mZnNldF90c2Modm9pZCkKK3sKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIGVheCwgZWR4OworCisJLyogUmVhZCB0aGUgVGltZSBTdGFtcCBDb3VudGVyICovCisKKwlyZHRzYyhlYXgsZWR4KTsKKworCS8qIC4uIHJlbGF0aXZlIHRvIHByZXZpb3VzIGppZmZ5ICgzMiBiaXRzIGlzIGVub3VnaCkgKi8KKwllYXggLT0gbGFzdF90c2NfbG93OwkvKiB0c2NfbG93IGRlbHRhICovCisKKwkvKgorICAgICAgICAgKiBUaW1lIG9mZnNldCA9ICh0c2NfbG93IGRlbHRhKSAqIGZhc3RfZ2V0dGltZW9mZnNldF9xdW90aWVudAorICAgICAgICAgKiAgICAgICAgICAgICA9ICh0c2NfbG93IGRlbHRhKSAqICh1c2Vjc19wZXJfY2xvY2spCisgICAgICAgICAqICAgICAgICAgICAgID0gKHRzY19sb3cgZGVsdGEpICogKHVzZWNzX3Blcl9qaWZmeSAvIGNsb2Nrc19wZXJfamlmZnkpCisJICoKKwkgKiBVc2luZyBhIG11bGwgaW5zdGVhZCBvZiBhIGRpdmwgc2F2ZXMgdXAgdG8gMzEgY2xvY2sgY3ljbGVzCisJICogaW4gdGhlIGNyaXRpY2FsIHBhdGguCisgICAgICAgICAqLworCisJX19hc21fXygibXVsbCAlMiIKKwkJOiI9YSIgKGVheCksICI9ZCIgKGVkeCkKKwkJOiJybSIgKGZhc3RfZ2V0dGltZW9mZnNldF9xdW90aWVudCksCisJCSAiMCIgKGVheCkpOworCisJLyogb3VyIGFkanVzdGVkIHRpbWUgb2Zmc2V0IGluIG1pY3Jvc2Vjb25kcyAqLworCXJldHVybiBkZWxheV9hdF9sYXN0X2ludGVycnVwdCArIGVkeDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBtb25vdG9uaWNfY2xvY2tfdHNjKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGxhc3Rfb2Zmc2V0LCB0aGlzX29mZnNldCwgYmFzZTsKKwl1bnNpZ25lZCBzZXE7CisJCisJLyogYXRvbWljYWxseSByZWFkIG1vbm90b25pYyBiYXNlICYgbGFzdF9vZmZzZXQgKi8KKwlkbyB7CisJCXNlcSA9IHJlYWRfc2VxYmVnaW4oJm1vbm90b25pY19sb2NrKTsKKwkJbGFzdF9vZmZzZXQgPSAoKHVuc2lnbmVkIGxvbmcgbG9uZylsYXN0X3RzY19oaWdoPDwzMil8bGFzdF90c2NfbG93OworCQliYXNlID0gbW9ub3RvbmljX2Jhc2U7CisJfSB3aGlsZSAocmVhZF9zZXFyZXRyeSgmbW9ub3RvbmljX2xvY2ssIHNlcSkpOworCisJLyogUmVhZCB0aGUgVGltZSBTdGFtcCBDb3VudGVyICovCisJcmR0c2NsbCh0aGlzX29mZnNldCk7CisKKwkvKiByZXR1cm4gdGhlIHZhbHVlIGluIG5zICovCisJcmV0dXJuIGJhc2UgKyBjeWNsZXNfMl9ucyh0aGlzX29mZnNldCAtIGxhc3Rfb2Zmc2V0KTsKK30KKworLyoKKyAqIFNjaGVkdWxlciBjbG9jayAtIHJldHVybnMgY3VycmVudCB0aW1lIGluIG5hbm9zZWMgdW5pdHMuCisgKi8KK3Vuc2lnbmVkIGxvbmcgbG9uZyBzY2hlZF9jbG9jayh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyB0aGlzX29mZnNldDsKKworCS8qCisJICogSW4gdGhlIE5VTUEgY2FzZSB3ZSBkb250IHVzZSB0aGUgVFNDIGFzIHRoZXkgYXJlIG5vdAorCSAqIHN5bmNocm9uaXplZCBhY3Jvc3MgYWxsIENQVXMuCisJICovCisjaWZuZGVmIENPTkZJR19OVU1BCisJaWYgKCF1c2VfdHNjKQorI2VuZGlmCisJCS8qIG5vIGxvY2tpbmcgYnV0IGEgcmFyZSB3cm9uZyB2YWx1ZSBpcyBub3QgYSBiaWcgZGVhbCAqLworCQlyZXR1cm4gamlmZmllc182NCAqICgxMDAwMDAwMDAwIC8gSFopOworCisJLyogUmVhZCB0aGUgVGltZSBTdGFtcCBDb3VudGVyICovCisJcmR0c2NsbCh0aGlzX29mZnNldCk7CisKKwkvKiByZXR1cm4gdGhlIHZhbHVlIGluIG5zICovCisJcmV0dXJuIGN5Y2xlc18yX25zKHRoaXNfb2Zmc2V0KTsKK30KKworc3RhdGljIHZvaWQgZGVsYXlfdHNjKHVuc2lnbmVkIGxvbmcgbG9vcHMpCit7CisJdW5zaWduZWQgbG9uZyBiY2xvY2ssIG5vdzsKKwkKKwlyZHRzY2woYmNsb2NrKTsKKwlkbworCXsKKwkJcmVwX25vcCgpOworCQlyZHRzY2wobm93KTsKKwl9IHdoaWxlICgobm93LWJjbG9jaykgPCBsb29wcyk7Cit9CisKKyNpZmRlZiBDT05GSUdfSFBFVF9USU1FUgorc3RhdGljIHZvaWQgbWFya19vZmZzZXRfdHNjX2hwZXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgdGhpc19vZmZzZXQsIGxhc3Rfb2Zmc2V0OworIAl1bnNpZ25lZCBsb25nIG9mZnNldCwgdGVtcCwgaHBldF9jdXJyZW50OworCisJd3JpdGVfc2VxbG9jaygmbW9ub3RvbmljX2xvY2spOworCWxhc3Rfb2Zmc2V0ID0gKCh1bnNpZ25lZCBsb25nIGxvbmcpbGFzdF90c2NfaGlnaDw8MzIpfGxhc3RfdHNjX2xvdzsKKwkvKgorCSAqIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoZXNlIHR3byBvcGVyYXRpb25zIGhhcHBlbiBhbG1vc3QgYXQKKwkgKiB0aGUgc2FtZSB0aW1lLiBXZSBkbyB0aGUgUkRUU0Mgc3R1ZmYgZmlyc3QsIHNpbmNlIGl0J3MKKwkgKiBmYXN0ZXIuIFRvIGF2b2lkIGFueSBpbmNvbnNpc3RlbmNpZXMsIHdlIG5lZWQgaW50ZXJydXB0cworCSAqIGRpc2FibGVkIGxvY2FsbHkuCisJICovCisJLyoKKwkgKiBJbnRlcnJ1cHRzIGFyZSBqdXN0IGRpc2FibGVkIGxvY2FsbHkgc2luY2UgdGhlIHRpbWVyIGlycQorCSAqIGhhcyB0aGUgU0FfSU5URVJSVVBUIGZsYWcgc2V0LiAtYXJjYQorCSAqLworCS8qIHJlYWQgUGVudGl1bSBjeWNsZSBjb3VudGVyICovCisKKwlocGV0X2N1cnJlbnQgPSBocGV0X3JlYWRsKEhQRVRfQ09VTlRFUik7CisJcmR0c2MobGFzdF90c2NfbG93LCBsYXN0X3RzY19oaWdoKTsKKworCS8qIGxvc3QgdGljayBjb21wZW5zYXRpb24gKi8KKwlvZmZzZXQgPSBocGV0X3JlYWRsKEhQRVRfVDBfQ01QKSAtIGhwZXRfdGljazsKKwlpZiAodW5saWtlbHkoKChvZmZzZXQgLSBocGV0X2xhc3QpID4gaHBldF90aWNrKSAmJiAoaHBldF9sYXN0ICE9IDApKSkgeworCQlpbnQgbG9zdF90aWNrcyA9IChvZmZzZXQgLSBocGV0X2xhc3QpIC8gaHBldF90aWNrOworCQlqaWZmaWVzXzY0ICs9IGxvc3RfdGlja3M7CisJfQorCWhwZXRfbGFzdCA9IGhwZXRfY3VycmVudDsKKworCS8qIHVwZGF0ZSB0aGUgbW9ub3RvbmljIGJhc2UgdmFsdWUgKi8KKwl0aGlzX29mZnNldCA9ICgodW5zaWduZWQgbG9uZyBsb25nKWxhc3RfdHNjX2hpZ2g8PDMyKXxsYXN0X3RzY19sb3c7CisJbW9ub3RvbmljX2Jhc2UgKz0gY3ljbGVzXzJfbnModGhpc19vZmZzZXQgLSBsYXN0X29mZnNldCk7CisJd3JpdGVfc2VxdW5sb2NrKCZtb25vdG9uaWNfbG9jayk7CisKKwkvKiBjYWxjdWxhdGUgZGVsYXlfYXRfbGFzdF9pbnRlcnJ1cHQgKi8KKwkvKgorCSAqIFRpbWUgb2Zmc2V0ID0gKGhwZXQgZGVsdGEpICogKCB1c2VjcyBwZXIgSFBFVCBjbG9jayApCisJICogICAgICAgICAgICAgPSAoaHBldCBkZWx0YSkgKiAoIHVzZWNzIHBlciB0aWNrIC8gSFBFVCBjbG9ja3MgcGVyIHRpY2spCisJICogICAgICAgICAgICAgPSAoaHBldCBkZWx0YSkgKiAoIGhwZXRfdXNlY19xdW90aWVudCApIC8gKDJeMzIpCisJICogV2hlcmUsCisJICogaHBldF91c2VjX3F1b3RpZW50ID0gKDJeMzIgKiB1c2VjcyBwZXIgdGljaykvSFBFVCBjbG9ja3MgcGVyIHRpY2sKKwkgKi8KKwlkZWxheV9hdF9sYXN0X2ludGVycnVwdCA9IGhwZXRfY3VycmVudCAtIG9mZnNldDsKKwlBU01fTVVMNjRfUkVHKHRlbXAsIGRlbGF5X2F0X2xhc3RfaW50ZXJydXB0LAorCQkJaHBldF91c2VjX3F1b3RpZW50LCBkZWxheV9hdF9sYXN0X2ludGVycnVwdCk7Cit9CisjZW5kaWYKKworCisjaWZkZWYgQ09ORklHX0NQVV9GUkVRCisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3B1ZnJlcV9kZWxheWVkX2lzc2NoZWQgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCBjcHVmcmVxX2luaXQgPSAwOworc3RhdGljIHN0cnVjdCB3b3JrX3N0cnVjdCBjcHVmcmVxX2RlbGF5ZWRfZ2V0X3dvcms7CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9jcHVmcmVxX2RlbGF5ZWRfZ2V0KHZvaWQgKnYpCit7CisJdW5zaWduZWQgaW50IGNwdTsKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQljcHVmcmVxX2dldChjcHUpOworCX0KKwljcHVmcmVxX2RlbGF5ZWRfaXNzY2hlZCA9IDA7Cit9CisKKy8qIGlmIHdlIG5vdGljZSBsb3N0IHRpY2tzLCBzY2hlZHVsZSBhIGNhbGwgdG8gY3B1ZnJlcV9nZXQoKSBhcyBpdCB0cmllcworICogdG8gdmVyaWZ5IHRoZSBDUFUgZnJlcXVlbmN5IHRoZSB0aW1pbmcgY29yZSB0aGlua3MgdGhlIENQVSBpcyBydW5uaW5nCisgKiBhdCBpcyBzdGlsbCBjb3JyZWN0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1ZnJlcV9kZWxheWVkX2dldCh2b2lkKSAKK3sKKwlpZiAoY3B1ZnJlcV9pbml0ICYmICFjcHVmcmVxX2RlbGF5ZWRfaXNzY2hlZCkgeworCQljcHVmcmVxX2RlbGF5ZWRfaXNzY2hlZCA9IDE7CisJCXByaW50ayhLRVJOX0RFQlVHICJMb3Npbmcgc29tZSB0aWNrcy4uLiBjaGVja2luZyBpZiBDUFUgZnJlcXVlbmN5IGNoYW5nZWQuXG4iKTsKKwkJc2NoZWR1bGVfd29yaygmY3B1ZnJlcV9kZWxheWVkX2dldF93b3JrKTsKKwl9Cit9CisKKy8qIElmIHRoZSBDUFUgZnJlcXVlbmN5IGlzIHNjYWxlZCwgVFNDLWJhc2VkIGRlbGF5cyB3aWxsIG5lZWQgYSBkaWZmZXJlbnQKKyAqIGxvb3BzX3Blcl9qaWZmeSB2YWx1ZSB0byBmdW5jdGlvbiBwcm9wZXJseS4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50ICByZWZfZnJlcSA9IDA7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb29wc19wZXJfamlmZnlfcmVmID0gMDsKKworI2lmbmRlZiBDT05GSUdfU01QCitzdGF0aWMgdW5zaWduZWQgbG9uZyBmYXN0X2dldHRpbWVvZmZzZXRfcmVmID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNwdV9raHpfcmVmID0gMDsKKyNlbmRpZgorCitzdGF0aWMgaW50Cit0aW1lX2NwdWZyZXFfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyB2YWwsCisJCSAgICAgICB2b2lkICpkYXRhKQoreworCXN0cnVjdCBjcHVmcmVxX2ZyZXFzICpmcmVxID0gZGF0YTsKKworCWlmICh2YWwgIT0gQ1BVRlJFUV9SRVNVTUVDSEFOR0UpCisJCXdyaXRlX3NlcWxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKKwlpZiAoIXJlZl9mcmVxKSB7CisJCXJlZl9mcmVxID0gZnJlcS0+b2xkOworCQlsb29wc19wZXJfamlmZnlfcmVmID0gY3B1X2RhdGFbZnJlcS0+Y3B1XS5sb29wc19wZXJfamlmZnk7CisjaWZuZGVmIENPTkZJR19TTVAKKwkJZmFzdF9nZXR0aW1lb2Zmc2V0X3JlZiA9IGZhc3RfZ2V0dGltZW9mZnNldF9xdW90aWVudDsKKwkJY3B1X2toel9yZWYgPSBjcHVfa2h6OworI2VuZGlmCisJfQorCisJaWYgKCh2YWwgPT0gQ1BVRlJFUV9QUkVDSEFOR0UgICYmIGZyZXEtPm9sZCA8IGZyZXEtPm5ldykgfHwKKwkgICAgKHZhbCA9PSBDUFVGUkVRX1BPU1RDSEFOR0UgJiYgZnJlcS0+b2xkID4gZnJlcS0+bmV3KSB8fAorCSAgICAodmFsID09IENQVUZSRVFfUkVTVU1FQ0hBTkdFKSkgeworCQlpZiAoIShmcmVxLT5mbGFncyAmIENQVUZSRVFfQ09OU1RfTE9PUFMpKQorCQkJY3B1X2RhdGFbZnJlcS0+Y3B1XS5sb29wc19wZXJfamlmZnkgPSBjcHVmcmVxX3NjYWxlKGxvb3BzX3Blcl9qaWZmeV9yZWYsIHJlZl9mcmVxLCBmcmVxLT5uZXcpOworI2lmbmRlZiBDT05GSUdfU01QCisJCWlmIChjcHVfa2h6KQorCQkJY3B1X2toeiA9IGNwdWZyZXFfc2NhbGUoY3B1X2toel9yZWYsIHJlZl9mcmVxLCBmcmVxLT5uZXcpOworCQlpZiAodXNlX3RzYykgeworCQkJaWYgKCEoZnJlcS0+ZmxhZ3MgJiBDUFVGUkVRX0NPTlNUX0xPT1BTKSkgeworCQkJCWZhc3RfZ2V0dGltZW9mZnNldF9xdW90aWVudCA9IGNwdWZyZXFfc2NhbGUoZmFzdF9nZXR0aW1lb2Zmc2V0X3JlZiwgZnJlcS0+bmV3LCByZWZfZnJlcSk7CisJCQkJc2V0X2N5YzJuc19zY2FsZShjcHVfa2h6LzEwMDApOworCQkJfQorCQl9CisjZW5kaWYKKwl9CisKKwlpZiAodmFsICE9IENQVUZSRVFfUkVTVU1FQ0hBTkdFKQorCQl3cml0ZV9zZXF1bmxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHRpbWVfY3B1ZnJlcV9ub3RpZmllcl9ibG9jayA9IHsKKwkubm90aWZpZXJfY2FsbAk9IHRpbWVfY3B1ZnJlcV9ub3RpZmllcgorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBjcHVmcmVxX3RzYyh2b2lkKQoreworCWludCByZXQ7CisJSU5JVF9XT1JLKCZjcHVmcmVxX2RlbGF5ZWRfZ2V0X3dvcmssIGhhbmRsZV9jcHVmcmVxX2RlbGF5ZWRfZ2V0LCBOVUxMKTsKKwlyZXQgPSBjcHVmcmVxX3JlZ2lzdGVyX25vdGlmaWVyKCZ0aW1lX2NwdWZyZXFfbm90aWZpZXJfYmxvY2ssCisJCQkJCUNQVUZSRVFfVFJBTlNJVElPTl9OT1RJRklFUik7CisJaWYgKCFyZXQpCisJCWNwdWZyZXFfaW5pdCA9IDE7CisJcmV0dXJuIHJldDsKK30KK2NvcmVfaW5pdGNhbGwoY3B1ZnJlcV90c2MpOworCisjZWxzZSAvKiBDT05GSUdfQ1BVX0ZSRVEgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVmcmVxX2RlbGF5ZWRfZ2V0KHZvaWQpIHsgcmV0dXJuOyB9CisjZW5kaWYgCisKK3N0YXRpYyB2b2lkIG1hcmtfb2Zmc2V0X3RzYyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgbG9zdCxkZWxheTsKKwl1bnNpZ25lZCBsb25nIGRlbHRhID0gbGFzdF90c2NfbG93OworCWludCBjb3VudDsKKwlpbnQgY291bnRtcDsKKwlzdGF0aWMgaW50IGNvdW50MSA9IDA7CisJdW5zaWduZWQgbG9uZyBsb25nIHRoaXNfb2Zmc2V0LCBsYXN0X29mZnNldDsKKwlzdGF0aWMgaW50IGxvc3RfY291bnQgPSAwOworCisJd3JpdGVfc2VxbG9jaygmbW9ub3RvbmljX2xvY2spOworCWxhc3Rfb2Zmc2V0ID0gKCh1bnNpZ25lZCBsb25nIGxvbmcpbGFzdF90c2NfaGlnaDw8MzIpfGxhc3RfdHNjX2xvdzsKKwkvKgorCSAqIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoZXNlIHR3byBvcGVyYXRpb25zIGhhcHBlbiBhbG1vc3QgYXQKKwkgKiB0aGUgc2FtZSB0aW1lLiBXZSBkbyB0aGUgUkRUU0Mgc3R1ZmYgZmlyc3QsIHNpbmNlIGl0J3MKKwkgKiBmYXN0ZXIuIFRvIGF2b2lkIGFueSBpbmNvbnNpc3RlbmNpZXMsIHdlIG5lZWQgaW50ZXJydXB0cworCSAqIGRpc2FibGVkIGxvY2FsbHkuCisJICovCisKKwkvKgorCSAqIEludGVycnVwdHMgYXJlIGp1c3QgZGlzYWJsZWQgbG9jYWxseSBzaW5jZSB0aGUgdGltZXIgaXJxCisJICogaGFzIHRoZSBTQV9JTlRFUlJVUFQgZmxhZyBzZXQuIC1hcmNhCisJICovCisKKwkvKiByZWFkIFBlbnRpdW0gY3ljbGUgY291bnRlciAqLworCisJcmR0c2MobGFzdF90c2NfbG93LCBsYXN0X3RzY19oaWdoKTsKKworCXNwaW5fbG9jaygmaTgyNTNfbG9jayk7CisJb3V0Yl9wKDB4MDAsIFBJVF9NT0RFKTsgICAgIC8qIGxhdGNoIHRoZSBjb3VudCBBU0FQICovCisKKwljb3VudCA9IGluYl9wKFBJVF9DSDApOyAgICAvKiByZWFkIHRoZSBsYXRjaGVkIGNvdW50ICovCisJY291bnQgfD0gaW5iKFBJVF9DSDApIDw8IDg7CisKKwkvKgorCSAqIFZJQTY4NmEgdGVzdCBjb2RlLi4uIHJlc2V0IHRoZSBsYXRjaCBpZiBjb3VudCA+IG1heCArIDEKKwkgKiBmcm9tIHRpbWVyX3BpdC5jIC0gY2piCisJICovCisJaWYgKGNvdW50ID4gTEFUQ0gpIHsKKwkJb3V0Yl9wKDB4MzQsIFBJVF9NT0RFKTsKKwkJb3V0Yl9wKExBVENIICYgMHhmZiwgUElUX0NIMCk7CisJCW91dGIoTEFUQ0ggPj4gOCwgUElUX0NIMCk7CisJCWNvdW50ID0gTEFUQ0ggLSAxOworCX0KKworCXNwaW5fdW5sb2NrKCZpODI1M19sb2NrKTsKKworCWlmIChwaXRfbGF0Y2hfYnVnZ3kpIHsKKwkJLyogZ2V0IGNlbnRlciB2YWx1ZSBvZiBsYXN0IDMgdGltZSBsdXRjaCAqLworCQlpZiAoKGNvdW50MiA+PSBjb3VudCAmJiBjb3VudCA+PSBjb3VudDEpCisJCSAgICB8fCAoY291bnQxID49IGNvdW50ICYmIGNvdW50ID49IGNvdW50MikpIHsKKwkJCWNvdW50MiA9IGNvdW50MTsgY291bnQxID0gY291bnQ7CisJCX0gZWxzZSBpZiAoKGNvdW50MSA+PSBjb3VudDIgJiYgY291bnQyID49IGNvdW50KQorCQkJICAgfHwgKGNvdW50ID49IGNvdW50MiAmJiBjb3VudDIgPj0gY291bnQxKSkgeworCQkJY291bnRtcCA9IGNvdW50O2NvdW50ID0gY291bnQyOworCQkJY291bnQyID0gY291bnQxO2NvdW50MSA9IGNvdW50bXA7CisJCX0gZWxzZSB7CisJCQljb3VudDIgPSBjb3VudDE7IGNvdW50MSA9IGNvdW50OyBjb3VudCA9IGNvdW50MTsKKwkJfQorCX0KKworCS8qIGxvc3QgdGljayBjb21wZW5zYXRpb24gKi8KKwlkZWx0YSA9IGxhc3RfdHNjX2xvdyAtIGRlbHRhOworCXsKKwkJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBlYXgsIGVkeDsKKwkJZWF4ID0gZGVsdGE7CisJCV9fYXNtX18oIm11bGwgJTIiCisJCToiPWEiIChlYXgpLCAiPWQiIChlZHgpCisJCToicm0iIChmYXN0X2dldHRpbWVvZmZzZXRfcXVvdGllbnQpLAorCQkgIjAiIChlYXgpKTsKKwkJZGVsdGEgPSBlZHg7CisJfQorCWRlbHRhICs9IGRlbGF5X2F0X2xhc3RfaW50ZXJydXB0OworCWxvc3QgPSBkZWx0YS8oMTAwMDAwMC9IWik7CisJZGVsYXkgPSBkZWx0YSUoMTAwMDAwMC9IWik7CisJaWYgKGxvc3QgPj0gMikgeworCQlqaWZmaWVzXzY0ICs9IGxvc3QtMTsKKworCQkvKiBzYW5pdHkgY2hlY2sgdG8gZW5zdXJlIHdlJ3JlIG5vdCBhbHdheXMgbG9zaW5nIHRpY2tzICovCisJCWlmIChsb3N0X2NvdW50KysgPiAxMDApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkxvc2luZyB0b28gbWFueSB0aWNrcyFcbiIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVFNDIGNhbm5vdCBiZSB1c2VkIGFzIGEgdGltZXNvdXJjZS4gIFxuIik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJQb3NzaWJsZSByZWFzb25zIGZvciB0aGlzIGFyZTpcbiIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiICBZb3UncmUgcnVubmluZyB3aXRoIFNwZWVkc3RlcCxcbiIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiICBZb3UgZG9uJ3QgaGF2ZSBETUEgZW5hYmxlZCBmb3IgeW91ciBoYXJkIGRpc2sgKHNlZSBoZHBhcm0pLFxuIik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIgIEluY29ycmVjdCBUU0Mgc3luY2hyb25pemF0aW9uIG9uIGFuIFNNUCBzeXN0ZW0gKHNlZSBkbWVzZykuXG4iKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkZhbGxpbmcgYmFjayB0byBhIHNhbmUgdGltZXNvdXJjZSBub3cuXG4iKTsKKworCQkJY2xvY2tfZmFsbGJhY2soKTsKKwkJfQorCQkvKiAuLi4gYnV0IGdpdmUgdGhlIFRTQyBhIGZhaXIgY2hhbmNlICovCisJCWlmIChsb3N0X2NvdW50ID4gMjUpCisJCQljcHVmcmVxX2RlbGF5ZWRfZ2V0KCk7CisJfSBlbHNlCisJCWxvc3RfY291bnQgPSAwOworCS8qIHVwZGF0ZSB0aGUgbW9ub3RvbmljIGJhc2UgdmFsdWUgKi8KKwl0aGlzX29mZnNldCA9ICgodW5zaWduZWQgbG9uZyBsb25nKWxhc3RfdHNjX2hpZ2g8PDMyKXxsYXN0X3RzY19sb3c7CisJbW9ub3RvbmljX2Jhc2UgKz0gY3ljbGVzXzJfbnModGhpc19vZmZzZXQgLSBsYXN0X29mZnNldCk7CisJd3JpdGVfc2VxdW5sb2NrKCZtb25vdG9uaWNfbG9jayk7CisKKwkvKiBjYWxjdWxhdGUgZGVsYXlfYXRfbGFzdF9pbnRlcnJ1cHQgKi8KKwljb3VudCA9ICgoTEFUQ0gtMSkgLSBjb3VudCkgKiBUSUNLX1NJWkU7CisJZGVsYXlfYXRfbGFzdF9pbnRlcnJ1cHQgPSAoY291bnQgKyBMQVRDSC8yKSAvIExBVENIOworCisJLyogY2F0Y2ggY29ybmVyIGNhc2Ugd2hlcmUgdGljayByb2xsb3ZlciBvY2N1cmVkCisJICogYmV0d2VlbiB0c2MgYW5kIHBpdCByZWFkcyAoYXMgbm90ZWQgd2hlbgorCSAqIHVzZWMgZGVsdGEgaXMgPiA5MCUgIyBvZiB1c2Vjcy90aWNrKQorCSAqLworCWlmIChsb3N0ICYmIGFicyhkZWxheSAtIGRlbGF5X2F0X2xhc3RfaW50ZXJydXB0KSA+ICg5MDAwMDAvSFopKQorCQlqaWZmaWVzXzY0Kys7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfdHNjKGNoYXIqIG92ZXJyaWRlKQoreworCisJLyogY2hlY2sgY2xvY2sgb3ZlcnJpZGUgKi8KKwlpZiAob3ZlcnJpZGVbMF0gJiYgc3RybmNtcChvdmVycmlkZSwidHNjIiwzKSkgeworI2lmZGVmIENPTkZJR19IUEVUX1RJTUVSCisJCWlmIChpc19ocGV0X2VuYWJsZWQoKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJXYXJuaW5nOiBjbG9jaz0gb3ZlcnJpZGUgZmFpbGVkLiBEZWZhdWx0aW5nIHRvIHRzY1xuIik7CisJCX0gZWxzZQorI2VuZGlmCisJCXsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJLyoKKwkgKiBJZiB3ZSBoYXZlIEFQTSBlbmFibGVkIG9yIHRoZSBDUFUgY2xvY2sgc3BlZWQgaXMgdmFyaWFibGUKKwkgKiAoQ1BVIHN0b3BzIGNsb2NrIG9uIEhMVCBvciBzbG93cyBjbG9jayB0byBzYXZlIHBvd2VyKQorCSAqIHRoZW4gdGhlIFRTQyB0aW1lc3RhbXBzIG1heSBkaXZlcmdlIGJ5IHVwIHRvIDEgamlmZnkgZnJvbQorCSAqICdyZWFsIHRpbWUnIGJ1dCBub3RoaW5nIHdpbGwgYnJlYWsuCisJICogVGhlIG1vc3QgZnJlcXVlbnQgY2FzZSBpcyB0aGF0IHRoZSBDUFUgaXMgIndva2VuIiBmcm9tIGEgaGFsdAorCSAqIHN0YXRlIGJ5IHRoZSB0aW1lciBpbnRlcnJ1cHQgaXRzZWxmLCBzbyB3ZSBnZXQgMCBlcnJvci4gSW4gdGhlCisJICogcmFyZSBjYXNlcyB3aGVyZSBhIGRyaXZlciB3b3VsZCAid2FrZSIgdGhlIENQVSBhbmQgcmVxdWVzdCBhCisJICogdGltZXN0YW1wLCB0aGUgbWF4aW11bSBlcnJvciBpcyA8IDEgamlmZnkuIEJ1dCB0aW1lc3RhbXBzIGFyZQorCSAqIHN0aWxsIHBlcmZlY3RseSBvcmRlcmVkLgorCSAqIE5vdGUgdGhhdCB0aGUgVFNDIGNvdW50ZXIgd2lsbCBiZSByZXNldCBpZiBBUE0gc3VzcGVuZHMKKwkgKiB0byBkaXNrOyB0aGlzIHdvbid0IGJyZWFrIHRoZSBrZXJuZWwsIHRob3VnaCwgJ2N1eiB3ZSdyZQorCSAqIHNtYXJ0LiAgU2VlIGFyY2gvaTM4Ni9rZXJuZWwvYXBtLmMuCisJICovCisgCS8qCisgCSAqCUZpcnN0bHkgd2UgaGF2ZSB0byBkbyBhIENQVSBjaGVjayBmb3IgY2hpcHMgd2l0aAorIAkgKiAJYSBwb3RlbnRpYWxseSBidWdneSBUU0MuIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZW4ndCBydW4KKyAJICoJdGhlIGlkZW50L2J1Z3MgY2hlY2tzIHNvIHdlIG11c3QgcnVuIHRoaXMgaG9vayBhcyBpdAorIAkgKgltYXkgdHVybiBvZmYgdGhlIFRTQyBmbGFnLgorIAkgKgorIAkgKglOT1RFOiB0aGlzIGRvZXNuJ3QgeWV0IGhhbmRsZSBTTVAgNDg2IG1hY2hpbmVzIHdoZXJlIG9ubHkKKyAJICoJc29tZSBDUFUncyBoYXZlIGEgVFNDLiBUaGF0cyBuZXZlciB3b3JrZWQgYW5kIG5vYm9keSBoYXMKKyAJICoJbW9hbmVkIGlmIHlvdSBoYXZlIHRoZSBvbmx5IG9uZSBpbiB0aGUgd29ybGQgLSB5b3UgZml4IGl0IQorIAkgKi8KKworCWNvdW50MiA9IExBVENIOyAvKiBpbml0aWFsaXplIGNvdW50ZXIgZm9yIG1hcmtfb2Zmc2V0X3RzYygpICovCisKKwlpZiAoY3B1X2hhc190c2MpIHsKKwkJdW5zaWduZWQgbG9uZyB0c2NfcXVvdGllbnQ7CisjaWZkZWYgQ09ORklHX0hQRVRfVElNRVIKKwkJaWYgKGlzX2hwZXRfZW5hYmxlZCgpKXsKKwkJCXVuc2lnbmVkIGxvbmcgcmVzdWx0LCByZW1haW47CisJCQlwcmludGsoIlVzaW5nIFRTQyBmb3IgZ2V0dGltZW9mZGF5XG4iKTsKKwkJCXRzY19xdW90aWVudCA9IGNhbGlicmF0ZV90c2NfaHBldChOVUxMKTsKKwkJCXRpbWVyX3RzYy5tYXJrX29mZnNldCA9ICZtYXJrX29mZnNldF90c2NfaHBldDsKKwkJCS8qCisJCQkgKiBNYXRoIHRvIGNhbGN1bGF0ZSBocGV0IHRvIHVzZWMgbXVsdGlwbGllcgorCQkJICogTG9vayBmb3IgdGhlIGNvbW1lbnRzIGF0IGdldF9vZmZzZXRfdHNjX2hwZXQoKQorCQkJICovCisJCQlBU01fRElWNjRfUkVHKHJlc3VsdCwgcmVtYWluLCBocGV0X3RpY2ssCisJCQkJCTAsIEtFUk5FTF9USUNLX1VTRUMpOworCQkJaWYgKHJlbWFpbiA+IChocGV0X3RpY2sgPj4gMSkpCisJCQkJcmVzdWx0Kys7IC8qIHJvdW5kaW5nIHRoZSByZXN1bHQgKi8KKworCQkJaHBldF91c2VjX3F1b3RpZW50ID0gcmVzdWx0OworCQl9IGVsc2UKKyNlbmRpZgorCQl7CisJCQl0c2NfcXVvdGllbnQgPSBjYWxpYnJhdGVfdHNjKCk7CisJCX0KKworCQlpZiAodHNjX3F1b3RpZW50KSB7CisJCQlmYXN0X2dldHRpbWVvZmZzZXRfcXVvdGllbnQgPSB0c2NfcXVvdGllbnQ7CisJCQl1c2VfdHNjID0gMTsKKwkJCS8qCisJCQkgKglXZSBjb3VsZCBiZSBtb3JlIHNlbGVjdGl2ZSBoZXJlIEkgc3VzcGVjdAorCQkJICoJYW5kIGp1c3QgZW5hYmxlIHRoaXMgZm9yIHRoZSBuZXh0IGludGVsIGNoaXBzID8KKwkJCSAqLworCQkJLyogcmVwb3J0IENQVSBjbG9jayByYXRlIGluIEh6LgorCQkJICogVGhlIGZvcm11bGEgaXMgKDEwXjYgKiAyXjMyKSAvICgyXjMyICogMSAvIChjbG9ja3MvdXMpKSA9CisJCQkgKiBjbG9jay9zZWNvbmQuIE91ciBwcmVjaXNpb24gaXMgYWJvdXQgMTAwIHBwbS4KKwkJCSAqLworCQkJewl1bnNpZ25lZCBsb25nIGVheD0wLCBlZHg9MTAwMDsKKwkJCQlfX2FzbV9fKCJkaXZsICUyIgorCQkgICAgICAgCQk6Ij1hIiAoY3B1X2toeiksICI9ZCIgKGVkeCkKKyAgICAgICAgCSAgICAgICAJCToiciIgKHRzY19xdW90aWVudCksCisJICAgICAgICAgICAgICAgIAkiMCIgKGVheCksICIxIiAoZWR4KSk7CisJCQkJcHJpbnRrKCJEZXRlY3RlZCAlbHUuJTAzbHUgTUh6IHByb2Nlc3Nvci5cbiIsIGNwdV9raHogLyAxMDAwLCBjcHVfa2h6ICUgMTAwMCk7CisJCQl9CisJCQlzZXRfY3ljMm5zX3NjYWxlKGNwdV9raHovMTAwMCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLUVOT0RFVjsKK30KKworI2lmbmRlZiBDT05GSUdfWDg2X1RTQworLyogZGlzYWJsZSBmbGFnIGZvciB0c2MuICBUYWtlcyBlZmZlY3QgYnkgY2xlYXJpbmcgdGhlIFRTQyBjcHUgZmxhZworICogaW4gY3B1L2NvbW1vbi5jICovCitzdGF0aWMgaW50IF9faW5pdCB0c2Nfc2V0dXAoY2hhciAqc3RyKQoreworCXRzY19kaXNhYmxlID0gMTsKKwlyZXR1cm4gMTsKK30KKyNlbHNlCitzdGF0aWMgaW50IF9faW5pdCB0c2Nfc2V0dXAoY2hhciAqc3RyKQoreworCXByaW50ayhLRVJOX1dBUk5JTkcgIm5vdHNjOiBLZXJuZWwgY29tcGlsZWQgd2l0aCBDT05GSUdfWDg2X1RTQywgIgorCQkJCSJjYW5ub3QgZGlzYWJsZSBUU0MuXG4iKTsKKwlyZXR1cm4gMTsKK30KKyNlbmRpZgorX19zZXR1cCgibm90c2MiLCB0c2Nfc2V0dXApOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogdHNjIHRpbWVyX29wdHMgc3RydWN0ICovCitzdGF0aWMgc3RydWN0IHRpbWVyX29wdHMgdGltZXJfdHNjID0geworCS5uYW1lID0gInRzYyIsCisJLm1hcmtfb2Zmc2V0ID0gbWFya19vZmZzZXRfdHNjLCAKKwkuZ2V0X29mZnNldCA9IGdldF9vZmZzZXRfdHNjLAorCS5tb25vdG9uaWNfY2xvY2sgPSBtb25vdG9uaWNfY2xvY2tfdHNjLAorCS5kZWxheSA9IGRlbGF5X3RzYywKK307CisKK3N0cnVjdCBpbml0X3RpbWVyX29wdHMgX19pbml0ZGF0YSB0aW1lcl90c2NfaW5pdCA9IHsKKwkuaW5pdCA9IGluaXRfdHNjLAorCS5vcHRzID0gJnRpbWVyX3RzYywKK307CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RyYW1wb2xpbmUuUyBiL2FyY2gvaTM4Ni9rZXJuZWwvdHJhbXBvbGluZS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjY2UwZTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3RyYW1wb2xpbmUuUwpAQCAtMCwwICsxLDgwIEBACisvKgorICoKKyAqCVRyYW1wb2xpbmUuUwlEZXJpdmVkIGZyb20gU2V0dXAuUyBieSBMaW51cyBUb3J2YWxkcworICoKKyAqCTQgSmFuIDE5OTcgTWljaGFlbCBDaGFzdGFpbjogY2hhbmdlZCB0byBnbnUgYXMuCisgKgorICoJVGhpcyBpcyBvbmx5IHVzZWQgZm9yIGJvb3Rpbmcgc2Vjb25kYXJ5IENQVXMgaW4gU01QIG1hY2hpbmUKKyAqCisgKglFbnRyeTogQ1M6SVAgcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIG91ciBjb2RlLCB3ZSBhcmUgCisgKglpbiByZWFsIG1vZGUgd2l0aCBubyBzdGFjaywgYnV0IHRoZSByZXN0IG9mIHRoZSAKKyAqCXRyYW1wb2xpbmUgcGFnZSB0byBtYWtlIG91ciBzdGFjayBhbmQgZXZlcnl0aGluZyBlbHNlCisgKglpcyBhIG15c3RlcnkuCisgKgorICoJSW4gZmFjdCB3ZSBkb24ndCBhY3R1YWxseSBuZWVkIGEgc3RhY2sgc28gd2UgZG9uJ3QKKyAqCXNldCBvbmUgdXAuCisgKgorICoJV2UganVtcCBpbnRvIHRoZSBib290L2NvbXByZXNzZWQvaGVhZC5TIGNvZGUuIFNvIHlvdSdkCisgKgliZXR0ZXIgYmUgcnVubmluZyBhIGNvbXByZXNzZWQga2VybmVsIGltYWdlIG9yIHlvdQorICoJd29uJ3QgZ2V0IHZlcnkgZmFyLgorICoKKyAqCU9uIGVudHJ5IHRvIHRyYW1wb2xpbmVfZGF0YSwgdGhlIHByb2Nlc3NvciBpcyBpbiByZWFsIG1vZGUKKyAqCXdpdGggMTYtYml0IGFkZHJlc3NpbmcgYW5kIDE2LWJpdCBkYXRhLiAgQ1MgaGFzIHNvbWUgdmFsdWUKKyAqCWFuZCBJUCBpcyB6ZXJvLiAgVGh1cywgZGF0YSBhZGRyZXNzZXMgbmVlZCB0byBiZSBhYnNvbHV0ZQorICoJKG5vIHJlbG9jYXRpb24pIGFuZCBhcmUgdGFrZW4gd2l0aCByZWdhcmQgdG8gcl9iYXNlLgorICoKKyAqCUlmIHlvdSB3b3JrIG9uIHRoaXMgZmlsZSwgY2hlY2sgdGhlIG9iamVjdCBtb2R1bGUgd2l0aAorICoJb2JqZHVtcCAtLXJlbG9jIHRvIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gcmVsb2NhdGlvbgorICoJZW50cmllcyBleGNlcHQgZm9yOgorICoKKyAqCVRZUEUgICAgICAgICAgICAgIFZBTFVFCisgKglSXzM4Nl8zMiAgICAgICAgICBzdGFydHVwXzMyX3NtcAorICoJUl8zODZfMzIgICAgICAgICAgYm9vdF9nZHRfdGFibGUKKyAqLworCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworLmRhdGEKKworLmNvZGUxNgorCitFTlRSWSh0cmFtcG9saW5lX2RhdGEpCityX2Jhc2UgPSAuCisJd2JpbnZkCQkJIyBOZWVkZWQgZm9yIE5VTUEtUSBzaG91bGQgYmUgaGFybWxlc3MgZm9yIG90aGVycworCW1vdgklY3MsICVheAkjIENvZGUgYW5kIGRhdGEgaW4gdGhlIHNhbWUgcGxhY2UKKwltb3YJJWF4LCAlZHMKKworCWNsaQkJCSMgV2Ugc2hvdWxkIGJlIHNhZmUgYW55d2F5CisKKwltb3ZsCSQweEE1QTVBNUE1LCB0cmFtcG9saW5lX2RhdGEgLSByX2Jhc2UKKwkJCQkjIHdyaXRlIG1hcmtlciBmb3IgbWFzdGVyIGtub3dzIHdlJ3JlIHJ1bm5pbmcKKworCS8qIEdEVCB0YWJsZXMgaW4gbm9uIGRlZmF1bHQgbG9jYXRpb24ga2VybmVsIGNhbiBiZSBiZXlvbmQgMTZNQiBhbmQKKwkgKiBsZ2R0IHdpbGwgbm90IGJlIGFibGUgdG8gbG9hZCB0aGUgYWRkcmVzcyBhcyBpbiByZWFsIG1vZGUgZGVmYXVsdAorCSAqIG9wZXJhbmQgc2l6ZSBpcyAxNmJpdC4gVXNlIGxnZHRsIGluc3RlYWQgdG8gZm9yY2Ugb3BlcmFuZCBzaXplCisJICogdG8gMzIgYml0LgorCSAqLworCisJbGlkdGwJYm9vdF9pZHQgLSByX2Jhc2UJIyBsb2FkIGlkdCB3aXRoIDAsIDAKKwlsZ2R0bAlib290X2dkdCAtIHJfYmFzZQkjIGxvYWQgZ2R0IHdpdGggd2hhdGV2ZXIgaXMgYXBwcm9wcmlhdGUKKworCXhvcgklYXgsICVheAorCWluYwklYXgJCSMgcHJvdGVjdGVkIG1vZGUgKFBFKSBiaXQKKwlsbXN3CSVheAkJIyBpbnRvIHByb3RlY3RlZCBtb2RlCisJIyBmbHVzaCBwcmVmZXRjaCBhbmQganVtcCB0byBzdGFydHVwXzMyX3NtcCBpbiBhcmNoL2kzODYva2VybmVsL2hlYWQuUworCWxqbXBsCSRfX0JPT1RfQ1MsICQoc3RhcnR1cF8zMl9zbXAtX19QQUdFX09GRlNFVCkKKworCSMgVGhlc2UgbmVlZCB0byBiZSBpbiB0aGUgc2FtZSA2NEsgc2VnbWVudCBhcyB0aGUgYWJvdmU7CisJIyBoZW5jZSB3ZSBkb24ndCB1c2UgdGhlIGJvb3RfZ2R0X2Rlc2NyIGRlZmluZWQgaW4gaGVhZC5TCitib290X2dkdDoKKwkud29yZAlfX0JPT1RfRFMgKyA3CQkJIyBnZHQgbGltaXQKKwkubG9uZwlib290X2dkdF90YWJsZS1fX1BBR0VfT0ZGU0VUCSMgZ2R0IGJhc2UKKworYm9vdF9pZHQ6CisJLndvcmQJMAkJCQkjIGlkdCBsaW1pdCA9IDAKKwkubG9uZwkwCQkJCSMgaWR0IGJhc2UgPSAwTAorCisuZ2xvYmwgdHJhbXBvbGluZV9lbmQKK3RyYW1wb2xpbmVfZW5kOgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90cmFwcy5jIGIvYXJjaC9pMzg2L2tlcm5lbC90cmFwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMGUzODMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3RyYXBzLmMKQEAgLTAsMCArMSwxMDg0IEBACisvKgorICogIGxpbnV4L2FyY2gvaTM4Ni90cmFwcy5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgUGVudGl1bSBJSUkgRlhTUiwgU1NFIHN1cHBvcnQKKyAqCUdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4sIE1heSAyMDAwCisgKi8KKworLyoKKyAqICdUcmFwcy5jJyBoYW5kbGVzIGhhcmR3YXJlIHRyYXBzIGFuZCBmYXVsdHMgYWZ0ZXIgd2UgaGF2ZSBzYXZlZCBzb21lCisgKiBzdGF0ZSBpbiAnYXNtLnMnLgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CisKKyNpZmRlZiBDT05GSUdfRUlTQQorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vpc2EuaD4KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01DQQorI2luY2x1ZGUgPGxpbnV4L21jYS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGFzbS9kZWJ1Z3JlZy5oPgorI2luY2x1ZGUgPGFzbS9kZXNjLmg+CisjaW5jbHVkZSA8YXNtL2kzODcuaD4KKyNpbmNsdWRlIDxhc20vbm1pLmg+CisKKyNpbmNsdWRlIDxhc20vc21wLmg+CisjaW5jbHVkZSA8YXNtL2FyY2hfaG9va3MuaD4KKyNpbmNsdWRlIDxhc20va2RlYnVnLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgIm1hY2hfdHJhcHMuaCIKKworYXNtbGlua2FnZSBpbnQgc3lzdGVtX2NhbGwodm9pZCk7CisKK3N0cnVjdCBkZXNjX3N0cnVjdCBkZWZhdWx0X2xkdFtdID0geyB7IDAsIDAgfSwgeyAwLCAwIH0sIHsgMCwgMCB9LAorCQl7IDAsIDAgfSwgeyAwLCAwIH0gfTsKKworLyogRG8gd2UgaWdub3JlIEZQVSBpbnRlcnJ1cHRzID8gKi8KK2NoYXIgaWdub3JlX2ZwdV9pcnEgPSAwOworCisvKgorICogVGhlIElEVCBoYXMgdG8gYmUgcGFnZS1hbGlnbmVkIHRvIHNpbXBsaWZ5IHRoZSBQZW50aXVtCisgKiBGMCAwRiBidWcgd29ya2Fyb3VuZC4uIFdlIGhhdmUgYSBzcGVjaWFsIGxpbmsgc2VnbWVudAorICogZm9yIHRoaXMuCisgKi8KK3N0cnVjdCBkZXNjX3N0cnVjdCBpZHRfdGFibGVbMjU2XSBfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXygiLmRhdGEuaWR0IikpKSA9IHsgezAsIDB9LCB9OworCithc21saW5rYWdlIHZvaWQgZGl2aWRlX2Vycm9yKHZvaWQpOworYXNtbGlua2FnZSB2b2lkIGRlYnVnKHZvaWQpOworYXNtbGlua2FnZSB2b2lkIG5taSh2b2lkKTsKK2FzbWxpbmthZ2Ugdm9pZCBpbnQzKHZvaWQpOworYXNtbGlua2FnZSB2b2lkIG92ZXJmbG93KHZvaWQpOworYXNtbGlua2FnZSB2b2lkIGJvdW5kcyh2b2lkKTsKK2FzbWxpbmthZ2Ugdm9pZCBpbnZhbGlkX29wKHZvaWQpOworYXNtbGlua2FnZSB2b2lkIGRldmljZV9ub3RfYXZhaWxhYmxlKHZvaWQpOworYXNtbGlua2FnZSB2b2lkIGNvcHJvY2Vzc29yX3NlZ21lbnRfb3ZlcnJ1bih2b2lkKTsKK2FzbWxpbmthZ2Ugdm9pZCBpbnZhbGlkX1RTUyh2b2lkKTsKK2FzbWxpbmthZ2Ugdm9pZCBzZWdtZW50X25vdF9wcmVzZW50KHZvaWQpOworYXNtbGlua2FnZSB2b2lkIHN0YWNrX3NlZ21lbnQodm9pZCk7Cithc21saW5rYWdlIHZvaWQgZ2VuZXJhbF9wcm90ZWN0aW9uKHZvaWQpOworYXNtbGlua2FnZSB2b2lkIHBhZ2VfZmF1bHQodm9pZCk7Cithc21saW5rYWdlIHZvaWQgY29wcm9jZXNzb3JfZXJyb3Iodm9pZCk7Cithc21saW5rYWdlIHZvaWQgc2ltZF9jb3Byb2Nlc3Nvcl9lcnJvcih2b2lkKTsKK2FzbWxpbmthZ2Ugdm9pZCBhbGlnbm1lbnRfY2hlY2sodm9pZCk7Cithc21saW5rYWdlIHZvaWQgc3B1cmlvdXNfaW50ZXJydXB0X2J1Zyh2b2lkKTsKK2FzbWxpbmthZ2Ugdm9pZCBtYWNoaW5lX2NoZWNrKHZvaWQpOworCitzdGF0aWMgaW50IGtzdGFja19kZXB0aF90b19wcmludCA9IDI0Oworc3RydWN0IG5vdGlmaWVyX2Jsb2NrICppMzg2ZGllX2NoYWluOworc3RhdGljIERFRklORV9TUElOTE9DSyhkaWVfbm90aWZpZXJfbG9jayk7CisKK2ludCByZWdpc3Rlcl9kaWVfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZkaWVfbm90aWZpZXJfbG9jaywgZmxhZ3MpOworCWVyciA9IG5vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZpMzg2ZGllX2NoYWluLCBuYik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGllX25vdGlmaWVyX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW5saW5lIGludCB2YWxpZF9zdGFja19wdHIoc3RydWN0IHRocmVhZF9pbmZvICp0aW5mbywgdm9pZCAqcCkKK3sKKwlyZXR1cm4JcCA+ICh2b2lkICopdGluZm8gJiYKKwkJcCA8ICh2b2lkICopdGluZm8gKyBUSFJFQURfU0laRSAtIDM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwcmludF9jb250ZXh0X3N0YWNrKHN0cnVjdCB0aHJlYWRfaW5mbyAqdGluZm8sCisJCQkJdW5zaWduZWQgbG9uZyAqc3RhY2ssIHVuc2lnbmVkIGxvbmcgZWJwKQoreworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKworI2lmZGVmCUNPTkZJR19GUkFNRV9QT0lOVEVSCisJd2hpbGUgKHZhbGlkX3N0YWNrX3B0cih0aW5mbywgKHZvaWQgKillYnApKSB7CisJCWFkZHIgPSAqKHVuc2lnbmVkIGxvbmcgKikoZWJwICsgNCk7CisJCXByaW50aygiIFs8JTA4bHg+XSAiLCBhZGRyKTsKKwkJcHJpbnRfc3ltYm9sKCIlcyIsIGFkZHIpOworCQlwcmludGsoIlxuIik7CisJCWVicCA9ICoodW5zaWduZWQgbG9uZyAqKWVicDsKKwl9CisjZWxzZQorCXdoaWxlICh2YWxpZF9zdGFja19wdHIodGluZm8sIHN0YWNrKSkgeworCQlhZGRyID0gKnN0YWNrKys7CisJCWlmIChfX2tlcm5lbF90ZXh0X2FkZHJlc3MoYWRkcikpIHsKKwkJCXByaW50aygiIFs8JTA4bHg+XSIsIGFkZHIpOworCQkJcHJpbnRfc3ltYm9sKCIgJXMiLCBhZGRyKTsKKwkJCXByaW50aygiXG4iKTsKKwkJfQorCX0KKyNlbmRpZgorCXJldHVybiBlYnA7Cit9CisKK3ZvaWQgc2hvd190cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgKiBzdGFjaykKK3sKKwl1bnNpZ25lZCBsb25nIGVicDsKKworCWlmICghdGFzaykKKwkJdGFzayA9IGN1cnJlbnQ7CisKKwlpZiAodGFzayA9PSBjdXJyZW50KSB7CisJCS8qIEdyYWIgZWJwIHJpZ2h0IGZyb20gb3VyIHJlZ3MgKi8KKwkJYXNtICgibW92bCAlJWVicCwgJTAiIDogIj1yIiAoZWJwKSA6ICk7CisJfSBlbHNlIHsKKwkJLyogZWJwIGlzIHRoZSBsYXN0IHJlZyBwdXNoZWQgYnkgc3dpdGNoX3RvICovCisJCWVicCA9ICoodW5zaWduZWQgbG9uZyAqKSB0YXNrLT50aHJlYWQuZXNwOworCX0KKworCXdoaWxlICgxKSB7CisJCXN0cnVjdCB0aHJlYWRfaW5mbyAqY29udGV4dDsKKwkJY29udGV4dCA9IChzdHJ1Y3QgdGhyZWFkX2luZm8gKikKKwkJCSgodW5zaWduZWQgbG9uZylzdGFjayAmICh+KFRIUkVBRF9TSVpFIC0gMSkpKTsKKwkJZWJwID0gcHJpbnRfY29udGV4dF9zdGFjayhjb250ZXh0LCBzdGFjaywgZWJwKTsKKwkJc3RhY2sgPSAodW5zaWduZWQgbG9uZyopY29udGV4dC0+cHJldmlvdXNfZXNwOworCQlpZiAoIXN0YWNrKQorCQkJYnJlYWs7CisJCXByaW50aygiID09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKwl9Cit9CisKK3ZvaWQgc2hvd19zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgKmVzcCkKK3sKKwl1bnNpZ25lZCBsb25nICpzdGFjazsKKwlpbnQgaTsKKworCWlmIChlc3AgPT0gTlVMTCkgeworCQlpZiAodGFzaykKKwkJCWVzcCA9ICh1bnNpZ25lZCBsb25nKil0YXNrLT50aHJlYWQuZXNwOworCQllbHNlCisJCQllc3AgPSAodW5zaWduZWQgbG9uZyAqKSZlc3A7CisJfQorCisJc3RhY2sgPSBlc3A7CisJZm9yKGkgPSAwOyBpIDwga3N0YWNrX2RlcHRoX3RvX3ByaW50OyBpKyspIHsKKwkJaWYgKGtzdGFja19lbmQoc3RhY2spKQorCQkJYnJlYWs7CisJCWlmIChpICYmICgoaSAlIDgpID09IDApKQorCQkJcHJpbnRrKCJcbiAgICAgICAiKTsKKwkJcHJpbnRrKCIlMDhseCAiLCAqc3RhY2srKyk7CisJfQorCXByaW50aygiXG5DYWxsIFRyYWNlOlxuIik7CisJc2hvd190cmFjZSh0YXNrLCBlc3ApOworfQorCisvKgorICogVGhlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkdW1wX3N0YWNrIGdlbmVyYXRvcgorICovCit2b2lkIGR1bXBfc3RhY2sodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHN0YWNrOworCisJc2hvd190cmFjZShjdXJyZW50LCAmc3RhY2spOworfQorCitFWFBPUlRfU1lNQk9MKGR1bXBfc3RhY2spOworCit2b2lkIHNob3dfcmVnaXN0ZXJzKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBpOworCWludCBpbl9rZXJuZWwgPSAxOworCXVuc2lnbmVkIGxvbmcgZXNwOworCXVuc2lnbmVkIHNob3J0IHNzOworCisJZXNwID0gKHVuc2lnbmVkIGxvbmcpICgmcmVncy0+ZXNwKTsKKwlzcyA9IF9fS0VSTkVMX0RTOworCWlmIChyZWdzLT54Y3MgJiAzKSB7CisJCWluX2tlcm5lbCA9IDA7CisJCWVzcCA9IHJlZ3MtPmVzcDsKKwkJc3MgPSByZWdzLT54c3MgJiAweGZmZmY7CisJfQorCXByaW50X21vZHVsZXMoKTsKKwlwcmludGsoIkNQVTogICAgJWRcbkVJUDogICAgJTA0eDpbPCUwOGx4Pl0gICAgJXMgVkxJXG5FRkxBR1M6ICUwOGx4IgorCQkJIiAgICglcykgXG4iLAorCQlzbXBfcHJvY2Vzc29yX2lkKCksIDB4ZmZmZiAmIHJlZ3MtPnhjcywgcmVncy0+ZWlwLAorCQlwcmludF90YWludGVkKCksIHJlZ3MtPmVmbGFncywgc3lzdGVtX3V0c25hbWUucmVsZWFzZSk7CisJcHJpbnRfc3ltYm9sKCJFSVAgaXMgYXQgJXNcbiIsIHJlZ3MtPmVpcCk7CisJcHJpbnRrKCJlYXg6ICUwOGx4ICAgZWJ4OiAlMDhseCAgIGVjeDogJTA4bHggICBlZHg6ICUwOGx4XG4iLAorCQlyZWdzLT5lYXgsIHJlZ3MtPmVieCwgcmVncy0+ZWN4LCByZWdzLT5lZHgpOworCXByaW50aygiZXNpOiAlMDhseCAgIGVkaTogJTA4bHggICBlYnA6ICUwOGx4ICAgZXNwOiAlMDhseFxuIiwKKwkJcmVncy0+ZXNpLCByZWdzLT5lZGksIHJlZ3MtPmVicCwgZXNwKTsKKwlwcmludGsoImRzOiAlMDR4ICAgZXM6ICUwNHggICBzczogJTA0eFxuIiwKKwkJcmVncy0+eGRzICYgMHhmZmZmLCByZWdzLT54ZXMgJiAweGZmZmYsIHNzKTsKKwlwcmludGsoIlByb2Nlc3MgJXMgKHBpZDogJWQsIHRocmVhZGluZm89JXAgdGFzaz0lcCkiLAorCQljdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIGN1cnJlbnRfdGhyZWFkX2luZm8oKSwgY3VycmVudCk7CisJLyoKKwkgKiBXaGVuIGluLWtlcm5lbCwgd2UgYWxzbyBwcmludCBvdXQgdGhlIHN0YWNrIGFuZCBjb2RlIGF0IHRoZQorCSAqIHRpbWUgb2YgdGhlIGZhdWx0Li4KKwkgKi8KKwlpZiAoaW5fa2VybmVsKSB7CisJCXU4ICplaXA7CisKKwkJcHJpbnRrKCJcblN0YWNrOiAiKTsKKwkJc2hvd19zdGFjayhOVUxMLCAodW5zaWduZWQgbG9uZyopZXNwKTsKKworCQlwcmludGsoIkNvZGU6ICIpOworCisJCWVpcCA9ICh1OCAqKXJlZ3MtPmVpcCAtIDQzOworCQlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKywgZWlwKyspIHsKKwkJCXVuc2lnbmVkIGNoYXIgYzsKKworCQkJaWYgKGVpcCA8ICh1OCAqKVBBR0VfT0ZGU0VUIHx8IF9fZ2V0X3VzZXIoYywgZWlwKSkgeworCQkJCXByaW50aygiIEJhZCBFSVAgdmFsdWUuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoZWlwID09ICh1OCAqKXJlZ3MtPmVpcCkKKwkJCQlwcmludGsoIjwlMDJ4PiAiLCBjKTsKKwkJCWVsc2UKKwkJCQlwcmludGsoIiUwMnggIiwgYyk7CisJCX0KKwl9CisJcHJpbnRrKCJcbiIpOworfQkKKworc3RhdGljIHZvaWQgaGFuZGxlX0JVRyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBzaG9ydCB1ZDI7CisJdW5zaWduZWQgc2hvcnQgbGluZTsKKwljaGFyICpmaWxlOworCWNoYXIgYzsKKwl1bnNpZ25lZCBsb25nIGVpcDsKKworCWlmIChyZWdzLT54Y3MgJiAzKQorCQlnb3RvIG5vX2J1ZzsJCS8qIE5vdCBpbiBrZXJuZWwgKi8KKworCWVpcCA9IHJlZ3MtPmVpcDsKKworCWlmIChlaXAgPCBQQUdFX09GRlNFVCkKKwkJZ290byBub19idWc7CisJaWYgKF9fZ2V0X3VzZXIodWQyLCAodW5zaWduZWQgc2hvcnQgKillaXApKQorCQlnb3RvIG5vX2J1ZzsKKwlpZiAodWQyICE9IDB4MGIwZikKKwkJZ290byBub19idWc7CisJaWYgKF9fZ2V0X3VzZXIobGluZSwgKHVuc2lnbmVkIHNob3J0ICopKGVpcCArIDIpKSkKKwkJZ290byBidWc7CisJaWYgKF9fZ2V0X3VzZXIoZmlsZSwgKGNoYXIgKiopKGVpcCArIDQpKSB8fAorCQkodW5zaWduZWQgbG9uZylmaWxlIDwgUEFHRV9PRkZTRVQgfHwgX19nZXRfdXNlcihjLCBmaWxlKSkKKwkJZmlsZSA9ICI8YmFkIGZpbGVuYW1lPiI7CisKKwlwcmludGsoIi0tLS0tLS0tLS0tLVsgY3V0IGhlcmUgXS0tLS0tLS0tLS0tLVxuIik7CisJcHJpbnRrKEtFUk5fQUxFUlQgImtlcm5lbCBCVUcgYXQgJXM6JWQhXG4iLCBmaWxlLCBsaW5lKTsKKworbm9fYnVnOgorCXJldHVybjsKKworCS8qIEhlcmUgd2Uga25vdyBpdCB3YXMgYSBCVUcgYnV0IGZpbGUtbi1saW5lIGlzIHVuYXZhaWxhYmxlICovCitidWc6CisJcHJpbnRrKCJLZXJuZWwgQlVHXG4iKTsKK30KKwordm9pZCBkaWUoY29uc3QgY2hhciAqIHN0ciwgc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycikKK3sKKwlzdGF0aWMgc3RydWN0IHsKKwkJc3BpbmxvY2tfdCBsb2NrOworCQl1MzIgbG9ja19vd25lcjsKKwkJaW50IGxvY2tfb3duZXJfZGVwdGg7CisJfSBkaWUgPSB7CisJCS5sb2NrID0JCQlTUElOX0xPQ0tfVU5MT0NLRUQsCisJCS5sb2NrX293bmVyID0JCS0xLAorCQkubG9ja19vd25lcl9kZXB0aCA9CTAKKwl9OworCXN0YXRpYyBpbnQgZGllX2NvdW50ZXI7CisKKwlpZiAoZGllLmxvY2tfb3duZXIgIT0gX3NtcF9wcm9jZXNzb3JfaWQoKSkgeworCQljb25zb2xlX3ZlcmJvc2UoKTsKKwkJc3Bpbl9sb2NrX2lycSgmZGllLmxvY2spOworCQlkaWUubG9ja19vd25lciA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwkJZGllLmxvY2tfb3duZXJfZGVwdGggPSAwOworCQlidXN0X3NwaW5sb2NrcygxKTsKKwl9CisKKwlpZiAoKytkaWUubG9ja19vd25lcl9kZXB0aCA8IDMpIHsKKwkJaW50IG5sID0gMDsKKwkJaGFuZGxlX0JVRyhyZWdzKTsKKwkJcHJpbnRrKEtFUk5fQUxFUlQgIiVzOiAlMDRseCBbIyVkXVxuIiwgc3RyLCBlcnIgJiAweGZmZmYsICsrZGllX2NvdW50ZXIpOworI2lmZGVmIENPTkZJR19QUkVFTVBUCisJCXByaW50aygiUFJFRU1QVCAiKTsKKwkJbmwgPSAxOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1NNUAorCQlwcmludGsoIlNNUCAiKTsKKwkJbmwgPSAxOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0RFQlVHX1BBR0VBTExPQworCQlwcmludGsoIkRFQlVHX1BBR0VBTExPQyIpOworCQlubCA9IDE7CisjZW5kaWYKKwkJaWYgKG5sKQorCQkJcHJpbnRrKCJcbiIpOworCW5vdGlmeV9kaWUoRElFX09PUFMsIChjaGFyICopc3RyLCByZWdzLCBlcnIsIDI1NSwgU0lHU0VHVik7CisJCXNob3dfcmVnaXN0ZXJzKHJlZ3MpOworICAJfSBlbHNlCisJCXByaW50ayhLRVJOX0VSUiAiUmVjdXJzaXZlIGRpZSgpIGZhaWx1cmUsIG91dHB1dCBzdXBwcmVzc2VkXG4iKTsKKworCWJ1c3Rfc3BpbmxvY2tzKDApOworCWRpZS5sb2NrX293bmVyID0gLTE7CisJc3Bpbl91bmxvY2tfaXJxKCZkaWUubG9jayk7CisJaWYgKGluX2ludGVycnVwdCgpKQorCQlwYW5pYygiRmF0YWwgZXhjZXB0aW9uIGluIGludGVycnVwdCIpOworCisJaWYgKHBhbmljX29uX29vcHMpIHsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgIkZhdGFsIGV4Y2VwdGlvbjogcGFuaWMgaW4gNSBzZWNvbmRzXG4iKTsKKwkJc3NsZWVwKDUpOworCQlwYW5pYygiRmF0YWwgZXhjZXB0aW9uIik7CisJfQorCWRvX2V4aXQoU0lHU0VHVik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkaWVfaWZfa2VybmVsKGNvbnN0IGNoYXIgKiBzdHIsIHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnIpCit7CisJaWYgKCEocmVncy0+ZWZsYWdzICYgVk1fTUFTSykgJiYgISgzICYgcmVncy0+eGNzKSkKKwkJZGllKHN0ciwgcmVncywgZXJyKTsKK30KKworc3RhdGljIHZvaWQgZG9fdHJhcChpbnQgdHJhcG5yLCBpbnQgc2lnbnIsIGNoYXIgKnN0ciwgaW50IHZtODYsCisJCQkgICBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSwgc2lnaW5mb190ICppbmZvKQoreworCWlmIChyZWdzLT5lZmxhZ3MgJiBWTV9NQVNLKSB7CisJCWlmICh2bTg2KQorCQkJZ290byB2bTg2X3RyYXA7CisJCWdvdG8gdHJhcF9zaWduYWw7CisJfQorCisJaWYgKCEocmVncy0+eGNzICYgMykpCisJCWdvdG8ga2VybmVsX3RyYXA7CisKKwl0cmFwX3NpZ25hbDogeworCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisJCXRzay0+dGhyZWFkLmVycm9yX2NvZGUgPSBlcnJvcl9jb2RlOworCQl0c2stPnRocmVhZC50cmFwX25vID0gdHJhcG5yOworCQlpZiAoaW5mbykKKwkJCWZvcmNlX3NpZ19pbmZvKHNpZ25yLCBpbmZvLCB0c2spOworCQllbHNlCisJCQlmb3JjZV9zaWcoc2lnbnIsIHRzayk7CisJCXJldHVybjsKKwl9CisKKwlrZXJuZWxfdHJhcDogeworCQlpZiAoIWZpeHVwX2V4Y2VwdGlvbihyZWdzKSkKKwkJCWRpZShzdHIsIHJlZ3MsIGVycm9yX2NvZGUpOworCQlyZXR1cm47CisJfQorCisJdm04Nl90cmFwOiB7CisJCWludCByZXQgPSBoYW5kbGVfdm04Nl90cmFwKChzdHJ1Y3Qga2VybmVsX3ZtODZfcmVncyAqKSByZWdzLCBlcnJvcl9jb2RlLCB0cmFwbnIpOworCQlpZiAocmV0KSBnb3RvIHRyYXBfc2lnbmFsOworCQlyZXR1cm47CisJfQorfQorCisjZGVmaW5lIERPX0VSUk9SKHRyYXBuciwgc2lnbnIsIHN0ciwgbmFtZSkgXAorZmFzdGNhbGwgdm9pZCBkb18jI25hbWUoc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUpIFwKK3sgXAorCWlmIChub3RpZnlfZGllKERJRV9UUkFQLCBzdHIsIHJlZ3MsIGVycm9yX2NvZGUsIHRyYXBuciwgc2lnbnIpIFwKKwkJCQkJCT09IE5PVElGWV9TVE9QKSBcCisJCXJldHVybjsgXAorCWRvX3RyYXAodHJhcG5yLCBzaWduciwgc3RyLCAwLCByZWdzLCBlcnJvcl9jb2RlLCBOVUxMKTsgXAorfQorCisjZGVmaW5lIERPX0VSUk9SX0lORk8odHJhcG5yLCBzaWduciwgc3RyLCBuYW1lLCBzaWNvZGUsIHNpYWRkcikgXAorZmFzdGNhbGwgdm9pZCBkb18jI25hbWUoc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUpIFwKK3sgXAorCXNpZ2luZm9fdCBpbmZvOyBcCisJaW5mby5zaV9zaWdubyA9IHNpZ25yOyBcCisJaW5mby5zaV9lcnJubyA9IDA7IFwKKwlpbmZvLnNpX2NvZGUgPSBzaWNvZGU7IFwKKwlpbmZvLnNpX2FkZHIgPSAodm9pZCBfX3VzZXIgKilzaWFkZHI7IFwKKwlpZiAobm90aWZ5X2RpZShESUVfVFJBUCwgc3RyLCByZWdzLCBlcnJvcl9jb2RlLCB0cmFwbnIsIHNpZ25yKSBcCisJCQkJCQk9PSBOT1RJRllfU1RPUCkgXAorCQlyZXR1cm47IFwKKwlkb190cmFwKHRyYXBuciwgc2lnbnIsIHN0ciwgMCwgcmVncywgZXJyb3JfY29kZSwgJmluZm8pOyBcCit9CisKKyNkZWZpbmUgRE9fVk04Nl9FUlJPUih0cmFwbnIsIHNpZ25yLCBzdHIsIG5hbWUpIFwKK2Zhc3RjYWxsIHZvaWQgZG9fIyNuYW1lKHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnJvcl9jb2RlKSBcCit7IFwKKwlpZiAobm90aWZ5X2RpZShESUVfVFJBUCwgc3RyLCByZWdzLCBlcnJvcl9jb2RlLCB0cmFwbnIsIHNpZ25yKSBcCisJCQkJCQk9PSBOT1RJRllfU1RPUCkgXAorCQlyZXR1cm47IFwKKwlkb190cmFwKHRyYXBuciwgc2lnbnIsIHN0ciwgMSwgcmVncywgZXJyb3JfY29kZSwgTlVMTCk7IFwKK30KKworI2RlZmluZSBET19WTTg2X0VSUk9SX0lORk8odHJhcG5yLCBzaWduciwgc3RyLCBuYW1lLCBzaWNvZGUsIHNpYWRkcikgXAorZmFzdGNhbGwgdm9pZCBkb18jI25hbWUoc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUpIFwKK3sgXAorCXNpZ2luZm9fdCBpbmZvOyBcCisJaW5mby5zaV9zaWdubyA9IHNpZ25yOyBcCisJaW5mby5zaV9lcnJubyA9IDA7IFwKKwlpbmZvLnNpX2NvZGUgPSBzaWNvZGU7IFwKKwlpbmZvLnNpX2FkZHIgPSAodm9pZCBfX3VzZXIgKilzaWFkZHI7IFwKKwlpZiAobm90aWZ5X2RpZShESUVfVFJBUCwgc3RyLCByZWdzLCBlcnJvcl9jb2RlLCB0cmFwbnIsIHNpZ25yKSBcCisJCQkJCQk9PSBOT1RJRllfU1RPUCkgXAorCQlyZXR1cm47IFwKKwlkb190cmFwKHRyYXBuciwgc2lnbnIsIHN0ciwgMSwgcmVncywgZXJyb3JfY29kZSwgJmluZm8pOyBcCit9CisKK0RPX1ZNODZfRVJST1JfSU5GTyggMCwgU0lHRlBFLCAgImRpdmlkZSBlcnJvciIsIGRpdmlkZV9lcnJvciwgRlBFX0lOVERJViwgcmVncy0+ZWlwKQorI2lmbmRlZiBDT05GSUdfS1BST0JFUworRE9fVk04Nl9FUlJPUiggMywgU0lHVFJBUCwgImludDMiLCBpbnQzKQorI2VuZGlmCitET19WTTg2X0VSUk9SKCA0LCBTSUdTRUdWLCAib3ZlcmZsb3ciLCBvdmVyZmxvdykKK0RPX1ZNODZfRVJST1IoIDUsIFNJR1NFR1YsICJib3VuZHMiLCBib3VuZHMpCitET19FUlJPUl9JTkZPKCA2LCBTSUdJTEwsICAiaW52YWxpZCBvcGVyYW5kIiwgaW52YWxpZF9vcCwgSUxMX0lMTE9QTiwgcmVncy0+ZWlwKQorRE9fRVJST1IoIDksIFNJR0ZQRSwgICJjb3Byb2Nlc3NvciBzZWdtZW50IG92ZXJydW4iLCBjb3Byb2Nlc3Nvcl9zZWdtZW50X292ZXJydW4pCitET19FUlJPUigxMCwgU0lHU0VHViwgImludmFsaWQgVFNTIiwgaW52YWxpZF9UU1MpCitET19FUlJPUigxMSwgU0lHQlVTLCAgInNlZ21lbnQgbm90IHByZXNlbnQiLCBzZWdtZW50X25vdF9wcmVzZW50KQorRE9fRVJST1IoMTIsIFNJR0JVUywgICJzdGFjayBzZWdtZW50Iiwgc3RhY2tfc2VnbWVudCkKK0RPX0VSUk9SX0lORk8oMTcsIFNJR0JVUywgImFsaWdubWVudCBjaGVjayIsIGFsaWdubWVudF9jaGVjaywgQlVTX0FEUkFMTiwgMCkKKworZmFzdGNhbGwgdm9pZCBkb19nZW5lcmFsX3Byb3RlY3Rpb24oc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUpCit7CisJaW50IGNwdSA9IGdldF9jcHUoKTsKKwlzdHJ1Y3QgdHNzX3N0cnVjdCAqdHNzID0gJnBlcl9jcHUoaW5pdF90c3MsIGNwdSk7CisJc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnRocmVhZCA9ICZjdXJyZW50LT50aHJlYWQ7CisKKwkvKgorCSAqIFBlcmZvcm0gdGhlIGxhenkgVFNTJ3MgSS9PIGJpdG1hcCBjb3B5LiBJZiB0aGUgVFNTIGhhcyBhbgorCSAqIGludmFsaWQgb2Zmc2V0IHNldCAodGhlIExBWlkgb25lKSBhbmQgdGhlIGZhdWx0aW5nIHRocmVhZCBoYXMKKwkgKiBhIHZhbGlkIEkvTyBiaXRtYXAgcG9pbnRlciwgd2UgY29weSB0aGUgSS9PIGJpdG1hcCBpbiB0aGUgVFNTCisJICogYW5kIHdlIHNldCB0aGUgb2Zmc2V0IGZpZWxkIGNvcnJlY3RseS4gVGhlbiB3ZSBsZXQgdGhlIENQVSB0bworCSAqIHJlc3RhcnQgdGhlIGZhdWx0aW5nIGluc3RydWN0aW9uLgorCSAqLworCWlmICh0c3MtPmlvX2JpdG1hcF9iYXNlID09IElOVkFMSURfSU9fQklUTUFQX09GRlNFVF9MQVpZICYmCisJICAgIHRocmVhZC0+aW9fYml0bWFwX3B0cikgeworCQltZW1jcHkodHNzLT5pb19iaXRtYXAsIHRocmVhZC0+aW9fYml0bWFwX3B0ciwKKwkJICAgICAgIHRocmVhZC0+aW9fYml0bWFwX21heCk7CisJCS8qCisJCSAqIElmIHRoZSBwcmV2aW91c2x5IHNldCBtYXAgd2FzIGV4dGVuZGluZyB0byBoaWdoZXIgcG9ydHMKKwkJICogdGhhbiB0aGUgY3VycmVudCBvbmUsIHBhZCBleHRyYSBzcGFjZSB3aXRoIDB4ZmYgKG5vIGFjY2VzcykuCisJCSAqLworCQlpZiAodGhyZWFkLT5pb19iaXRtYXBfbWF4IDwgdHNzLT5pb19iaXRtYXBfbWF4KQorCQkJbWVtc2V0KChjaGFyICopIHRzcy0+aW9fYml0bWFwICsKKwkJCQl0aHJlYWQtPmlvX2JpdG1hcF9tYXgsIDB4ZmYsCisJCQkJdHNzLT5pb19iaXRtYXBfbWF4IC0gdGhyZWFkLT5pb19iaXRtYXBfbWF4KTsKKwkJdHNzLT5pb19iaXRtYXBfbWF4ID0gdGhyZWFkLT5pb19iaXRtYXBfbWF4OworCQl0c3MtPmlvX2JpdG1hcF9iYXNlID0gSU9fQklUTUFQX09GRlNFVDsKKwkJcHV0X2NwdSgpOworCQlyZXR1cm47CisJfQorCXB1dF9jcHUoKTsKKworCWlmIChyZWdzLT5lZmxhZ3MgJiBWTV9NQVNLKQorCQlnb3RvIGdwX2luX3ZtODY7CisKKwlpZiAoIShyZWdzLT54Y3MgJiAzKSkKKwkJZ290byBncF9pbl9rZXJuZWw7CisKKwljdXJyZW50LT50aHJlYWQuZXJyb3JfY29kZSA9IGVycm9yX2NvZGU7CisJY3VycmVudC0+dGhyZWFkLnRyYXBfbm8gPSAxMzsKKwlmb3JjZV9zaWcoU0lHU0VHViwgY3VycmVudCk7CisJcmV0dXJuOworCitncF9pbl92bTg2OgorCWxvY2FsX2lycV9lbmFibGUoKTsKKwloYW5kbGVfdm04Nl9mYXVsdCgoc3RydWN0IGtlcm5lbF92bTg2X3JlZ3MgKikgcmVncywgZXJyb3JfY29kZSk7CisJcmV0dXJuOworCitncF9pbl9rZXJuZWw6CisJaWYgKCFmaXh1cF9leGNlcHRpb24ocmVncykpIHsKKwkJaWYgKG5vdGlmeV9kaWUoRElFX0dQRiwgImdlbmVyYWwgcHJvdGVjdGlvbiBmYXVsdCIsIHJlZ3MsCisJCQkJZXJyb3JfY29kZSwgMTMsIFNJR1NFR1YpID09IE5PVElGWV9TVE9QKQorCQkJcmV0dXJuOworCQlkaWUoImdlbmVyYWwgcHJvdGVjdGlvbiBmYXVsdCIsIHJlZ3MsIGVycm9yX2NvZGUpOworCX0KK30KKworc3RhdGljIHZvaWQgbWVtX3Bhcml0eV9lcnJvcih1bnNpZ25lZCBjaGFyIHJlYXNvbiwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCXByaW50aygiVWhodWguIE5NSSByZWNlaXZlZC4gRGF6ZWQgYW5kIGNvbmZ1c2VkLCBidXQgdHJ5aW5nIHRvIGNvbnRpbnVlXG4iKTsKKwlwcmludGsoIllvdSBwcm9iYWJseSBoYXZlIGEgaGFyZHdhcmUgcHJvYmxlbSB3aXRoIHlvdXIgUkFNIGNoaXBzXG4iKTsKKworCS8qIENsZWFyIGFuZCBkaXNhYmxlIHRoZSBtZW1vcnkgcGFyaXR5IGVycm9yIGxpbmUuICovCisJY2xlYXJfbWVtX2Vycm9yKHJlYXNvbik7Cit9CisKK3N0YXRpYyB2b2lkIGlvX2NoZWNrX2Vycm9yKHVuc2lnbmVkIGNoYXIgcmVhc29uLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBpOworCisJcHJpbnRrKCJOTUk6IElPQ0sgZXJyb3IgKGRlYnVnIGludGVycnVwdD8pXG4iKTsKKwlzaG93X3JlZ2lzdGVycyhyZWdzKTsKKworCS8qIFJlLWVuYWJsZSB0aGUgSU9DSyBsaW5lLCB3YWl0IGZvciBhIGZldyBzZWNvbmRzICovCisJcmVhc29uID0gKHJlYXNvbiAmIDB4ZikgfCA4OworCW91dGIocmVhc29uLCAweDYxKTsKKwlpID0gMjAwMDsKKwl3aGlsZSAoLS1pKSB1ZGVsYXkoMTAwMCk7CisJcmVhc29uICY9IH44OworCW91dGIocmVhc29uLCAweDYxKTsKK30KKworc3RhdGljIHZvaWQgdW5rbm93bl9ubWlfZXJyb3IodW5zaWduZWQgY2hhciByZWFzb24sIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKyNpZmRlZiBDT05GSUdfTUNBCisJLyogTWlnaHQgYWN0dWFsbHkgYmUgYWJsZSB0byBmaWd1cmUgb3V0IHdoYXQgdGhlIGd1aWx0eSBwYXJ0eQorCSogaXMuICovCisJaWYoIE1DQV9idXMgKSB7CisJCW1jYV9oYW5kbGVfbm1pKCk7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKwlwcmludGsoIlVoaHVoLiBOTUkgcmVjZWl2ZWQgZm9yIHVua25vd24gcmVhc29uICUwMnggb24gQ1BVICVkLlxuIiwKKwkJcmVhc29uLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCXByaW50aygiRGF6ZWQgYW5kIGNvbmZ1c2VkLCBidXQgdHJ5aW5nIHRvIGNvbnRpbnVlXG4iKTsKKwlwcmludGsoIkRvIHlvdSBoYXZlIGEgc3RyYW5nZSBwb3dlciBzYXZpbmcgbW9kZSBlbmFibGVkP1xuIik7Cit9CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobm1pX3ByaW50X2xvY2spOworCit2b2lkIGRpZV9ubWkgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBjb25zdCBjaGFyICptc2cpCit7CisJc3Bpbl9sb2NrKCZubWlfcHJpbnRfbG9jayk7CisJLyoKKwkqIFdlIGFyZSBpbiB0cm91YmxlIGFueXdheSwgbGV0cyBhdCBsZWFzdCB0cnkKKwkqIHRvIGdldCBhIG1lc3NhZ2Ugb3V0LgorCSovCisJYnVzdF9zcGlubG9ja3MoMSk7CisJcHJpbnRrKG1zZyk7CisJcHJpbnRrKCIgb24gQ1BVJWQsIGVpcCAlMDhseCwgcmVnaXN0ZXJzOlxuIiwKKwkJc21wX3Byb2Nlc3Nvcl9pZCgpLCByZWdzLT5laXApOworCXNob3dfcmVnaXN0ZXJzKHJlZ3MpOworCXByaW50aygiY29uc29sZSBzaHV0cyB1cCAuLi5cbiIpOworCWNvbnNvbGVfc2lsZW50KCk7CisJc3Bpbl91bmxvY2soJm5taV9wcmludF9sb2NrKTsKKwlidXN0X3NwaW5sb2NrcygwKTsKKwlkb19leGl0KFNJR1NFR1YpOworfQorCitzdGF0aWMgdm9pZCBkZWZhdWx0X2RvX25taShzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJdW5zaWduZWQgY2hhciByZWFzb24gPSAwOworCisJLyogT25seSB0aGUgQlNQIGdldHMgZXh0ZXJuYWwgTk1JcyBmcm9tIHRoZSBzeXN0ZW0uICAqLworCWlmICghc21wX3Byb2Nlc3Nvcl9pZCgpKQorCQlyZWFzb24gPSBnZXRfbm1pX3JlYXNvbigpOworIAorCWlmICghKHJlYXNvbiAmIDB4YzApKSB7CisJCWlmIChub3RpZnlfZGllKERJRV9OTUlfSVBJLCAibm1pX2lwaSIsIHJlZ3MsIHJlYXNvbiwgMCwgU0lHSU5UKQorCQkJCQkJCT09IE5PVElGWV9TVE9QKQorCQkJcmV0dXJuOworI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQworCQkvKgorCQkgKiBPaywgc28gdGhpcyBpcyBub25lIG9mIHRoZSBkb2N1bWVudGVkIE5NSSBzb3VyY2VzLAorCQkgKiBzbyBpdCBtdXN0IGJlIHRoZSBOTUkgd2F0Y2hkb2cuCisJCSAqLworCQlpZiAobm1pX3dhdGNoZG9nKSB7CisJCQlubWlfd2F0Y2hkb2dfdGljayhyZWdzKTsKKwkJCXJldHVybjsKKwkJfQorI2VuZGlmCisJCXVua25vd25fbm1pX2Vycm9yKHJlYXNvbiwgcmVncyk7CisJCXJldHVybjsKKwl9CisJaWYgKG5vdGlmeV9kaWUoRElFX05NSSwgIm5taSIsIHJlZ3MsIHJlYXNvbiwgMCwgU0lHSU5UKSA9PSBOT1RJRllfU1RPUCkKKwkJcmV0dXJuOworCWlmIChyZWFzb24gJiAweDgwKQorCQltZW1fcGFyaXR5X2Vycm9yKHJlYXNvbiwgcmVncyk7CisJaWYgKHJlYXNvbiAmIDB4NDApCisJCWlvX2NoZWNrX2Vycm9yKHJlYXNvbiwgcmVncyk7CisJLyoKKwkgKiBSZWFzc2VydCBOTUkgaW4gY2FzZSBpdCBiZWNhbWUgYWN0aXZlIG1lYW53aGlsZQorCSAqIGFzIGl0J3MgZWRnZS10cmlnZ2VyZWQuCisJICovCisJcmVhc3NlcnRfbm1pKCk7Cit9CisKK3N0YXRpYyBpbnQgZHVtbXlfbm1pX2NhbGxiYWNrKHN0cnVjdCBwdF9yZWdzICogcmVncywgaW50IGNwdSkKK3sKKwlyZXR1cm4gMDsKK30KKyAKK3N0YXRpYyBubWlfY2FsbGJhY2tfdCBubWlfY2FsbGJhY2sgPSBkdW1teV9ubWlfY2FsbGJhY2s7CisgCitmYXN0Y2FsbCB2b2lkIGRvX25taShzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKK3sKKwlpbnQgY3B1OworCisJbm1pX2VudGVyKCk7CisKKwljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJKytubWlfY291bnQoY3B1KTsKKworCWlmICghbm1pX2NhbGxiYWNrKHJlZ3MsIGNwdSkpCisJCWRlZmF1bHRfZG9fbm1pKHJlZ3MpOworCisJbm1pX2V4aXQoKTsKK30KKwordm9pZCBzZXRfbm1pX2NhbGxiYWNrKG5taV9jYWxsYmFja190IGNhbGxiYWNrKQoreworCW5taV9jYWxsYmFjayA9IGNhbGxiYWNrOworfQorCit2b2lkIHVuc2V0X25taV9jYWxsYmFjayh2b2lkKQoreworCW5taV9jYWxsYmFjayA9IGR1bW15X25taV9jYWxsYmFjazsKK30KKworI2lmZGVmIENPTkZJR19LUFJPQkVTCitmYXN0Y2FsbCBpbnQgZG9faW50MyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnJvcl9jb2RlKQoreworCWlmIChub3RpZnlfZGllKERJRV9JTlQzLCAiaW50MyIsIHJlZ3MsIGVycm9yX2NvZGUsIDMsIFNJR1RSQVApCisJCQk9PSBOT1RJRllfU1RPUCkKKwkJcmV0dXJuIDE7CisJLyogVGhpcyBpcyBhbiBpbnRlcnJ1cHQgZ2F0ZSwgYmVjYXVzZSBrcHJvYmVzIHdhbnRzIGludGVycnVwdHMKKwlkaXNhYmxlZC4gIE5vcm1hbCB0cmFwIGhhbmRsZXJzIGRvbid0LiAqLworCXJlc3RvcmVfaW50ZXJydXB0cyhyZWdzKTsKKwlkb190cmFwKDMsIFNJR1RSQVAsICJpbnQzIiwgMSwgcmVncywgZXJyb3JfY29kZSwgTlVMTCk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworLyoKKyAqIE91ciBoYW5kbGluZyBvZiB0aGUgcHJvY2Vzc29yIGRlYnVnIHJlZ2lzdGVycyBpcyBub24tdHJpdmlhbC4KKyAqIFdlIGRvIG5vdCBjbGVhciB0aGVtIG9uIGVudHJ5IGFuZCBleGl0IGZyb20gdGhlIGtlcm5lbC4gVGhlcmVmb3JlCisgKiBpdCBpcyBwb3NzaWJsZSB0byBnZXQgYSB3YXRjaHBvaW50IHRyYXAgaGVyZSBmcm9tIGluc2lkZSB0aGUga2VybmVsLgorICogSG93ZXZlciwgdGhlIGNvZGUgaW4gLi9wdHJhY2UuYyBoYXMgZW5zdXJlZCB0aGF0IHRoZSB1c2VyIGNhbgorICogb25seSBzZXQgd2F0Y2hwb2ludHMgb24gdXNlcnNwYWNlIGFkZHJlc3Nlcy4gVGhlcmVmb3JlIHRoZSBpbi1rZXJuZWwKKyAqIHdhdGNocG9pbnQgdHJhcCBjYW4gb25seSBvY2N1ciBpbiBjb2RlIHdoaWNoIGlzIHJlYWRpbmcvd3JpdGluZworICogZnJvbSB1c2VyIHNwYWNlLiBTdWNoIGNvZGUgbXVzdCBub3QgaG9sZCBrZXJuZWwgbG9ja3MgKHNpbmNlIGl0CisgKiBjYW4gZXF1YWxseSB0YWtlIGEgcGFnZSBmYXVsdCksIHRoZXJlZm9yZSBpdCBpcyBzYWZlIHRvIGNhbGwKKyAqIGZvcmNlX3NpZ19pbmZvIGV2ZW4gdGhvdWdoIHRoYXQgY2xhaW1zIGFuZCByZWxlYXNlcyBsb2Nrcy4KKyAqIAorICogQ29kZSBpbiAuL3NpZ25hbC5jIGVuc3VyZXMgdGhhdCB0aGUgZGVidWcgY29udHJvbCByZWdpc3RlcgorICogaXMgcmVzdG9yZWQgYmVmb3JlIHdlIGRlbGl2ZXIgYW55IHNpZ25hbCwgYW5kIHRoZXJlZm9yZSB0aGF0CisgKiB1c2VyIGNvZGUgcnVucyB3aXRoIHRoZSBjb3JyZWN0IGRlYnVnIGNvbnRyb2wgcmVnaXN0ZXIgZXZlbiB0aG91Z2gKKyAqIHdlIGNsZWFyIGl0IGhlcmUuCisgKgorICogQmVpbmcgY2FyZWZ1bCBoZXJlIG1lYW5zIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBiZSBhcyBjYXJlZnVsIGluIGEKKyAqIGxvdCBvZiBtb3JlIGNvbXBsaWNhdGVkIHBsYWNlcyAodGFzayBzd2l0Y2hpbmcgY2FuIGJlIGEgYml0IGxhenkKKyAqIGFib3V0IHJlc3RvcmluZyBhbGwgdGhlIGRlYnVnIHN0YXRlLCBhbmQgcHRyYWNlIGRvZXNuJ3QgaGF2ZSB0bworICogZmluZCBldmVyeSBvY2N1cnJlbmNlIG9mIHRoZSBURiBiaXQgdGhhdCBjb3VsZCBiZSBzYXZlZCBhd2F5IGV2ZW4KKyAqIGJ5IHVzZXIgY29kZSkKKyAqLworZmFzdGNhbGwgdm9pZCBkb19kZWJ1ZyhzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKK3sKKwl1bnNpZ25lZCBpbnQgY29uZGl0aW9uOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZsICUlZGI2LCUwIiA6ICI9ciIgKGNvbmRpdGlvbikpOworCisJaWYgKG5vdGlmeV9kaWUoRElFX0RFQlVHLCAiZGVidWciLCByZWdzLCBjb25kaXRpb24sIGVycm9yX2NvZGUsCisJCQkJCVNJR1RSQVApID09IE5PVElGWV9TVE9QKQorCQlyZXR1cm47CisJLyogSXQncyBzYWZlIHRvIGFsbG93IGlycSdzIGFmdGVyIERSNiBoYXMgYmVlbiBzYXZlZCAqLworCWlmIChyZWdzLT5lZmxhZ3MgJiBYODZfRUZMQUdTX0lGKQorCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwkvKiBNYXNrIG91dCBzcHVyaW91cyBkZWJ1ZyB0cmFwcyBkdWUgdG8gbGF6eSBEUjcgc2V0dGluZyAqLworCWlmIChjb25kaXRpb24gJiAoRFJfVFJBUDB8RFJfVFJBUDF8RFJfVFJBUDJ8RFJfVFJBUDMpKSB7CisJCWlmICghdHNrLT50aHJlYWQuZGVidWdyZWdbN10pCisJCQlnb3RvIGNsZWFyX2RyNzsKKwl9CisKKwlpZiAocmVncy0+ZWZsYWdzICYgVk1fTUFTSykKKwkJZ290byBkZWJ1Z192bTg2OworCisJLyogU2F2ZSBkZWJ1ZyBzdGF0dXMgcmVnaXN0ZXIgd2hlcmUgcHRyYWNlIGNhbiBzZWUgaXQgKi8KKwl0c2stPnRocmVhZC5kZWJ1Z3JlZ1s2XSA9IGNvbmRpdGlvbjsKKworCS8qCisJICogU2luZ2xlLXN0ZXBwaW5nIHRocm91Z2ggVEY6IG1ha2Ugc3VyZSB3ZSBpZ25vcmUgYW55IGV2ZW50cyBpbgorCSAqIGtlcm5lbCBzcGFjZSAoYnV0IHJlLWVuYWJsZSBURiB3aGVuIHJldHVybmluZyB0byB1c2VyIG1vZGUpLgorCSAqLworCWlmIChjb25kaXRpb24gJiBEUl9TVEVQKSB7CisJCS8qCisJCSAqIFdlIGFscmVhZHkgY2hlY2tlZCB2ODYgbW9kZSBhYm92ZSwgc28gd2UgY2FuCisJCSAqIGNoZWNrIGZvciBrZXJuZWwgbW9kZSBieSBqdXN0IGNoZWNraW5nIHRoZSBDUEwKKwkJICogb2YgQ1MuCisJCSAqLworCQlpZiAoKHJlZ3MtPnhjcyAmIDMpID09IDApCisJCQlnb3RvIGNsZWFyX1RGX3JlZW5hYmxlOworCX0KKworCS8qIE9rLCBmaW5hbGx5IHNvbWV0aGluZyB3ZSBjYW4gaGFuZGxlICovCisJc2VuZF9zaWd0cmFwKHRzaywgcmVncywgZXJyb3JfY29kZSk7CisKKwkvKiBEaXNhYmxlIGFkZGl0aW9uYWwgdHJhcHMuIFRoZXknbGwgYmUgcmUtZW5hYmxlZCB3aGVuCisJICogdGhlIHNpZ25hbCBpcyBkZWxpdmVyZWQuCisJICovCitjbGVhcl9kcjc6CisJX19hc21fXygibW92bCAlMCwlJWRiNyIKKwkJOiAvKiBubyBvdXRwdXQgKi8KKwkJOiAiciIgKDApKTsKKwlyZXR1cm47CisKK2RlYnVnX3ZtODY6CisJaGFuZGxlX3ZtODZfdHJhcCgoc3RydWN0IGtlcm5lbF92bTg2X3JlZ3MgKikgcmVncywgZXJyb3JfY29kZSwgMSk7CisJcmV0dXJuOworCitjbGVhcl9URl9yZWVuYWJsZToKKwlzZXRfdHNrX3RocmVhZF9mbGFnKHRzaywgVElGX1NJTkdMRVNURVApOworCXJlZ3MtPmVmbGFncyAmPSB+VEZfTUFTSzsKKwlyZXR1cm47Cit9CisKKy8qCisgKiBOb3RlIHRoYXQgd2UgcGxheSBhcm91bmQgd2l0aCB0aGUgJ1RTJyBiaXQgaW4gYW4gYXR0ZW1wdCB0byBnZXQKKyAqIHRoZSBjb3JyZWN0IGJlaGF2aW91ciBldmVuIGluIHRoZSBwcmVzZW5jZSBvZiB0aGUgYXN5bmNocm9ub3VzCisgKiBJUlExMyBiZWhhdmlvdXIKKyAqLwordm9pZCBtYXRoX2Vycm9yKHZvaWQgX191c2VyICplaXApCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICogdGFzazsKKwlzaWdpbmZvX3QgaW5mbzsKKwl1bnNpZ25lZCBzaG9ydCBjd2QsIHN3ZDsKKworCS8qCisJICogU2F2ZSB0aGUgaW5mbyBmb3IgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyIGFuZCBjbGVhciB0aGUgZXJyb3IuCisJICovCisJdGFzayA9IGN1cnJlbnQ7CisJc2F2ZV9pbml0X2ZwdSh0YXNrKTsKKwl0YXNrLT50aHJlYWQudHJhcF9ubyA9IDE2OworCXRhc2stPnRocmVhZC5lcnJvcl9jb2RlID0gMDsKKwlpbmZvLnNpX3NpZ25vID0gU0lHRlBFOworCWluZm8uc2lfZXJybm8gPSAwOworCWluZm8uc2lfY29kZSA9IF9fU0lfRkFVTFQ7CisJaW5mby5zaV9hZGRyID0gZWlwOworCS8qCisJICogKH5jd2QgJiBzd2QpIHdpbGwgbWFzayBvdXQgZXhjZXB0aW9ucyB0aGF0IGFyZSBub3Qgc2V0IHRvIHVubWFza2VkCisJICogc3RhdHVzLiAgMHgzZiBpcyB0aGUgZXhjZXB0aW9uIGJpdHMgaW4gdGhlc2UgcmVncywgMHgyMDAgaXMgdGhlCisJICogQzEgcmVnIHlvdSBuZWVkIGluIGNhc2Ugb2YgYSBzdGFjayBmYXVsdCwgMHgwNDAgaXMgdGhlIHN0YWNrCisJICogZmF1bHQgYml0LiAgV2Ugc2hvdWxkIG9ubHkgYmUgdGFraW5nIG9uZSBleGNlcHRpb24gYXQgYSB0aW1lLAorCSAqIHNvIGlmIHRoaXMgY29tYmluYXRpb24gZG9lc24ndCBwcm9kdWNlIGFueSBzaW5nbGUgZXhjZXB0aW9uLAorCSAqIHRoZW4gd2UgaGF2ZSBhIGJhZCBwcm9ncmFtIHRoYXQgaXNuJ3Qgc3luY3Jvbml6aW5nIGl0cyBGUFUgdXNhZ2UKKwkgKiBhbmQgaXQgd2lsbCBzdWZmZXIgdGhlIGNvbnNlcXVlbmNlcyBzaW5jZSB3ZSB3b24ndCBiZSBhYmxlIHRvCisJICogZnVsbHkgcmVwcm9kdWNlIHRoZSBjb250ZXh0IG9mIHRoZSBleGNlcHRpb24KKwkgKi8KKwljd2QgPSBnZXRfZnB1X2N3ZCh0YXNrKTsKKwlzd2QgPSBnZXRfZnB1X3N3ZCh0YXNrKTsKKwlzd2l0Y2ggKCgofmN3ZCkgJiBzd2QgJiAweDNmKSB8IChzd2QgJiAweDI0MCkpIHsKKwkJY2FzZSAweDAwMDoKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQljYXNlIDB4MDAxOiAvKiBJbnZhbGlkIE9wICovCisJCWNhc2UgMHgwNDE6IC8qIFN0YWNrIEZhdWx0ICovCisJCWNhc2UgMHgyNDE6IC8qIFN0YWNrIEZhdWx0IHwgRGlyZWN0aW9uICovCisJCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxUSU5WOworCQkJLyogU2hvdWxkIHdlIGNsZWFyIHRoZSBTRiBvciBsZXQgdXNlciBzcGFjZSBkbyBpdCA/Pz8/ICovCisJCQlicmVhazsKKwkJY2FzZSAweDAwMjogLyogRGVub3JtYWxpemUgKi8KKwkJY2FzZSAweDAxMDogLyogVW5kZXJmbG93ICovCisJCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxUVU5EOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMDQ6IC8qIFplcm8gRGl2aWRlICovCisJCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxURElWOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMDg6IC8qIE92ZXJmbG93ICovCisJCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxUT1ZGOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMjA6IC8qIFByZWNpc2lvbiAqLworCQkJaW5mby5zaV9jb2RlID0gRlBFX0ZMVFJFUzsKKwkJCWJyZWFrOworCX0KKwlmb3JjZV9zaWdfaW5mbyhTSUdGUEUsICZpbmZvLCB0YXNrKTsKK30KKworZmFzdGNhbGwgdm9pZCBkb19jb3Byb2Nlc3Nvcl9lcnJvcihzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKK3sKKwlpZ25vcmVfZnB1X2lycSA9IDE7CisJbWF0aF9lcnJvcigodm9pZCBfX3VzZXIgKilyZWdzLT5laXApOworfQorCitzdGF0aWMgdm9pZCBzaW1kX21hdGhfZXJyb3Iodm9pZCBfX3VzZXIgKmVpcCkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKiB0YXNrOworCXNpZ2luZm9fdCBpbmZvOworCXVuc2lnbmVkIHNob3J0IG14Y3NyOworCisJLyoKKwkgKiBTYXZlIHRoZSBpbmZvIGZvciB0aGUgZXhjZXB0aW9uIGhhbmRsZXIgYW5kIGNsZWFyIHRoZSBlcnJvci4KKwkgKi8KKwl0YXNrID0gY3VycmVudDsKKwlzYXZlX2luaXRfZnB1KHRhc2spOworCXRhc2stPnRocmVhZC50cmFwX25vID0gMTk7CisJdGFzay0+dGhyZWFkLmVycm9yX2NvZGUgPSAwOworCWluZm8uc2lfc2lnbm8gPSBTSUdGUEU7CisJaW5mby5zaV9lcnJubyA9IDA7CisJaW5mby5zaV9jb2RlID0gX19TSV9GQVVMVDsKKwlpbmZvLnNpX2FkZHIgPSBlaXA7CisJLyoKKwkgKiBUaGUgU0lNRCBGUFUgZXhjZXB0aW9ucyBhcmUgaGFuZGxlZCBhIGxpdHRsZSBkaWZmZXJlbnRseSwgYXMgdGhlcmUKKwkgKiBpcyBvbmx5IGEgc2luZ2xlIHN0YXR1cy9jb250cm9sIHJlZ2lzdGVyLiAgVGh1cywgdG8gZGV0ZXJtaW5lIHdoaWNoCisJICogdW5tYXNrZWQgZXhjZXB0aW9uIHdhcyBjYXVnaHQgd2UgbXVzdCBtYXNrIHRoZSBleGNlcHRpb24gbWFzayBiaXRzCisJICogYXQgMHgxZjgwLCBhbmQgdGhlbiB1c2UgdGhlc2UgdG8gbWFzayB0aGUgZXhjZXB0aW9uIGJpdHMgYXQgMHgzZi4KKwkgKi8KKwlteGNzciA9IGdldF9mcHVfbXhjc3IodGFzayk7CisJc3dpdGNoICh+KChteGNzciAmIDB4MWY4MCkgPj4gNykgJiAobXhjc3IgJiAweDNmKSkgeworCQljYXNlIDB4MDAwOgorCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCWNhc2UgMHgwMDE6IC8qIEludmFsaWQgT3AgKi8KKwkJCWluZm8uc2lfY29kZSA9IEZQRV9GTFRJTlY7CisJCQlicmVhazsKKwkJY2FzZSAweDAwMjogLyogRGVub3JtYWxpemUgKi8KKwkJY2FzZSAweDAxMDogLyogVW5kZXJmbG93ICovCisJCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxUVU5EOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMDQ6IC8qIFplcm8gRGl2aWRlICovCisJCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxURElWOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMDg6IC8qIE92ZXJmbG93ICovCisJCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxUT1ZGOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMjA6IC8qIFByZWNpc2lvbiAqLworCQkJaW5mby5zaV9jb2RlID0gRlBFX0ZMVFJFUzsKKwkJCWJyZWFrOworCX0KKwlmb3JjZV9zaWdfaW5mbyhTSUdGUEUsICZpbmZvLCB0YXNrKTsKK30KKworZmFzdGNhbGwgdm9pZCBkb19zaW1kX2NvcHJvY2Vzc29yX2Vycm9yKHN0cnVjdCBwdF9yZWdzICogcmVncywKKwkJCQkJICBsb25nIGVycm9yX2NvZGUpCit7CisJaWYgKGNwdV9oYXNfeG1tKSB7CisJCS8qIEhhbmRsZSBTSU1EIEZQVSBleGNlcHRpb25zIG9uIFBJSUkrIHByb2Nlc3NvcnMuICovCisJCWlnbm9yZV9mcHVfaXJxID0gMTsKKwkJc2ltZF9tYXRoX2Vycm9yKCh2b2lkIF9fdXNlciAqKXJlZ3MtPmVpcCk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogSGFuZGxlIHN0cmFuZ2UgY2FjaGUgZmx1c2ggZnJvbSB1c2VyIHNwYWNlIGV4Y2VwdGlvbgorCQkgKiBpbiBhbGwgb3RoZXIgY2FzZXMuICBUaGlzIGlzIHVuZG9jdW1lbnRlZCBiZWhhdmlvdXIuCisJCSAqLworCQlpZiAocmVncy0+ZWZsYWdzICYgVk1fTUFTSykgeworCQkJaGFuZGxlX3ZtODZfZmF1bHQoKHN0cnVjdCBrZXJuZWxfdm04Nl9yZWdzICopcmVncywKKwkJCQkJICBlcnJvcl9jb2RlKTsKKwkJCXJldHVybjsKKwkJfQorCQlkaWVfaWZfa2VybmVsKCJjYWNoZSBmbHVzaCBkZW5pZWQiLCByZWdzLCBlcnJvcl9jb2RlKTsKKwkJY3VycmVudC0+dGhyZWFkLnRyYXBfbm8gPSAxOTsKKwkJY3VycmVudC0+dGhyZWFkLmVycm9yX2NvZGUgPSBlcnJvcl9jb2RlOworCQlmb3JjZV9zaWcoU0lHU0VHViwgY3VycmVudCk7CisJfQorfQorCitmYXN0Y2FsbCB2b2lkIGRvX3NwdXJpb3VzX2ludGVycnVwdF9idWcoc3RydWN0IHB0X3JlZ3MgKiByZWdzLAorCQkJCQkgIGxvbmcgZXJyb3JfY29kZSkKK3sKKyNpZiAwCisJLyogTm8gbmVlZCB0byB3YXJuIGFib3V0IHRoaXMgYW55IGxvbmdlci4gKi8KKwlwcmludGsoIklnbm9yaW5nIFA2IExvY2FsIEFQSUMgU3B1cmlvdXMgSW50ZXJydXB0IEJ1Zy4uLlxuIik7CisjZW5kaWYKK30KKworZmFzdGNhbGwgdm9pZCBzZXR1cF94ODZfYm9ndXNfc3RhY2sodW5zaWduZWQgY2hhciAqIHN0aykKK3sKKwl1bnNpZ25lZCBsb25nICpzd2l0Y2gxNl9wdHIsICpzd2l0Y2gzMl9wdHI7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3M7CisJdW5zaWduZWQgbG9uZyBzdGFja190b3AsIHN0YWNrX2JvdDsKKwl1bnNpZ25lZCBzaG9ydCBpcmV0X2ZyYW1lMTZfb2ZmOworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJLyogcmVzZXJ2ZSB0aGUgc3BhY2Ugb24gMzJiaXQgc3RhY2sgZm9yIHRoZSBtYWdpYyBzd2l0Y2gxNiBwb2ludGVyICovCisJbWVtbW92ZShzdGssIHN0ayArIDgsIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpOworCXN3aXRjaDE2X3B0ciA9ICh1bnNpZ25lZCBsb25nICopKHN0ayArIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpOworCXJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKilzdGs7CisJLyogbm93IHRoZSBzd2l0Y2gzMiBvbiAxNmJpdCBzdGFjayAqLworCXN0YWNrX2JvdCA9ICh1bnNpZ25lZCBsb25nKSZwZXJfY3B1KGNwdV8xNmJpdF9zdGFjaywgY3B1KTsKKwlzdGFja190b3AgPSBzdGFja19ib3QgKwlDUFVfMTZCSVRfU1RBQ0tfU0laRTsKKwlzd2l0Y2gzMl9wdHIgPSAodW5zaWduZWQgbG9uZyAqKShzdGFja190b3AgLSA4KTsKKwlpcmV0X2ZyYW1lMTZfb2ZmID0gQ1BVXzE2QklUX1NUQUNLX1NJWkUgLSA4IC0gMjA7CisJLyogY29weSBpcmV0IGZyYW1lIG9uIDE2Yml0IHN0YWNrICovCisJbWVtY3B5KCh2b2lkICopKHN0YWNrX2JvdCArIGlyZXRfZnJhbWUxNl9vZmYpLCAmcmVncy0+ZWlwLCAyMCk7CisJLyogZmlsbCBpbiB0aGUgc3dpdGNoIHBvaW50ZXJzICovCisJc3dpdGNoMTZfcHRyWzBdID0gKHJlZ3MtPmVzcCAmIDB4ZmZmZjAwMDApIHwgaXJldF9mcmFtZTE2X29mZjsKKwlzd2l0Y2gxNl9wdHJbMV0gPSBfX0VTUEZJWF9TUzsKKwlzd2l0Y2gzMl9wdHJbMF0gPSAodW5zaWduZWQgbG9uZylzdGsgKyBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpICsKKwkJOCAtIENQVV8xNkJJVF9TVEFDS19TSVpFOworCXN3aXRjaDMyX3B0clsxXSA9IF9fS0VSTkVMX0RTOworfQorCitmYXN0Y2FsbCB1bnNpZ25lZCBjaGFyICogZml4dXBfeDg2X2JvZ3VzX3N0YWNrKHVuc2lnbmVkIHNob3J0IHNwKQoreworCXVuc2lnbmVkIGxvbmcgKnN3aXRjaDMyX3B0cjsKKwl1bnNpZ25lZCBjaGFyICpzdGFjazE2LCAqc3RhY2szMjsKKwl1bnNpZ25lZCBsb25nIHN0YWNrX3RvcCwgc3RhY2tfYm90OworCWludCBsZW47CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlzdGFja19ib3QgPSAodW5zaWduZWQgbG9uZykmcGVyX2NwdShjcHVfMTZiaXRfc3RhY2ssIGNwdSk7CisJc3RhY2tfdG9wID0gc3RhY2tfYm90ICsJQ1BVXzE2QklUX1NUQUNLX1NJWkU7CisJc3dpdGNoMzJfcHRyID0gKHVuc2lnbmVkIGxvbmcgKikoc3RhY2tfdG9wIC0gOCk7CisJLyogY29weSB0aGUgZGF0YSBmcm9tIDE2Yml0IHN0YWNrIHRvIDMyYml0IHN0YWNrICovCisJbGVuID0gQ1BVXzE2QklUX1NUQUNLX1NJWkUgLSA4IC0gc3A7CisJc3RhY2sxNiA9ICh1bnNpZ25lZCBjaGFyICopKHN0YWNrX2JvdCArIHNwKTsKKwlzdGFjazMyID0gKHVuc2lnbmVkIGNoYXIgKikKKwkJKHN3aXRjaDMyX3B0clswXSArIENQVV8xNkJJVF9TVEFDS19TSVpFIC0gOCAtIGxlbik7CisJbWVtY3B5KHN0YWNrMzIsIHN0YWNrMTYsIGxlbik7CisJcmV0dXJuIHN0YWNrMzI7Cit9CisKKy8qCisgKiAgJ21hdGhfc3RhdGVfcmVzdG9yZSgpJyBzYXZlcyB0aGUgY3VycmVudCBtYXRoIGluZm9ybWF0aW9uIGluIHRoZQorICogb2xkIG1hdGggc3RhdGUgYXJyYXksIGFuZCBnZXRzIHRoZSBuZXcgb25lcyBmcm9tIHRoZSBjdXJyZW50IHRhc2sKKyAqCisgKiBDYXJlZnVsLi4gVGhlcmUgYXJlIHByb2JsZW1zIHdpdGggSUJNLWRlc2lnbmVkIElSUTEzIGJlaGF2aW91ci4KKyAqIERvbid0IHRvdWNoIHVubGVzcyB5b3UgKnJlYWxseSoga25vdyBob3cgaXQgd29ya3MuCisgKgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCBrZXJuZWwgcHJlZW1wdGlvbiBkaXNhYmxlZCAoaW4gdGhpcyBjYXNlLAorICogbG9jYWwgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgYXQgdGhlIGNhbGwtc2l0ZSBpbiBlbnRyeS5TKS4KKyAqLworYXNtbGlua2FnZSB2b2lkIG1hdGhfc3RhdGVfcmVzdG9yZShzdHJ1Y3QgcHRfcmVncyByZWdzKQoreworCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGhyZWFkID0gY3VycmVudF90aHJlYWRfaW5mbygpOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gdGhyZWFkLT50YXNrOworCisJY2x0cygpOwkJLyogQWxsb3cgbWF0aHMgb3BzIChvciB3ZSByZWN1cnNlKSAqLworCWlmICghdHNrX3VzZWRfbWF0aCh0c2spKQorCQlpbml0X2ZwdSh0c2spOworCXJlc3RvcmVfZnB1KHRzayk7CisJdGhyZWFkLT5zdGF0dXMgfD0gVFNfVVNFREZQVTsJLyogU28gd2UgZm5zYXZlIG9uIHN3aXRjaF90bygpICovCit9CisKKyNpZm5kZWYgQ09ORklHX01BVEhfRU1VTEFUSU9OCisKK2FzbWxpbmthZ2Ugdm9pZCBtYXRoX2VtdWxhdGUobG9uZyBhcmcpCit7CisJcHJpbnRrKCJtYXRoLWVtdWxhdGlvbiBub3QgZW5hYmxlZCBhbmQgbm8gY29wcm9jZXNzb3IgZm91bmQuXG4iKTsKKwlwcmludGsoImtpbGxpbmcgJXMuXG4iLGN1cnJlbnQtPmNvbW0pOworCWZvcmNlX3NpZyhTSUdGUEUsY3VycmVudCk7CisJc2NoZWR1bGUoKTsKK30KKworI2VuZGlmIC8qIENPTkZJR19NQVRIX0VNVUxBVElPTiAqLworCisjaWZkZWYgQ09ORklHX1g4Nl9GMDBGX0JVRwordm9pZCBfX2luaXQgdHJhcF9pbml0X2YwMGZfYnVnKHZvaWQpCit7CisJX19zZXRfZml4bWFwKEZJWF9GMDBGX0lEVCwgX19wYSgmaWR0X3RhYmxlKSwgUEFHRV9LRVJORUxfUk8pOworCisJLyoKKwkgKiBVcGRhdGUgdGhlIElEVCBkZXNjcmlwdG9yIGFuZCByZWxvYWQgdGhlIElEVCBzbyB0aGF0CisJICogaXQgdXNlcyB0aGUgcmVhZC1vbmx5IG1hcHBlZCB2aXJ0dWFsIGFkZHJlc3MuCisJICovCisJaWR0X2Rlc2NyLmFkZHJlc3MgPSBmaXhfdG9fdmlydChGSVhfRjAwRl9JRFQpOworCV9fYXNtX18gX192b2xhdGlsZV9fKCJsaWR0ICUwIiA6IDogIm0iIChpZHRfZGVzY3IpKTsKK30KKyNlbmRpZgorCisjZGVmaW5lIF9zZXRfZ2F0ZShnYXRlX2FkZHIsdHlwZSxkcGwsYWRkcixzZWcpIFwKK2RvIHsgXAorICBpbnQgX19kMCwgX19kMTsgXAorICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdncgJSVkeCwlJWF4XG5cdCIgXAorCSJtb3Z3ICU0LCUlZHhcblx0IiBcCisJIm1vdmwgJSVlYXgsJTBcblx0IiBcCisJIm1vdmwgJSVlZHgsJTEiIFwKKwk6Ij1tIiAoKigobG9uZyAqKSAoZ2F0ZV9hZGRyKSkpLCBcCisJICI9bSIgKCooMSsobG9uZyAqKSAoZ2F0ZV9hZGRyKSkpLCAiPSZhIiAoX19kMCksICI9JmQiIChfX2QxKSBcCisJOiJpIiAoKHNob3J0KSAoMHg4MDAwKyhkcGw8PDEzKSsodHlwZTw8OCkpKSwgXAorCSAiMyIgKChjaGFyICopIChhZGRyKSksIjIiICgoc2VnKSA8PCAxNikpOyBcCit9IHdoaWxlICgwKQorCisKKy8qCisgKiBUaGlzIG5lZWRzIHRvIHVzZSAnaWR0X3RhYmxlJyByYXRoZXIgdGhhbiAnaWR0JywgYW5kCisgKiB0aHVzIHVzZSB0aGUgX25vbm1hcHBlZF8gdmVyc2lvbiBvZiB0aGUgSURULCBhcyB0aGUKKyAqIFBlbnRpdW0gRjAgMEYgYnVnZml4IGNhbiBoYXZlIHJlc3VsdGVkIGluIHRoZSBtYXBwZWQKKyAqIElEVCBiZWluZyB3cml0ZS1wcm90ZWN0ZWQuCisgKi8KK3ZvaWQgc2V0X2ludHJfZ2F0ZSh1bnNpZ25lZCBpbnQgbiwgdm9pZCAqYWRkcikKK3sKKwlfc2V0X2dhdGUoaWR0X3RhYmxlK24sMTQsMCxhZGRyLF9fS0VSTkVMX0NTKTsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBzZXRzIHVwIGFuIGludGVycnVwdCBnYXRlIGF0IGRpcmVjdG9yeSBwcml2aWxlZ2UgbGV2ZWwgMy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNldF9zeXN0ZW1faW50cl9nYXRlKHVuc2lnbmVkIGludCBuLCB2b2lkICphZGRyKQoreworCV9zZXRfZ2F0ZShpZHRfdGFibGUrbiwgMTQsIDMsIGFkZHIsIF9fS0VSTkVMX0NTKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHNldF90cmFwX2dhdGUodW5zaWduZWQgaW50IG4sIHZvaWQgKmFkZHIpCit7CisJX3NldF9nYXRlKGlkdF90YWJsZStuLDE1LDAsYWRkcixfX0tFUk5FTF9DUyk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzZXRfc3lzdGVtX2dhdGUodW5zaWduZWQgaW50IG4sIHZvaWQgKmFkZHIpCit7CisJX3NldF9nYXRlKGlkdF90YWJsZStuLDE1LDMsYWRkcixfX0tFUk5FTF9DUyk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzZXRfdGFza19nYXRlKHVuc2lnbmVkIGludCBuLCB1bnNpZ25lZCBpbnQgZ2R0X2VudHJ5KQoreworCV9zZXRfZ2F0ZShpZHRfdGFibGUrbiw1LDAsMCwoZ2R0X2VudHJ5PDwzKSk7Cit9CisKKwordm9pZCBfX2luaXQgdHJhcF9pbml0KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0VJU0EKKwl2b2lkIF9faW9tZW0gKnAgPSBpb3JlbWFwKDB4MEZGRkQ5LCA0KTsKKwlpZiAocmVhZGwocCkgPT0gJ0UnKygnSSc8PDgpKygnUyc8PDE2KSsoJ0EnPDwyNCkpIHsKKwkJRUlTQV9idXMgPSAxOworCX0KKwlpb3VubWFwKHApOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKKwlpbml0X2FwaWNfbWFwcGluZ3MoKTsKKyNlbmRpZgorCisJc2V0X3RyYXBfZ2F0ZSgwLCZkaXZpZGVfZXJyb3IpOworCXNldF9pbnRyX2dhdGUoMSwmZGVidWcpOworCXNldF9pbnRyX2dhdGUoMiwmbm1pKTsKKwlzZXRfc3lzdGVtX2ludHJfZ2F0ZSgzLCAmaW50Myk7IC8qIGludDMtNSBjYW4gYmUgY2FsbGVkIGZyb20gYWxsICovCisJc2V0X3N5c3RlbV9nYXRlKDQsJm92ZXJmbG93KTsKKwlzZXRfc3lzdGVtX2dhdGUoNSwmYm91bmRzKTsKKwlzZXRfdHJhcF9nYXRlKDYsJmludmFsaWRfb3ApOworCXNldF90cmFwX2dhdGUoNywmZGV2aWNlX25vdF9hdmFpbGFibGUpOworCXNldF90YXNrX2dhdGUoOCxHRFRfRU5UUllfRE9VQkxFRkFVTFRfVFNTKTsKKwlzZXRfdHJhcF9nYXRlKDksJmNvcHJvY2Vzc29yX3NlZ21lbnRfb3ZlcnJ1bik7CisJc2V0X3RyYXBfZ2F0ZSgxMCwmaW52YWxpZF9UU1MpOworCXNldF90cmFwX2dhdGUoMTEsJnNlZ21lbnRfbm90X3ByZXNlbnQpOworCXNldF90cmFwX2dhdGUoMTIsJnN0YWNrX3NlZ21lbnQpOworCXNldF90cmFwX2dhdGUoMTMsJmdlbmVyYWxfcHJvdGVjdGlvbik7CisJc2V0X2ludHJfZ2F0ZSgxNCwmcGFnZV9mYXVsdCk7CisJc2V0X3RyYXBfZ2F0ZSgxNSwmc3B1cmlvdXNfaW50ZXJydXB0X2J1Zyk7CisJc2V0X3RyYXBfZ2F0ZSgxNiwmY29wcm9jZXNzb3JfZXJyb3IpOworCXNldF90cmFwX2dhdGUoMTcsJmFsaWdubWVudF9jaGVjayk7CisjaWZkZWYgQ09ORklHX1g4Nl9NQ0UKKwlzZXRfdHJhcF9nYXRlKDE4LCZtYWNoaW5lX2NoZWNrKTsKKyNlbmRpZgorCXNldF90cmFwX2dhdGUoMTksJnNpbWRfY29wcm9jZXNzb3JfZXJyb3IpOworCisJc2V0X3N5c3RlbV9nYXRlKFNZU0NBTExfVkVDVE9SLCZzeXN0ZW1fY2FsbCk7CisKKwkvKgorCSAqIFNob3VsZCBiZSBhIGJhcnJpZXIgZm9yIGFueSBleHRlcm5hbCBDUFUgc3RhdGUuCisJICovCisJY3B1X2luaXQoKTsKKworCXRyYXBfaW5pdF9ob29rKCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGtzdGFja19zZXR1cChjaGFyICpzKQoreworCWtzdGFja19kZXB0aF90b19wcmludCA9IHNpbXBsZV9zdHJ0b3VsKHMsIE5VTEwsIDApOworCXJldHVybiAwOworfQorX19zZXR1cCgia3N0YWNrPSIsIGtzdGFja19zZXR1cCk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3ZtODYuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdm04Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmM2Q1MmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3ZtODYuYwpAQCAtMCwwICsxLDgwNCBAQAorLyoKKyAqICBsaW51eC9rZXJuZWwvdm04Ni5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NCAgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgMjkgZGVjIDIwMDEgLSBGaXhlZCBvb3BzZXMgY2F1c2VkIGJ5IHVuY2hlY2tlZCBhY2Nlc3MgdG8gdGhlIHZtODYKKyAqICAgICAgICAgICAgICAgIHN0YWNrIC0gTWFuZnJlZCBTcHJhdWwgPG1hbmZyZWRzQGNvbG9yZnVsbGlmZS5jb20+CisgKgorICogIDIyIG1hciAyMDAyIC0gTWFuZnJlZCBkZXRlY3RlZCB0aGUgc3RhY2tmYXVsdHMsIGJ1dCBkaWRuJ3QgaGFuZGxlCisgKiAgICAgICAgICAgICAgICB0aGVtIGNvcnJlY3RseS4gTm93IHRoZSBlbXVsYXRpb24gd2lsbCBiZSBpbiBhCisgKiAgICAgICAgICAgICAgICBjb25zaXN0ZW50IHN0YXRlIGFmdGVyIHN0YWNrZmF1bHRzIC0gS2FzcGVyIER1cG9udAorICogICAgICAgICAgICAgICAgPGthc3BlcmRAZGFpbWkuYXUuZGs+CisgKgorICogIDIyIG1hciAyMDAyIC0gQWRkZWQgbWlzc2luZyBjbGVhcl9JRiBpbiBzZXRfdmZsYWdzXyogS2FzcGVyIER1cG9udAorICogICAgICAgICAgICAgICAgPGthc3BlcmRAZGFpbWkuYXUuZGs+CisgKgorICogID8/ID8/PyAyMDAyIC0gRml4ZWQgcHJlbWF0dXJlIHJldHVybnMgZnJvbSBoYW5kbGVfdm04Nl9mYXVsdAorICogICAgICAgICAgICAgICAgY2F1c2VkIGJ5IEthc3BlciBEdXBvbnQncyBjaGFuZ2VzIC0gU3RhcyBTZXJnZWV2CisgKgorICogICA0IGFwciAyMDAyIC0gRml4ZWQgQ0hFQ0tfSUZfSU5fVFJBUCBicm9rZW4gYnkgU3RhcycgY2hhbmdlcy4KKyAqICAgICAgICAgICAgICAgIEthc3BlciBEdXBvbnQgPGthc3BlcmRAZGFpbWkuYXUuZGs+CisgKgorICogICA5IGFwciAyMDAyIC0gQ2hhbmdlZCBzeW50YXggb2YgbWFjcm9zIGluIGhhbmRsZV92bTg2X2ZhdWx0LgorICogICAgICAgICAgICAgICAgS2FzcGVyIER1cG9udCA8a2FzcGVyZEBkYWltaS5hdS5kaz4KKyAqCisgKiAgIDkgYXByIDIwMDIgLSBDaGFuZ2VkIHN0YWNrIGFjY2VzcyBtYWNyb3MgdG8ganVtcCB0byBhIGxhYmVsCisgKiAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIHJldHVybmluZyB0byB1c2Vyc3BhY2UuIFRoaXMgc2ltcGxpZmllcworICogICAgICAgICAgICAgICAgZG9faW50LCBhbmQgaXMgbmVlZGVkIGJ5IGhhbmRsZV92bTZfZmF1bHQuIEthc3BlcgorICogICAgICAgICAgICAgICAgRHVwb250IDxrYXNwZXJkQGRhaW1pLmF1LmRrPgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworLyoKKyAqIEtub3duIHByb2JsZW1zOgorICoKKyAqIEludGVycnVwdCBoYW5kbGluZyBpcyBub3QgZ3VhcmFudGVlZDoKKyAqIC0gYSByZWFsIHg4NiB3aWxsIGRpc2FibGUgYWxsIGludGVycnVwdHMgZm9yIG9uZSBpbnN0cnVjdGlvbgorICogICBhZnRlciBhICJtb3Ygc3MseHgiIHRvIG1ha2Ugc3RhY2sgaGFuZGxpbmcgYXRvbWljIGV2ZW4gd2l0aG91dAorICogICB0aGUgJ2xzcycgaW5zdHJ1Y3Rpb24uIFdlIGNhbid0IGd1YXJhbnRlZSB0aGlzIGluIHY4NiBtb2RlLAorICogICBhcyB0aGUgbmV4dCBpbnN0cnVjdGlvbiBtaWdodCByZXN1bHQgaW4gYSBwYWdlIGZhdWx0IG9yIHNpbWlsYXIuCisgKiAtIGEgcmVhbCB4ODYgd2lsbCBoYXZlIGludGVycnVwdHMgZGlzYWJsZWQgZm9yIG9uZSBpbnN0cnVjdGlvbgorICogICBwYXN0IHRoZSAnc3RpJyB0aGF0IGVuYWJsZXMgdGhlbS4gV2UgZG9uJ3QgYm90aGVyIHdpdGggYWxsIHRoZQorICogICBkZXRhaWxzIHlldC4KKyAqCisgKiBMZXQncyBob3BlIHRoZXNlIHByb2JsZW1zIGRvIG5vdCBhY3R1YWxseSBtYXR0ZXIgZm9yIGFueXRoaW5nLgorICovCisKKworI2RlZmluZSBLVk04NgkoKHN0cnVjdCBrZXJuZWxfdm04Nl9zdHJ1Y3QgKilyZWdzKQorI2RlZmluZSBWTVBJIAlLVk04Ni0+dm04NnBsdXMKKworCisvKgorICogOC0gYW5kIDE2LWJpdCByZWdpc3RlciBkZWZpbmVzLi4KKyAqLworI2RlZmluZSBBTChyZWdzKQkoKCh1bnNpZ25lZCBjaGFyICopJigocmVncyktPmVheCkpWzBdKQorI2RlZmluZSBBSChyZWdzKQkoKCh1bnNpZ25lZCBjaGFyICopJigocmVncyktPmVheCkpWzFdKQorI2RlZmluZSBJUChyZWdzKQkoKih1bnNpZ25lZCBzaG9ydCAqKSYoKHJlZ3MpLT5laXApKQorI2RlZmluZSBTUChyZWdzKQkoKih1bnNpZ25lZCBzaG9ydCAqKSYoKHJlZ3MpLT5lc3ApKQorCisvKgorICogdmlydHVhbCBmbGFncyAoMTYgYW5kIDMyLWJpdCB2ZXJzaW9ucykKKyAqLworI2RlZmluZSBWRkxBR1MJKCoodW5zaWduZWQgc2hvcnQgKikmKGN1cnJlbnQtPnRocmVhZC52ODZmbGFncykpCisjZGVmaW5lIFZFRkxBR1MJKGN1cnJlbnQtPnRocmVhZC52ODZmbGFncykKKworI2RlZmluZSBzZXRfZmxhZ3MoWCxuZXcsbWFzaykgXAorKChYKSA9ICgoWCkgJiB+KG1hc2spKSB8ICgobmV3KSAmIChtYXNrKSkpCisKKyNkZWZpbmUgU0FGRV9NQVNLCSgweERENSkKKyNkZWZpbmUgUkVUVVJOX01BU0sJKDB4REZGKQorCisjZGVmaW5lIFZNODZfUkVHU19QQVJUMiBvcmlnX2VheAorI2RlZmluZSBWTTg2X1JFR1NfU0laRTEgXAorICAgICAgICAoICh1bnNpZ25lZCkoICYgKCgoc3RydWN0IGtlcm5lbF92bTg2X3JlZ3MgKikwKS0+Vk04Nl9SRUdTX1BBUlQyKSApICkKKyNkZWZpbmUgVk04Nl9SRUdTX1NJWkUyIChzaXplb2Yoc3RydWN0IGtlcm5lbF92bTg2X3JlZ3MpIC0gVk04Nl9SRUdTX1NJWkUxKQorCitzdHJ1Y3QgcHRfcmVncyAqIEZBU1RDQUxMKHNhdmVfdjg2X3N0YXRlKHN0cnVjdCBrZXJuZWxfdm04Nl9yZWdzICogcmVncykpOworc3RydWN0IHB0X3JlZ3MgKiBmYXN0Y2FsbCBzYXZlX3Y4Nl9zdGF0ZShzdHJ1Y3Qga2VybmVsX3ZtODZfcmVncyAqIHJlZ3MpCit7CisJc3RydWN0IHRzc19zdHJ1Y3QgKnRzczsKKwlzdHJ1Y3QgcHRfcmVncyAqcmV0OworCXVuc2lnbmVkIGxvbmcgdG1wOworCisJLyoKKwkgKiBUaGlzIGdldHMgY2FsbGVkIGZyb20gZW50cnkuUyB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQsIGJ1dAorCSAqIGZyb20gcHJvY2VzcyBjb250ZXh0LiBFbmFibGUgaW50ZXJydXB0cyBoZXJlLCBiZWZvcmUgdHJ5aW5nCisJICogdG8gYWNjZXNzIHVzZXIgc3BhY2UuCisJICovCisJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJaWYgKCFjdXJyZW50LT50aHJlYWQudm04Nl9pbmZvKSB7CisJCXByaW50aygibm8gdm04Nl9pbmZvOiBCQURcbiIpOworCQlkb19leGl0KFNJR1NFR1YpOworCX0KKwlzZXRfZmxhZ3MocmVncy0+ZWZsYWdzLCBWRUZMQUdTLCBWSUZfTUFTSyB8IGN1cnJlbnQtPnRocmVhZC52ODZtYXNrKTsKKwl0bXAgPSBjb3B5X3RvX3VzZXIoJmN1cnJlbnQtPnRocmVhZC52bTg2X2luZm8tPnJlZ3MscmVncywgVk04Nl9SRUdTX1NJWkUxKTsKKwl0bXAgKz0gY29weV90b191c2VyKCZjdXJyZW50LT50aHJlYWQudm04Nl9pbmZvLT5yZWdzLlZNODZfUkVHU19QQVJUMiwKKwkJJnJlZ3MtPlZNODZfUkVHU19QQVJUMiwgVk04Nl9SRUdTX1NJWkUyKTsKKwl0bXAgKz0gcHV0X3VzZXIoY3VycmVudC0+dGhyZWFkLnNjcmVlbl9iaXRtYXAsJmN1cnJlbnQtPnRocmVhZC52bTg2X2luZm8tPnNjcmVlbl9iaXRtYXApOworCWlmICh0bXApIHsKKwkJcHJpbnRrKCJ2bTg2OiBjb3VsZCBub3QgYWNjZXNzIHVzZXJzcGFjZSB2bTg2X2luZm9cbiIpOworCQlkb19leGl0KFNJR1NFR1YpOworCX0KKworCXRzcyA9ICZwZXJfY3B1KGluaXRfdHNzLCBnZXRfY3B1KCkpOworCWN1cnJlbnQtPnRocmVhZC5lc3AwID0gY3VycmVudC0+dGhyZWFkLnNhdmVkX2VzcDA7CisJY3VycmVudC0+dGhyZWFkLnN5c2VudGVyX2NzID0gX19LRVJORUxfQ1M7CisJbG9hZF9lc3AwKHRzcywgJmN1cnJlbnQtPnRocmVhZCk7CisJY3VycmVudC0+dGhyZWFkLnNhdmVkX2VzcDAgPSAwOworCXB1dF9jcHUoKTsKKworCWxvYWRzZWdtZW50KGZzLCBjdXJyZW50LT50aHJlYWQuc2F2ZWRfZnMpOworCWxvYWRzZWdtZW50KGdzLCBjdXJyZW50LT50aHJlYWQuc2F2ZWRfZ3MpOworCXJldCA9IEtWTTg2LT5yZWdzMzI7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbWFya19zY3JlZW5fcmRvbmx5KHN0cnVjdCB0YXNrX3N0cnVjdCAqIHRzaykKK3sKKwlwZ2RfdCAqcGdkOworCXB1ZF90ICpwdWQ7CisJcG1kX3QgKnBtZDsKKwlwdGVfdCAqcHRlLCAqbWFwcGVkOworCWludCBpOworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisJc3Bpbl9sb2NrKCZ0c2stPm1tLT5wYWdlX3RhYmxlX2xvY2spOworCXBnZCA9IHBnZF9vZmZzZXQodHNrLT5tbSwgMHhBMDAwMCk7CisJaWYgKHBnZF9ub25lX29yX2NsZWFyX2JhZChwZ2QpKQorCQlnb3RvIG91dDsKKwlwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgMHhBMDAwMCk7CisJaWYgKHB1ZF9ub25lX29yX2NsZWFyX2JhZChwdWQpKQorCQlnb3RvIG91dDsKKwlwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgMHhBMDAwMCk7CisJaWYgKHBtZF9ub25lX29yX2NsZWFyX2JhZChwbWQpKQorCQlnb3RvIG91dDsKKwlwdGUgPSBtYXBwZWQgPSBwdGVfb2Zmc2V0X21hcChwbWQsIDB4QTAwMDApOworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCWlmIChwdGVfcHJlc2VudCgqcHRlKSkKKwkJCXNldF9wdGUocHRlLCBwdGVfd3Jwcm90ZWN0KCpwdGUpKTsKKwkJcHRlKys7CisJfQorCXB0ZV91bm1hcChtYXBwZWQpOworb3V0OgorCXNwaW5fdW5sb2NrKCZ0c2stPm1tLT5wYWdlX3RhYmxlX2xvY2spOworCXByZWVtcHRfZW5hYmxlKCk7CisJZmx1c2hfdGxiKCk7Cit9CisKKworCitzdGF0aWMgaW50IGRvX3ZtODZfaXJxX2hhbmRsaW5nKGludCBzdWJmdW5jdGlvbiwgaW50IGlycW51bWJlcik7CitzdGF0aWMgdm9pZCBkb19zeXNfdm04NihzdHJ1Y3Qga2VybmVsX3ZtODZfc3RydWN0ICppbmZvLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7CisKK2FzbWxpbmthZ2UgaW50IHN5c192bTg2b2xkKHN0cnVjdCBwdF9yZWdzIHJlZ3MpCit7CisJc3RydWN0IHZtODZfc3RydWN0IF9fdXNlciAqdjg2ID0gKHN0cnVjdCB2bTg2X3N0cnVjdCBfX3VzZXIgKilyZWdzLmVieDsKKwlzdHJ1Y3Qga2VybmVsX3ZtODZfc3RydWN0IGluZm87IC8qIGRlY2xhcmUgdGhpcyBfb24gdG9wXywKKwkJCQkJICogdGhpcyBhdm9pZHMgd2FzdGluZyBvZiBzdGFjayBzcGFjZS4KKwkJCQkJICogVGhpcyByZW1haW5zIG9uIHRoZSBzdGFjayB1bnRpbCB3ZQorCQkJCQkgKiByZXR1cm4gdG8gMzIgYml0IHVzZXIgc3BhY2UuCisJCQkJCSAqLworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOworCWludCB0bXAsIHJldCA9IC1FUEVSTTsKKworCXRzayA9IGN1cnJlbnQ7CisJaWYgKHRzay0+dGhyZWFkLnNhdmVkX2VzcDApCisJCWdvdG8gb3V0OworCXRtcCAgPSBjb3B5X2Zyb21fdXNlcigmaW5mbywgdjg2LCBWTTg2X1JFR1NfU0laRTEpOworCXRtcCArPSBjb3B5X2Zyb21fdXNlcigmaW5mby5yZWdzLlZNODZfUkVHU19QQVJUMiwgJnY4Ni0+cmVncy5WTTg2X1JFR1NfUEFSVDIsCisJCShsb25nKSZpbmZvLnZtODZwbHVzIC0gKGxvbmcpJmluZm8ucmVncy5WTTg2X1JFR1NfUEFSVDIpOworCXJldCA9IC1FRkFVTFQ7CisJaWYgKHRtcCkKKwkJZ290byBvdXQ7CisJbWVtc2V0KCZpbmZvLnZtODZwbHVzLCAwLCAoaW50KSZpbmZvLnJlZ3MzMiAtIChpbnQpJmluZm8udm04NnBsdXMpOworCWluZm8ucmVnczMyID0gJnJlZ3M7CisJdHNrLT50aHJlYWQudm04Nl9pbmZvID0gdjg2OworCWRvX3N5c192bTg2KCZpbmZvLCB0c2spOworCXJldCA9IDA7CS8qIHdlIG5ldmVyIHJldHVybiBoZXJlICovCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworCithc21saW5rYWdlIGludCBzeXNfdm04NihzdHJ1Y3QgcHRfcmVncyByZWdzKQoreworCXN0cnVjdCBrZXJuZWxfdm04Nl9zdHJ1Y3QgaW5mbzsgLyogZGVjbGFyZSB0aGlzIF9vbiB0b3BfLAorCQkJCQkgKiB0aGlzIGF2b2lkcyB3YXN0aW5nIG9mIHN0YWNrIHNwYWNlLgorCQkJCQkgKiBUaGlzIHJlbWFpbnMgb24gdGhlIHN0YWNrIHVudGlsIHdlCisJCQkJCSAqIHJldHVybiB0byAzMiBiaXQgdXNlciBzcGFjZS4KKwkJCQkJICovCisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CisJaW50IHRtcCwgcmV0OworCXN0cnVjdCB2bTg2cGx1c19zdHJ1Y3QgX191c2VyICp2ODY7CisKKwl0c2sgPSBjdXJyZW50OworCXN3aXRjaCAocmVncy5lYngpIHsKKwkJY2FzZSBWTTg2X1JFUVVFU1RfSVJROgorCQljYXNlIFZNODZfRlJFRV9JUlE6CisJCWNhc2UgVk04Nl9HRVRfSVJRX0JJVFM6CisJCWNhc2UgVk04Nl9HRVRfQU5EX1JFU0VUX0lSUToKKwkJCXJldCA9IGRvX3ZtODZfaXJxX2hhbmRsaW5nKHJlZ3MuZWJ4LCAoaW50KXJlZ3MuZWN4KTsKKwkJCWdvdG8gb3V0OworCQljYXNlIFZNODZfUExVU19JTlNUQUxMX0NIRUNLOgorCQkJLyogTk9URTogb24gb2xkIHZtODYgc3R1ZmYgdGhpcyB3aWxsIHJldHVybiB0aGUgZXJyb3IKKwkJCSAgIGZyb20gdmVyaWZ5X2FyZWEoKSwgYmVjYXVzZSB0aGUgc3ViZnVuY3Rpb24gaXMKKwkJCSAgIGludGVycHJldGVkIGFzIChpbnZhbGlkKSBhZGRyZXNzIHRvIHZtODZfc3RydWN0LgorCQkJICAgU28gdGhlIGluc3RhbGxhdGlvbiBjaGVjayB3b3Jrcy4KKwkJCSAqLworCQkJcmV0ID0gMDsKKwkJCWdvdG8gb3V0OworCX0KKworCS8qIHdlIGNvbWUgaGVyZSBvbmx5IGZvciBmdW5jdGlvbnMgVk04Nl9FTlRFUiwgVk04Nl9FTlRFUl9OT19CWVBBU1MgKi8KKwlyZXQgPSAtRVBFUk07CisJaWYgKHRzay0+dGhyZWFkLnNhdmVkX2VzcDApCisJCWdvdG8gb3V0OworCXY4NiA9IChzdHJ1Y3Qgdm04NnBsdXNfc3RydWN0IF9fdXNlciAqKXJlZ3MuZWN4OworCXRtcCAgPSBjb3B5X2Zyb21fdXNlcigmaW5mbywgdjg2LCBWTTg2X1JFR1NfU0laRTEpOworCXRtcCArPSBjb3B5X2Zyb21fdXNlcigmaW5mby5yZWdzLlZNODZfUkVHU19QQVJUMiwgJnY4Ni0+cmVncy5WTTg2X1JFR1NfUEFSVDIsCisJCShsb25nKSZpbmZvLnJlZ3MzMiAtIChsb25nKSZpbmZvLnJlZ3MuVk04Nl9SRUdTX1BBUlQyKTsKKwlyZXQgPSAtRUZBVUxUOworCWlmICh0bXApCisJCWdvdG8gb3V0OworCWluZm8ucmVnczMyID0gJnJlZ3M7CisJaW5mby52bTg2cGx1cy5pc192bTg2cHVzID0gMTsKKwl0c2stPnRocmVhZC52bTg2X2luZm8gPSAoc3RydWN0IHZtODZfc3RydWN0IF9fdXNlciAqKXY4NjsKKwlkb19zeXNfdm04NigmaW5mbywgdHNrKTsKKwlyZXQgPSAwOwkvKiB3ZSBuZXZlciByZXR1cm4gaGVyZSAqLworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHZvaWQgZG9fc3lzX3ZtODYoc3RydWN0IGtlcm5lbF92bTg2X3N0cnVjdCAqaW5mbywgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJc3RydWN0IHRzc19zdHJ1Y3QgKnRzczsKKy8qCisgKiBtYWtlIHN1cmUgdGhlIHZtODYoKSBzeXN0ZW0gY2FsbCBkb2Vzbid0IHRyeSB0byBkbyBhbnl0aGluZyBzaWxseQorICovCisJaW5mby0+cmVncy5fX251bGxfZHMgPSAwOworCWluZm8tPnJlZ3MuX19udWxsX2VzID0gMDsKKworLyogd2UgYXJlIGNsZWFyaW5nIGZzLGdzIGxhdGVyIGp1c3QgYmVmb3JlICJqbXAgcmVzdW1lX3VzZXJzcGFjZSIsCisgKiBiZWNhdXNlIHN0YXJ0aW5nIHdpdGggTGludXggMi4xLnggdGhleSBhcmVuJ3Qgbm8gbG9uZ2VyIHNhdmVkL3Jlc3RvcmVkCisgKi8KKworLyoKKyAqIFRoZSBlZmxhZ3MgcmVnaXN0ZXIgaXMgYWxzbyBzcGVjaWFsOiB3ZSBjYW5ub3QgdHJ1c3QgdGhhdCB0aGUgdXNlcgorICogaGFzIHNldCBpdCB1cCBzYWZlbHksIHNvIHRoaXMgbWFrZXMgc3VyZSBpbnRlcnJ1cHQgZXRjIGZsYWdzIGFyZQorICogaW5oZXJpdGVkIGZyb20gcHJvdGVjdGVkIG1vZGUuCisgKi8KKyAJVkVGTEFHUyA9IGluZm8tPnJlZ3MuZWZsYWdzOworCWluZm8tPnJlZ3MuZWZsYWdzICY9IFNBRkVfTUFTSzsKKwlpbmZvLT5yZWdzLmVmbGFncyB8PSBpbmZvLT5yZWdzMzItPmVmbGFncyAmIH5TQUZFX01BU0s7CisJaW5mby0+cmVncy5lZmxhZ3MgfD0gVk1fTUFTSzsKKworCXN3aXRjaCAoaW5mby0+Y3B1X3R5cGUpIHsKKwkJY2FzZSBDUFVfMjg2OgorCQkJdHNrLT50aHJlYWQudjg2bWFzayA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBDUFVfMzg2OgorCQkJdHNrLT50aHJlYWQudjg2bWFzayA9IE5UX01BU0sgfCBJT1BMX01BU0s7CisJCQlicmVhazsKKwkJY2FzZSBDUFVfNDg2OgorCQkJdHNrLT50aHJlYWQudjg2bWFzayA9IEFDX01BU0sgfCBOVF9NQVNLIHwgSU9QTF9NQVNLOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl0c2stPnRocmVhZC52ODZtYXNrID0gSURfTUFTSyB8IEFDX01BU0sgfCBOVF9NQVNLIHwgSU9QTF9NQVNLOworCQkJYnJlYWs7CisJfQorCisvKgorICogU2F2ZSBvbGQgc3RhdGUsIHNldCBkZWZhdWx0IHJldHVybiB2YWx1ZSAoJWVheCkgdG8gMAorICovCisJaW5mby0+cmVnczMyLT5lYXggPSAwOworCXRzay0+dGhyZWFkLnNhdmVkX2VzcDAgPSB0c2stPnRocmVhZC5lc3AwOworCWFzbSB2b2xhdGlsZSgibW92bCAlJWZzLCUwIjoiPW0iICh0c2stPnRocmVhZC5zYXZlZF9mcykpOworCWFzbSB2b2xhdGlsZSgibW92bCAlJWdzLCUwIjoiPW0iICh0c2stPnRocmVhZC5zYXZlZF9ncykpOworCisJdHNzID0gJnBlcl9jcHUoaW5pdF90c3MsIGdldF9jcHUoKSk7CisJdHNrLT50aHJlYWQuZXNwMCA9ICh1bnNpZ25lZCBsb25nKSAmaW5mby0+Vk04Nl9UU1NfRVNQMDsKKwlpZiAoY3B1X2hhc19zZXApCisJCXRzay0+dGhyZWFkLnN5c2VudGVyX2NzID0gMDsKKwlsb2FkX2VzcDAodHNzLCAmdHNrLT50aHJlYWQpOworCXB1dF9jcHUoKTsKKworCXRzay0+dGhyZWFkLnNjcmVlbl9iaXRtYXAgPSBpbmZvLT5zY3JlZW5fYml0bWFwOworCWlmIChpbmZvLT5mbGFncyAmIFZNODZfU0NSRUVOX0JJVE1BUCkKKwkJbWFya19zY3JlZW5fcmRvbmx5KHRzayk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSJ4b3JsICUlZWF4LCUlZWF4OyBtb3ZsICUlZWF4LCUlZnM7IG1vdmwgJSVlYXgsJSVnc1xuXHQiCisJCSJtb3ZsICUwLCUlZXNwXG5cdCIKKwkJIm1vdmwgJTEsJSVlYnBcblx0IgorCQkiam1wIHJlc3VtZV91c2Vyc3BhY2UiCisJCTogLyogbm8gb3V0cHV0cyAqLworCQk6InIiICgmaW5mby0+cmVncyksICJyIiAodHNrLT50aHJlYWRfaW5mbykgOiAiYXgiKTsKKwkvKiB3ZSBuZXZlciByZXR1cm4gaGVyZSAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmV0dXJuX3RvXzMyYml0KHN0cnVjdCBrZXJuZWxfdm04Nl9yZWdzICogcmVnczE2LCBpbnQgcmV0dmFsKQoreworCXN0cnVjdCBwdF9yZWdzICogcmVnczMyOworCisJcmVnczMyID0gc2F2ZV92ODZfc3RhdGUocmVnczE2KTsKKwlyZWdzMzItPmVheCA9IHJldHZhbDsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92bCAlMCwlJWVzcFxuXHQiCisJCSJtb3ZsICUxLCUlZWJwXG5cdCIKKwkJImptcCByZXN1bWVfdXNlcnNwYWNlIgorCQk6IDogInIiIChyZWdzMzIpLCAiciIgKGN1cnJlbnRfdGhyZWFkX2luZm8oKSkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X0lGKHN0cnVjdCBrZXJuZWxfdm04Nl9yZWdzICogcmVncykKK3sKKwlWRUZMQUdTIHw9IFZJRl9NQVNLOworCWlmIChWRUZMQUdTICYgVklQX01BU0spCisJCXJldHVybl90b18zMmJpdChyZWdzLCBWTTg2X1NUSSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9JRihzdHJ1Y3Qga2VybmVsX3ZtODZfcmVncyAqIHJlZ3MpCit7CisJVkVGTEFHUyAmPSB+VklGX01BU0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9URihzdHJ1Y3Qga2VybmVsX3ZtODZfcmVncyAqIHJlZ3MpCit7CisJcmVncy0+ZWZsYWdzICY9IH5URl9NQVNLOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfQUMoc3RydWN0IGtlcm5lbF92bTg2X3JlZ3MgKiByZWdzKQoreworCXJlZ3MtPmVmbGFncyAmPSB+QUNfTUFTSzsKK30KKworLyogSXQgaXMgY29ycmVjdCB0byBjYWxsIHNldF9JRihyZWdzKSBmcm9tIHRoZSBzZXRfdmZsYWdzXyoKKyAqIGZ1bmN0aW9ucy4gSG93ZXZlciBzb21lb25lIGZvcmdvdCB0byBjYWxsIGNsZWFyX0lGKHJlZ3MpCisgKiBpbiB0aGUgb3Bwb3NpdGUgY2FzZS4KKyAqIEFmdGVyIHRoZSBjb21tYW5kIHNlcXVlbmNlIENMSSBQVVNIRiBTVEkgUE9QRiB5b3Ugc2hvdWxkCisgKiBlbmQgdXAgd2l0aCBpbnRlcnJ1cHMgZGlzYWJsZWQsIGJ1dCB5b3UgZW5kZWQgdXAgd2l0aAorICogaW50ZXJydXB0cyBlbmFibGVkLgorICogICggSSB3YXMgdGVzdGluZyBteSBvd24gY2hhbmdlcywgYnV0IHRoZSBvbmx5IGJ1ZyBJCisgKiAgICBjb3VsZCBmaW5kIHdhcyBpbiBhIGZ1bmN0aW9uIEkgaGFkIG5vdCBjaGFuZ2VkLiApCisgKiBbS0RdCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHNldF92ZmxhZ3NfbG9uZyh1bnNpZ25lZCBsb25nIGVmbGFncywgc3RydWN0IGtlcm5lbF92bTg2X3JlZ3MgKiByZWdzKQoreworCXNldF9mbGFncyhWRUZMQUdTLCBlZmxhZ3MsIGN1cnJlbnQtPnRocmVhZC52ODZtYXNrKTsKKwlzZXRfZmxhZ3MocmVncy0+ZWZsYWdzLCBlZmxhZ3MsIFNBRkVfTUFTSyk7CisJaWYgKGVmbGFncyAmIElGX01BU0spCisJCXNldF9JRihyZWdzKTsKKwllbHNlCisJCWNsZWFyX0lGKHJlZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3ZmbGFnc19zaG9ydCh1bnNpZ25lZCBzaG9ydCBmbGFncywgc3RydWN0IGtlcm5lbF92bTg2X3JlZ3MgKiByZWdzKQoreworCXNldF9mbGFncyhWRkxBR1MsIGZsYWdzLCBjdXJyZW50LT50aHJlYWQudjg2bWFzayk7CisJc2V0X2ZsYWdzKHJlZ3MtPmVmbGFncywgZmxhZ3MsIFNBRkVfTUFTSyk7CisJaWYgKGZsYWdzICYgSUZfTUFTSykKKwkJc2V0X0lGKHJlZ3MpOworCWVsc2UKKwkJY2xlYXJfSUYocmVncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfdmZsYWdzKHN0cnVjdCBrZXJuZWxfdm04Nl9yZWdzICogcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gcmVncy0+ZWZsYWdzICYgUkVUVVJOX01BU0s7CisKKwlpZiAoVkVGTEFHUyAmIFZJRl9NQVNLKQorCQlmbGFncyB8PSBJRl9NQVNLOworCWZsYWdzIHw9IElPUExfTUFTSzsKKwlyZXR1cm4gZmxhZ3MgfCAoVkVGTEFHUyAmIGN1cnJlbnQtPnRocmVhZC52ODZtYXNrKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfcmV2ZWN0b3JlZChpbnQgbnIsIHN0cnVjdCByZXZlY3RvcmVkX3N0cnVjdCAqIGJpdG1hcCkKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygiYnRsICUyLCUxXG5cdHNiYmwgJTAsJTAiCisJCToiPXIiIChucikKKwkJOiJtIiAoKmJpdG1hcCksInIiIChucikpOworCXJldHVybiBucjsKK30KKworI2RlZmluZSB2YWxfYnl0ZSh2YWwsIG4pICgoKF9fdTggKikmdmFsKVtuXSkKKworI2RlZmluZSBwdXNoYihiYXNlLCBwdHIsIHZhbCwgZXJyX2xhYmVsKSBcCisJZG8geyBcCisJCV9fdTggX192YWwgPSB2YWw7IFwKKwkJcHRyLS07IFwKKwkJaWYgKHB1dF91c2VyKF9fdmFsLCBiYXNlICsgcHRyKSA8IDApIFwKKwkJCWdvdG8gZXJyX2xhYmVsOyBcCisJfSB3aGlsZSgwKQorCisjZGVmaW5lIHB1c2h3KGJhc2UsIHB0ciwgdmFsLCBlcnJfbGFiZWwpIFwKKwlkbyB7IFwKKwkJX191MTYgX192YWwgPSB2YWw7IFwKKwkJcHRyLS07IFwKKwkJaWYgKHB1dF91c2VyKHZhbF9ieXRlKF9fdmFsLCAxKSwgYmFzZSArIHB0cikgPCAwKSBcCisJCQlnb3RvIGVycl9sYWJlbDsgXAorCQlwdHItLTsgXAorCQlpZiAocHV0X3VzZXIodmFsX2J5dGUoX192YWwsIDApLCBiYXNlICsgcHRyKSA8IDApIFwKKwkJCWdvdG8gZXJyX2xhYmVsOyBcCisJfSB3aGlsZSgwKQorCisjZGVmaW5lIHB1c2hsKGJhc2UsIHB0ciwgdmFsLCBlcnJfbGFiZWwpIFwKKwlkbyB7IFwKKwkJX191MzIgX192YWwgPSB2YWw7IFwKKwkJcHRyLS07IFwKKwkJaWYgKHB1dF91c2VyKHZhbF9ieXRlKF9fdmFsLCAzKSwgYmFzZSArIHB0cikgPCAwKSBcCisJCQlnb3RvIGVycl9sYWJlbDsgXAorCQlwdHItLTsgXAorCQlpZiAocHV0X3VzZXIodmFsX2J5dGUoX192YWwsIDIpLCBiYXNlICsgcHRyKSA8IDApIFwKKwkJCWdvdG8gZXJyX2xhYmVsOyBcCisJCXB0ci0tOyBcCisJCWlmIChwdXRfdXNlcih2YWxfYnl0ZShfX3ZhbCwgMSksIGJhc2UgKyBwdHIpIDwgMCkgXAorCQkJZ290byBlcnJfbGFiZWw7IFwKKwkJcHRyLS07IFwKKwkJaWYgKHB1dF91c2VyKHZhbF9ieXRlKF9fdmFsLCAwKSwgYmFzZSArIHB0cikgPCAwKSBcCisJCQlnb3RvIGVycl9sYWJlbDsgXAorCX0gd2hpbGUoMCkKKworI2RlZmluZSBwb3BiKGJhc2UsIHB0ciwgZXJyX2xhYmVsKSBcCisJKHsgXAorCQlfX3U4IF9fcmVzOyBcCisJCWlmIChnZXRfdXNlcihfX3JlcywgYmFzZSArIHB0cikgPCAwKSBcCisJCQlnb3RvIGVycl9sYWJlbDsgXAorCQlwdHIrKzsgXAorCQlfX3JlczsgXAorCX0pCisKKyNkZWZpbmUgcG9wdyhiYXNlLCBwdHIsIGVycl9sYWJlbCkgXAorCSh7IFwKKwkJX191MTYgX19yZXM7IFwKKwkJaWYgKGdldF91c2VyKHZhbF9ieXRlKF9fcmVzLCAwKSwgYmFzZSArIHB0cikgPCAwKSBcCisJCQlnb3RvIGVycl9sYWJlbDsgXAorCQlwdHIrKzsgXAorCQlpZiAoZ2V0X3VzZXIodmFsX2J5dGUoX19yZXMsIDEpLCBiYXNlICsgcHRyKSA8IDApIFwKKwkJCWdvdG8gZXJyX2xhYmVsOyBcCisJCXB0cisrOyBcCisJCV9fcmVzOyBcCisJfSkKKworI2RlZmluZSBwb3BsKGJhc2UsIHB0ciwgZXJyX2xhYmVsKSBcCisJKHsgXAorCQlfX3UzMiBfX3JlczsgXAorCQlpZiAoZ2V0X3VzZXIodmFsX2J5dGUoX19yZXMsIDApLCBiYXNlICsgcHRyKSA8IDApIFwKKwkJCWdvdG8gZXJyX2xhYmVsOyBcCisJCXB0cisrOyBcCisJCWlmIChnZXRfdXNlcih2YWxfYnl0ZShfX3JlcywgMSksIGJhc2UgKyBwdHIpIDwgMCkgXAorCQkJZ290byBlcnJfbGFiZWw7IFwKKwkJcHRyKys7IFwKKwkJaWYgKGdldF91c2VyKHZhbF9ieXRlKF9fcmVzLCAyKSwgYmFzZSArIHB0cikgPCAwKSBcCisJCQlnb3RvIGVycl9sYWJlbDsgXAorCQlwdHIrKzsgXAorCQlpZiAoZ2V0X3VzZXIodmFsX2J5dGUoX19yZXMsIDMpLCBiYXNlICsgcHRyKSA8IDApIFwKKwkJCWdvdG8gZXJyX2xhYmVsOyBcCisJCXB0cisrOyBcCisJCV9fcmVzOyBcCisJfSkKKworLyogVGhlcmUgYXJlIHNvIG1hbnkgcG9zc2libGUgcmVhc29ucyBmb3IgdGhpcyBmdW5jdGlvbiB0byByZXR1cm4KKyAqIFZNODZfSU5UeCwgc28gYWRkaW5nIGFub3RoZXIgZG9lc24ndCBib3RoZXIgbWUuIFdlIGNhbiBleHBlY3QKKyAqIHVzZXJzcGFjZSBwcm9ncmFtcyB0byBiZSBhYmxlIHRvIGhhbmRsZSBpdC4gKEdldHRpbmcgYSBwcm9ibGVtCisgKiBpbiB1c2Vyc3BhY2UgaXMgYWx3YXlzIGJldHRlciB0aGFuIGFuIE9vcHMgYW55d2F5LikgW0tEXQorICovCitzdGF0aWMgdm9pZCBkb19pbnQoc3RydWN0IGtlcm5lbF92bTg2X3JlZ3MgKnJlZ3MsIGludCBpLAorICAgIHVuc2lnbmVkIGNoYXIgX191c2VyICogc3NwLCB1bnNpZ25lZCBzaG9ydCBzcCkKK3sKKwl1bnNpZ25lZCBsb25nIF9fdXNlciAqaW50cl9wdHI7CisJdW5zaWduZWQgbG9uZyBzZWdvZmZzOworCisJaWYgKHJlZ3MtPmNzID09IEJJT1NTRUcpCisJCWdvdG8gY2Fubm90X2hhbmRsZTsKKwlpZiAoaXNfcmV2ZWN0b3JlZChpLCAmS1ZNODYtPmludF9yZXZlY3RvcmVkKSkKKwkJZ290byBjYW5ub3RfaGFuZGxlOworCWlmIChpPT0weDIxICYmIGlzX3JldmVjdG9yZWQoQUgocmVncyksJktWTTg2LT5pbnQyMV9yZXZlY3RvcmVkKSkKKwkJZ290byBjYW5ub3RfaGFuZGxlOworCWludHJfcHRyID0gKHVuc2lnbmVkIGxvbmcgX191c2VyICopIChpIDw8IDIpOworCWlmIChnZXRfdXNlcihzZWdvZmZzLCBpbnRyX3B0cikpCisJCWdvdG8gY2Fubm90X2hhbmRsZTsKKwlpZiAoKHNlZ29mZnMgPj4gMTYpID09IEJJT1NTRUcpCisJCWdvdG8gY2Fubm90X2hhbmRsZTsKKwlwdXNodyhzc3AsIHNwLCBnZXRfdmZsYWdzKHJlZ3MpLCBjYW5ub3RfaGFuZGxlKTsKKwlwdXNodyhzc3AsIHNwLCByZWdzLT5jcywgY2Fubm90X2hhbmRsZSk7CisJcHVzaHcoc3NwLCBzcCwgSVAocmVncyksIGNhbm5vdF9oYW5kbGUpOworCXJlZ3MtPmNzID0gc2Vnb2ZmcyA+PiAxNjsKKwlTUChyZWdzKSAtPSA2OworCUlQKHJlZ3MpID0gc2Vnb2ZmcyAmIDB4ZmZmZjsKKwljbGVhcl9URihyZWdzKTsKKwljbGVhcl9JRihyZWdzKTsKKwljbGVhcl9BQyhyZWdzKTsKKwlyZXR1cm47CisKK2Nhbm5vdF9oYW5kbGU6CisJcmV0dXJuX3RvXzMyYml0KHJlZ3MsIFZNODZfSU5UeCArIChpIDw8IDgpKTsKK30KKworaW50IGhhbmRsZV92bTg2X3RyYXAoc3RydWN0IGtlcm5lbF92bTg2X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUsIGludCB0cmFwbm8pCit7CisJaWYgKFZNUEkuaXNfdm04NnB1cykgeworCQlpZiAoICh0cmFwbm89PTMpIHx8ICh0cmFwbm89PTEpICkKKwkJCXJldHVybl90b18zMmJpdChyZWdzLCBWTTg2X1RSQVAgKyAodHJhcG5vIDw8IDgpKTsKKwkJZG9faW50KHJlZ3MsIHRyYXBubywgKHVuc2lnbmVkIGNoYXIgX191c2VyICopIChyZWdzLT5zcyA8PCA0KSwgU1AocmVncykpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHRyYXBubyAhPTEpCisJCXJldHVybiAxOyAvKiB3ZSBsZXQgdGhpcyBoYW5kbGUgYnkgdGhlIGNhbGxpbmcgcm91dGluZSAqLworCWlmIChjdXJyZW50LT5wdHJhY2UgJiBQVF9QVFJBQ0VEKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CisJCXNpZ2RlbHNldCgmY3VycmVudC0+YmxvY2tlZCwgU0lHVFJBUCk7CisJCXJlY2FsY19zaWdwZW5kaW5nKCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKKwl9CisJc2VuZF9zaWcoU0lHVFJBUCwgY3VycmVudCwgMSk7CisJY3VycmVudC0+dGhyZWFkLnRyYXBfbm8gPSB0cmFwbm87CisJY3VycmVudC0+dGhyZWFkLmVycm9yX2NvZGUgPSBlcnJvcl9jb2RlOworCXJldHVybiAwOworfQorCit2b2lkIGhhbmRsZV92bTg2X2ZhdWx0KHN0cnVjdCBrZXJuZWxfdm04Nl9yZWdzICogcmVncywgbG9uZyBlcnJvcl9jb2RlKQoreworCXVuc2lnbmVkIGNoYXIgb3Bjb2RlOworCXVuc2lnbmVkIGNoYXIgX191c2VyICpjc3A7CisJdW5zaWduZWQgY2hhciBfX3VzZXIgKnNzcDsKKwl1bnNpZ25lZCBzaG9ydCBpcCwgc3A7CisJaW50IGRhdGEzMiwgcHJlZl9kb25lOworCisjZGVmaW5lIENIRUNLX0lGX0lOX1RSQVAgXAorCWlmIChWTVBJLnZtODZkYmdfYWN0aXZlICYmIFZNUEkudm04NmRiZ19URnBlbmRpZykgXAorCQluZXdmbGFncyB8PSBURl9NQVNLCisjZGVmaW5lIFZNODZfRkFVTFRfUkVUVVJOIGRvIHsgXAorCWlmIChWTVBJLmZvcmNlX3JldHVybl9mb3JfcGljICAmJiAoVkVGTEFHUyAmIChJRl9NQVNLIHwgVklGX01BU0spKSkgXAorCQlyZXR1cm5fdG9fMzJiaXQocmVncywgVk04Nl9QSUNSRVRVUk4pOyBcCisJcmV0dXJuOyB9IHdoaWxlICgwKQorCisJY3NwID0gKHVuc2lnbmVkIGNoYXIgX191c2VyICopIChyZWdzLT5jcyA8PCA0KTsKKwlzc3AgPSAodW5zaWduZWQgY2hhciBfX3VzZXIgKikgKHJlZ3MtPnNzIDw8IDQpOworCXNwID0gU1AocmVncyk7CisJaXAgPSBJUChyZWdzKTsKKworCWRhdGEzMiA9IDA7CisJcHJlZl9kb25lID0gMDsKKwlkbyB7CisJCXN3aXRjaCAob3Bjb2RlID0gcG9wYihjc3AsIGlwLCBzaW11bGF0ZV9zaWdzZWd2KSkgeworCQkJY2FzZSAweDY2OiAgICAgIC8qIDMyLWJpdCBkYXRhICovICAgICBkYXRhMzI9MTsgYnJlYWs7CisJCQljYXNlIDB4Njc6ICAgICAgLyogMzItYml0IGFkZHJlc3MgKi8gIGJyZWFrOworCQkJY2FzZSAweDJlOiAgICAgIC8qIENTICovICAgICAgICAgICAgICBicmVhazsKKwkJCWNhc2UgMHgzZTogICAgICAvKiBEUyAqLyAgICAgICAgICAgICAgYnJlYWs7CisJCQljYXNlIDB4MjY6ICAgICAgLyogRVMgKi8gICAgICAgICAgICAgIGJyZWFrOworCQkJY2FzZSAweDM2OiAgICAgIC8qIFNTICovICAgICAgICAgICAgICBicmVhazsKKwkJCWNhc2UgMHg2NTogICAgICAvKiBHUyAqLyAgICAgICAgICAgICAgYnJlYWs7CisJCQljYXNlIDB4NjQ6ICAgICAgLyogRlMgKi8gICAgICAgICAgICAgIGJyZWFrOworCQkJY2FzZSAweGYyOiAgICAgIC8qIHJlcG56ICovICAgICAgIGJyZWFrOworCQkJY2FzZSAweGYzOiAgICAgIC8qIHJlcCAqLyAgICAgICAgICAgICBicmVhazsKKwkJCWRlZmF1bHQ6IHByZWZfZG9uZSA9IDE7CisJCX0KKwl9IHdoaWxlICghcHJlZl9kb25lKTsKKworCXN3aXRjaCAob3Bjb2RlKSB7CisKKwkvKiBwdXNoZiAqLworCWNhc2UgMHg5YzoKKwkJaWYgKGRhdGEzMikgeworCQkJcHVzaGwoc3NwLCBzcCwgZ2V0X3ZmbGFncyhyZWdzKSwgc2ltdWxhdGVfc2lnc2Vndik7CisJCQlTUChyZWdzKSAtPSA0OworCQl9IGVsc2UgeworCQkJcHVzaHcoc3NwLCBzcCwgZ2V0X3ZmbGFncyhyZWdzKSwgc2ltdWxhdGVfc2lnc2Vndik7CisJCQlTUChyZWdzKSAtPSAyOworCQl9CisJCUlQKHJlZ3MpID0gaXA7CisJCVZNODZfRkFVTFRfUkVUVVJOOworCisJLyogcG9wZiAqLworCWNhc2UgMHg5ZDoKKwkJeworCQl1bnNpZ25lZCBsb25nIG5ld2ZsYWdzOworCQlpZiAoZGF0YTMyKSB7CisJCQluZXdmbGFncz1wb3BsKHNzcCwgc3AsIHNpbXVsYXRlX3NpZ3NlZ3YpOworCQkJU1AocmVncykgKz0gNDsKKwkJfSBlbHNlIHsKKwkJCW5ld2ZsYWdzID0gcG9wdyhzc3AsIHNwLCBzaW11bGF0ZV9zaWdzZWd2KTsKKwkJCVNQKHJlZ3MpICs9IDI7CisJCX0KKwkJSVAocmVncykgPSBpcDsKKwkJQ0hFQ0tfSUZfSU5fVFJBUDsKKwkJaWYgKGRhdGEzMikgeworCQkJc2V0X3ZmbGFnc19sb25nKG5ld2ZsYWdzLCByZWdzKTsKKwkJfSBlbHNlIHsKKwkJCXNldF92ZmxhZ3Nfc2hvcnQobmV3ZmxhZ3MsIHJlZ3MpOworCQl9CisJCVZNODZfRkFVTFRfUkVUVVJOOworCQl9CisKKwkvKiBpbnQgeHggKi8KKwljYXNlIDB4Y2Q6IHsKKwkJaW50IGludG5vPXBvcGIoY3NwLCBpcCwgc2ltdWxhdGVfc2lnc2Vndik7CisJCUlQKHJlZ3MpID0gaXA7CisJCWlmIChWTVBJLnZtODZkYmdfYWN0aXZlKSB7CisJCQlpZiAoICgxIDw8IChpbnRubyAmNykpICYgVk1QSS52bTg2ZGJnX2ludHh4dGFiW2ludG5vID4+IDNdICkKKwkJCQlyZXR1cm5fdG9fMzJiaXQocmVncywgVk04Nl9JTlR4ICsgKGludG5vIDw8IDgpKTsKKwkJfQorCQlkb19pbnQocmVncywgaW50bm8sIHNzcCwgc3ApOworCQlyZXR1cm47CisJfQorCisJLyogaXJldCAqLworCWNhc2UgMHhjZjoKKwkJeworCQl1bnNpZ25lZCBsb25nIG5ld2lwOworCQl1bnNpZ25lZCBsb25nIG5ld2NzOworCQl1bnNpZ25lZCBsb25nIG5ld2ZsYWdzOworCQlpZiAoZGF0YTMyKSB7CisJCQluZXdpcD1wb3BsKHNzcCwgc3AsIHNpbXVsYXRlX3NpZ3NlZ3YpOworCQkJbmV3Y3M9cG9wbChzc3AsIHNwLCBzaW11bGF0ZV9zaWdzZWd2KTsKKwkJCW5ld2ZsYWdzPXBvcGwoc3NwLCBzcCwgc2ltdWxhdGVfc2lnc2Vndik7CisJCQlTUChyZWdzKSArPSAxMjsKKwkJfSBlbHNlIHsKKwkJCW5ld2lwID0gcG9wdyhzc3AsIHNwLCBzaW11bGF0ZV9zaWdzZWd2KTsKKwkJCW5ld2NzID0gcG9wdyhzc3AsIHNwLCBzaW11bGF0ZV9zaWdzZWd2KTsKKwkJCW5ld2ZsYWdzID0gcG9wdyhzc3AsIHNwLCBzaW11bGF0ZV9zaWdzZWd2KTsKKwkJCVNQKHJlZ3MpICs9IDY7CisJCX0KKwkJSVAocmVncykgPSBuZXdpcDsKKwkJcmVncy0+Y3MgPSBuZXdjczsKKwkJQ0hFQ0tfSUZfSU5fVFJBUDsKKwkJaWYgKGRhdGEzMikgeworCQkJc2V0X3ZmbGFnc19sb25nKG5ld2ZsYWdzLCByZWdzKTsKKwkJfSBlbHNlIHsKKwkJCXNldF92ZmxhZ3Nfc2hvcnQobmV3ZmxhZ3MsIHJlZ3MpOworCQl9CisJCVZNODZfRkFVTFRfUkVUVVJOOworCQl9CisKKwkvKiBjbGkgKi8KKwljYXNlIDB4ZmE6CisJCUlQKHJlZ3MpID0gaXA7CisJCWNsZWFyX0lGKHJlZ3MpOworCQlWTTg2X0ZBVUxUX1JFVFVSTjsKKworCS8qIHN0aSAqLworCS8qCisJICogRGFtbi4gVGhpcyBpcyBpbmNvcnJlY3Q6IHRoZSAnc3RpJyBpbnN0cnVjdGlvbiBzaG91bGQgYWN0dWFsbHkKKwkgKiBlbmFibGUgaW50ZXJydXB0cyBhZnRlciB0aGUgL25leHQvIGluc3RydWN0aW9uLiBOb3QgZ29vZC4KKwkgKgorCSAqIFByb2JhYmx5IG5lZWRzIHNvbWUgaG9yc2luZyBhcm91bmQgd2l0aCB0aGUgVEYgZmxhZy4gQWllZS4uCisJICovCisJY2FzZSAweGZiOgorCQlJUChyZWdzKSA9IGlwOworCQlzZXRfSUYocmVncyk7CisJCVZNODZfRkFVTFRfUkVUVVJOOworCisJZGVmYXVsdDoKKwkJcmV0dXJuX3RvXzMyYml0KHJlZ3MsIFZNODZfVU5LTk9XTik7CisJfQorCisJcmV0dXJuOworCitzaW11bGF0ZV9zaWdzZWd2OgorCS8qIEZJWE1FOiBBZnRlciBhIGxvbmcgZGlzY3Vzc2lvbiB3aXRoIFN0YXMgd2UgZmluYWxseQorCSAqICAgICAgICBhZ3JlZWQsIHRoYXQgdGhpcyBpcyB3cm9uZy4gSGVyZSB3ZSBzaG91bGQKKwkgKiAgICAgICAgcmVhbGx5IHNlbmQgYSBTSUdTRUdWIHRvIHRoZSB1c2VyIHByb2dyYW0uCisJICogICAgICAgIEJ1dCBob3cgZG8gd2UgY3JlYXRlIHRoZSBjb3JyZWN0IGNvbnRleHQ/IFdlCisJICogICAgICAgIGFyZSBpbnNpZGUgYSBnZW5lcmFsIHByb3RlY3Rpb24gZmF1bHQgaGFuZGxlcgorCSAqICAgICAgICBhbmQgaGFzIGp1c3QgcmV0dXJuZWQgZnJvbSBhIHBhZ2UgZmF1bHQgaGFuZGxlci4KKwkgKiAgICAgICAgVGhlIGNvcnJlY3QgY29udGV4dCBmb3IgdGhlIHNpZ25hbCBoYW5kbGVyCisJICogICAgICAgIHNob3VsZCBiZSBhIG1peHR1cmUgb2YgdGhlIHR3bywgYnV0IGhvdyBkbyB3ZQorCSAqICAgICAgICBnZXQgdGhlIGluZm9ybWF0aW9uPyBbS0RdCisJICovCisJcmV0dXJuX3RvXzMyYml0KHJlZ3MsIFZNODZfVU5LTk9XTik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0gdm04NiBzcGVjaWFsIElSUSBwYXNzaW5nIHN0dWZmIC0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgVk04Nl9JUlFOQU1FCQkidm04NmlycSIKKworc3RhdGljIHN0cnVjdCB2bTg2X2lycXMgeworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOworCWludCBzaWc7Cit9IHZtODZfaXJxc1sxNl07CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaXJxYml0c19sb2NrKTsKK3N0YXRpYyBpbnQgaXJxYml0czsKKworI2RlZmluZSBBTExPV0VEX1NJR1MgKCAxIC8qIDAgPSBkb24ndCBzZW5kIGEgc2lnbmFsICovIFwKKwl8ICgxIDw8IFNJR1VTUjEpIHwgKDEgPDwgU0lHVVNSMikgfCAoMSA8PCBTSUdJTykgIHwgKDEgPDwgU0lHVVJHKSBcCisJfCAoMSA8PCBTSUdVTlVTRUQpICkKKwkKK3N0YXRpYyBpcnFyZXR1cm5fdCBpcnFfaGFuZGxlcihpbnQgaW50bm8sIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCWludCBpcnFfYml0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxYml0c19sb2NrLCBmbGFncyk7CQorCWlycV9iaXQgPSAxIDw8IGludG5vOworCWlmICgoaXJxYml0cyAmIGlycV9iaXQpIHx8ICEgdm04Nl9pcnFzW2ludG5vXS50c2spCisJCWdvdG8gb3V0OworCWlycWJpdHMgfD0gaXJxX2JpdDsKKwlpZiAodm04Nl9pcnFzW2ludG5vXS5zaWcpCisJCXNlbmRfc2lnKHZtODZfaXJxc1tpbnRub10uc2lnLCB2bTg2X2lycXNbaW50bm9dLnRzaywgMSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxYml0c19sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBJUlEgd2lsbCBiZSByZS1lbmFibGVkIHdoZW4gdXNlciBhc2tzIGZvciB0aGUgaXJxICh3aGV0aGVyCisJICogcG9sbGluZyBvciBhcyBhIHJlc3VsdCBvZiB0aGUgc2lnbmFsKQorCSAqLworCWRpc2FibGVfaXJxKGludG5vKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFiaXRzX2xvY2ssIGZsYWdzKTsJCisJcmV0dXJuIElSUV9OT05FOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV92bTg2X2lycShpbnQgaXJxbnVtYmVyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlmcmVlX2lycShpcnFudW1iZXIsIE5VTEwpOworCXZtODZfaXJxc1tpcnFudW1iZXJdLnRzayA9IE5VTEw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxYml0c19sb2NrLCBmbGFncyk7CQorCWlycWJpdHMgJj0gfigxIDw8IGlycW51bWJlcik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxYml0c19sb2NrLCBmbGFncyk7CQorfQorCit2b2lkIHJlbGVhc2Vfdm04Nl9pcnFzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSBGSVJTVF9WTTg2X0lSUSA7IGkgPD0gTEFTVF9WTTg2X0lSUTsgaSsrKQorCSAgICBpZiAodm04Nl9pcnFzW2ldLnRzayA9PSB0YXNrKQorCQlmcmVlX3ZtODZfaXJxKGkpOworfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRfYW5kX3Jlc2V0X2lycShpbnQgaXJxbnVtYmVyKQoreworCWludCBiaXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlpZiAoaW52YWxpZF92bTg2X2lycShpcnFudW1iZXIpKSByZXR1cm4gMDsKKwlpZiAodm04Nl9pcnFzW2lycW51bWJlcl0udHNrICE9IGN1cnJlbnQpIHJldHVybiAwOworCXNwaW5fbG9ja19pcnFzYXZlKCZpcnFiaXRzX2xvY2ssIGZsYWdzKTsJCisJYml0ID0gaXJxYml0cyAmICgxIDw8IGlycW51bWJlcik7CisJaXJxYml0cyAmPSB+Yml0OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycWJpdHNfbG9jaywgZmxhZ3MpOwkKKwlpZiAoIWJpdCkKKwkJcmV0dXJuIDA7CisJZW5hYmxlX2lycShpcnFudW1iZXIpOworCXJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgZG9fdm04Nl9pcnFfaGFuZGxpbmcoaW50IHN1YmZ1bmN0aW9uLCBpbnQgaXJxbnVtYmVyKQoreworCWludCByZXQ7CisJc3dpdGNoIChzdWJmdW5jdGlvbikgeworCQljYXNlIFZNODZfR0VUX0FORF9SRVNFVF9JUlE6IHsKKwkJCXJldHVybiBnZXRfYW5kX3Jlc2V0X2lycShpcnFudW1iZXIpOworCQl9CisJCWNhc2UgVk04Nl9HRVRfSVJRX0JJVFM6IHsKKwkJCXJldHVybiBpcnFiaXRzOworCQl9CisJCWNhc2UgVk04Nl9SRVFVRVNUX0lSUTogeworCQkJaW50IHNpZyA9IGlycW51bWJlciA+PiA4OworCQkJaW50IGlycSA9IGlycW51bWJlciAmIDI1NTsKKwkJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgcmV0dXJuIC1FUEVSTTsKKwkJCWlmICghKCgxIDw8IHNpZykgJiBBTExPV0VEX1NJR1MpKSByZXR1cm4gLUVQRVJNOworCQkJaWYgKGludmFsaWRfdm04Nl9pcnEoaXJxKSkgcmV0dXJuIC1FUEVSTTsKKwkJCWlmICh2bTg2X2lycXNbaXJxXS50c2spIHJldHVybiAtRVBFUk07CisJCQlyZXQgPSByZXF1ZXN0X2lycShpcnEsICZpcnFfaGFuZGxlciwgMCwgVk04Nl9JUlFOQU1FLCBOVUxMKTsKKwkJCWlmIChyZXQpIHJldHVybiByZXQ7CisJCQl2bTg2X2lycXNbaXJxXS5zaWcgPSBzaWc7CisJCQl2bTg2X2lycXNbaXJxXS50c2sgPSBjdXJyZW50OworCQkJcmV0dXJuIGlycTsKKwkJfQorCQljYXNlICBWTTg2X0ZSRUVfSVJROiB7CisJCQlpZiAoaW52YWxpZF92bTg2X2lycShpcnFudW1iZXIpKSByZXR1cm4gLUVQRVJNOworCQkJaWYgKCF2bTg2X2lycXNbaXJxbnVtYmVyXS50c2spIHJldHVybiAwOworCQkJaWYgKHZtODZfaXJxc1tpcnFudW1iZXJdLnRzayAhPSBjdXJyZW50KSByZXR1cm4gLUVQRVJNOworCQkJZnJlZV92bTg2X2lycShpcnFudW1iZXIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvaTM4Ni9rZXJuZWwvdm1saW51eC5sZHMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDUxMmNjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC0wLDAgKzEsMTM0IEBACisvKiBsZCBzY3JpcHQgdG8gbWFrZSBpMzg2IExpbnV4IGtlcm5lbAorICogV3JpdHRlbiBieSBNYXJ0aW4gTWFyZXMgPG1qQGF0cmV5Lmthcmxpbi5tZmYuY3VuaS5jej47CisgKi8KKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3ZtbGludXgubGRzLmg+CisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworT1VUUFVUX0ZPUk1BVCgiZWxmMzItaTM4NiIsICJlbGYzMi1pMzg2IiwgImVsZjMyLWkzODYiKQorT1VUUFVUX0FSQ0goaTM4NikKK0VOVFJZKHN0YXJ0dXBfMzIpCitqaWZmaWVzID0gamlmZmllc182NDsKK1NFQ1RJT05TCit7CisgIC4gPSBfX1BBR0VfT0ZGU0VUICsgMHgxMDAwMDA7CisgIC8qIHJlYWQtb25seSAqLworICBfdGV4dCA9IC47CQkJLyogVGV4dCBhbmQgcmVhZC1vbmx5IGRhdGEgKi8KKyAgLnRleHQgOiB7CisJKigudGV4dCkKKwlTQ0hFRF9URVhUCisJTE9DS19URVhUCisJKiguZml4dXApCisJKiguZ251Lndhcm5pbmcpCisJfSA9IDB4OTA5MAorCisgIF9ldGV4dCA9IC47CQkJLyogRW5kIG9mIHRleHQgc2VjdGlvbiAqLworCisgIC4gPSBBTElHTigxNik7CQkvKiBFeGNlcHRpb24gdGFibGUgKi8KKyAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKKyAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9CisgIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKKworICBST0RBVEEKKworICAvKiB3cml0ZWFibGUgKi8KKyAgLmRhdGEgOiB7CQkJLyogRGF0YSAqLworCSooLmRhdGEpCisJQ09OU1RSVUNUT1JTCisJfQorCisgIC4gPSBBTElHTig0MDk2KTsKKyAgX19ub3NhdmVfYmVnaW4gPSAuOworICAuZGF0YV9ub3NhdmUgOiB7ICooLmRhdGEubm9zYXZlKSB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgX19ub3NhdmVfZW5kID0gLjsKKworICAuID0gQUxJR04oNDA5Nik7CisgIC5kYXRhLnBhZ2VfYWxpZ25lZCA6IHsgKiguZGF0YS5pZHQpIH0KKworICAuID0gQUxJR04oMzIpOworICAuZGF0YS5jYWNoZWxpbmVfYWxpZ25lZCA6IHsgKiguZGF0YS5jYWNoZWxpbmVfYWxpZ25lZCkgfQorCisgIF9lZGF0YSA9IC47CQkJLyogRW5kIG9mIGRhdGEgc2VjdGlvbiAqLworCisgIC4gPSBBTElHTihUSFJFQURfU0laRSk7CS8qIGluaXRfdGFzayAqLworICAuZGF0YS5pbml0X3Rhc2sgOiB7ICooLmRhdGEuaW5pdF90YXNrKSB9CisKKyAgLyogd2lsbCBiZSBmcmVlZCBhZnRlciBpbml0ICovCisgIC4gPSBBTElHTig0MDk2KTsJCS8qIEluaXQgY29kZSBhbmQgZGF0YSAqLworICBfX2luaXRfYmVnaW4gPSAuOworICAuaW5pdC50ZXh0IDogeyAKKwlfc2luaXR0ZXh0ID0gLjsKKwkqKC5pbml0LnRleHQpCisJX2Vpbml0dGV4dCA9IC47CisgIH0KKyAgLmluaXQuZGF0YSA6IHsgKiguaW5pdC5kYXRhKSB9CisgIC4gPSBBTElHTigxNik7CisgIF9fc2V0dXBfc3RhcnQgPSAuOworICAuaW5pdC5zZXR1cCA6IHsgKiguaW5pdC5zZXR1cCkgfQorICBfX3NldHVwX2VuZCA9IC47CisgIF9faW5pdGNhbGxfc3RhcnQgPSAuOworICAuaW5pdGNhbGwuaW5pdCA6IHsKKwkqKC5pbml0Y2FsbDEuaW5pdCkgCisJKiguaW5pdGNhbGwyLmluaXQpIAorCSooLmluaXRjYWxsMy5pbml0KSAKKwkqKC5pbml0Y2FsbDQuaW5pdCkgCisJKiguaW5pdGNhbGw1LmluaXQpIAorCSooLmluaXRjYWxsNi5pbml0KSAKKwkqKC5pbml0Y2FsbDcuaW5pdCkKKyAgfQorICBfX2luaXRjYWxsX2VuZCA9IC47CisgIF9fY29uX2luaXRjYWxsX3N0YXJ0ID0gLjsKKyAgLmNvbl9pbml0Y2FsbC5pbml0IDogeyAqKC5jb25faW5pdGNhbGwuaW5pdCkgfQorICBfX2Nvbl9pbml0Y2FsbF9lbmQgPSAuOworICBTRUNVUklUWV9JTklUCisgIC4gPSBBTElHTig0KTsKKyAgX19hbHRfaW5zdHJ1Y3Rpb25zID0gLjsKKyAgLmFsdGluc3RydWN0aW9ucyA6IHsgKiguYWx0aW5zdHJ1Y3Rpb25zKSB9IAorICBfX2FsdF9pbnN0cnVjdGlvbnNfZW5kID0gLjsgCisgLmFsdGluc3RyX3JlcGxhY2VtZW50IDogeyAqKC5hbHRpbnN0cl9yZXBsYWNlbWVudCkgfSAKKyAgLyogLmV4aXQudGV4dCBpcyBkaXNjYXJkIGF0IHJ1bnRpbWUsIG5vdCBsaW5rIHRpbWUsIHRvIGRlYWwgd2l0aCByZWZlcmVuY2VzCisgICAgIGZyb20gLmFsdGluc3RydWN0aW9ucyBhbmQgLmVoX2ZyYW1lICovCisgIC5leGl0LnRleHQgOiB7ICooLmV4aXQudGV4dCkgfQorICAuZXhpdC5kYXRhIDogeyAqKC5leGl0LmRhdGEpIH0KKyAgLiA9IEFMSUdOKDQwOTYpOworICBfX2luaXRyYW1mc19zdGFydCA9IC47CisgIC5pbml0LnJhbWZzIDogeyAqKC5pbml0LnJhbWZzKSB9CisgIF9faW5pdHJhbWZzX2VuZCA9IC47CisgIC4gPSBBTElHTigzMik7CisgIF9fcGVyX2NwdV9zdGFydCA9IC47CisgIC5kYXRhLnBlcmNwdSAgOiB7ICooLmRhdGEucGVyY3B1KSB9CisgIF9fcGVyX2NwdV9lbmQgPSAuOworICAuID0gQUxJR04oNDA5Nik7CisgIF9faW5pdF9lbmQgPSAuOworICAvKiBmcmVlZCBhZnRlciBpbml0IGVuZHMgaGVyZSAqLworCQorICBfX2Jzc19zdGFydCA9IC47CQkvKiBCU1MgKi8KKyAgLmJzcyA6IHsKKwkqKC5ic3MucGFnZV9hbGlnbmVkKQorCSooLmJzcykKKyAgfQorICAuID0gQUxJR04oNCk7CisgIF9fYnNzX3N0b3AgPSAuOyAKKworICBfZW5kID0gLiA7CisKKyAgLyogVGhpcyBpcyB3aGVyZSB0aGUga2VybmVsIGNyZWF0ZXMgdGhlIGVhcmx5IGJvb3QgcGFnZSB0YWJsZXMgKi8KKyAgLiA9IEFMSUdOKDQwOTYpOworICBwZzAgPSAuOworCisgIC8qIFNlY3Rpb25zIHRvIGJlIGRpc2NhcmRlZCAqLworICAvRElTQ0FSRC8gOiB7CisJKiguZXhpdGNhbGwuZXhpdCkKKwl9CisKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4IDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAwIDogeyAqKC5jb21tZW50KSB9Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3ZzeXNjYWxsLWludDgwLlMgYi9hcmNoL2kzODYva2VybmVsL3ZzeXNjYWxsLWludDgwLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMwZDA1MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdnN5c2NhbGwtaW50ODAuUwpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29kZSBmb3IgdGhlIHZzeXNjYWxsIHBhZ2UuICBUaGlzIHZlcnNpb24gdXNlcyB0aGUgb2xkIGludCAkMHg4MCBtZXRob2QuCisgKgorICogTk9URToKKyAqIDEpIF9fa2VybmVsX3ZzeXNjYWxsIF9tdXN0XyBiZSBmaXJzdCBpbiB0aGlzIHBhZ2UuCisgKiAyKSB0aGVyZSBhcmUgYWxpZ25tZW50IGNvbnN0cmFpbnRzIG9uIHRoaXMgc3R1Yiwgc2VlIHZzeXNjYWxsLXNpZ3JldHVybi5TCisgKiAgICBmb3IgZGV0YWlscy4KKyAqLworCisJLnRleHQKKwkuZ2xvYmwgX19rZXJuZWxfdnN5c2NhbGwKKwkudHlwZSBfX2tlcm5lbF92c3lzY2FsbCxAZnVuY3Rpb24KK19fa2VybmVsX3ZzeXNjYWxsOgorLkxTVEFSVF92c3lzY2FsbDoKKwlpbnQgJDB4ODAKKwlyZXQKKy5MRU5EX3ZzeXNjYWxsOgorCS5zaXplIF9fa2VybmVsX3ZzeXNjYWxsLC4tLkxTVEFSVF92c3lzY2FsbAorCS5wcmV2aW91cworCisJLnNlY3Rpb24gLmVoX2ZyYW1lLCJhIixAcHJvZ2JpdHMKKy5MU1RBUlRGUkFNRURMU0k6CisJLmxvbmcgLkxFTkRDSUVETFNJLS5MU1RBUlRDSUVETFNJCisuTFNUQVJUQ0lFRExTSToKKwkubG9uZyAwCQkJLyogQ0lFIElEICovCisJLmJ5dGUgMQkJCS8qIFZlcnNpb24gbnVtYmVyICovCisJLnN0cmluZyAielIiCQkvKiBOVUwtdGVybWluYXRlZCBhdWdtZW50YXRpb24gc3RyaW5nICovCisJLnVsZWIxMjggMQkJLyogQ29kZSBhbGlnbm1lbnQgZmFjdG9yICovCisJLnNsZWIxMjggLTQJCS8qIERhdGEgYWxpZ25tZW50IGZhY3RvciAqLworCS5ieXRlIDgJCQkvKiBSZXR1cm4gYWRkcmVzcyByZWdpc3RlciBjb2x1bW4gKi8KKwkudWxlYjEyOCAxCQkvKiBBdWdtZW50YXRpb24gdmFsdWUgbGVuZ3RoICovCisJLmJ5dGUgMHgxYgkJLyogRFdfRUhfUEVfcGNyZWx8RFdfRUhfUEVfc2RhdGE0LiAqLworCS5ieXRlIDB4MGMJCS8qIERXX0NGQV9kZWZfY2ZhICovCisJLnVsZWIxMjggNAorCS51bGViMTI4IDQKKwkuYnl0ZSAweDg4CQkvKiBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHg4ICovCisJLnVsZWIxMjggMQorCS5hbGlnbiA0CisuTEVORENJRURMU0k6CisJLmxvbmcgLkxFTkRGREVETFNJLS5MU1RBUlRGREVETFNJIC8qIExlbmd0aCBGREUgKi8KKy5MU1RBUlRGREVETFNJOgorCS5sb25nIC5MU1RBUlRGREVETFNJLS5MU1RBUlRGUkFNRURMU0kgLyogQ0lFIHBvaW50ZXIgKi8KKwkubG9uZyAuTFNUQVJUX3ZzeXNjYWxsLS4JLyogUEMtcmVsYXRpdmUgc3RhcnQgYWRkcmVzcyAqLworCS5sb25nIC5MRU5EX3ZzeXNjYWxsLS5MU1RBUlRfdnN5c2NhbGwKKwkudWxlYjEyOCAwCisJLmFsaWduIDQKKy5MRU5ERkRFRExTSToKKwkucHJldmlvdXMKKworLyoKKyAqIEdldCB0aGUgY29tbW9uIGNvZGUgZm9yIHRoZSBzaWdyZXR1cm4gZW50cnkgcG9pbnRzLgorICovCisjaW5jbHVkZSAidnN5c2NhbGwtc2lncmV0dXJuLlMiCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3ZzeXNjYWxsLXNpZ3JldHVybi5TIGIvYXJjaC9pMzg2L2tlcm5lbC92c3lzY2FsbC1zaWdyZXR1cm4uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGZjZjc1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC92c3lzY2FsbC1zaWdyZXR1cm4uUwpAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIENvbW1vbiBjb2RlIGZvciB0aGUgc2lncmV0dXJuIGVudHJ5IHBvaW50cyBvbiB0aGUgdnN5c2NhbGwgcGFnZS4KKyAqIFNvIGZhciB0aGlzIGNvZGUgaXMgdGhlIHNhbWUgZm9yIGJvdGggaW50ODAgYW5kIHN5c2VudGVyIHZlcnNpb25zLgorICogVGhpcyBmaWxlIGlzICNpbmNsdWRlJ2QgYnkgdnN5c2NhbGwtKi5TIHRvIGRlZmluZSB0aGVtIGFmdGVyIHRoZQorICogdnN5c2NhbGwgZW50cnkgcG9pbnQuICBUaGUga2VybmVsIGFzc3VtZXMgdGhhdCB0aGUgYWRkcmVzc2VzIG9mIHRoZXNlCisgKiByb3V0aW5lcyBhcmUgY29uc3RhbnQgZm9yIGFsbCB2c3lzY2FsbCBpbXBsZW1lbnRhdGlvbnMuCisgKi8KKworI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKyNpbmNsdWRlIDxhc20vYXNtX29mZnNldHMuaD4KKworCisvKiBYWFgKKyAgIFNob3VsZCB0aGVzZSBiZSBuYW1lZCAiX3NpZ3RyYW1wIiBvciBzb21ldGhpbmc/CisqLworCisJLnRleHQKKwkub3JnCV9fa2VybmVsX3ZzeXNjYWxsKzMyCisJLmdsb2JsIF9fa2VybmVsX3NpZ3JldHVybgorCS50eXBlIF9fa2VybmVsX3NpZ3JldHVybixAZnVuY3Rpb24KK19fa2VybmVsX3NpZ3JldHVybjoKKy5MU1RBUlRfc2lncmV0dXJuOgorCXBvcGwgJWVheAkJLyogWFhYIGRvZXMgdGhpcyBtZWFuIGl0IG5lZWRzIHVud2luZCBpbmZvPyAqLworCW1vdmwgJF9fTlJfc2lncmV0dXJuLCAlZWF4CisJaW50ICQweDgwCisuTEVORF9zaWdyZXR1cm46CisJLnNpemUgX19rZXJuZWxfc2lncmV0dXJuLC4tLkxTVEFSVF9zaWdyZXR1cm4KKworCS5iYWxpZ24gMzIKKwkuZ2xvYmwgX19rZXJuZWxfcnRfc2lncmV0dXJuCisJLnR5cGUgX19rZXJuZWxfcnRfc2lncmV0dXJuLEBmdW5jdGlvbgorX19rZXJuZWxfcnRfc2lncmV0dXJuOgorLkxTVEFSVF9ydF9zaWdyZXR1cm46CisJbW92bCAkX19OUl9ydF9zaWdyZXR1cm4sICVlYXgKKwlpbnQgJDB4ODAKKy5MRU5EX3J0X3NpZ3JldHVybjoKKwkuc2l6ZSBfX2tlcm5lbF9ydF9zaWdyZXR1cm4sLi0uTFNUQVJUX3J0X3NpZ3JldHVybgorCS5wcmV2aW91cworCisJLnNlY3Rpb24gLmVoX2ZyYW1lLCJhIixAcHJvZ2JpdHMKKy5MU1RBUlRGUkFNRURMU0kxOgorCS5sb25nIC5MRU5EQ0lFRExTSTEtLkxTVEFSVENJRURMU0kxCisuTFNUQVJUQ0lFRExTSTE6CisJLmxvbmcgMAkJCS8qIENJRSBJRCAqLworCS5ieXRlIDEJCQkvKiBWZXJzaW9uIG51bWJlciAqLworCS5zdHJpbmcgInpSIgkJLyogTlVMLXRlcm1pbmF0ZWQgYXVnbWVudGF0aW9uIHN0cmluZyAqLworCS51bGViMTI4IDEJCS8qIENvZGUgYWxpZ25tZW50IGZhY3RvciAqLworCS5zbGViMTI4IC00CQkvKiBEYXRhIGFsaWdubWVudCBmYWN0b3IgKi8KKwkuYnl0ZSA4CQkJLyogUmV0dXJuIGFkZHJlc3MgcmVnaXN0ZXIgY29sdW1uICovCisJLnVsZWIxMjggMQkJLyogQXVnbWVudGF0aW9uIHZhbHVlIGxlbmd0aCAqLworCS5ieXRlIDB4MWIJCS8qIERXX0VIX1BFX3BjcmVsfERXX0VIX1BFX3NkYXRhNC4gKi8KKwkuYnl0ZSAwCQkJLyogRFdfQ0ZBX25vcCAqLworCS5hbGlnbiA0CisuTEVORENJRURMU0kxOgorCS5sb25nIC5MRU5ERkRFRExTSTEtLkxTVEFSVEZERURMU0kxIC8qIExlbmd0aCBGREUgKi8KKy5MU1RBUlRGREVETFNJMToKKwkubG9uZyAuTFNUQVJURkRFRExTSTEtLkxTVEFSVEZSQU1FRExTSTEgLyogQ0lFIHBvaW50ZXIgKi8KKwkvKiBIQUNLOiBUaGUgZHdhcmYyIHVud2luZCByb3V0aW5lcyB3aWxsIHN1YnRyYWN0IDEgZnJvbSB0aGUKKwkgICByZXR1cm4gYWRkcmVzcyB0byBnZXQgYW4gYWRkcmVzcyBpbiB0aGUgbWlkZGxlIG9mIHRoZQorCSAgIHByZXN1bWVkIGNhbGwgaW5zdHJ1Y3Rpb24uICBTaW5jZSB3ZSBkaWRuJ3QgZ2V0IGhlcmUgdmlhCisJICAgYSBjYWxsLCB3ZSBuZWVkIHRvIGluY2x1ZGUgdGhlIG5vcCBiZWZvcmUgdGhlIHJlYWwgc3RhcnQKKwkgICB0byBtYWtlIHVwIGZvciBpdC4gICovCisJLmxvbmcgLkxTVEFSVF9zaWdyZXR1cm4tMS0uCS8qIFBDLXJlbGF0aXZlIHN0YXJ0IGFkZHJlc3MgKi8KKwkubG9uZyAuTEVORF9zaWdyZXR1cm4tLkxTVEFSVF9zaWdyZXR1cm4rMQorCS51bGViMTI4IDAJCQkvKiBBdWdtZW50YXRpb24gKi8KKwkvKiBXaGF0IGZvbGxvd3MgYXJlIHRoZSBpbnN0cnVjdGlvbnMgZm9yIHRoZSB0YWJsZSBnZW5lcmF0aW9uLgorCSAgIFdlIHJlY29yZCB0aGUgbG9jYXRpb25zIG9mIGVhY2ggcmVnaXN0ZXIgc2F2ZWQuICBUaGlzIGlzCisJICAgY29tcGxpY2F0ZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgIkNGQSIgaXMgYWx3YXlzIGFzc3VtZWQgdG8KKwkgICBiZSB0aGUgdmFsdWUgb2YgdGhlIHN0YWNrIHBvaW50ZXIgaW4gdGhlIGNhbGxlci4gIFRoaXMgbWVhbnMKKwkgICB0aGF0IHdlIG11c3QgZGVmaW5lIHRoZSBDRkEgb2YgdGhpcyBib2R5IG9mIGNvZGUgdG8gYmUgdGhlCisJICAgc2F2ZWQgdmFsdWUgb2YgdGhlIHN0YWNrIHBvaW50ZXIgaW4gdGhlIHNpZ2NvbnRleHQuICBXaGljaAorCSAgIGFsc28gbWVhbnMgdGhhdCB0aGVyZSBpcyBubyBmaXhlZCByZWxhdGlvbiB0byB0aGUgb3RoZXIgCisJICAgc2F2ZWQgcmVnaXN0ZXJzLCB3aGljaCBtZWFucyB0aGF0IHdlIG11c3QgdXNlIERXX0NGQV9leHByZXNzaW9uCisJICAgdG8gY29tcHV0ZSB0aGVpciBhZGRyZXNzZXMuICBJdCBhbHNvIG1lYW5zIHRoYXQgd2hlbiB3ZSAKKwkgICBhZGp1c3QgdGhlIHN0YWNrIHdpdGggdGhlIHBvcGwsIHdlIGhhdmUgdG8gZG8gaXQgYWxsIG92ZXIgYWdhaW4uICAqLworCisjZGVmaW5lIGRvX2NmYV9leHByKG9mZnNldCkJCQkJCQlcCisJLmJ5dGUgMHgwZjsJCQkvKiBEV19DRkFfZGVmX2NmYV9leHByZXNzaW9uICovCVwKKwkudWxlYjEyOCAxZi0wZjsJCQkvKiAgIGxlbmd0aCAqLwkJCVwKKzA6CS5ieXRlIDB4NzQ7CQkJLyogICAgIERXX09QX2JyZWc0ICovCQlcCisJLnNsZWIxMjggb2Zmc2V0OwkJLyogICAgICBvZmZzZXQgKi8JCVwKKwkuYnl0ZSAweDA2OwkJCS8qICAgICBEV19PUF9kZXJlZiAqLwkJXAorMToKKworI2RlZmluZSBkb19leHByKHJlZ25vLCBvZmZzZXQpCQkJCQkJXAorCS5ieXRlIDB4MTA7CQkJLyogRFdfQ0ZBX2V4cHJlc3Npb24gKi8JCVwKKwkudWxlYjEyOCByZWdubzsJCQkvKiAgIHJlZ25vICovCQkJXAorCS51bGViMTI4IDFmLTBmOwkJCS8qICAgbGVuZ3RoICovCQkJXAorMDoJLmJ5dGUgMHg3NDsJCQkvKiAgICAgRFdfT1BfYnJlZzQgKi8JCVwKKwkuc2xlYjEyOCBvZmZzZXQ7CQkvKiAgICAgICBvZmZzZXQgKi8JCVwKKzE6CisKKwlkb19jZmFfZXhwcihTSUdDT05URVhUX2VzcCs0KQorCWRvX2V4cHIoMCwgU0lHQ09OVEVYVF9lYXgrNCkKKwlkb19leHByKDEsIFNJR0NPTlRFWFRfZWN4KzQpCisJZG9fZXhwcigyLCBTSUdDT05URVhUX2VkeCs0KQorCWRvX2V4cHIoMywgU0lHQ09OVEVYVF9lYngrNCkKKwlkb19leHByKDUsIFNJR0NPTlRFWFRfZWJwKzQpCisJZG9fZXhwcig2LCBTSUdDT05URVhUX2VzaSs0KQorCWRvX2V4cHIoNywgU0lHQ09OVEVYVF9lZGkrNCkKKwlkb19leHByKDgsIFNJR0NPTlRFWFRfZWlwKzQpCisKKwkuYnl0ZSAweDQyCS8qIERXX0NGQV9hZHZhbmNlX2xvYyAyIC0tIG5vcDsgcG9wbCBlYXguICovCisKKwlkb19jZmFfZXhwcihTSUdDT05URVhUX2VzcCkKKwlkb19leHByKDAsIFNJR0NPTlRFWFRfZWF4KQorCWRvX2V4cHIoMSwgU0lHQ09OVEVYVF9lY3gpCisJZG9fZXhwcigyLCBTSUdDT05URVhUX2VkeCkKKwlkb19leHByKDMsIFNJR0NPTlRFWFRfZWJ4KQorCWRvX2V4cHIoNSwgU0lHQ09OVEVYVF9lYnApCisJZG9fZXhwcig2LCBTSUdDT05URVhUX2VzaSkKKwlkb19leHByKDcsIFNJR0NPTlRFWFRfZWRpKQorCWRvX2V4cHIoOCwgU0lHQ09OVEVYVF9laXApCisKKwkuYWxpZ24gNAorLkxFTkRGREVETFNJMToKKworCS5sb25nIC5MRU5ERkRFRExTSTItLkxTVEFSVEZERURMU0kyIC8qIExlbmd0aCBGREUgKi8KKy5MU1RBUlRGREVETFNJMjoKKwkubG9uZyAuTFNUQVJURkRFRExTSTItLkxTVEFSVEZSQU1FRExTSTEgLyogQ0lFIHBvaW50ZXIgKi8KKwkvKiBIQUNLOiBTZWUgYWJvdmUgd3J0IHVud2luZCBsaWJyYXJ5IGFzc3VtcHRpb25zLiAgKi8KKwkubG9uZyAuTFNUQVJUX3J0X3NpZ3JldHVybi0xLS4JLyogUEMtcmVsYXRpdmUgc3RhcnQgYWRkcmVzcyAqLworCS5sb25nIC5MRU5EX3J0X3NpZ3JldHVybi0uTFNUQVJUX3J0X3NpZ3JldHVybisxCisJLnVsZWIxMjggMAkJCS8qIEF1Z21lbnRhdGlvbiAqLworCS8qIFdoYXQgZm9sbG93cyBhcmUgdGhlIGluc3RydWN0aW9ucyBmb3IgdGhlIHRhYmxlIGdlbmVyYXRpb24uCisJICAgV2UgcmVjb3JkIHRoZSBsb2NhdGlvbnMgb2YgZWFjaCByZWdpc3RlciBzYXZlZC4gIFRoaXMgaXMKKwkgICBzbGlnaHRseSBsZXNzIGNvbXBsaWNhdGVkIHRoYW4gdGhlIGFib3ZlLCBzaW5jZSB3ZSBkb24ndAorCSAgIG1vZGlmeSB0aGUgc3RhY2sgcG9pbnRlciBpbiB0aGUgcHJvY2Vzcy4gICovCisKKwlkb19jZmFfZXhwcihSVF9TSUdGUkFNRV9zaWdjb250ZXh0LTQgKyBTSUdDT05URVhUX2VzcCkKKwlkb19leHByKDAsIFJUX1NJR0ZSQU1FX3NpZ2NvbnRleHQtNCArIFNJR0NPTlRFWFRfZWF4KQorCWRvX2V4cHIoMSwgUlRfU0lHRlJBTUVfc2lnY29udGV4dC00ICsgU0lHQ09OVEVYVF9lY3gpCisJZG9fZXhwcigyLCBSVF9TSUdGUkFNRV9zaWdjb250ZXh0LTQgKyBTSUdDT05URVhUX2VkeCkKKwlkb19leHByKDMsIFJUX1NJR0ZSQU1FX3NpZ2NvbnRleHQtNCArIFNJR0NPTlRFWFRfZWJ4KQorCWRvX2V4cHIoNSwgUlRfU0lHRlJBTUVfc2lnY29udGV4dC00ICsgU0lHQ09OVEVYVF9lYnApCisJZG9fZXhwcig2LCBSVF9TSUdGUkFNRV9zaWdjb250ZXh0LTQgKyBTSUdDT05URVhUX2VzaSkKKwlkb19leHByKDcsIFJUX1NJR0ZSQU1FX3NpZ2NvbnRleHQtNCArIFNJR0NPTlRFWFRfZWRpKQorCWRvX2V4cHIoOCwgUlRfU0lHRlJBTUVfc2lnY29udGV4dC00ICsgU0lHQ09OVEVYVF9laXApCisKKwkuYWxpZ24gNAorLkxFTkRGREVETFNJMjoKKwkucHJldmlvdXMKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdnN5c2NhbGwtc3lzZW50ZXIuUyBiL2FyY2gvaTM4Ni9rZXJuZWwvdnN5c2NhbGwtc3lzZW50ZXIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGFlZmIyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC92c3lzY2FsbC1zeXNlbnRlci5TCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29kZSBmb3IgdGhlIHZzeXNjYWxsIHBhZ2UuICBUaGlzIHZlcnNpb24gdXNlcyB0aGUgc3lzZW50ZXIgaW5zdHJ1Y3Rpb24uCisgKgorICogTk9URToKKyAqIDEpIF9fa2VybmVsX3ZzeXNjYWxsIF9tdXN0XyBiZSBmaXJzdCBpbiB0aGlzIHBhZ2UuCisgKiAyKSB0aGVyZSBhcmUgYWxpZ25tZW50IGNvbnN0cmFpbnRzIG9uIHRoaXMgc3R1Yiwgc2VlIHZzeXNjYWxsLXNpZ3JldHVybi5TCisgKiAgICBmb3IgZGV0YWlscy4KKyAqLworCisJLnRleHQKKwkuZ2xvYmwgX19rZXJuZWxfdnN5c2NhbGwKKwkudHlwZSBfX2tlcm5lbF92c3lzY2FsbCxAZnVuY3Rpb24KK19fa2VybmVsX3ZzeXNjYWxsOgorLkxTVEFSVF92c3lzY2FsbDoKKwlwdXNoICVlY3gKKy5McHVzaF9lY3g6CisJcHVzaCAlZWR4CisuTHB1c2hfZWR4OgorCXB1c2ggJWVicAorLkxlbnRlcl9rZXJuZWw6CisJbW92bCAlZXNwLCVlYnAKKwlzeXNlbnRlcgorCisJLyogNzogYWxpZ24gcmV0dXJuIHBvaW50IHdpdGggbm9wJ3MgdG8gbWFrZSBkaXNhc3NlbWJseSBlYXNpZXIgKi8KKwkuc3BhY2UgNywweDkwCisKKwkvKiAxNDogU3lzdGVtIGNhbGwgcmVzdGFydCBwb2ludCBpcyBoZXJlISAoU1lTRU5URVJfUkVUVVJOIC0gMikgKi8KKwlqbXAgLkxlbnRlcl9rZXJuZWwKKwkvKiAxNjogU3lzdGVtIGNhbGwgbm9ybWFsIHJldHVybiBwb2ludCBpcyBoZXJlISAqLworCS5nbG9ibCBTWVNFTlRFUl9SRVRVUk4JLyogU3ltYm9sIHVzZWQgYnkgZW50cnkuUy4gICovCitTWVNFTlRFUl9SRVRVUk46CisJcG9wICVlYnAKKy5McG9wX2VicDoKKwlwb3AgJWVkeAorLkxwb3BfZWR4OgorCXBvcCAlZWN4CisuTHBvcF9lY3g6CisJcmV0CisuTEVORF92c3lzY2FsbDoKKwkuc2l6ZSBfX2tlcm5lbF92c3lzY2FsbCwuLS5MU1RBUlRfdnN5c2NhbGwKKwkucHJldmlvdXMKKworCS5zZWN0aW9uIC5laF9mcmFtZSwiYSIsQHByb2diaXRzCisuTFNUQVJURlJBTUVETFNJOgorCS5sb25nIC5MRU5EQ0lFRExTSS0uTFNUQVJUQ0lFRExTSQorLkxTVEFSVENJRURMU0k6CisJLmxvbmcgMAkJCS8qIENJRSBJRCAqLworCS5ieXRlIDEJCQkvKiBWZXJzaW9uIG51bWJlciAqLworCS5zdHJpbmcgInpSIgkJLyogTlVMLXRlcm1pbmF0ZWQgYXVnbWVudGF0aW9uIHN0cmluZyAqLworCS51bGViMTI4IDEJCS8qIENvZGUgYWxpZ25tZW50IGZhY3RvciAqLworCS5zbGViMTI4IC00CQkvKiBEYXRhIGFsaWdubWVudCBmYWN0b3IgKi8KKwkuYnl0ZSA4CQkJLyogUmV0dXJuIGFkZHJlc3MgcmVnaXN0ZXIgY29sdW1uICovCisJLnVsZWIxMjggMQkJLyogQXVnbWVudGF0aW9uIHZhbHVlIGxlbmd0aCAqLworCS5ieXRlIDB4MWIJCS8qIERXX0VIX1BFX3BjcmVsfERXX0VIX1BFX3NkYXRhNC4gKi8KKwkuYnl0ZSAweDBjCQkvKiBEV19DRkFfZGVmX2NmYSAqLworCS51bGViMTI4IDQKKwkudWxlYjEyOCA0CisJLmJ5dGUgMHg4OAkJLyogRFdfQ0ZBX29mZnNldCwgY29sdW1uIDB4OCAqLworCS51bGViMTI4IDEKKwkuYWxpZ24gNAorLkxFTkRDSUVETFNJOgorCS5sb25nIC5MRU5ERkRFRExTSS0uTFNUQVJURkRFRExTSSAvKiBMZW5ndGggRkRFICovCisuTFNUQVJURkRFRExTSToKKwkubG9uZyAuTFNUQVJURkRFRExTSS0uTFNUQVJURlJBTUVETFNJIC8qIENJRSBwb2ludGVyICovCisJLmxvbmcgLkxTVEFSVF92c3lzY2FsbC0uCS8qIFBDLXJlbGF0aXZlIHN0YXJ0IGFkZHJlc3MgKi8KKwkubG9uZyAuTEVORF92c3lzY2FsbC0uTFNUQVJUX3ZzeXNjYWxsCisJLnVsZWIxMjggMAorCS8qIFdoYXQgZm9sbG93cyBhcmUgdGhlIGluc3RydWN0aW9ucyBmb3IgdGhlIHRhYmxlIGdlbmVyYXRpb24uCisJICAgV2UgaGF2ZSB0byByZWNvcmQgYWxsIGNoYW5nZXMgb2YgdGhlIHN0YWNrIHBvaW50ZXIuICAqLworCS5ieXRlIDB4MDQJCS8qIERXX0NGQV9hZHZhbmNlX2xvYzQgKi8KKwkubG9uZyAuTHB1c2hfZWN4LS5MU1RBUlRfdnN5c2NhbGwKKwkuYnl0ZSAweDBlCQkvKiBEV19DRkFfZGVmX2NmYV9vZmZzZXQgKi8KKwkuYnl0ZSAweDA4CQkvKiBSQSBhdCBvZmZzZXQgOCBub3cgKi8KKwkuYnl0ZSAweDA0CQkvKiBEV19DRkFfYWR2YW5jZV9sb2M0ICovCisJLmxvbmcgLkxwdXNoX2VkeC0uTHB1c2hfZWN4CisJLmJ5dGUgMHgwZQkJLyogRFdfQ0ZBX2RlZl9jZmFfb2Zmc2V0ICovCisJLmJ5dGUgMHgwYwkJLyogUkEgYXQgb2Zmc2V0IDEyIG5vdyAqLworCS5ieXRlIDB4MDQJCS8qIERXX0NGQV9hZHZhbmNlX2xvYzQgKi8KKwkubG9uZyAuTGVudGVyX2tlcm5lbC0uTHB1c2hfZWR4CisJLmJ5dGUgMHgwZQkJLyogRFdfQ0ZBX2RlZl9jZmFfb2Zmc2V0ICovCisJLmJ5dGUgMHgxMAkJLyogUkEgYXQgb2Zmc2V0IDE2IG5vdyAqLworCS5ieXRlIDB4ODUsIDB4MDQJLyogRFdfQ0ZBX29mZnNldCAlZWJwIC0xNiAqLworCS8qIEZpbmFsbHkgdGhlIGVwaWxvZ3VlLiAgKi8KKwkuYnl0ZSAweDA0CQkvKiBEV19DRkFfYWR2YW5jZV9sb2M0ICovCisJLmxvbmcgLkxwb3BfZWJwLS5MZW50ZXJfa2VybmVsCisJLmJ5dGUgMHgwZQkJLyogRFdfQ0ZBX2RlZl9jZmFfb2Zmc2V0ICovCisJLmJ5dGUgMHgwYwkJLyogUkEgYXQgb2Zmc2V0IDEyIG5vdyAqLworCS5ieXRlIDB4YzUJCS8qIERXX0NGQV9yZXN0b3JlICVlYnAgKi8KKwkuYnl0ZSAweDA0CQkvKiBEV19DRkFfYWR2YW5jZV9sb2M0ICovCisJLmxvbmcgLkxwb3BfZWR4LS5McG9wX2VicAorCS5ieXRlIDB4MGUJCS8qIERXX0NGQV9kZWZfY2ZhX29mZnNldCAqLworCS5ieXRlIDB4MDgJCS8qIFJBIGF0IG9mZnNldCA4IG5vdyAqLworCS5ieXRlIDB4MDQJCS8qIERXX0NGQV9hZHZhbmNlX2xvYzQgKi8KKwkubG9uZyAuTHBvcF9lY3gtLkxwb3BfZWR4CisJLmJ5dGUgMHgwZQkJLyogRFdfQ0ZBX2RlZl9jZmFfb2Zmc2V0ICovCisJLmJ5dGUgMHgwNAkJLyogUkEgYXQgb2Zmc2V0IDQgbm93ICovCisJLmFsaWduIDQKKy5MRU5ERkRFRExTSToKKwkucHJldmlvdXMKKworLyoKKyAqIEdldCB0aGUgY29tbW9uIGNvZGUgZm9yIHRoZSBzaWdyZXR1cm4gZW50cnkgcG9pbnRzLgorICovCisjaW5jbHVkZSAidnN5c2NhbGwtc2lncmV0dXJuLlMiCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3ZzeXNjYWxsLlMgYi9hcmNoL2kzODYva2VybmVsL3ZzeXNjYWxsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQwMzg5MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdnN5c2NhbGwuUwpAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCitfX0lOSVREQVRBCisKKwkuZ2xvYmwgdnN5c2NhbGxfaW50ODBfc3RhcnQsIHZzeXNjYWxsX2ludDgwX2VuZAordnN5c2NhbGxfaW50ODBfc3RhcnQ6CisJLmluY2JpbiAiYXJjaC9pMzg2L2tlcm5lbC92c3lzY2FsbC1pbnQ4MC5zbyIKK3ZzeXNjYWxsX2ludDgwX2VuZDoKKworCS5nbG9ibCB2c3lzY2FsbF9zeXNlbnRlcl9zdGFydCwgdnN5c2NhbGxfc3lzZW50ZXJfZW5kCit2c3lzY2FsbF9zeXNlbnRlcl9zdGFydDoKKwkuaW5jYmluICJhcmNoL2kzODYva2VybmVsL3ZzeXNjYWxsLXN5c2VudGVyLnNvIgordnN5c2NhbGxfc3lzZW50ZXJfZW5kOgorCitfX0ZJTklUCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3ZzeXNjYWxsLmxkcy5TIGIvYXJjaC9pMzg2L2tlcm5lbC92c3lzY2FsbC5sZHMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTgzMjlkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC92c3lzY2FsbC5sZHMuUwpAQCAtMCwwICsxLDY1IEBACisvKgorICogTGlua2VyIHNjcmlwdCBmb3IgdnN5c2NhbGwgRFNPLiAgVGhlIHZzeXNjYWxsIHBhZ2UgaXMgYW4gRUxGIHNoYXJlZAorICogb2JqZWN0IHByZWxpbmtlZCB0byBpdHMgdmlydHVhbCBhZGRyZXNzLCBhbmQgd2l0aCBvbmx5IG9uZSByZWFkLW9ubHkKKyAqIHNlZ21lbnQgKHRoYXQgZml0cyBpbiBvbmUgcGFnZSkuICBUaGlzIHNjcmlwdCBjb250cm9scyBpdHMgbGF5b3V0LgorICovCisjaW5jbHVkZSA8YXNtL2FzbV9vZmZzZXRzLmg+CisKK1NFQ1RJT05TCit7CisgIC4gPSBWU1lTQ0FMTF9CQVNFICsgU0laRU9GX0hFQURFUlM7CisKKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CQk6dGV4dAorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKworICAvKiBUaGlzIGxpbmtlciBzY3JpcHQgaXMgdXNlZCBib3RoIHdpdGggLXIgYW5kIHdpdGggLXNoYXJlZC4KKyAgICAgRm9yIHRoZSBsYXlvdXRzIHRvIG1hdGNoLCB3ZSBuZWVkIHRvIHNraXAgbW9yZSB0aGFuIGVub3VnaAorICAgICBzcGFjZSBmb3IgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIGV0IGFsLiAgSWYgdGhpcyBhbW91bnQKKyAgICAgaXMgaW5zdWZmaWNpZW50LCBsZCAtc2hhcmVkIHdpbGwgYmFyZi4gIEp1c3QgaW5jcmVhc2UgaXQgaGVyZS4gICovCisgIC4gPSBWU1lTQ0FMTF9CQVNFICsgMHg0MDA7CisKKyAgLnRleHQgICAgICAgICAgIDogeyAqKC50ZXh0KSB9CQk6dGV4dCA9MHg5MDkwOTA5MAorCisgIC5laF9mcmFtZV9oZHIgICA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CTp0ZXh0IDplaF9mcmFtZV9oZHIKKyAgLmVoX2ZyYW1lICAgICAgIDogeyBLRUVQICgqKC5laF9mcmFtZSkpIH0JOnRleHQKKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CQk6dGV4dCA6ZHluYW1pYworICAudXNlbGVzcyAgICAgICAgOiB7CisgIAkqKC5nb3QucGx0KSAqKC5nb3QpCisJKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorCSooLmR5bmJzcykKKwkqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICB9CQkJCQkJOnRleHQKK30KKworLyoKKyAqIFdlIG11c3Qgc3VwcGx5IHRoZSBFTEYgcHJvZ3JhbSBoZWFkZXJzIGV4cGxpY2l0bHkgdG8gZ2V0IGp1c3Qgb25lCisgKiBQVF9MT0FEIHNlZ21lbnQsIGFuZCBzZXQgdGhlIGZsYWdzIGV4cGxpY2l0bHkgdG8gbWFrZSBzZWdtZW50cyByZWFkLW9ubHkuCisgKi8KK1BIRFJTCit7CisgIHRleHQgUFRfTE9BRCBGSUxFSERSIFBIRFJTIEZMQUdTKDUpOyAvKiBQRl9SfFBGX1ggKi8KKyAgZHluYW1pYyBQVF9EWU5BTUlDIEZMQUdTKDQpOyAvKiBQRl9SICovCisgIGVoX2ZyYW1lX2hkciAweDY0NzRlNTUwOyAvKiBQVF9HTlVfRUhfRlJBTUUsIGJ1dCBsZCBkb2Vzbid0IG1hdGNoIHRoZSBuYW1lICovCit9CisKKy8qCisgKiBUaGlzIGNvbnRyb2xzIHdoYXQgc3ltYm9scyB3ZSBleHBvcnQgZnJvbSB0aGUgRFNPLgorICovCitWRVJTSU9OCit7CisgIExJTlVYXzIuNSB7CisgICAgZ2xvYmFsOgorICAgIAlfX2tlcm5lbF92c3lzY2FsbDsKKyAgICAJX19rZXJuZWxfc2lncmV0dXJuOworICAgIAlfX2tlcm5lbF9ydF9zaWdyZXR1cm47CisKKyAgICBsb2NhbDogKjsKKyAgfTsKK30KKworLyogVGhlIEVMRiBlbnRyeSBwb2ludCBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIEFUX1NZU0lORk8gdmFsdWUuICAqLworRU5UUlkoX19rZXJuZWxfdnN5c2NhbGwpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2xpYi9NYWtlZmlsZSBiL2FyY2gvaTM4Ni9saWIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IxOTMyZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9saWIvTWFrZWZpbGUKQEAgLTAsMCArMSwxMCBAQAorIworIyBNYWtlZmlsZSBmb3IgaTM4Ni1zcGVjaWZpYyBsaWJyYXJ5IGZpbGVzLi4KKyMKKworCitsaWIteSA9IGNoZWNrc3VtLm8gZGVsYXkubyB1c2VyY29weS5vIGdldHVzZXIubyBwdXR1c2VyLm8gbWVtY3B5Lm8gc3Ryc3RyLm8gXAorCWJpdG9wcy5vCisKK2xpYi0kKENPTkZJR19YODZfVVNFXzNETk9XKSArPSBtbXgubworbGliLSQoQ09ORklHX0hBVkVfREVDX0xPQ0spICs9IGRlY19hbmRfbG9jay5vCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbGliL2JpdG9wcy5jIGIvYXJjaC9pMzg2L2xpYi9iaXRvcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2RiMzg1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2xpYi9iaXRvcHMuYwpAQCAtMCwwICsxLDcwIEBACisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKy8qKgorICogZmluZF9uZXh0X2JpdCAtIGZpbmQgdGhlIGZpcnN0IHNldCBiaXQgaW4gYSBtZW1vcnkgcmVnaW9uCisgKiBAYWRkcjogVGhlIGFkZHJlc3MgdG8gYmFzZSB0aGUgc2VhcmNoIG9uCisgKiBAb2Zmc2V0OiBUaGUgYml0bnVtYmVyIHRvIHN0YXJ0IHNlYXJjaGluZyBhdAorICogQHNpemU6IFRoZSBtYXhpbXVtIHNpemUgdG8gc2VhcmNoCisgKi8KK2ludCBmaW5kX25leHRfYml0KGNvbnN0IHVuc2lnbmVkIGxvbmcgKmFkZHIsIGludCBzaXplLCBpbnQgb2Zmc2V0KQoreworCWNvbnN0IHVuc2lnbmVkIGxvbmcgKnAgPSBhZGRyICsgKG9mZnNldCA+PiA1KTsKKwlpbnQgc2V0ID0gMCwgYml0ID0gb2Zmc2V0ICYgMzEsIHJlczsKKworCWlmIChiaXQpIHsKKwkJLyoKKwkJICogTG9vayBmb3Igbm9uemVybyBpbiB0aGUgZmlyc3QgMzIgYml0czoKKwkJICovCisJCV9fYXNtX18oImJzZmwgJTEsJTBcblx0IgorCQkJImpuZSAxZlxuXHQiCisJCQkibW92bCAkMzIsICUwXG4iCisJCQkiMToiCisJCQk6ICI9ciIgKHNldCkKKwkJCTogInIiICgqcCA+PiBiaXQpKTsKKwkJaWYgKHNldCA8ICgzMiAtIGJpdCkpCisJCQlyZXR1cm4gc2V0ICsgb2Zmc2V0OworCQlzZXQgPSAzMiAtIGJpdDsKKwkJcCsrOworCX0KKwkvKgorCSAqIE5vIHNldCBiaXQgeWV0LCBzZWFyY2ggcmVtYWluaW5nIGZ1bGwgd29yZHMgZm9yIGEgYml0CisJICovCisJcmVzID0gZmluZF9maXJzdF9iaXQgKHAsIHNpemUgLSAzMiAqIChwIC0gYWRkcikpOworCXJldHVybiAob2Zmc2V0ICsgc2V0ICsgcmVzKTsKK30KK0VYUE9SVF9TWU1CT0woZmluZF9uZXh0X2JpdCk7CisKKy8qKgorICogZmluZF9uZXh0X3plcm9fYml0IC0gZmluZCB0aGUgZmlyc3QgemVybyBiaXQgaW4gYSBtZW1vcnkgcmVnaW9uCisgKiBAYWRkcjogVGhlIGFkZHJlc3MgdG8gYmFzZSB0aGUgc2VhcmNoIG9uCisgKiBAb2Zmc2V0OiBUaGUgYml0bnVtYmVyIHRvIHN0YXJ0IHNlYXJjaGluZyBhdAorICogQHNpemU6IFRoZSBtYXhpbXVtIHNpemUgdG8gc2VhcmNoCisgKi8KK2ludCBmaW5kX25leHRfemVyb19iaXQoY29uc3QgdW5zaWduZWQgbG9uZyAqYWRkciwgaW50IHNpemUsIGludCBvZmZzZXQpCit7CisJdW5zaWduZWQgbG9uZyAqIHAgPSAoKHVuc2lnbmVkIGxvbmcgKikgYWRkcikgKyAob2Zmc2V0ID4+IDUpOworCWludCBzZXQgPSAwLCBiaXQgPSBvZmZzZXQgJiAzMSwgcmVzOworCisJaWYgKGJpdCkgeworCQkvKgorCQkgKiBMb29rIGZvciB6ZXJvIGluIHRoZSBmaXJzdCAzMiBiaXRzLgorCQkgKi8KKwkJX19hc21fXygiYnNmbCAlMSwlMFxuXHQiCisJCQkiam5lIDFmXG5cdCIKKwkJCSJtb3ZsICQzMiwgJTBcbiIKKwkJCSIxOiIKKwkJCTogIj1yIiAoc2V0KQorCQkJOiAiciIgKH4oKnAgPj4gYml0KSkpOworCQlpZiAoc2V0IDwgKDMyIC0gYml0KSkKKwkJCXJldHVybiBzZXQgKyBvZmZzZXQ7CisJCXNldCA9IDMyIC0gYml0OworCQlwKys7CisJfQorCS8qCisJICogTm8gemVybyB5ZXQsIHNlYXJjaCByZW1haW5pbmcgZnVsbCBieXRlcyBmb3IgYSB6ZXJvCisJICovCisJcmVzID0gZmluZF9maXJzdF96ZXJvX2JpdCAocCwgc2l6ZSAtIDMyICogKHAgLSAodW5zaWduZWQgbG9uZyAqKSBhZGRyKSk7CisJcmV0dXJuIChvZmZzZXQgKyBzZXQgKyByZXMpOworfQorRVhQT1JUX1NZTUJPTChmaW5kX25leHRfemVyb19iaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2xpYi9jaGVja3N1bS5TIGIvYXJjaC9pMzg2L2xpYi9jaGVja3N1bS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0Yzc4NjcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbGliL2NoZWNrc3VtLlMKQEAgLTAsMCArMSw0OTYgQEAKKy8qCisgKiBJTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqCQlvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqCQlpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKgkJSVAvVENQL1VEUCBjaGVja3N1bW1pbmcgcm91dGluZXMKKyAqCisgKiBBdXRob3JzOglKb3JnZSBDd2lrLCA8am9yZ2VAbGFzZXIuc2F0bGluay5uZXQ+CisgKgkJQXJudCBHdWxicmFuZHNlbiwgPGFndWxicmFAbnZnLnVuaXQubm8+CisgKgkJVG9tIE1heSwgPGZ0b21AbmV0Y29tLmNvbT4KKyAqICAgICAgICAgICAgICBQZW50aXVtIFByby9JSSByb3V0aW5lczoKKyAqICAgICAgICAgICAgICBBbGV4YW5kZXIgS2plbGRhYXMgPGFzdG9yQGd1YXJkaWFuLm5vPgorICogICAgICAgICAgICAgIEZpbm4gQXJuZSBHYW5nc3RhZCA8ZmlubmFnQGd1YXJkaWFuLm5vPgorICoJCUxvdHMgb2YgY29kZSBtb3ZlZCBmcm9tIHRjcC5jIGFuZCBpcC5jOyBzZWUgdGhvc2UgZmlsZXMKKyAqCQlmb3IgbW9yZSBuYW1lcy4KKyAqCisgKiBDaGFuZ2VzOiAgICAgSW5nbyBNb2xuYXIsIGNvbnZlcnRlZCBjc3VtX3BhcnRpYWxfY29weSgpIHRvIDIuMSBleGNlcHRpb24KKyAqCQkJICAgICBoYW5kbGluZy4KKyAqCQlBbmRpIEtsZWVuLCAgYWRkIHplcm9pbmcgb24gZXJyb3IKKyAqICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCB0byBwdXJlIGFzc2VtYmxlcgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKwkJCQkKKy8qCisgKiBjb21wdXRlcyBhIHBhcnRpYWwgY2hlY2tzdW0sIGUuZy4gZm9yIFRDUC9VRFAgZnJhZ21lbnRzCisgKi8KKworLyoJCit1bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtKQorICovCisJCQorLnRleHQKKy5hbGlnbiA0CisuZ2xvYmwgY3N1bV9wYXJ0aWFsCQkJCQkJCQkKKwkJCisjaWZuZGVmIENPTkZJR19YODZfVVNFX1BQUk9fQ0hFQ0tTVU0KKworCSAgLyoJCQorCSAgICogRXhwZXJpbWVudHMgd2l0aCBFdGhlcm5ldCBhbmQgU0xJUCBjb25uZWN0aW9ucyBzaG93IHRoYXQgYnVmZgorCSAgICogaXMgYWxpZ25lZCBvbiBlaXRoZXIgYSAyLWJ5dGUgb3IgNC1ieXRlIGJvdW5kYXJ5LiAgV2UgZ2V0IGF0CisJICAgKiBsZWFzdCBhIHR3b2ZvbGQgc3BlZWR1cCBvbiA0ODYgYW5kIFBlbnRpdW0gaWYgaXQgaXMgNC1ieXRlIGFsaWduZWQuCisJICAgKiBGb3J0dW5hdGVseSwgaXQgaXMgZWFzeSB0byBjb252ZXJ0IDItYnl0ZSBhbGlnbm1lbnQgdG8gNC1ieXRlCisJICAgKiBhbGlnbm1lbnQgZm9yIHRoZSB1bnJvbGxlZCBsb29wLgorCSAgICovCQkKK2NzdW1fcGFydGlhbDoJCisJcHVzaGwgJWVzaQorCXB1c2hsICVlYngKKwltb3ZsIDIwKCVlc3ApLCVlYXgJIyBGdW5jdGlvbiBhcmc6IHVuc2lnbmVkIGludCBzdW0KKwltb3ZsIDE2KCVlc3ApLCVlY3gJIyBGdW5jdGlvbiBhcmc6IGludCBsZW4KKwltb3ZsIDEyKCVlc3ApLCVlc2kJIyBGdW5jdGlvbiBhcmc6IHVuc2lnbmVkIGNoYXIgKmJ1ZmYKKwl0ZXN0bCAkMywgJWVzaQkJIyBDaGVjayBhbGlnbm1lbnQuCisJanogMmYJCQkjIEp1bXAgaWYgYWxpZ25tZW50IGlzIG9rLgorCXRlc3RsICQxLCAlZXNpCQkjIENoZWNrIGFsaWdubWVudC4KKwlqeiAxMGYJCQkjIEp1bXAgaWYgYWxpZ25tZW50IGlzIGJvdW5kYXJ5IG9mIDJieXRlcy4KKworCSMgYnVmIGlzIG9kZAorCWRlYyAlZWN4CisJamwgOGYKKwltb3Z6YmwgKCVlc2kpLCAlZWJ4CisJYWRjbCAlZWJ4LCAlZWF4CisJcm9sbCAkOCwgJWVheAorCWluYyAlZXNpCisJdGVzdGwgJDIsICVlc2kKKwlqeiAyZgorMTA6CisJc3VibCAkMiwgJWVjeAkJIyBBbGlnbm1lbnQgdXNlcyB1cCB0d28gYnl0ZXMuCisJamFlIDFmCQkJIyBKdW1wIGlmIHdlIGhhZCBhdCBsZWFzdCB0d28gYnl0ZXMuCisJYWRkbCAkMiwgJWVjeAkJIyBlY3ggd2FzIDwgMi4gIERlYWwgd2l0aCBpdC4KKwlqbXAgNGYKKzE6CW1vdncgKCVlc2kpLCAlYngKKwlhZGRsICQyLCAlZXNpCisJYWRkdyAlYngsICVheAorCWFkY2wgJDAsICVlYXgKKzI6CisJbW92bCAlZWN4LCAlZWR4CisJc2hybCAkNSwgJWVjeAorCWp6IDJmCisJdGVzdGwgJWVzaSwgJWVzaQorMToJbW92bCAoJWVzaSksICVlYngKKwlhZGNsICVlYngsICVlYXgKKwltb3ZsIDQoJWVzaSksICVlYngKKwlhZGNsICVlYngsICVlYXgKKwltb3ZsIDgoJWVzaSksICVlYngKKwlhZGNsICVlYngsICVlYXgKKwltb3ZsIDEyKCVlc2kpLCAlZWJ4CisJYWRjbCAlZWJ4LCAlZWF4CisJbW92bCAxNiglZXNpKSwgJWVieAorCWFkY2wgJWVieCwgJWVheAorCW1vdmwgMjAoJWVzaSksICVlYngKKwlhZGNsICVlYngsICVlYXgKKwltb3ZsIDI0KCVlc2kpLCAlZWJ4CisJYWRjbCAlZWJ4LCAlZWF4CisJbW92bCAyOCglZXNpKSwgJWVieAorCWFkY2wgJWVieCwgJWVheAorCWxlYSAzMiglZXNpKSwgJWVzaQorCWRlYyAlZWN4CisJam5lIDFiCisJYWRjbCAkMCwgJWVheAorMjoJbW92bCAlZWR4LCAlZWN4CisJYW5kbCAkMHgxYywgJWVkeAorCWplIDRmCisJc2hybCAkMiwgJWVkeAkJIyBUaGlzIGNsZWFycyBDRgorMzoJYWRjbCAoJWVzaSksICVlYXgKKwlsZWEgNCglZXNpKSwgJWVzaQorCWRlYyAlZWR4CisJam5lIDNiCisJYWRjbCAkMCwgJWVheAorNDoJYW5kbCAkMywgJWVjeAorCWp6IDdmCisJY21wbCAkMiwgJWVjeAorCWpiIDVmCisJbW92dyAoJWVzaSksJWN4CisJbGVhbCAyKCVlc2kpLCVlc2kKKwlqZSA2ZgorCXNobGwgJDE2LCVlY3gKKzU6CW1vdmIgKCVlc2kpLCVjbAorNjoJYWRkbCAlZWN4LCVlYXgKKwlhZGNsICQwLCAlZWF4IAorNzoJCisJdGVzdGwgJDEsIDEyKCVlc3ApCisJanogOGYKKwlyb2xsICQ4LCAlZWF4Cis4OgorCXBvcGwgJWVieAorCXBvcGwgJWVzaQorCXJldAorCisjZWxzZQorCisvKiBWZXJzaW9uIGZvciBQZW50aXVtSUkvUFBybyAqLworCitjc3VtX3BhcnRpYWw6CisJcHVzaGwgJWVzaQorCXB1c2hsICVlYngKKwltb3ZsIDIwKCVlc3ApLCVlYXgJIyBGdW5jdGlvbiBhcmc6IHVuc2lnbmVkIGludCBzdW0KKwltb3ZsIDE2KCVlc3ApLCVlY3gJIyBGdW5jdGlvbiBhcmc6IGludCBsZW4KKwltb3ZsIDEyKCVlc3ApLCVlc2kJIyBGdW5jdGlvbiBhcmc6CWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZgorCisJdGVzdGwgJDMsICVlc2kgICAgICAgICAKKwlqbnogMjVmICAgICAgICAgICAgICAgICAKKzEwOgorCW1vdmwgJWVjeCwgJWVkeAorCW1vdmwgJWVjeCwgJWVieAorCWFuZGwgJDB4N2MsICVlYngKKwlzaHJsICQ3LCAlZWN4CisJYWRkbCAlZWJ4LCVlc2kKKwlzaHJsICQyLCAlZWJ4ICAKKwluZWdsICVlYngKKwlsZWEgNDVmKCVlYngsJWVieCwyKSwgJWVieAorCXRlc3RsICVlc2ksICVlc2kKKwlqbXAgKiVlYngKKworCSMgSGFuZGxlIDItYnl0ZS1hbGlnbmVkIHJlZ2lvbnMKKzIwOglhZGR3ICglZXNpKSwgJWF4CisJbGVhIDIoJWVzaSksICVlc2kKKwlhZGNsICQwLCAlZWF4CisJam1wIDEwYgorMjU6CisJdGVzdGwgJDEsICVlc2kgICAgICAgICAKKwlqeiAzMGYgICAgICAgICAgICAgICAgIAorCSMgYnVmIGlzIG9kZAorCWRlYyAlZWN4CisJamwgOTBmCisJbW92emJsICglZXNpKSwgJWVieAorCWFkZGwgJWVieCwgJWVheAorCWFkY2wgJDAsICVlYXgKKwlyb2xsICQ4LCAlZWF4CisJaW5jICVlc2kKKwl0ZXN0bCAkMiwgJWVzaQorCWp6IDEwYgorCiszMDoJc3VibCAkMiwgJWVjeCAgICAgICAgICAKKwlqYSAyMGIgICAgICAgICAgICAgICAgIAorCWplIDMyZgorCWFkZGwgJDIsICVlY3gKKwlqeiA4MGYKKwltb3Z6YmwgKCVlc2kpLCVlYngJIyBjc3VtbWluZyAxIGJ5dGUsIDItYWxpZ25lZAorCWFkZGwgJWVieCwgJWVheAorCWFkY2wgJDAsICVlYXgKKwlqbXAgODBmCiszMjoKKwlhZGR3ICglZXNpKSwgJWF4CSMgY3N1bW1pbmcgMiBieXRlcywgMi1hbGlnbmVkCisJYWRjbCAkMCwgJWVheAorCWptcCA4MGYKKworNDA6IAorCWFkZGwgLTEyOCglZXNpKSwgJWVheAorCWFkY2wgLTEyNCglZXNpKSwgJWVheAorCWFkY2wgLTEyMCglZXNpKSwgJWVheAorCWFkY2wgLTExNiglZXNpKSwgJWVheCAgIAorCWFkY2wgLTExMiglZXNpKSwgJWVheCAgIAorCWFkY2wgLTEwOCglZXNpKSwgJWVheAorCWFkY2wgLTEwNCglZXNpKSwgJWVheAorCWFkY2wgLTEwMCglZXNpKSwgJWVheAorCWFkY2wgLTk2KCVlc2kpLCAlZWF4CisJYWRjbCAtOTIoJWVzaSksICVlYXgKKwlhZGNsIC04OCglZXNpKSwgJWVheAorCWFkY2wgLTg0KCVlc2kpLCAlZWF4CisJYWRjbCAtODAoJWVzaSksICVlYXgKKwlhZGNsIC03NiglZXNpKSwgJWVheAorCWFkY2wgLTcyKCVlc2kpLCAlZWF4CisJYWRjbCAtNjgoJWVzaSksICVlYXgKKwlhZGNsIC02NCglZXNpKSwgJWVheCAgICAgCisJYWRjbCAtNjAoJWVzaSksICVlYXggICAgIAorCWFkY2wgLTU2KCVlc2kpLCAlZWF4ICAgICAKKwlhZGNsIC01MiglZXNpKSwgJWVheCAgIAorCWFkY2wgLTQ4KCVlc2kpLCAlZWF4ICAgCisJYWRjbCAtNDQoJWVzaSksICVlYXgKKwlhZGNsIC00MCglZXNpKSwgJWVheAorCWFkY2wgLTM2KCVlc2kpLCAlZWF4CisJYWRjbCAtMzIoJWVzaSksICVlYXgKKwlhZGNsIC0yOCglZXNpKSwgJWVheAorCWFkY2wgLTI0KCVlc2kpLCAlZWF4CisJYWRjbCAtMjAoJWVzaSksICVlYXgKKwlhZGNsIC0xNiglZXNpKSwgJWVheAorCWFkY2wgLTEyKCVlc2kpLCAlZWF4CisJYWRjbCAtOCglZXNpKSwgJWVheAorCWFkY2wgLTQoJWVzaSksICVlYXgKKzQ1OgorCWxlYSAxMjgoJWVzaSksICVlc2kKKwlhZGNsICQwLCAlZWF4CisJZGVjICVlY3gKKwlqZ2UgNDBiCisJbW92bCAlZWR4LCAlZWN4Cis1MDoJYW5kbCAkMywgJWVjeAorCWp6IDgwZgorCisJIyBIYW5kbGUgdGhlIGxhc3QgMS0zIGJ5dGVzIHdpdGhvdXQganVtcGluZworCW5vdGwgJWVjeAkJIyAxLT4yLCAyLT4xLCAzLT4wLCBoaWdoZXIgYml0cyBhcmUgbWFza2VkCisJbW92bCAkMHhmZmZmZmYsJWVieAkjIGJ5IHRoZSBzaGxsIGFuZCBzaHJsIGluc3RydWN0aW9ucworCXNobGwgJDMsJWVjeAorCXNocmwgJWNsLCVlYngKKwlhbmRsIC0xMjgoJWVzaSksJWVieAkjIGVzaSBpcyA0LWFsaWduZWQgc28gc2hvdWxkIGJlIG9rCisJYWRkbCAlZWJ4LCVlYXgKKwlhZGNsICQwLCVlYXgKKzgwOiAKKwl0ZXN0bCAkMSwgMTIoJWVzcCkKKwlqeiA5MGYKKwlyb2xsICQ4LCAlZWF4Cis5MDogCisJcG9wbCAlZWJ4CisJcG9wbCAlZXNpCisJcmV0CisJCQkJCisjZW5kaWYKKworLyoKK3Vuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljIChjb25zdCBjaGFyICpzcmMsIGNoYXIgKmRzdCwKKwkJCQkgIGludCBsZW4sIGludCBzdW0sIGludCAqc3JjX2Vycl9wdHIsIGludCAqZHN0X2Vycl9wdHIpCisgKi8gCisKKy8qCisgKiBDb3B5IGZyb20gZHMgd2hpbGUgY2hlY2tzdW1taW5nLCBvdGhlcndpc2UgbGlrZSBjc3VtX3BhcnRpYWwKKyAqCisgKiBUaGUgbWFjcm9zIFNSQyBhbmQgRFNUIHNwZWNpZnkgdGhlIHR5cGUgb2YgYWNjZXNzIGZvciB0aGUgaW5zdHJ1Y3Rpb24uCisgKiB0aHVzIHdlIGNhbiBjYWxsIGEgY3VzdG9tIGV4Y2VwdGlvbiBoYW5kbGVyIGZvciBhbGwgYWNjZXNzIHR5cGVzLgorICoKKyAqIEZJWE1FOiBjb3VsZCBzb21lb25lIGRvdWJsZS1jaGVjayB3aGV0aGVyIEkgaGF2ZW4ndCBtaXhlZCB1cCBzb21lIFNSQyBhbmQKKyAqCSAgRFNUIGRlZmluaXRpb25zPyBJdCdzIGRhbW4gaGFyZCB0byB0cmlnZ2VyIGFsbCBjYXNlcy4gIEkgaG9wZSBJIGdvdAorICoJICB0aGVtIGFsbCBidXQgdGhlcmUncyBubyBndWFyYW50ZWUuCisgKi8KKworI2RlZmluZSBTUkMoeS4uLikJCQlcCisJOTk5OTogeTsJCQlcCisJLnNlY3Rpb24gX19leF90YWJsZSwgImEiOwlcCisJLmxvbmcgOTk5OWIsIDYwMDFmCTsJXAorCS5wcmV2aW91cworCisjZGVmaW5lIERTVCh5Li4uKQkJCVwKKwk5OTk5OiB5OwkJCVwKKwkuc2VjdGlvbiBfX2V4X3RhYmxlLCAiYSI7CVwKKwkubG9uZyA5OTk5YiwgNjAwMmYJOwlcCisJLnByZXZpb3VzCisKKy5hbGlnbiA0CisuZ2xvYmwgY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYworCQkJCQorI2lmbmRlZiBDT05GSUdfWDg2X1VTRV9QUFJPX0NIRUNLU1VNCisKKyNkZWZpbmUgQVJHQkFTRSAxNgkJCisjZGVmaW5lIEZQCQkxMgorCQkKK2NzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWM6CisJc3VibCAgJDQsJWVzcAkKKwlwdXNobCAlZWRpCisJcHVzaGwgJWVzaQorCXB1c2hsICVlYngKKwltb3ZsIEFSR0JBU0UrMTYoJWVzcCksJWVheAkjIHN1bQorCW1vdmwgQVJHQkFTRSsxMiglZXNwKSwlZWN4CSMgbGVuCisJbW92bCBBUkdCQVNFKzQoJWVzcCksJWVzaQkjIHNyYworCW1vdmwgQVJHQkFTRSs4KCVlc3ApLCVlZGkJIyBkc3QKKworCXRlc3RsICQyLCAlZWRpCQkJIyBDaGVjayBhbGlnbm1lbnQuIAorCWp6IDJmCQkJCSMgSnVtcCBpZiBhbGlnbm1lbnQgaXMgb2suCisJc3VibCAkMiwgJWVjeAkJCSMgQWxpZ25tZW50IHVzZXMgdXAgdHdvIGJ5dGVzLgorCWphZSAxZgkJCQkjIEp1bXAgaWYgd2UgaGFkIGF0IGxlYXN0IHR3byBieXRlcy4KKwlhZGRsICQyLCAlZWN4CQkJIyBlY3ggd2FzIDwgMi4gIERlYWwgd2l0aCBpdC4KKwlqbXAgNGYKK1NSQygxOgltb3Z3ICglZXNpKSwgJWJ4CSkKKwlhZGRsICQyLCAlZXNpCitEU1QoCW1vdncgJWJ4LCAoJWVkaSkJKQorCWFkZGwgJDIsICVlZGkKKwlhZGR3ICVieCwgJWF4CQorCWFkY2wgJDAsICVlYXgKKzI6CisJbW92bCAlZWN4LCBGUCglZXNwKQorCXNocmwgJDUsICVlY3gKKwlqeiAyZgorCXRlc3RsICVlc2ksICVlc2kKK1NSQygxOgltb3ZsICglZXNpKSwgJWVieAkpCitTUkMoCW1vdmwgNCglZXNpKSwgJWVkeAkpCisJYWRjbCAlZWJ4LCAlZWF4CitEU1QoCW1vdmwgJWVieCwgKCVlZGkpCSkKKwlhZGNsICVlZHgsICVlYXgKK0RTVCgJbW92bCAlZWR4LCA0KCVlZGkpCSkKKworU1JDKAltb3ZsIDgoJWVzaSksICVlYngJKQorU1JDKAltb3ZsIDEyKCVlc2kpLCAlZWR4CSkKKwlhZGNsICVlYngsICVlYXgKK0RTVCgJbW92bCAlZWJ4LCA4KCVlZGkpCSkKKwlhZGNsICVlZHgsICVlYXgKK0RTVCgJbW92bCAlZWR4LCAxMiglZWRpKQkpCisKK1NSQygJbW92bCAxNiglZXNpKSwgJWVieCAJKQorU1JDKAltb3ZsIDIwKCVlc2kpLCAlZWR4CSkKKwlhZGNsICVlYngsICVlYXgKK0RTVCgJbW92bCAlZWJ4LCAxNiglZWRpKQkpCisJYWRjbCAlZWR4LCAlZWF4CitEU1QoCW1vdmwgJWVkeCwgMjAoJWVkaSkJKQorCitTUkMoCW1vdmwgMjQoJWVzaSksICVlYngJKQorU1JDKAltb3ZsIDI4KCVlc2kpLCAlZWR4CSkKKwlhZGNsICVlYngsICVlYXgKK0RTVCgJbW92bCAlZWJ4LCAyNCglZWRpKQkpCisJYWRjbCAlZWR4LCAlZWF4CitEU1QoCW1vdmwgJWVkeCwgMjgoJWVkaSkJKQorCisJbGVhIDMyKCVlc2kpLCAlZXNpCisJbGVhIDMyKCVlZGkpLCAlZWRpCisJZGVjICVlY3gKKwlqbmUgMWIKKwlhZGNsICQwLCAlZWF4CisyOgltb3ZsIEZQKCVlc3ApLCAlZWR4CisJbW92bCAlZWR4LCAlZWN4CisJYW5kbCAkMHgxYywgJWVkeAorCWplIDRmCisJc2hybCAkMiwgJWVkeAkJCSMgVGhpcyBjbGVhcnMgQ0YKK1NSQygzOgltb3ZsICglZXNpKSwgJWVieAkpCisJYWRjbCAlZWJ4LCAlZWF4CitEU1QoCW1vdmwgJWVieCwgKCVlZGkpCSkKKwlsZWEgNCglZXNpKSwgJWVzaQorCWxlYSA0KCVlZGkpLCAlZWRpCisJZGVjICVlZHgKKwlqbmUgM2IKKwlhZGNsICQwLCAlZWF4Cis0OglhbmRsICQzLCAlZWN4CisJanogN2YKKwljbXBsICQyLCAlZWN4CisJamIgNWYKK1NSQygJbW92dyAoJWVzaSksICVjeAkpCisJbGVhbCAyKCVlc2kpLCAlZXNpCitEU1QoCW1vdncgJWN4LCAoJWVkaSkJKQorCWxlYWwgMiglZWRpKSwgJWVkaQorCWplIDZmCisJc2hsbCAkMTYsJWVjeAorU1JDKDU6CW1vdmIgKCVlc2kpLCAlY2wJKQorRFNUKAltb3ZiICVjbCwgKCVlZGkpCSkKKzY6CWFkZGwgJWVjeCwgJWVheAorCWFkY2wgJDAsICVlYXgKKzc6Cis1MDAwOgorCisjIEV4Y2VwdGlvbiBoYW5kbGVyOgorLnNlY3Rpb24gLmZpeHVwLCAiYXgiCQkJCQkJCQorCis2MDAxOgorCW1vdmwgQVJHQkFTRSsyMCglZXNwKSwgJWVieAkjIHNyY19lcnJfcHRyCisJbW92bCAkLUVGQVVMVCwgKCVlYngpCisKKwkjIHplcm8gdGhlIGNvbXBsZXRlIGRlc3RpbmF0aW9uIC0gY29tcHV0aW5nIHRoZSByZXN0CisJIyBpcyB0b28gbXVjaCB3b3JrIAorCW1vdmwgQVJHQkFTRSs4KCVlc3ApLCAlZWRpCSMgZHN0CisJbW92bCBBUkdCQVNFKzEyKCVlc3ApLCAlZWN4CSMgbGVuCisJeG9ybCAlZWF4LCVlYXgKKwlyZXAgOyBzdG9zYgorCisJam1wIDUwMDBiCisKKzYwMDI6CisJbW92bCBBUkdCQVNFKzI0KCVlc3ApLCAlZWJ4CSMgZHN0X2Vycl9wdHIKKwltb3ZsICQtRUZBVUxULCglZWJ4KQorCWptcCA1MDAwYgorCisucHJldmlvdXMKKworCXBvcGwgJWVieAorCXBvcGwgJWVzaQorCXBvcGwgJWVkaQorCXBvcGwgJWVjeAkJCSMgZXF1aXZhbGVudCB0byBhZGRsICQ0LCVlc3AKKwlyZXQJCisKKyNlbHNlCisKKy8qIFZlcnNpb24gZm9yIFBlbnRpdW1JSS9QUHJvICovCisKKyNkZWZpbmUgUk9VTkQxKHgpIFwKKwlTUkMobW92bCB4KCVlc2kpLCAlZWJ4CSkJOwlcCisJYWRkbCAlZWJ4LCAlZWF4CQkJOwlcCisJRFNUKG1vdmwgJWVieCwgeCglZWRpKQkpCTsgCisKKyNkZWZpbmUgUk9VTkQoeCkgXAorCVNSQyhtb3ZsIHgoJWVzaSksICVlYngJKQk7CVwKKwlhZGNsICVlYngsICVlYXgJCQk7CVwKKwlEU1QobW92bCAlZWJ4LCB4KCVlZGkpCSkJOworCisjZGVmaW5lIEFSR0JBU0UgMTIKKwkJCitjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljOgorCXB1c2hsICVlYngKKwlwdXNobCAlZWRpCisJcHVzaGwgJWVzaQorCW1vdmwgQVJHQkFTRSs0KCVlc3ApLCVlc2kJI3NyYworCW1vdmwgQVJHQkFTRSs4KCVlc3ApLCVlZGkJI2RzdAkKKwltb3ZsIEFSR0JBU0UrMTIoJWVzcCksJWVjeAkjbGVuCisJbW92bCBBUkdCQVNFKzE2KCVlc3ApLCVlYXgJI3N1bQorIwltb3ZsICVlY3gsICVlZHggIAorCW1vdmwgJWVjeCwgJWVieCAgCisJbW92bCAlZXNpLCAlZWR4CisJc2hybCAkNiwgJWVjeCAgICAgCisJYW5kbCAkMHgzYywgJWVieCAgCisJbmVnbCAlZWJ4CisJc3VibCAlZWJ4LCAlZXNpICAKKwlzdWJsICVlYngsICVlZGkgIAorCWxlYSAgLTEoJWVzaSksJWVkeAorCWFuZGwgJC0zMiwlZWR4CisJbGVhIDNmKCVlYngsJWVieCksICVlYngKKwl0ZXN0bCAlZXNpLCAlZXNpIAorCWptcCAqJWVieAorMToJYWRkbCAkNjQsJWVzaQorCWFkZGwgJDY0LCVlZGkgCisJU1JDKG1vdmIgLTMyKCVlZHgpLCVibCkJOyBTUkMobW92YiAoJWVkeCksJWJsKQorCVJPVU5EMSgtNjQpIFJPVU5EKC02MCkgUk9VTkQoLTU2KSBST1VORCgtNTIpCQorCVJPVU5EICgtNDgpIFJPVU5EKC00NCkgUk9VTkQoLTQwKSBST1VORCgtMzYpCQorCVJPVU5EICgtMzIpIFJPVU5EKC0yOCkgUk9VTkQoLTI0KSBST1VORCgtMjApCQorCVJPVU5EICgtMTYpIFJPVU5EKC0xMikgUk9VTkQoLTgpICBST1VORCgtNCkJCiszOglhZGNsICQwLCVlYXgKKwlhZGRsICQ2NCwgJWVkeAorCWRlYyAlZWN4CisJamdlIDFiCis0Ogltb3ZsIEFSR0JBU0UrMTIoJWVzcCksJWVkeAkjbGVuCisJYW5kbCAkMywgJWVkeAorCWp6IDdmCisJY21wbCAkMiwgJWVkeAorCWpiIDVmCitTUkMoCW1vdncgKCVlc2kpLCAlZHggICAgICAgICApCisJbGVhbCAyKCVlc2kpLCAlZXNpCitEU1QoCW1vdncgJWR4LCAoJWVkaSkgICAgICAgICApCisJbGVhbCAyKCVlZGkpLCAlZWRpCisJamUgNmYKKwlzaGxsICQxNiwlZWR4Cis1OgorU1JDKAltb3ZiICglZXNpKSwgJWRsICAgICAgICAgKQorRFNUKAltb3ZiICVkbCwgKCVlZGkpICAgICAgICAgKQorNjoJYWRkbCAlZWR4LCAlZWF4CisJYWRjbCAkMCwgJWVheAorNzoKKy5zZWN0aW9uIC5maXh1cCwgImF4IgorNjAwMToJbW92bAlBUkdCQVNFKzIwKCVlc3ApLCAlZWJ4CSMgc3JjX2Vycl9wdHIJCisJbW92bCAkLUVGQVVMVCwgKCVlYngpCisJIyB6ZXJvIHRoZSBjb21wbGV0ZSBkZXN0aW5hdGlvbiAoY29tcHV0aW5nIHRoZSByZXN0IGlzIHRvbyBtdWNoIHdvcmspCisJbW92bCBBUkdCQVNFKzgoJWVzcCksJWVkaQkjIGRzdAorCW1vdmwgQVJHQkFTRSsxMiglZXNwKSwlZWN4CSMgbGVuCisJeG9ybCAlZWF4LCVlYXgKKwlyZXA7IHN0b3NiCisJam1wIDdiCis2MDAyOgltb3ZsIEFSR0JBU0UrMjQoJWVzcCksICVlYngJIyBkc3RfZXJyX3B0cgorCW1vdmwgJC1FRkFVTFQsICglZWJ4KQorCWptcCAgN2IJCQkKKy5wcmV2aW91cwkJCQkKKworCXBvcGwgJWVzaQorCXBvcGwgJWVkaQorCXBvcGwgJWVieAorCXJldAorCQkJCQorI3VuZGVmIFJPVU5ECisjdW5kZWYgUk9VTkQxCQkKKwkJCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9saWIvZGVjX2FuZF9sb2NrLmMgYi9hcmNoL2kzODYvbGliL2RlY19hbmRfbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNDMzOTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbGliL2RlY19hbmRfbG9jay5jCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiB4ODYgdmVyc2lvbiBvZiAiYXRvbWljX2RlY19hbmRfbG9jaygpIiB1c2luZworICogdGhlIGF0b21pYyAiY21weGNoZyIgaW5zdHJ1Y3Rpb24uCisgKgorICogKEZvciBDUFUncyBsYWNraW5nIGNtcHhjaGcsIHdlIHVzZSB0aGUgc2xvdworICogZ2VuZXJpYyB2ZXJzaW9uLCBhbmQgdGhpcyBvbmUgbmV2ZXIgZXZlbiBnZXRzCisgKiBjb21waWxlZCkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorCitpbnQgX2F0b21pY19kZWNfYW5kX2xvY2soYXRvbWljX3QgKmF0b21pYywgc3BpbmxvY2tfdCAqbG9jaykKK3sKKwlpbnQgY291bnRlcjsKKwlpbnQgbmV3Y291bnQ7CisKK3JlcGVhdDoKKwljb3VudGVyID0gYXRvbWljX3JlYWQoYXRvbWljKTsKKwluZXdjb3VudCA9IGNvdW50ZXItMTsKKworCWlmICghbmV3Y291bnQpCisJCWdvdG8gc2xvd19wYXRoOworCisJYXNtIHZvbGF0aWxlKCJsb2NrOyBjbXB4Y2hnbCAlMSwlMiIKKwkJOiI9YSIgKG5ld2NvdW50KQorCQk6InIiIChuZXdjb3VudCksICJtIiAoYXRvbWljLT5jb3VudGVyKSwgIjAiIChjb3VudGVyKSk7CisKKwkvKiBJZiB0aGUgYWJvdmUgZmFpbGVkLCAiZWF4IiB3aWxsIGhhdmUgY2hhbmdlZCAqLworCWlmIChuZXdjb3VudCAhPSBjb3VudGVyKQorCQlnb3RvIHJlcGVhdDsKKwlyZXR1cm4gMDsKKworc2xvd19wYXRoOgorCXNwaW5fbG9jayhsb2NrKTsKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdChhdG9taWMpKQorCQlyZXR1cm4gMTsKKwlzcGluX3VubG9jayhsb2NrKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9saWIvZGVsYXkuYyBiL2FyY2gvaTM4Ni9saWIvZGVsYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODA2MzlmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2xpYi9kZWxheS5jCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKglQcmVjaXNlIERlbGF5IExvb3BzIGZvciBpMzg2CisgKgorICoJQ29weXJpZ2h0IChDKSAxOTkzIExpbnVzIFRvcnZhbGRzCisgKglDb3B5cmlnaHQgKEMpIDE5OTcgTWFydGluIE1hcmVzIDxtakBhdHJleS5rYXJsaW4ubWZmLmN1bmkuY3o+CisgKgorICoJVGhlIF9fZGVsYXkgZnVuY3Rpb24gbXVzdCBfTk9UXyBiZSBpbmxpbmVkIGFzIGl0cyBleGVjdXRpb24gdGltZQorICoJZGVwZW5kcyB3aWxkbHkgb24gYWxpZ25tZW50IG9uIG1hbnkgeDg2IHByb2Nlc3NvcnMuIFRoZSBhZGRpdGlvbmFsCisgKglqdW1wIG1hZ2ljIGlzIG5lZWRlZCB0byBnZXQgdGhlIHRpbWluZyBzdGFibGUgb24gYWxsIHRoZSBDUFUncworICoJd2UgaGF2ZSB0byB3b3JyeSBhYm91dC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vdGltZXIuaD4KKworI2lmZGVmIENPTkZJR19TTVAKKyNpbmNsdWRlIDxhc20vc21wLmg+CisjZW5kaWYKKworZXh0ZXJuIHN0cnVjdCB0aW1lcl9vcHRzKiB0aW1lcjsKKwordm9pZCBfX2RlbGF5KHVuc2lnbmVkIGxvbmcgbG9vcHMpCit7CisJY3VyX3RpbWVyLT5kZWxheShsb29wcyk7Cit9CisKK2lubGluZSB2b2lkIF9fY29uc3RfdWRlbGF5KHVuc2lnbmVkIGxvbmcgeGxvb3BzKQoreworCWludCBkMDsKKwl4bG9vcHMgKj0gNDsKKwlfX2FzbV9fKCJtdWxsICUwIgorCQk6Ij1kIiAoeGxvb3BzKSwgIj0mYSIgKGQwKQorCQk6IjEiICh4bG9vcHMpLCIwIiAoY3B1X2RhdGFbX3NtcF9wcm9jZXNzb3JfaWQoKV0ubG9vcHNfcGVyX2ppZmZ5ICogKEhaLzQpKSk7CisgICAgICAgIF9fZGVsYXkoKyt4bG9vcHMpOworfQorCit2b2lkIF9fdWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlY3MpCit7CisJX19jb25zdF91ZGVsYXkodXNlY3MgKiAweDAwMDAxMGM3KTsgIC8qIDIqKjMyIC8gMTAwMDAwMCAocm91bmRlZCB1cCkgKi8KK30KKwordm9pZCBfX25kZWxheSh1bnNpZ25lZCBsb25nIG5zZWNzKQoreworCV9fY29uc3RfdWRlbGF5KG5zZWNzICogMHgwMDAwNSk7ICAvKiAyKiozMiAvIDEwMDAwMDAwMDAgKHJvdW5kZWQgdXApICovCit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbGliL2dldHVzZXIuUyBiL2FyY2gvaTM4Ni9saWIvZ2V0dXNlci5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZDdmMTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbGliL2dldHVzZXIuUwpAQCAtMCwwICsxLDcwIEBACisvKgorICogX19nZXRfdXNlciBmdW5jdGlvbnMuCisgKgorICogKEMpIENvcHlyaWdodCAxOTk4IExpbnVzIFRvcnZhbGRzCisgKgorICogVGhlc2UgZnVuY3Rpb25zIGhhdmUgYSBub24tc3RhbmRhcmQgY2FsbCBpbnRlcmZhY2UKKyAqIHRvIG1ha2UgdGhlbSBtb3JlIGVmZmljaWVudCwgZXNwZWNpYWxseSBhcyB0aGV5CisgKiByZXR1cm4gYW4gZXJyb3IgdmFsdWUgaW4gYWRkaXRpb24gdG8gdGhlICJyZWFsIgorICogcmV0dXJuIHZhbHVlLgorICovCisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CisKKworLyoKKyAqIF9fZ2V0X3VzZXJfWAorICoKKyAqIElucHV0czoJJWVheCBjb250YWlucyB0aGUgYWRkcmVzcworICoKKyAqIE91dHB1dHM6CSVlYXggaXMgZXJyb3IgY29kZSAoMCBvciAtRUZBVUxUKQorICoJCSVlZHggY29udGFpbnMgemVyby1leHRlbmRlZCB2YWx1ZQorICoKKyAqIFRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgbm90IG1vZGlmeSBhbnkgb3RoZXIgcmVnaXN0ZXJzLAorICogYXMgdGhleSBnZXQgY2FsbGVkIGZyb20gd2l0aGluIGlubGluZSBhc3NlbWJseS4KKyAqLworCisudGV4dAorLmFsaWduIDQKKy5nbG9ibCBfX2dldF91c2VyXzEKK19fZ2V0X3VzZXJfMToKKwlHRVRfVEhSRUFEX0lORk8oJWVkeCkKKwljbXBsIFRJX2FkZHJfbGltaXQoJWVkeCksJWVheAorCWphZSBiYWRfZ2V0X3VzZXIKKzE6CW1vdnpibCAoJWVheCksJWVkeAorCXhvcmwgJWVheCwlZWF4CisJcmV0CisKKy5hbGlnbiA0CisuZ2xvYmwgX19nZXRfdXNlcl8yCitfX2dldF91c2VyXzI6CisJYWRkbCAkMSwlZWF4CisJamMgYmFkX2dldF91c2VyCisJR0VUX1RIUkVBRF9JTkZPKCVlZHgpCisJY21wbCBUSV9hZGRyX2xpbWl0KCVlZHgpLCVlYXgKKwlqYWUgYmFkX2dldF91c2VyCisyOgltb3Z6d2wgLTEoJWVheCksJWVkeAorCXhvcmwgJWVheCwlZWF4CisJcmV0CisKKy5hbGlnbiA0CisuZ2xvYmwgX19nZXRfdXNlcl80CitfX2dldF91c2VyXzQ6CisJYWRkbCAkMywlZWF4CisJamMgYmFkX2dldF91c2VyCisJR0VUX1RIUkVBRF9JTkZPKCVlZHgpCisJY21wbCBUSV9hZGRyX2xpbWl0KCVlZHgpLCVlYXgKKwlqYWUgYmFkX2dldF91c2VyCiszOgltb3ZsIC0zKCVlYXgpLCVlZHgKKwl4b3JsICVlYXgsJWVheAorCXJldAorCitiYWRfZ2V0X3VzZXI6CisJeG9ybCAlZWR4LCVlZHgKKwltb3ZsICQtMTQsJWVheAorCXJldAorCisuc2VjdGlvbiBfX2V4X3RhYmxlLCJhIgorCS5sb25nIDFiLGJhZF9nZXRfdXNlcgorCS5sb25nIDJiLGJhZF9nZXRfdXNlcgorCS5sb25nIDNiLGJhZF9nZXRfdXNlcgorLnByZXZpb3VzCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbGliL21lbWNweS5jIGIvYXJjaC9pMzg2L2xpYi9tZW1jcHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTFiMjM1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2xpYi9tZW1jcHkuYwpAQCAtMCwwICsxLDQ0IEBACisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyN1bmRlZiBtZW1jcHkKKyN1bmRlZiBtZW1zZXQKKwordm9pZCAqbWVtY3B5KHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCBzaXplX3QgbikKK3sKKyNpZmRlZiBDT05GSUdfWDg2X1VTRV8zRE5PVworCXJldHVybiBfX21lbWNweTNkKHRvLCBmcm9tLCBuKTsKKyNlbHNlCisJcmV0dXJuIF9fbWVtY3B5KHRvLCBmcm9tLCBuKTsKKyNlbmRpZgorfQorRVhQT1JUX1NZTUJPTChtZW1jcHkpOworCit2b2lkICptZW1zZXQodm9pZCAqcywgaW50IGMsIHNpemVfdCBjb3VudCkKK3sKKwlyZXR1cm4gX19tZW1zZXQocywgYywgY291bnQpOworfQorRVhQT1JUX1NZTUJPTChtZW1zZXQpOworCit2b2lkICptZW1tb3ZlKHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG4pCit7CisJaW50IGQwLCBkMSwgZDI7CisKKwlpZiAoZGVzdCA8IHNyYykgeworCQltZW1jcHkoZGVzdCxzcmMsbik7CisJfSBlbHNlIHsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCQkic3RkXG5cdCIKKwkJCSJyZXBcblx0IgorCQkJIm1vdnNiXG5cdCIKKwkJCSJjbGQiCisJCQk6ICI9JmMiIChkMCksICI9JlMiIChkMSksICI9JkQiIChkMikKKwkJCToiMCIgKG4pLAorCQkJICIxIiAobi0xKyhjb25zdCBjaGFyICopc3JjKSwKKwkJCSAiMiIgKG4tMSsoY2hhciAqKWRlc3QpCisJCQk6Im1lbW9yeSIpOworCX0KKwlyZXR1cm4gZGVzdDsKK30KK0VYUE9SVF9TWU1CT0wobWVtbW92ZSk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbGliL21teC5jIGIvYXJjaC9pMzg2L2xpYi9tbXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWY4YjFhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2xpYi9tbXguYwpAQCAtMCwwICsxLDM5OSBAQAorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CisKKyNpbmNsdWRlIDxhc20vaTM4Ny5oPgorCisKKy8qCisgKglNTVggM0ROb3chIGxpYnJhcnkgaGVscGVyIGZ1bmN0aW9ucworICoKKyAqCVRvIGRvOgorICoJV2UgY2FuIHVzZSBNTVgganVzdCBmb3IgcHJlZmV0Y2ggaW4gSVJRJ3MuIFRoaXMgbWF5IGJlIGEgd2luLiAKKyAqCQkocmVwb3J0ZWQgc28gb24gSzYtSUlJKQorICoJV2Ugc2hvdWxkIHVzZSBhIGJldHRlciBjb2RlIG5ldXRyYWwgZmlsbGVyIGZvciB0aGUgc2hvcnQganVtcAorICoJCWxlYWwgZWJ4LiBbZWJ4XSBpcyBhcHBhcmVudGx5IGJlc3QgZm9yIEs2LTIsIGJ1dCBDeXJpeCA/PworICoJV2UgYWxzbyB3YW50IHRvIGNsb2JiZXIgdGhlIGZpbGxlciByZWdpc3RlciBzbyB3ZSBkb24ndCBnZXQgYW55CisgKgkJcmVnaXN0ZXIgZm9yd2FyZGluZyBzdGFsbHMgb24gdGhlIGZpbGxlci4gCisgKgorICoJQWRkICp1c2VyIGhhbmRsaW5nLiBDaGVja3N1bXMgYXJlIG5vdCBhIHdpbiB3aXRoIE1NWCBvbiBhbnkgQ1BVCisgKgl0ZXN0ZWQgc28gZmFyIGZvciBhbnkgTU1YIHNvbHV0aW9uIGZpZ3VyZWQuCisgKgorICoJMjIvMDkvMjAwMCAtIEFyamFuIHZhbiBkZSBWZW4gCisgKgkJSW1wcm92ZWQgZm9yIG5vbi1lZ2luZWVyaW5nLXNhbXBsZSBBdGhsb25zIAorICoKKyAqLworIAordm9pZCAqX21teF9tZW1jcHkodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHNpemVfdCBsZW4pCit7CisJdm9pZCAqcDsKKwlpbnQgaTsKKworCWlmICh1bmxpa2VseShpbl9pbnRlcnJ1cHQoKSkpCisJCXJldHVybiBfX21lbWNweSh0bywgZnJvbSwgbGVuKTsKKworCXAgPSB0bzsKKwlpID0gbGVuID4+IDY7IC8qIGxlbi82NCAqLworCisJa2VybmVsX2ZwdV9iZWdpbigpOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkiMTogcHJlZmV0Y2ggKCUwKVxuIgkJLyogVGhpcyBzZXQgaXMgMjggYnl0ZXMgKi8KKwkJIiAgIHByZWZldGNoIDY0KCUwKVxuIgorCQkiICAgcHJlZmV0Y2ggMTI4KCUwKVxuIgorCQkiICAgcHJlZmV0Y2ggMTkyKCUwKVxuIgorCQkiICAgcHJlZmV0Y2ggMjU2KCUwKVxuIgorCQkiMjogIFxuIgorCQkiLnNlY3Rpb24gLmZpeHVwLCBcImF4XCJcbiIKKwkJIjM6IG1vdncgJDB4MUFFQiwgMWJcbiIJLyogam1wIG9uIDI2IGJ5dGVzICovCisJCSIgICBqbXAgMmJcbiIKKwkJIi5wcmV2aW91c1xuIgorCQkiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgorCQkiCS5hbGlnbiA0XG4iCisJCSIJLmxvbmcgMWIsIDNiXG4iCisJCSIucHJldmlvdXMiCisJCTogOiAiciIgKGZyb20pICk7CisJCQorCQorCWZvcig7IGk+NTsgaS0tKQorCXsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkiMTogIHByZWZldGNoIDMyMCglMClcbiIKKwkJIjI6ICBtb3ZxICglMCksICUlbW0wXG4iCisJCSIgIG1vdnEgOCglMCksICUlbW0xXG4iCisJCSIgIG1vdnEgMTYoJTApLCAlJW1tMlxuIgorCQkiICBtb3ZxIDI0KCUwKSwgJSVtbTNcbiIKKwkJIiAgbW92cSAlJW1tMCwgKCUxKVxuIgorCQkiICBtb3ZxICUlbW0xLCA4KCUxKVxuIgorCQkiICBtb3ZxICUlbW0yLCAxNiglMSlcbiIKKwkJIiAgbW92cSAlJW1tMywgMjQoJTEpXG4iCisJCSIgIG1vdnEgMzIoJTApLCAlJW1tMFxuIgorCQkiICBtb3ZxIDQwKCUwKSwgJSVtbTFcbiIKKwkJIiAgbW92cSA0OCglMCksICUlbW0yXG4iCisJCSIgIG1vdnEgNTYoJTApLCAlJW1tM1xuIgorCQkiICBtb3ZxICUlbW0wLCAzMiglMSlcbiIKKwkJIiAgbW92cSAlJW1tMSwgNDAoJTEpXG4iCisJCSIgIG1vdnEgJSVtbTIsIDQ4KCUxKVxuIgorCQkiICBtb3ZxICUlbW0zLCA1NiglMSlcbiIKKwkJIi5zZWN0aW9uIC5maXh1cCwgXCJheFwiXG4iCisJCSIzOiBtb3Z3ICQweDA1RUIsIDFiXG4iCS8qIGptcCBvbiA1IGJ5dGVzICovCisJCSIgICBqbXAgMmJcbiIKKwkJIi5wcmV2aW91c1xuIgorCQkiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgorCQkiCS5hbGlnbiA0XG4iCisJCSIJLmxvbmcgMWIsIDNiXG4iCisJCSIucHJldmlvdXMiCisJCTogOiAiciIgKGZyb20pLCAiciIgKHRvKSA6ICJtZW1vcnkiKTsKKwkJZnJvbSs9NjQ7CisJCXRvKz02NDsKKwl9CisKKwlmb3IoOyBpPjA7IGktLSkKKwl7CisJCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJIiAgbW92cSAoJTApLCAlJW1tMFxuIgorCQkiICBtb3ZxIDgoJTApLCAlJW1tMVxuIgorCQkiICBtb3ZxIDE2KCUwKSwgJSVtbTJcbiIKKwkJIiAgbW92cSAyNCglMCksICUlbW0zXG4iCisJCSIgIG1vdnEgJSVtbTAsICglMSlcbiIKKwkJIiAgbW92cSAlJW1tMSwgOCglMSlcbiIKKwkJIiAgbW92cSAlJW1tMiwgMTYoJTEpXG4iCisJCSIgIG1vdnEgJSVtbTMsIDI0KCUxKVxuIgorCQkiICBtb3ZxIDMyKCUwKSwgJSVtbTBcbiIKKwkJIiAgbW92cSA0MCglMCksICUlbW0xXG4iCisJCSIgIG1vdnEgNDgoJTApLCAlJW1tMlxuIgorCQkiICBtb3ZxIDU2KCUwKSwgJSVtbTNcbiIKKwkJIiAgbW92cSAlJW1tMCwgMzIoJTEpXG4iCisJCSIgIG1vdnEgJSVtbTEsIDQwKCUxKVxuIgorCQkiICBtb3ZxICUlbW0yLCA0OCglMSlcbiIKKwkJIiAgbW92cSAlJW1tMywgNTYoJTEpXG4iCisJCTogOiAiciIgKGZyb20pLCAiciIgKHRvKSA6ICJtZW1vcnkiKTsKKwkJZnJvbSs9NjQ7CisJCXRvKz02NDsKKwl9CisJLyoKKwkgKglOb3cgZG8gdGhlIHRhaWwgb2YgdGhlIGJsb2NrCisJICovCisJX19tZW1jcHkodG8sIGZyb20sIGxlbiY2Myk7CisJa2VybmVsX2ZwdV9lbmQoKTsKKwlyZXR1cm4gcDsKK30KKworI2lmZGVmIENPTkZJR19NSzcKKworLyoKKyAqCVRoZSBLNyBoYXMgc3RyZWFtaW5nIGNhY2hlIGJ5cGFzcyBsb2FkL3N0b3JlLiBUaGUgQ3lyaXggSUlJLCBLNiBhbmQKKyAqCW90aGVyIE1NWCB1c2luZyBwcm9jZXNzb3JzIGRvIG5vdC4KKyAqLworCitzdGF0aWMgdm9pZCBmYXN0X2NsZWFyX3BhZ2Uodm9pZCAqcGFnZSkKK3sKKwlpbnQgaTsKKworCWtlcm5lbF9mcHVfYmVnaW4oKTsKKwkKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSIgIHB4b3IgJSVtbTAsICUlbW0wXG4iIDogOgorCSk7CisKKwlmb3IoaT0wO2k8NDA5Ni82NDtpKyspCisJeworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSIgIG1vdm50cSAlJW1tMCwgKCUwKVxuIgorCQkiICBtb3ZudHEgJSVtbTAsIDgoJTApXG4iCisJCSIgIG1vdm50cSAlJW1tMCwgMTYoJTApXG4iCisJCSIgIG1vdm50cSAlJW1tMCwgMjQoJTApXG4iCisJCSIgIG1vdm50cSAlJW1tMCwgMzIoJTApXG4iCisJCSIgIG1vdm50cSAlJW1tMCwgNDAoJTApXG4iCisJCSIgIG1vdm50cSAlJW1tMCwgNDgoJTApXG4iCisJCSIgIG1vdm50cSAlJW1tMCwgNTYoJTApXG4iCisJCTogOiAiciIgKHBhZ2UpIDogIm1lbW9yeSIpOworCQlwYWdlKz02NDsKKwl9CisJLyogc2luY2UgbW92bnRxIGlzIHdlYWtseS1vcmRlcmVkLCBhICJzZmVuY2UiIGlzIG5lZWRlZCB0byBiZWNvbWUKKwkgKiBvcmRlcmVkIGFnYWluLgorCSAqLworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJIiAgc2ZlbmNlIFxuIiA6IDoKKwkpOworCWtlcm5lbF9mcHVfZW5kKCk7Cit9CisKK3N0YXRpYyB2b2lkIGZhc3RfY29weV9wYWdlKHZvaWQgKnRvLCB2b2lkICpmcm9tKQoreworCWludCBpOworCisJa2VybmVsX2ZwdV9iZWdpbigpOworCisJLyogbWF5YmUgdGhlIHByZWZldGNoIHN0dWZmIGNhbiBnbyBiZWZvcmUgdGhlIGV4cGVuc2l2ZSBmbnNhdmUuLi4KKwkgKiBidXQgdGhhdCBpcyBmb3IgbGF0ZXIuIC1BVgorCSAqLworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJIjE6IHByZWZldGNoICglMClcbiIKKwkJIiAgIHByZWZldGNoIDY0KCUwKVxuIgorCQkiICAgcHJlZmV0Y2ggMTI4KCUwKVxuIgorCQkiICAgcHJlZmV0Y2ggMTkyKCUwKVxuIgorCQkiICAgcHJlZmV0Y2ggMjU2KCUwKVxuIgorCQkiMjogIFxuIgorCQkiLnNlY3Rpb24gLmZpeHVwLCBcImF4XCJcbiIKKwkJIjM6IG1vdncgJDB4MUFFQiwgMWJcbiIJLyogam1wIG9uIDI2IGJ5dGVzICovCisJCSIgICBqbXAgMmJcbiIKKwkJIi5wcmV2aW91c1xuIgorCQkiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgorCQkiCS5hbGlnbiA0XG4iCisJCSIJLmxvbmcgMWIsIDNiXG4iCisJCSIucHJldmlvdXMiCisJCTogOiAiciIgKGZyb20pICk7CisKKwlmb3IoaT0wOyBpPCg0MDk2LTMyMCkvNjQ7IGkrKykKKwl7CisJCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJIjE6IHByZWZldGNoIDMyMCglMClcbiIKKwkJIjI6IG1vdnEgKCUwKSwgJSVtbTBcbiIKKwkJIiAgIG1vdm50cSAlJW1tMCwgKCUxKVxuIgorCQkiICAgbW92cSA4KCUwKSwgJSVtbTFcbiIKKwkJIiAgIG1vdm50cSAlJW1tMSwgOCglMSlcbiIKKwkJIiAgIG1vdnEgMTYoJTApLCAlJW1tMlxuIgorCQkiICAgbW92bnRxICUlbW0yLCAxNiglMSlcbiIKKwkJIiAgIG1vdnEgMjQoJTApLCAlJW1tM1xuIgorCQkiICAgbW92bnRxICUlbW0zLCAyNCglMSlcbiIKKwkJIiAgIG1vdnEgMzIoJTApLCAlJW1tNFxuIgorCQkiICAgbW92bnRxICUlbW00LCAzMiglMSlcbiIKKwkJIiAgIG1vdnEgNDAoJTApLCAlJW1tNVxuIgorCQkiICAgbW92bnRxICUlbW01LCA0MCglMSlcbiIKKwkJIiAgIG1vdnEgNDgoJTApLCAlJW1tNlxuIgorCQkiICAgbW92bnRxICUlbW02LCA0OCglMSlcbiIKKwkJIiAgIG1vdnEgNTYoJTApLCAlJW1tN1xuIgorCQkiICAgbW92bnRxICUlbW03LCA1NiglMSlcbiIKKwkJIi5zZWN0aW9uIC5maXh1cCwgXCJheFwiXG4iCisJCSIzOiBtb3Z3ICQweDA1RUIsIDFiXG4iCS8qIGptcCBvbiA1IGJ5dGVzICovCisJCSIgICBqbXAgMmJcbiIKKwkJIi5wcmV2aW91c1xuIgorCQkiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgorCQkiCS5hbGlnbiA0XG4iCisJCSIJLmxvbmcgMWIsIDNiXG4iCisJCSIucHJldmlvdXMiCisJCTogOiAiciIgKGZyb20pLCAiciIgKHRvKSA6ICJtZW1vcnkiKTsKKwkJZnJvbSs9NjQ7CisJCXRvKz02NDsKKwl9CisJZm9yKGk9KDQwOTYtMzIwKS82NDsgaTw0MDk2LzY0OyBpKyspCisJeworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSIyOiBtb3ZxICglMCksICUlbW0wXG4iCisJCSIgICBtb3ZudHEgJSVtbTAsICglMSlcbiIKKwkJIiAgIG1vdnEgOCglMCksICUlbW0xXG4iCisJCSIgICBtb3ZudHEgJSVtbTEsIDgoJTEpXG4iCisJCSIgICBtb3ZxIDE2KCUwKSwgJSVtbTJcbiIKKwkJIiAgIG1vdm50cSAlJW1tMiwgMTYoJTEpXG4iCisJCSIgICBtb3ZxIDI0KCUwKSwgJSVtbTNcbiIKKwkJIiAgIG1vdm50cSAlJW1tMywgMjQoJTEpXG4iCisJCSIgICBtb3ZxIDMyKCUwKSwgJSVtbTRcbiIKKwkJIiAgIG1vdm50cSAlJW1tNCwgMzIoJTEpXG4iCisJCSIgICBtb3ZxIDQwKCUwKSwgJSVtbTVcbiIKKwkJIiAgIG1vdm50cSAlJW1tNSwgNDAoJTEpXG4iCisJCSIgICBtb3ZxIDQ4KCUwKSwgJSVtbTZcbiIKKwkJIiAgIG1vdm50cSAlJW1tNiwgNDgoJTEpXG4iCisJCSIgICBtb3ZxIDU2KCUwKSwgJSVtbTdcbiIKKwkJIiAgIG1vdm50cSAlJW1tNywgNTYoJTEpXG4iCisJCTogOiAiciIgKGZyb20pLCAiciIgKHRvKSA6ICJtZW1vcnkiKTsKKwkJZnJvbSs9NjQ7CisJCXRvKz02NDsKKwl9CisJLyogc2luY2UgbW92bnRxIGlzIHdlYWtseS1vcmRlcmVkLCBhICJzZmVuY2UiIGlzIG5lZWRlZCB0byBiZWNvbWUKKwkgKiBvcmRlcmVkIGFnYWluLgorCSAqLworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJIiAgc2ZlbmNlIFxuIiA6IDoKKwkpOworCWtlcm5lbF9mcHVfZW5kKCk7Cit9CisKKyNlbHNlCisKKy8qCisgKglHZW5lcmljIE1NWCBpbXBsZW1lbnRhdGlvbiB3aXRob3V0IEs3IHNwZWNpZmljIHN0cmVhbWluZworICovCisgCitzdGF0aWMgdm9pZCBmYXN0X2NsZWFyX3BhZ2Uodm9pZCAqcGFnZSkKK3sKKwlpbnQgaTsKKwkKKwlrZXJuZWxfZnB1X2JlZ2luKCk7CisJCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkiICBweG9yICUlbW0wLCAlJW1tMFxuIiA6IDoKKwkpOworCisJZm9yKGk9MDtpPDQwOTYvMTI4O2krKykKKwl7CisJCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJIiAgbW92cSAlJW1tMCwgKCUwKVxuIgorCQkiICBtb3ZxICUlbW0wLCA4KCUwKVxuIgorCQkiICBtb3ZxICUlbW0wLCAxNiglMClcbiIKKwkJIiAgbW92cSAlJW1tMCwgMjQoJTApXG4iCisJCSIgIG1vdnEgJSVtbTAsIDMyKCUwKVxuIgorCQkiICBtb3ZxICUlbW0wLCA0MCglMClcbiIKKwkJIiAgbW92cSAlJW1tMCwgNDgoJTApXG4iCisJCSIgIG1vdnEgJSVtbTAsIDU2KCUwKVxuIgorCQkiICBtb3ZxICUlbW0wLCA2NCglMClcbiIKKwkJIiAgbW92cSAlJW1tMCwgNzIoJTApXG4iCisJCSIgIG1vdnEgJSVtbTAsIDgwKCUwKVxuIgorCQkiICBtb3ZxICUlbW0wLCA4OCglMClcbiIKKwkJIiAgbW92cSAlJW1tMCwgOTYoJTApXG4iCisJCSIgIG1vdnEgJSVtbTAsIDEwNCglMClcbiIKKwkJIiAgbW92cSAlJW1tMCwgMTEyKCUwKVxuIgorCQkiICBtb3ZxICUlbW0wLCAxMjAoJTApXG4iCisJCTogOiAiciIgKHBhZ2UpIDogIm1lbW9yeSIpOworCQlwYWdlKz0xMjg7CisJfQorCisJa2VybmVsX2ZwdV9lbmQoKTsKK30KKworc3RhdGljIHZvaWQgZmFzdF9jb3B5X3BhZ2Uodm9pZCAqdG8sIHZvaWQgKmZyb20pCit7CisJaW50IGk7CisJCisJCisJa2VybmVsX2ZwdV9iZWdpbigpOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkiMTogcHJlZmV0Y2ggKCUwKVxuIgorCQkiICAgcHJlZmV0Y2ggNjQoJTApXG4iCisJCSIgICBwcmVmZXRjaCAxMjgoJTApXG4iCisJCSIgICBwcmVmZXRjaCAxOTIoJTApXG4iCisJCSIgICBwcmVmZXRjaCAyNTYoJTApXG4iCisJCSIyOiAgXG4iCisJCSIuc2VjdGlvbiAuZml4dXAsIFwiYXhcIlxuIgorCQkiMzogbW92dyAkMHgxQUVCLCAxYlxuIgkvKiBqbXAgb24gMjYgYnl0ZXMgKi8KKwkJIiAgIGptcCAyYlxuIgorCQkiLnByZXZpb3VzXG4iCisJCSIuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCisJCSIJLmFsaWduIDRcbiIKKwkJIgkubG9uZyAxYiwgM2JcbiIKKwkJIi5wcmV2aW91cyIKKwkJOiA6ICJyIiAoZnJvbSkgKTsKKworCWZvcihpPTA7IGk8NDA5Ni82NDsgaSsrKQorCXsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkiMTogcHJlZmV0Y2ggMzIwKCUwKVxuIgorCQkiMjogbW92cSAoJTApLCAlJW1tMFxuIgorCQkiICAgbW92cSA4KCUwKSwgJSVtbTFcbiIKKwkJIiAgIG1vdnEgMTYoJTApLCAlJW1tMlxuIgorCQkiICAgbW92cSAyNCglMCksICUlbW0zXG4iCisJCSIgICBtb3ZxICUlbW0wLCAoJTEpXG4iCisJCSIgICBtb3ZxICUlbW0xLCA4KCUxKVxuIgorCQkiICAgbW92cSAlJW1tMiwgMTYoJTEpXG4iCisJCSIgICBtb3ZxICUlbW0zLCAyNCglMSlcbiIKKwkJIiAgIG1vdnEgMzIoJTApLCAlJW1tMFxuIgorCQkiICAgbW92cSA0MCglMCksICUlbW0xXG4iCisJCSIgICBtb3ZxIDQ4KCUwKSwgJSVtbTJcbiIKKwkJIiAgIG1vdnEgNTYoJTApLCAlJW1tM1xuIgorCQkiICAgbW92cSAlJW1tMCwgMzIoJTEpXG4iCisJCSIgICBtb3ZxICUlbW0xLCA0MCglMSlcbiIKKwkJIiAgIG1vdnEgJSVtbTIsIDQ4KCUxKVxuIgorCQkiICAgbW92cSAlJW1tMywgNTYoJTEpXG4iCisJCSIuc2VjdGlvbiAuZml4dXAsIFwiYXhcIlxuIgorCQkiMzogbW92dyAkMHgwNUVCLCAxYlxuIgkvKiBqbXAgb24gNSBieXRlcyAqLworCQkiICAgam1wIDJiXG4iCisJCSIucHJldmlvdXNcbiIKKwkJIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIKKwkJIgkuYWxpZ24gNFxuIgorCQkiCS5sb25nIDFiLCAzYlxuIgorCQkiLnByZXZpb3VzIgorCQk6IDogInIiIChmcm9tKSwgInIiICh0bykgOiAibWVtb3J5Iik7CisJCWZyb20rPTY0OworCQl0bys9NjQ7CisJfQorCWtlcm5lbF9mcHVfZW5kKCk7Cit9CisKKworI2VuZGlmCisKKy8qCisgKglGYXZvdXIgTU1YIGZvciBwYWdlIGNsZWFyIGFuZCBjb3B5LiAKKyAqLworCitzdGF0aWMgdm9pZCBzbG93X3plcm9fcGFnZSh2b2lkICogcGFnZSkKK3sKKwlpbnQgZDAsIGQxOworCV9fYXNtX18gX192b2xhdGlsZV9fKCBcCisJCSJjbGRcblx0IiBcCisJCSJyZXAgOyBzdG9zbCIgXAorCQk6ICI9JmMiIChkMCksICI9JkQiIChkMSkKKwkJOiJhIiAoMCksIjEiIChwYWdlKSwiMCIgKDEwMjQpCisJCToibWVtb3J5Iik7Cit9CisgCit2b2lkIG1teF9jbGVhcl9wYWdlKHZvaWQgKiBwYWdlKQoreworCWlmKHVubGlrZWx5KGluX2ludGVycnVwdCgpKSkKKwkJc2xvd196ZXJvX3BhZ2UocGFnZSk7CisJZWxzZQorCQlmYXN0X2NsZWFyX3BhZ2UocGFnZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNsb3dfY29weV9wYWdlKHZvaWQgKnRvLCB2b2lkICpmcm9tKQoreworCWludCBkMCwgZDEsIGQyOworCV9fYXNtX18gX192b2xhdGlsZV9fKCBcCisJCSJjbGRcblx0IiBcCisJCSJyZXAgOyBtb3ZzbCIgXAorCQk6ICI9JmMiIChkMCksICI9JkQiIChkMSksICI9JlMiIChkMikgXAorCQk6ICIwIiAoMTAyNCksIjEiICgobG9uZykgdG8pLCIyIiAoKGxvbmcpIGZyb20pIFwKKwkJOiAibWVtb3J5Iik7Cit9CisgIAorCit2b2lkIG1teF9jb3B5X3BhZ2Uodm9pZCAqdG8sIHZvaWQgKmZyb20pCit7CisJaWYodW5saWtlbHkoaW5faW50ZXJydXB0KCkpKQorCQlzbG93X2NvcHlfcGFnZSh0bywgZnJvbSk7CisJZWxzZQorCQlmYXN0X2NvcHlfcGFnZSh0bywgZnJvbSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbGliL3B1dHVzZXIuUyBiL2FyY2gvaTM4Ni9saWIvcHV0dXNlci5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMmQ5ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbGliL3B1dHVzZXIuUwpAQCAtMCwwICsxLDg3IEBACisvKgorICogX19wdXRfdXNlciBmdW5jdGlvbnMuCisgKgorICogKEMpIENvcHlyaWdodCAyMDA1IExpbnVzIFRvcnZhbGRzCisgKgorICogVGhlc2UgZnVuY3Rpb25zIGhhdmUgYSBub24tc3RhbmRhcmQgY2FsbCBpbnRlcmZhY2UKKyAqIHRvIG1ha2UgdGhlbSBtb3JlIGVmZmljaWVudCwgZXNwZWNpYWxseSBhcyB0aGV5CisgKiByZXR1cm4gYW4gZXJyb3IgdmFsdWUgaW4gYWRkaXRpb24gdG8gdGhlICJyZWFsIgorICogcmV0dXJuIHZhbHVlLgorICovCisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CisKKworLyoKKyAqIF9fcHV0X3VzZXJfWAorICoKKyAqIElucHV0czoJJWVheFs6JWVkeF0gY29udGFpbnMgdGhlIGRhdGEKKyAqCQklZWN4IGNvbnRhaW5zIHRoZSBhZGRyZXNzCisgKgorICogT3V0cHV0czoJJWVheCBpcyBlcnJvciBjb2RlICgwIG9yIC1FRkFVTFQpCisgKgorICogVGhlc2UgZnVuY3Rpb25zIHNob3VsZCBub3QgbW9kaWZ5IGFueSBvdGhlciByZWdpc3RlcnMsCisgKiBhcyB0aGV5IGdldCBjYWxsZWQgZnJvbSB3aXRoaW4gaW5saW5lIGFzc2VtYmx5LgorICovCisKKyNkZWZpbmUgRU5URVIJcHVzaGwgJWVieCA7IEdFVF9USFJFQURfSU5GTyglZWJ4KQorI2RlZmluZSBFWElUCXBvcGwgJWVieCA7IHJldAorCisudGV4dAorLmFsaWduIDQKKy5nbG9ibCBfX3B1dF91c2VyXzEKK19fcHV0X3VzZXJfMToKKwlFTlRFUgorCWNtcGwgVElfYWRkcl9saW1pdCglZWJ4KSwlZWN4CisJamFlIGJhZF9wdXRfdXNlcgorMToJbW92YiAlYWwsKCVlY3gpCisJeG9ybCAlZWF4LCVlYXgKKwlFWElUCisKKy5hbGlnbiA0CisuZ2xvYmwgX19wdXRfdXNlcl8yCitfX3B1dF91c2VyXzI6CisJRU5URVIKKwltb3ZsIFRJX2FkZHJfbGltaXQoJWVieCksJWVieAorCXN1YmwgJDEsJWVieAorCWNtcGwgJWVieCwlZWN4CisJamFlIGJhZF9wdXRfdXNlcgorMjoJbW92dyAlYXgsKCVlY3gpCisJeG9ybCAlZWF4LCVlYXgKKwlFWElUCisKKy5hbGlnbiA0CisuZ2xvYmwgX19wdXRfdXNlcl80CitfX3B1dF91c2VyXzQ6CisJRU5URVIKKwltb3ZsIFRJX2FkZHJfbGltaXQoJWVieCksJWVieAorCXN1YmwgJDMsJWVieAorCWNtcGwgJWVieCwlZWN4CisJamFlIGJhZF9wdXRfdXNlcgorMzoJbW92bCAlZWF4LCglZWN4KQorCXhvcmwgJWVheCwlZWF4CisJRVhJVAorCisuYWxpZ24gNAorLmdsb2JsIF9fcHV0X3VzZXJfOAorX19wdXRfdXNlcl84OgorCUVOVEVSCisJbW92bCBUSV9hZGRyX2xpbWl0KCVlYngpLCVlYngKKwlzdWJsICQ3LCVlYngKKwljbXBsICVlYngsJWVjeAorCWphZSBiYWRfcHV0X3VzZXIKKzQ6CW1vdmwgJWVheCwoJWVjeCkKKzU6CW1vdmwgJWVkeCw0KCVlY3gpCisJeG9ybCAlZWF4LCVlYXgKKwlFWElUCisKK2JhZF9wdXRfdXNlcjoKKwltb3ZsICQtMTQsJWVheAorCUVYSVQKKworLnNlY3Rpb24gX19leF90YWJsZSwiYSIKKwkubG9uZyAxYixiYWRfcHV0X3VzZXIKKwkubG9uZyAyYixiYWRfcHV0X3VzZXIKKwkubG9uZyAzYixiYWRfcHV0X3VzZXIKKwkubG9uZyA0YixiYWRfcHV0X3VzZXIKKwkubG9uZyA1YixiYWRfcHV0X3VzZXIKKy5wcmV2aW91cwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2xpYi9zdHJzdHIuYyBiL2FyY2gvaTM4Ni9saWIvc3Ryc3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNkYWZiZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9saWIvc3Ryc3RyLmMKQEAgLTAsMCArMSwzMSBAQAorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCitjaGFyICogc3Ryc3RyKGNvbnN0IGNoYXIgKiBjcyxjb25zdCBjaGFyICogY3QpCit7CitpbnQJZDAsIGQxOworcmVnaXN0ZXIgY2hhciAqIF9fcmVzOworX19hc21fXyBfX3ZvbGF0aWxlX18oCisJIm1vdmwgJTYsJSVlZGlcblx0IgorCSJyZXBuZVxuXHQiCisJInNjYXNiXG5cdCIKKwkibm90bCAlJWVjeFxuXHQiCisJImRlY2wgJSVlY3hcblx0IgkvKiBOT1RFISBUaGlzIGFsc28gc2V0cyBaIGlmIHNlYXJjaHN0cmluZz0nJyAqLworCSJtb3ZsICUlZWN4LCUlZWR4XG4iCisJIjE6XHRtb3ZsICU2LCUlZWRpXG5cdCIKKwkibW92bCAlJWVzaSwlJWVheFxuXHQiCisJIm1vdmwgJSVlZHgsJSVlY3hcblx0IgorCSJyZXBlXG5cdCIKKwkiY21wc2Jcblx0IgorCSJqZSAyZlxuXHQiCQkvKiBhbHNvIHdvcmtzIGZvciBlbXB0eSBzdHJpbmcsIHNlZSBhYm92ZSAqLworCSJ4Y2hnbCAlJWVheCwlJWVzaVxuXHQiCisJImluY2wgJSVlc2lcblx0IgorCSJjbXBiICQwLC0xKCUlZWF4KVxuXHQiCisJImpuZSAxYlxuXHQiCisJInhvcmwgJSVlYXgsJSVlYXhcblx0IgorCSIyOiIKKwk6Ij1hIiAoX19yZXMpLCAiPSZjIiAoZDApLCAiPSZTIiAoZDEpCisJOiIwIiAoMCksICIxIiAoMHhmZmZmZmZmZiksICIyIiAoY3MpLCAiZyIgKGN0KQorCToiZHgiLCAiZGkiKTsKK3JldHVybiBfX3JlczsKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2xpYi91c2VyY29weS5jIGIvYXJjaC9pMzg2L2xpYi91c2VyY29weS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYWEyYmIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbGliL3VzZXJjb3B5LmMKQEAgLTAsMCArMSw2MzYgQEAKKy8qIAorICogVXNlciBhZGRyZXNzIHNwYWNlIGFjY2VzcyBmdW5jdGlvbnMuCisgKiBUaGUgbm9uIGlubGluZWQgcGFydHMgb2YgYXNtLWkzODYvdWFjY2Vzcy5oIGFyZSBoZXJlLgorICoKKyAqIENvcHlyaWdodCAxOTk3IEFuZGkgS2xlZW4gPGFrQG11Yy5kZT4KKyAqIENvcHlyaWdodCAxOTk3IExpbnVzIFRvcnZhbGRzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9tbXguaD4KKworc3RhdGljIGlubGluZSBpbnQgX19tb3ZzbF9pc19vayh1bnNpZ25lZCBsb25nIGExLCB1bnNpZ25lZCBsb25nIGEyLCB1bnNpZ25lZCBsb25nIG4pCit7CisjaWZkZWYgQ09ORklHX1g4Nl9JTlRFTF9VU0VSQ09QWQorCWlmIChuID49IDY0ICYmICgoYTEgXiBhMikgJiBtb3ZzbF9tYXNrLm1hc2spKQorCQlyZXR1cm4gMDsKKyNlbmRpZgorCXJldHVybiAxOworfQorI2RlZmluZSBtb3ZzbF9pc19vayhhMSxhMixuKSBcCisJX19tb3ZzbF9pc19vaygodW5zaWduZWQgbG9uZykoYTEpLCh1bnNpZ25lZCBsb25nKShhMiksKG4pKQorCisvKgorICogQ29weSBhIG51bGwgdGVybWluYXRlZCBzdHJpbmcgZnJvbSB1c2Vyc3BhY2UuCisgKi8KKworI2RlZmluZSBfX2RvX3N0cm5jcHlfZnJvbV91c2VyKGRzdCxzcmMsY291bnQscmVzKQkJCSAgIFwKK2RvIHsJCQkJCQkJCQkgICBcCisJaW50IF9fZDAsIF9fZDEsIF9fZDI7CQkJCQkJICAgXAorCW1pZ2h0X3NsZWVwKCk7CQkJCQkJCSAgIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQkgICBcCisJCSIJdGVzdGwgJTEsJTFcbiIJCQkJCSAgIFwKKwkJIglqeiAyZlxuIgkJCQkJICAgXAorCQkiMDoJbG9kc2JcbiIJCQkJCSAgIFwKKwkJIglzdG9zYlxuIgkJCQkJICAgXAorCQkiCXRlc3RiICUlYWwsJSVhbFxuIgkJCQkgICBcCisJCSIJanogMWZcbiIJCQkJCSAgIFwKKwkJIglkZWNsICUxXG4iCQkJCQkgICBcCisJCSIJam56IDBiXG4iCQkJCQkgICBcCisJCSIxOglzdWJsICUxLCUwXG4iCQkJCQkgICBcCisJCSIyOlxuIgkJCQkJCQkgICBcCisJCSIuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCQkJCSAgIFwKKwkJIjM6CW1vdmwgJTUsJTBcbiIJCQkJCSAgIFwKKwkJIglqbXAgMmJcbiIJCQkJCSAgIFwKKwkJIi5wcmV2aW91c1xuIgkJCQkJCSAgIFwKKwkJIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIJCQkJICAgXAorCQkiCS5hbGlnbiA0XG4iCQkJCQkgICBcCisJCSIJLmxvbmcgMGIsM2JcbiIJCQkJCSAgIFwKKwkJIi5wcmV2aW91cyIJCQkJCQkgICBcCisJCTogIj1kIihyZXMpLCAiPWMiKGNvdW50KSwgIj0mYSIgKF9fZDApLCAiPSZTIiAoX19kMSksCSAgIFwKKwkJICAiPSZEIiAoX19kMikJCQkJCQkgICBcCisJCTogImkiKC1FRkFVTFQpLCAiMCIoY291bnQpLCAiMSIoY291bnQpLCAiMyIoc3JjKSwgIjQiKGRzdCkgXAorCQk6ICJtZW1vcnkiKTsJCQkJCQkgICBcCit9IHdoaWxlICgwKQorCisvKioKKyAqIF9fc3RybmNweV9mcm9tX3VzZXI6IC0gQ29weSBhIE5VTCB0ZXJtaW5hdGVkIHN0cmluZyBmcm9tIHVzZXJzcGFjZSwgd2l0aCBsZXNzIGNoZWNraW5nLgorICogQGRzdDogICBEZXN0aW5hdGlvbiBhZGRyZXNzLCBpbiBrZXJuZWwgc3BhY2UuICBUaGlzIGJ1ZmZlciBtdXN0IGJlIGF0CisgKiAgICAgICAgIGxlYXN0IEBjb3VudCBieXRlcyBsb25nLgorICogQHNyYzogICBTb3VyY2UgYWRkcmVzcywgaW4gdXNlciBzcGFjZS4KKyAqIEBjb3VudDogTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gY29weSwgaW5jbHVkaW5nIHRoZSB0cmFpbGluZyBOVUwuCisgKiAKKyAqIENvcGllcyBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBmcm9tIHVzZXJzcGFjZSB0byBrZXJuZWwgc3BhY2UuCisgKiBDYWxsZXIgbXVzdCBjaGVjayB0aGUgc3BlY2lmaWVkIGJsb2NrIHdpdGggYWNjZXNzX29rKCkgYmVmb3JlIGNhbGxpbmcKKyAqIHRoaXMgZnVuY3Rpb24uCisgKgorICogT24gc3VjY2VzcywgcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgKG5vdCBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nCisgKiBOVUwpLgorICoKKyAqIElmIGFjY2VzcyB0byB1c2Vyc3BhY2UgZmFpbHMsIHJldHVybnMgLUVGQVVMVCAoc29tZSBkYXRhIG1heSBoYXZlIGJlZW4KKyAqIGNvcGllZCkuCisgKgorICogSWYgQGNvdW50IGlzIHNtYWxsZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcsIGNvcGllcyBAY291bnQgYnl0ZXMKKyAqIGFuZCByZXR1cm5zIEBjb3VudC4KKyAqLworbG9uZworX19zdHJuY3B5X2Zyb21fdXNlcihjaGFyICpkc3QsIGNvbnN0IGNoYXIgX191c2VyICpzcmMsIGxvbmcgY291bnQpCit7CisJbG9uZyByZXM7CisJX19kb19zdHJuY3B5X2Zyb21fdXNlcihkc3QsIHNyYywgY291bnQsIHJlcyk7CisJcmV0dXJuIHJlczsKK30KKworLyoqCisgKiBzdHJuY3B5X2Zyb21fdXNlcjogLSBDb3B5IGEgTlVMIHRlcm1pbmF0ZWQgc3RyaW5nIGZyb20gdXNlcnNwYWNlLgorICogQGRzdDogICBEZXN0aW5hdGlvbiBhZGRyZXNzLCBpbiBrZXJuZWwgc3BhY2UuICBUaGlzIGJ1ZmZlciBtdXN0IGJlIGF0CisgKiAgICAgICAgIGxlYXN0IEBjb3VudCBieXRlcyBsb25nLgorICogQHNyYzogICBTb3VyY2UgYWRkcmVzcywgaW4gdXNlciBzcGFjZS4KKyAqIEBjb3VudDogTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gY29weSwgaW5jbHVkaW5nIHRoZSB0cmFpbGluZyBOVUwuCisgKiAKKyAqIENvcGllcyBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBmcm9tIHVzZXJzcGFjZSB0byBrZXJuZWwgc3BhY2UuCisgKgorICogT24gc3VjY2VzcywgcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgKG5vdCBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nCisgKiBOVUwpLgorICoKKyAqIElmIGFjY2VzcyB0byB1c2Vyc3BhY2UgZmFpbHMsIHJldHVybnMgLUVGQVVMVCAoc29tZSBkYXRhIG1heSBoYXZlIGJlZW4KKyAqIGNvcGllZCkuCisgKgorICogSWYgQGNvdW50IGlzIHNtYWxsZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcsIGNvcGllcyBAY291bnQgYnl0ZXMKKyAqIGFuZCByZXR1cm5zIEBjb3VudC4KKyAqLworbG9uZworc3RybmNweV9mcm9tX3VzZXIoY2hhciAqZHN0LCBjb25zdCBjaGFyIF9fdXNlciAqc3JjLCBsb25nIGNvdW50KQoreworCWxvbmcgcmVzID0gLUVGQVVMVDsKKwlpZiAoYWNjZXNzX29rKFZFUklGWV9SRUFELCBzcmMsIDEpKQorCQlfX2RvX3N0cm5jcHlfZnJvbV91c2VyKGRzdCwgc3JjLCBjb3VudCwgcmVzKTsKKwlyZXR1cm4gcmVzOworfQorCisKKy8qCisgKiBaZXJvIFVzZXJzcGFjZQorICovCisKKyNkZWZpbmUgX19kb19jbGVhcl91c2VyKGFkZHIsc2l6ZSkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJaW50IF9fZDA7CQkJCQkJCVwKKwltaWdodF9zbGVlcCgpOwkJCQkJCQlcCisgIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCisJCSIwOglyZXA7IHN0b3NsXG4iCQkJCQlcCisJCSIJbW92bCAlMiwlMFxuIgkJCQkJXAorCQkiMToJcmVwOyBzdG9zYlxuIgkJCQkJXAorCQkiMjpcbiIJCQkJCQkJXAorCQkiLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgkJCQlcCisJCSIzOglsZWEgMCglMiwlMCw0KSwlMFxuIgkJCQlcCisJCSIJam1wIDJiXG4iCQkJCQlcCisJCSIucHJldmlvdXNcbiIJCQkJCQlcCisJCSIuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCQkJCVwKKwkJIgkuYWxpZ24gNFxuIgkJCQkJXAorCQkiCS5sb25nIDBiLDNiXG4iCQkJCQlcCisJCSIJLmxvbmcgMWIsMmJcbiIJCQkJCVwKKwkJIi5wcmV2aW91cyIJCQkJCQlcCisJCTogIj0mYyIoc2l6ZSksICI9JkQiIChfX2QwKQkJCQlcCisJCTogInIiKHNpemUgJiAzKSwgIjAiKHNpemUgLyA0KSwgIjEiKGFkZHIpLCAiYSIoMCkpOwlcCit9IHdoaWxlICgwKQorCisvKioKKyAqIGNsZWFyX3VzZXI6IC0gWmVybyBhIGJsb2NrIG9mIG1lbW9yeSBpbiB1c2VyIHNwYWNlLgorICogQHRvOiAgIERlc3RpbmF0aW9uIGFkZHJlc3MsIGluIHVzZXIgc3BhY2UuCisgKiBAbjogICAgTnVtYmVyIG9mIGJ5dGVzIHRvIHplcm8uCisgKgorICogWmVybyBhIGJsb2NrIG9mIG1lbW9yeSBpbiB1c2VyIHNwYWNlLgorICoKKyAqIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY291bGQgbm90IGJlIGNsZWFyZWQuCisgKiBPbiBzdWNjZXNzLCB0aGlzIHdpbGwgYmUgemVyby4KKyAqLwordW5zaWduZWQgbG9uZworY2xlYXJfdXNlcih2b2lkIF9fdXNlciAqdG8sIHVuc2lnbmVkIGxvbmcgbikKK3sKKwltaWdodF9zbGVlcCgpOworCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB0bywgbikpCisJCV9fZG9fY2xlYXJfdXNlcih0bywgbik7CisJcmV0dXJuIG47Cit9CisKKy8qKgorICogX19jbGVhcl91c2VyOiAtIFplcm8gYSBibG9jayBvZiBtZW1vcnkgaW4gdXNlciBzcGFjZSwgd2l0aCBsZXNzIGNoZWNraW5nLgorICogQHRvOiAgIERlc3RpbmF0aW9uIGFkZHJlc3MsIGluIHVzZXIgc3BhY2UuCisgKiBAbjogICAgTnVtYmVyIG9mIGJ5dGVzIHRvIHplcm8uCisgKgorICogWmVybyBhIGJsb2NrIG9mIG1lbW9yeSBpbiB1c2VyIHNwYWNlLiAgQ2FsbGVyIG11c3QgY2hlY2sKKyAqIHRoZSBzcGVjaWZpZWQgYmxvY2sgd2l0aCBhY2Nlc3Nfb2soKSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY291bGQgbm90IGJlIGNsZWFyZWQuCisgKiBPbiBzdWNjZXNzLCB0aGlzIHdpbGwgYmUgemVyby4KKyAqLwordW5zaWduZWQgbG9uZworX19jbGVhcl91c2VyKHZvaWQgX191c2VyICp0bywgdW5zaWduZWQgbG9uZyBuKQoreworCV9fZG9fY2xlYXJfdXNlcih0bywgbik7CisJcmV0dXJuIG47Cit9CisKKy8qKgorICogc3RybGVuX3VzZXI6IC0gR2V0IHRoZSBzaXplIG9mIGEgc3RyaW5nIGluIHVzZXIgc3BhY2UuCisgKiBAczogVGhlIHN0cmluZyB0byBtZWFzdXJlLgorICogQG46IFRoZSBtYXhpbXVtIHZhbGlkIGxlbmd0aAorICoKKyAqIEdldCB0aGUgc2l6ZSBvZiBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBpbiB1c2VyIHNwYWNlLgorICoKKyAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIHN0cmluZyBJTkNMVURJTkcgdGhlIHRlcm1pbmF0aW5nIE5VTC4KKyAqIE9uIGV4Y2VwdGlvbiwgcmV0dXJucyAwLgorICogSWYgdGhlIHN0cmluZyBpcyB0b28gbG9uZywgcmV0dXJucyBhIHZhbHVlIGdyZWF0ZXIgdGhhbiBAbi4KKyAqLworbG9uZyBzdHJubGVuX3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKnMsIGxvbmcgbikKK3sKKwl1bnNpZ25lZCBsb25nIG1hc2sgPSAtX19hZGRyX29rKHMpOworCXVuc2lnbmVkIGxvbmcgcmVzLCB0bXA7CisKKwltaWdodF9zbGVlcCgpOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSIJdGVzdGwgJTAsICUwXG4iCisJCSIJanogM2ZcbiIKKwkJIglhbmRsICUwLCUlZWN4XG4iCisJCSIwOglyZXBuZTsgc2Nhc2JcbiIKKwkJIglzZXRuZSAlJWFsXG4iCisJCSIJc3VibCAlJWVjeCwlMFxuIgorCQkiCWFkZGwgJTAsJSVlYXhcbiIKKwkJIjE6XG4iCisJCSIuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCisJCSIyOgl4b3JsICUlZWF4LCUlZWF4XG4iCisJCSIJam1wIDFiXG4iCisJCSIzOgltb3ZiICQxLCUlYWxcbiIKKwkJIglqbXAgMWJcbiIKKwkJIi5wcmV2aW91c1xuIgorCQkiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgorCQkiCS5hbGlnbiA0XG4iCisJCSIJLmxvbmcgMGIsMmJcbiIKKwkJIi5wcmV2aW91cyIKKwkJOiI9ciIgKG4pLCAiPUQiIChzKSwgIj1hIiAocmVzKSwgIj1jIiAodG1wKQorCQk6IjAiIChuKSwgIjEiIChzKSwgIjIiICgwKSwgIjMiIChtYXNrKQorCQk6ImNjIik7CisJcmV0dXJuIHJlcyAmIG1hc2s7Cit9CisKKyNpZmRlZiBDT05GSUdfWDg2X0lOVEVMX1VTRVJDT1BZCitzdGF0aWMgdW5zaWduZWQgbG9uZworX19jb3B5X3VzZXJfaW50ZWwodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaW50IGQwLCBkMTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJICAgICAgICIgICAgICAgLmFsaWduIDIsMHg5MFxuIgorCQkgICAgICAgIjE6ICAgICBtb3ZsIDMyKCU0KSwgJSVlYXhcbiIKKwkJICAgICAgICIgICAgICAgY21wbCAkNjcsICUwXG4iCisJCSAgICAgICAiICAgICAgIGpiZSAzZlxuIgorCQkgICAgICAgIjI6ICAgICBtb3ZsIDY0KCU0KSwgJSVlYXhcbiIKKwkJICAgICAgICIgICAgICAgLmFsaWduIDIsMHg5MFxuIgorCQkgICAgICAgIjM6ICAgICBtb3ZsIDAoJTQpLCAlJWVheFxuIgorCQkgICAgICAgIjQ6ICAgICBtb3ZsIDQoJTQpLCAlJWVkeFxuIgorCQkgICAgICAgIjU6ICAgICBtb3ZsICUlZWF4LCAwKCUzKVxuIgorCQkgICAgICAgIjY6ICAgICBtb3ZsICUlZWR4LCA0KCUzKVxuIgorCQkgICAgICAgIjc6ICAgICBtb3ZsIDgoJTQpLCAlJWVheFxuIgorCQkgICAgICAgIjg6ICAgICBtb3ZsIDEyKCU0KSwlJWVkeFxuIgorCQkgICAgICAgIjk6ICAgICBtb3ZsICUlZWF4LCA4KCUzKVxuIgorCQkgICAgICAgIjEwOiAgICBtb3ZsICUlZWR4LCAxMiglMylcbiIKKwkJICAgICAgICIxMTogICAgbW92bCAxNiglNCksICUlZWF4XG4iCisJCSAgICAgICAiMTI6ICAgIG1vdmwgMjAoJTQpLCAlJWVkeFxuIgorCQkgICAgICAgIjEzOiAgICBtb3ZsICUlZWF4LCAxNiglMylcbiIKKwkJICAgICAgICIxNDogICAgbW92bCAlJWVkeCwgMjAoJTMpXG4iCisJCSAgICAgICAiMTU6ICAgIG1vdmwgMjQoJTQpLCAlJWVheFxuIgorCQkgICAgICAgIjE2OiAgICBtb3ZsIDI4KCU0KSwgJSVlZHhcbiIKKwkJICAgICAgICIxNzogICAgbW92bCAlJWVheCwgMjQoJTMpXG4iCisJCSAgICAgICAiMTg6ICAgIG1vdmwgJSVlZHgsIDI4KCUzKVxuIgorCQkgICAgICAgIjE5OiAgICBtb3ZsIDMyKCU0KSwgJSVlYXhcbiIKKwkJICAgICAgICIyMDogICAgbW92bCAzNiglNCksICUlZWR4XG4iCisJCSAgICAgICAiMjE6ICAgIG1vdmwgJSVlYXgsIDMyKCUzKVxuIgorCQkgICAgICAgIjIyOiAgICBtb3ZsICUlZWR4LCAzNiglMylcbiIKKwkJICAgICAgICIyMzogICAgbW92bCA0MCglNCksICUlZWF4XG4iCisJCSAgICAgICAiMjQ6ICAgIG1vdmwgNDQoJTQpLCAlJWVkeFxuIgorCQkgICAgICAgIjI1OiAgICBtb3ZsICUlZWF4LCA0MCglMylcbiIKKwkJICAgICAgICIyNjogICAgbW92bCAlJWVkeCwgNDQoJTMpXG4iCisJCSAgICAgICAiMjc6ICAgIG1vdmwgNDgoJTQpLCAlJWVheFxuIgorCQkgICAgICAgIjI4OiAgICBtb3ZsIDUyKCU0KSwgJSVlZHhcbiIKKwkJICAgICAgICIyOTogICAgbW92bCAlJWVheCwgNDgoJTMpXG4iCisJCSAgICAgICAiMzA6ICAgIG1vdmwgJSVlZHgsIDUyKCUzKVxuIgorCQkgICAgICAgIjMxOiAgICBtb3ZsIDU2KCU0KSwgJSVlYXhcbiIKKwkJICAgICAgICIzMjogICAgbW92bCA2MCglNCksICUlZWR4XG4iCisJCSAgICAgICAiMzM6ICAgIG1vdmwgJSVlYXgsIDU2KCUzKVxuIgorCQkgICAgICAgIjM0OiAgICBtb3ZsICUlZWR4LCA2MCglMylcbiIKKwkJICAgICAgICIgICAgICAgYWRkbCAkLTY0LCAlMFxuIgorCQkgICAgICAgIiAgICAgICBhZGRsICQ2NCwgJTRcbiIKKwkJICAgICAgICIgICAgICAgYWRkbCAkNjQsICUzXG4iCisJCSAgICAgICAiICAgICAgIGNtcGwgJDYzLCAlMFxuIgorCQkgICAgICAgIiAgICAgICBqYSAgMWJcbiIKKwkJICAgICAgICIzNTogICAgbW92bCAgJTAsICUlZWF4XG4iCisJCSAgICAgICAiICAgICAgIHNocmwgICQyLCAlMFxuIgorCQkgICAgICAgIiAgICAgICBhbmRsICAkMywgJSVlYXhcbiIKKwkJICAgICAgICIgICAgICAgY2xkXG4iCisJCSAgICAgICAiOTk6ICAgIHJlcDsgbW92c2xcbiIKKwkJICAgICAgICIzNjogICAgbW92bCAlJWVheCwgJTBcbiIKKwkJICAgICAgICIzNzogICAgcmVwOyBtb3ZzYlxuIgorCQkgICAgICAgIjEwMDpcbiIKKwkJICAgICAgICIuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCisJCSAgICAgICAiMTAxOiAgIGxlYSAwKCUlZWF4LCUwLDQpLCUwXG4iCisJCSAgICAgICAiICAgICAgIGptcCAxMDBiXG4iCisJCSAgICAgICAiLnByZXZpb3VzXG4iCisJCSAgICAgICAiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgorCQkgICAgICAgIiAgICAgICAuYWxpZ24gNFxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAxYiwxMDBiXG4iCisJCSAgICAgICAiICAgICAgIC5sb25nIDJiLDEwMGJcbiIKKwkJICAgICAgICIgICAgICAgLmxvbmcgM2IsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyA0YiwxMDBiXG4iCisJCSAgICAgICAiICAgICAgIC5sb25nIDViLDEwMGJcbiIKKwkJICAgICAgICIgICAgICAgLmxvbmcgNmIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyA3YiwxMDBiXG4iCisJCSAgICAgICAiICAgICAgIC5sb25nIDhiLDEwMGJcbiIKKwkJICAgICAgICIgICAgICAgLmxvbmcgOWIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAxMGIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAxMWIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAxMmIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAxM2IsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAxNGIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAxNWIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAxNmIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAxN2IsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAxOGIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAxOWIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAyMGIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAyMWIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAyMmIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAyM2IsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAyNGIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAyNWIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAyNmIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAyN2IsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAyOGIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAyOWIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAzMGIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAzMWIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAzMmIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAzM2IsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAzNGIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAzNWIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAzNmIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAzN2IsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyA5OWIsMTAxYlxuIgorCQkgICAgICAgIi5wcmV2aW91cyIKKwkJICAgICAgIDogIj0mYyIoc2l6ZSksICI9JkQiIChkMCksICI9JlMiIChkMSkKKwkJICAgICAgIDogICIxIih0byksICIyIihmcm9tKSwgIjAiKHNpemUpCisJCSAgICAgICA6ICJlYXgiLCAiZWR4IiwgIm1lbW9yeSIpOworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZworX19jb3B5X3VzZXJfemVyb2luZ19pbnRlbCh2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlpbnQgZDAsIGQxOworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkgICAgICAgIiAgICAgICAgLmFsaWduIDIsMHg5MFxuIgorCQkgICAgICAgIjA6ICAgICAgbW92bCAzMiglNCksICUlZWF4XG4iCisJCSAgICAgICAiICAgICAgICBjbXBsICQ2NywgJTBcbiIgICAgICAKKwkJICAgICAgICIgICAgICAgIGpiZSAyZlxuIiAgICAgICAgICAgIAorCQkgICAgICAgIjE6ICAgICAgbW92bCA2NCglNCksICUlZWF4XG4iCisJCSAgICAgICAiICAgICAgICAuYWxpZ24gMiwweDkwXG4iICAgICAKKwkJICAgICAgICIyOiAgICAgIG1vdmwgMCglNCksICUlZWF4XG4iIAorCQkgICAgICAgIjIxOiAgICAgbW92bCA0KCU0KSwgJSVlZHhcbiIgCisJCSAgICAgICAiICAgICAgICBtb3ZsICUlZWF4LCAwKCUzKVxuIiAKKwkJICAgICAgICIgICAgICAgIG1vdmwgJSVlZHgsIDQoJTMpXG4iIAorCQkgICAgICAgIjM6ICAgICAgbW92bCA4KCU0KSwgJSVlYXhcbiIgCisJCSAgICAgICAiMzE6ICAgICBtb3ZsIDEyKCU0KSwlJWVkeFxuIiAKKwkJICAgICAgICIgICAgICAgIG1vdmwgJSVlYXgsIDgoJTMpXG4iIAorCQkgICAgICAgIiAgICAgICAgbW92bCAlJWVkeCwgMTIoJTMpXG4iCisJCSAgICAgICAiNDogICAgICBtb3ZsIDE2KCU0KSwgJSVlYXhcbiIKKwkJICAgICAgICI0MTogICAgIG1vdmwgMjAoJTQpLCAlJWVkeFxuIgorCQkgICAgICAgIiAgICAgICAgbW92bCAlJWVheCwgMTYoJTMpXG4iCisJCSAgICAgICAiICAgICAgICBtb3ZsICUlZWR4LCAyMCglMylcbiIKKwkJICAgICAgICIxMDogICAgIG1vdmwgMjQoJTQpLCAlJWVheFxuIgorCQkgICAgICAgIjUxOiAgICAgbW92bCAyOCglNCksICUlZWR4XG4iCisJCSAgICAgICAiICAgICAgICBtb3ZsICUlZWF4LCAyNCglMylcbiIKKwkJICAgICAgICIgICAgICAgIG1vdmwgJSVlZHgsIDI4KCUzKVxuIgorCQkgICAgICAgIjExOiAgICAgbW92bCAzMiglNCksICUlZWF4XG4iCisJCSAgICAgICAiNjE6ICAgICBtb3ZsIDM2KCU0KSwgJSVlZHhcbiIKKwkJICAgICAgICIgICAgICAgIG1vdmwgJSVlYXgsIDMyKCUzKVxuIgorCQkgICAgICAgIiAgICAgICAgbW92bCAlJWVkeCwgMzYoJTMpXG4iCisJCSAgICAgICAiMTI6ICAgICBtb3ZsIDQwKCU0KSwgJSVlYXhcbiIKKwkJICAgICAgICI3MTogICAgIG1vdmwgNDQoJTQpLCAlJWVkeFxuIgorCQkgICAgICAgIiAgICAgICAgbW92bCAlJWVheCwgNDAoJTMpXG4iCisJCSAgICAgICAiICAgICAgICBtb3ZsICUlZWR4LCA0NCglMylcbiIKKwkJICAgICAgICIxMzogICAgIG1vdmwgNDgoJTQpLCAlJWVheFxuIgorCQkgICAgICAgIjgxOiAgICAgbW92bCA1MiglNCksICUlZWR4XG4iCisJCSAgICAgICAiICAgICAgICBtb3ZsICUlZWF4LCA0OCglMylcbiIKKwkJICAgICAgICIgICAgICAgIG1vdmwgJSVlZHgsIDUyKCUzKVxuIgorCQkgICAgICAgIjE0OiAgICAgbW92bCA1NiglNCksICUlZWF4XG4iCisJCSAgICAgICAiOTE6ICAgICBtb3ZsIDYwKCU0KSwgJSVlZHhcbiIKKwkJICAgICAgICIgICAgICAgIG1vdmwgJSVlYXgsIDU2KCUzKVxuIgorCQkgICAgICAgIiAgICAgICAgbW92bCAlJWVkeCwgNjAoJTMpXG4iCisJCSAgICAgICAiICAgICAgICBhZGRsICQtNjQsICUwXG4iICAgICAKKwkJICAgICAgICIgICAgICAgIGFkZGwgJDY0LCAlNFxuIiAgICAgIAorCQkgICAgICAgIiAgICAgICAgYWRkbCAkNjQsICUzXG4iICAgICAgCisJCSAgICAgICAiICAgICAgICBjbXBsICQ2MywgJTBcbiIgICAgICAKKwkJICAgICAgICIgICAgICAgIGphICAwYlxuIiAgICAgICAgICAgIAorCQkgICAgICAgIjU6ICAgICAgbW92bCAgJTAsICUlZWF4XG4iICAgCisJCSAgICAgICAiICAgICAgICBzaHJsICAkMiwgJTBcbiIgICAgICAKKwkJICAgICAgICIgICAgICAgIGFuZGwgJDMsICUlZWF4XG4iICAgIAorCQkgICAgICAgIiAgICAgICAgY2xkXG4iICAgICAgICAgICAgICAgCisJCSAgICAgICAiNjogICAgICByZXA7IG1vdnNsXG4iICAgCisJCSAgICAgICAiICAgICAgICBtb3ZsICUlZWF4LCUwXG4iCisJCSAgICAgICAiNzogICAgICByZXA7IG1vdnNiXG4iCQorCQkgICAgICAgIjg6XG4iCQkJCisJCSAgICAgICAiLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgorCQkgICAgICAgIjk6ICAgICAgbGVhIDAoJSVlYXgsJTAsNCksJTBcbiIJCisJCSAgICAgICAiMTY6ICAgICBwdXNobCAlMFxuIgkKKwkJICAgICAgICIgICAgICAgIHB1c2hsICUlZWF4XG4iCQorCQkgICAgICAgIiAgICAgICAgeG9ybCAlJWVheCwlJWVheFxuIgorCQkgICAgICAgIiAgICAgICAgcmVwOyBzdG9zYlxuIgkKKwkJICAgICAgICIgICAgICAgIHBvcGwgJSVlYXhcbiIJCisJCSAgICAgICAiICAgICAgICBwb3BsICUwXG4iCQorCQkgICAgICAgIiAgICAgICAgam1wIDhiXG4iCQorCQkgICAgICAgIi5wcmV2aW91c1xuIgkJCisJCSAgICAgICAiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgorCQkgICAgICAgIgkuYWxpZ24gNFxuIgkgICAKKwkJICAgICAgICIJLmxvbmcgMGIsMTZiXG4iCSAKKwkJICAgICAgICIJLmxvbmcgMWIsMTZiXG4iCisJCSAgICAgICAiCS5sb25nIDJiLDE2YlxuIgorCQkgICAgICAgIgkubG9uZyAyMWIsMTZiXG4iCisJCSAgICAgICAiCS5sb25nIDNiLDE2YlxuIgkKKwkJICAgICAgICIJLmxvbmcgMzFiLDE2YlxuIgorCQkgICAgICAgIgkubG9uZyA0YiwxNmJcbiIJCisJCSAgICAgICAiCS5sb25nIDQxYiwxNmJcbiIKKwkJICAgICAgICIJLmxvbmcgMTBiLDE2YlxuIgorCQkgICAgICAgIgkubG9uZyA1MWIsMTZiXG4iCisJCSAgICAgICAiCS5sb25nIDExYiwxNmJcbiIKKwkJICAgICAgICIJLmxvbmcgNjFiLDE2YlxuIgorCQkgICAgICAgIgkubG9uZyAxMmIsMTZiXG4iCisJCSAgICAgICAiCS5sb25nIDcxYiwxNmJcbiIKKwkJICAgICAgICIJLmxvbmcgMTNiLDE2YlxuIgorCQkgICAgICAgIgkubG9uZyA4MWIsMTZiXG4iCisJCSAgICAgICAiCS5sb25nIDE0YiwxNmJcbiIKKwkJICAgICAgICIJLmxvbmcgOTFiLDE2YlxuIgorCQkgICAgICAgIgkubG9uZyA2Yiw5YlxuIgkKKwkJICAgICAgICIgICAgICAgIC5sb25nIDdiLDE2YlxuIiAKKwkJICAgICAgICIucHJldmlvdXMiCQkKKwkJICAgICAgIDogIj0mYyIoc2l6ZSksICI9JkQiIChkMCksICI9JlMiIChkMSkKKwkJICAgICAgIDogICIxIih0byksICIyIihmcm9tKSwgIjAiKHNpemUpCisJCSAgICAgICA6ICJlYXgiLCAiZWR4IiwgIm1lbW9yeSIpOworCXJldHVybiBzaXplOworfQorI2Vsc2UKKy8qCisgKiBMZWF2ZSB0aGVzZSBkZWNsYXJlZCBidXQgdW5kZWZpbmVkLiAgVGhleSBzaG91bGQgbm90IGJlIGFueSByZWZlcmVuY2VzIHRvCisgKiB0aGVtCisgKi8KK3Vuc2lnbmVkIGxvbmcKK19fY29weV91c2VyX3plcm9pbmdfaW50ZWwodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIHNpemUpOwordW5zaWduZWQgbG9uZworX19jb3B5X3VzZXJfaW50ZWwodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIHNpemUpOworI2VuZGlmIC8qIENPTkZJR19YODZfSU5URUxfVVNFUkNPUFkgKi8KKworLyogR2VuZXJpYyBhcmJpdHJhcnkgc2l6ZWQgY29weS4gICovCisjZGVmaW5lIF9fY29weV91c2VyKHRvLGZyb20sc2l6ZSkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJaW50IF9fZDAsIF9fZDEsIF9fZDI7CQkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKKwkJIgljbXAgICQ3LCUwXG4iCQkJCQlcCisJCSIJamJlICAxZlxuIgkJCQkJXAorCQkiCW1vdmwgJTEsJTBcbiIJCQkJCVwKKwkJIgluZWdsICUwXG4iCQkJCQlcCisJCSIJYW5kbCAkNywlMFxuIgkJCQkJXAorCQkiCXN1YmwgJTAsJTNcbiIJCQkJCVwKKwkJIjQ6CXJlcDsgbW92c2JcbiIJCQkJCVwKKwkJIgltb3ZsICUzLCUwXG4iCQkJCQlcCisJCSIJc2hybCAkMiwlMFxuIgkJCQkJXAorCQkiCWFuZGwgJDMsJTNcbiIJCQkJCVwKKwkJIgkuYWxpZ24gMiwweDkwXG4iCQkJCVwKKwkJIjA6CXJlcDsgbW92c2xcbiIJCQkJCVwKKwkJIgltb3ZsICUzLCUwXG4iCQkJCQlcCisJCSIxOglyZXA7IG1vdnNiXG4iCQkJCQlcCisJCSIyOlxuIgkJCQkJCQlcCisJCSIuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCQkJCVwKKwkJIjU6CWFkZGwgJTMsJTBcbiIJCQkJCVwKKwkJIglqbXAgMmJcbiIJCQkJCVwKKwkJIjM6CWxlYSAwKCUzLCUwLDQpLCUwXG4iCQkJCVwKKwkJIglqbXAgMmJcbiIJCQkJCVwKKwkJIi5wcmV2aW91c1xuIgkJCQkJCVwKKwkJIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIJCQkJXAorCQkiCS5hbGlnbiA0XG4iCQkJCQlcCisJCSIJLmxvbmcgNGIsNWJcbiIJCQkJCVwKKwkJIgkubG9uZyAwYiwzYlxuIgkJCQkJXAorCQkiCS5sb25nIDFiLDJiXG4iCQkJCQlcCisJCSIucHJldmlvdXMiCQkJCQkJXAorCQk6ICI9JmMiKHNpemUpLCAiPSZEIiAoX19kMCksICI9JlMiIChfX2QxKSwgIj1yIihfX2QyKQlcCisJCTogIjMiKHNpemUpLCAiMCIoc2l6ZSksICIxIih0byksICIyIihmcm9tKQkJXAorCQk6ICJtZW1vcnkiKTsJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIF9fY29weV91c2VyX3plcm9pbmcodG8sZnJvbSxzaXplKQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWludCBfX2QwLCBfX2QxLCBfX2QyOwkJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCisJCSIJY21wICAkNywlMFxuIgkJCQkJXAorCQkiCWpiZSAgMWZcbiIJCQkJCVwKKwkJIgltb3ZsICUxLCUwXG4iCQkJCQlcCisJCSIJbmVnbCAlMFxuIgkJCQkJXAorCQkiCWFuZGwgJDcsJTBcbiIJCQkJCVwKKwkJIglzdWJsICUwLCUzXG4iCQkJCQlcCisJCSI0OglyZXA7IG1vdnNiXG4iCQkJCQlcCisJCSIJbW92bCAlMywlMFxuIgkJCQkJXAorCQkiCXNocmwgJDIsJTBcbiIJCQkJCVwKKwkJIglhbmRsICQzLCUzXG4iCQkJCQlcCisJCSIJLmFsaWduIDIsMHg5MFxuIgkJCQlcCisJCSIwOglyZXA7IG1vdnNsXG4iCQkJCQlcCisJCSIJbW92bCAlMywlMFxuIgkJCQkJXAorCQkiMToJcmVwOyBtb3ZzYlxuIgkJCQkJXAorCQkiMjpcbiIJCQkJCQkJXAorCQkiLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgkJCQlcCisJCSI1OglhZGRsICUzLCUwXG4iCQkJCQlcCisJCSIJam1wIDZmXG4iCQkJCQlcCisJCSIzOglsZWEgMCglMywlMCw0KSwlMFxuIgkJCQlcCisJCSI2OglwdXNobCAlMFxuIgkJCQkJXAorCQkiCXB1c2hsICUlZWF4XG4iCQkJCQlcCisJCSIJeG9ybCAlJWVheCwlJWVheFxuIgkJCQlcCisJCSIJcmVwOyBzdG9zYlxuIgkJCQkJXAorCQkiCXBvcGwgJSVlYXhcbiIJCQkJCVwKKwkJIglwb3BsICUwXG4iCQkJCQlcCisJCSIJam1wIDJiXG4iCQkJCQlcCisJCSIucHJldmlvdXNcbiIJCQkJCQlcCisJCSIuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCQkJCVwKKwkJIgkuYWxpZ24gNFxuIgkJCQkJXAorCQkiCS5sb25nIDRiLDViXG4iCQkJCQlcCisJCSIJLmxvbmcgMGIsM2JcbiIJCQkJCVwKKwkJIgkubG9uZyAxYiw2YlxuIgkJCQkJXAorCQkiLnByZXZpb3VzIgkJCQkJCVwKKwkJOiAiPSZjIihzaXplKSwgIj0mRCIgKF9fZDApLCAiPSZTIiAoX19kMSksICI9ciIoX19kMikJXAorCQk6ICIzIihzaXplKSwgIjAiKHNpemUpLCAiMSIodG8pLCAiMiIoZnJvbSkJCVwKKwkJOiAibWVtb3J5Iik7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworCit1bnNpZ25lZCBsb25nIF9fY29weV90b191c2VyX2xsKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQoreworCUJVR19PTigobG9uZykgbiA8IDApOworI2lmbmRlZiBDT05GSUdfWDg2X1dQX1dPUktTX09LCisJaWYgKHVubGlrZWx5KGJvb3RfY3B1X2RhdGEud3Bfd29ya3Nfb2sgPT0gMCkgJiYKKwkJCSgodW5zaWduZWQgbG9uZyApdG8pIDwgVEFTS19TSVpFKSB7CisJCS8qIAorCQkgKiBDUFUgZG9lcyBub3QgaG9ub3IgdGhlIFdQIGJpdCB3aGVuIHdyaXRpbmcKKwkJICogZnJvbSBzdXBlcnZpc29yeSBtb2RlLCBhbmQgZHVlIHRvIHByZWVtcHRpb24gb3IgU01QLAorCQkgKiB0aGUgcGFnZSB0YWJsZXMgY2FuIGNoYW5nZSBhdCBhbnkgdGltZS4KKwkJICogRG8gaXQgbWFudWFsbHkuCU1hbmZyZWQgPG1hbmZyZWRAY29sb3JmdWxsaWZlLmNvbT4KKwkJICovCisJCXdoaWxlIChuKSB7CisJCSAgICAgIAl1bnNpZ25lZCBsb25nIG9mZnNldCA9ICgodW5zaWduZWQgbG9uZyl0byklUEFHRV9TSVpFOworCQkJdW5zaWduZWQgbG9uZyBsZW4gPSBQQUdFX1NJWkUgLSBvZmZzZXQ7CisJCQlpbnQgcmV0dmFsOworCQkJc3RydWN0IHBhZ2UgKnBnOworCQkJdm9pZCAqbWFkZHI7CisJCQkKKwkJCWlmIChsZW4gPiBuKQorCQkJCWxlbiA9IG47CisKK3N1cnZpdmU6CisJCQlkb3duX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJCQlyZXR2YWwgPSBnZXRfdXNlcl9wYWdlcyhjdXJyZW50LCBjdXJyZW50LT5tbSwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgKXRvLCAxLCAxLCAwLCAmcGcsIE5VTEwpOworCisJCQlpZiAocmV0dmFsID09IC1FTk9NRU0gJiYgY3VycmVudC0+cGlkID09IDEpIHsKKwkJCQl1cF9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCQkJCWJsa19jb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzUwKTsKKwkJCQlnb3RvIHN1cnZpdmU7CisJCQl9CisKKwkJCWlmIChyZXR2YWwgIT0gMSkgeworCQkJCXVwX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJCSAgICAgICAJCWJyZWFrOworCQkgICAgICAgCX0KKworCQkJbWFkZHIgPSBrbWFwX2F0b21pYyhwZywgS01fVVNFUjApOworCQkJbWVtY3B5KG1hZGRyICsgb2Zmc2V0LCBmcm9tLCBsZW4pOworCQkJa3VubWFwX2F0b21pYyhtYWRkciwgS01fVVNFUjApOworCQkJc2V0X3BhZ2VfZGlydHlfbG9jayhwZyk7CisJCQlwdXRfcGFnZShwZyk7CisJCQl1cF9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCisJCQlmcm9tICs9IGxlbjsKKwkJCXRvICs9IGxlbjsKKwkJCW4gLT0gbGVuOworCQl9CisJCXJldHVybiBuOworCX0KKyNlbmRpZgorCWlmIChtb3ZzbF9pc19vayh0bywgZnJvbSwgbikpCisJCV9fY29weV91c2VyKHRvLCBmcm9tLCBuKTsKKwllbHNlCisJCW4gPSBfX2NvcHlfdXNlcl9pbnRlbCh0bywgZnJvbSwgbik7CisJcmV0dXJuIG47Cit9CisKK3Vuc2lnbmVkIGxvbmcKK19fY29weV9mcm9tX3VzZXJfbGwodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCit7CisJQlVHX09OKChsb25nKW4gPCAwKTsKKwlpZiAobW92c2xfaXNfb2sodG8sIGZyb20sIG4pKQorCQlfX2NvcHlfdXNlcl96ZXJvaW5nKHRvLCBmcm9tLCBuKTsKKwllbHNlCisJCW4gPSBfX2NvcHlfdXNlcl96ZXJvaW5nX2ludGVsKHRvLCBmcm9tLCBuKTsKKwlyZXR1cm4gbjsKK30KKworLyoqCisgKiBjb3B5X3RvX3VzZXI6IC0gQ29weSBhIGJsb2NrIG9mIGRhdGEgaW50byB1c2VyIHNwYWNlLgorICogQHRvOiAgIERlc3RpbmF0aW9uIGFkZHJlc3MsIGluIHVzZXIgc3BhY2UuCisgKiBAZnJvbTogU291cmNlIGFkZHJlc3MsIGluIGtlcm5lbCBzcGFjZS4KKyAqIEBuOiAgICBOdW1iZXIgb2YgYnl0ZXMgdG8gY29weS4KKyAqCisgKiBDb250ZXh0OiBVc2VyIGNvbnRleHQgb25seS4gIFRoaXMgZnVuY3Rpb24gbWF5IHNsZWVwLgorICoKKyAqIENvcHkgZGF0YSBmcm9tIGtlcm5lbCBzcGFjZSB0byB1c2VyIHNwYWNlLgorICoKKyAqIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY291bGQgbm90IGJlIGNvcGllZC4KKyAqIE9uIHN1Y2Nlc3MsIHRoaXMgd2lsbCBiZSB6ZXJvLgorICovCit1bnNpZ25lZCBsb25nCitjb3B5X3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCit7CisJbWlnaHRfc2xlZXAoKTsKKwlCVUdfT04oKGxvbmcpIG4gPCAwKTsKKwlpZiAoYWNjZXNzX29rKFZFUklGWV9XUklURSwgdG8sIG4pKQorCQluID0gX19jb3B5X3RvX3VzZXIodG8sIGZyb20sIG4pOworCXJldHVybiBuOworfQorRVhQT1JUX1NZTUJPTChjb3B5X3RvX3VzZXIpOworCisvKioKKyAqIGNvcHlfZnJvbV91c2VyOiAtIENvcHkgYSBibG9jayBvZiBkYXRhIGZyb20gdXNlciBzcGFjZS4KKyAqIEB0bzogICBEZXN0aW5hdGlvbiBhZGRyZXNzLCBpbiBrZXJuZWwgc3BhY2UuCisgKiBAZnJvbTogU291cmNlIGFkZHJlc3MsIGluIHVzZXIgc3BhY2UuCisgKiBAbjogICAgTnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkuCisgKgorICogQ29udGV4dDogVXNlciBjb250ZXh0IG9ubHkuICBUaGlzIGZ1bmN0aW9uIG1heSBzbGVlcC4KKyAqCisgKiBDb3B5IGRhdGEgZnJvbSB1c2VyIHNwYWNlIHRvIGtlcm5lbCBzcGFjZS4KKyAqCisgKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyB0aGF0IGNvdWxkIG5vdCBiZSBjb3BpZWQuCisgKiBPbiBzdWNjZXNzLCB0aGlzIHdpbGwgYmUgemVyby4KKyAqCisgKiBJZiBzb21lIGRhdGEgY291bGQgbm90IGJlIGNvcGllZCwgdGhpcyBmdW5jdGlvbiB3aWxsIHBhZCB0aGUgY29waWVkCisgKiBkYXRhIHRvIHRoZSByZXF1ZXN0ZWQgc2l6ZSB1c2luZyB6ZXJvIGJ5dGVzLgorICovCit1bnNpZ25lZCBsb25nCitjb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKK3sKKwltaWdodF9zbGVlcCgpOworCUJVR19PTigobG9uZykgbiA8IDApOworCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyb20sIG4pKQorCQluID0gX19jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbik7CisJZWxzZQorCQltZW1zZXQodG8sIDAsIG4pOworCXJldHVybiBuOworfQorRVhQT1JUX1NZTUJPTChjb3B5X2Zyb21fdXNlcik7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWFjaC1kZWZhdWx0L01ha2VmaWxlIGIvYXJjaC9pMzg2L21hY2gtZGVmYXVsdC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTViYjAyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hY2gtZGVmYXVsdC9NYWtlZmlsZQpAQCAtMCwwICsxLDUgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuCisjCisKK29iai15CQkJCTo9IHNldHVwLm8gdG9wb2xvZ3kubwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hY2gtZGVmYXVsdC9zZXR1cC5jIGIvYXJjaC9pMzg2L21hY2gtZGVmYXVsdC9zZXR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYTA4ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWFjaC1kZWZhdWx0L3NldHVwLmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKglNYWNoaW5lIHNwZWNpZmljIHNldHVwIGZvciBnZW5lcmljCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxhc20vYWNwaS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoX2hvb2tzLmg+CisKKy8qKgorICogcHJlX2ludHJfaW5pdF9ob29rIC0gaW5pdGlhbGlzYXRpb24gcHJpb3IgdG8gc2V0dGluZyB1cCBpbnRlcnJ1cHQgdmVjdG9ycworICoKKyAqIERlc2NyaXB0aW9uOgorICoJUGVyZm9ybSBhbnkgbmVjZXNzYXJ5IGludGVycnVwdCBpbml0aWFsaXNhdGlvbiBwcmlvciB0byBzZXR0aW5nIHVwCisgKgl0aGUgIm9yZGluYXJ5IiBpbnRlcnJ1cHQgY2FsbCBnYXRlcy4gIEZvciBsZWdhY3kgcmVhc29ucywgdGhlIElTQQorICoJaW50ZXJydXB0cyBzaG91bGQgYmUgaW5pdGlhbGlzZWQgaGVyZSBpZiB0aGUgbWFjaGluZSBlbXVsYXRlcyBhIFBDCisgKglpbiBhbnkgd2F5LgorICoqLwordm9pZCBfX2luaXQgcHJlX2ludHJfaW5pdF9ob29rKHZvaWQpCit7CisJaW5pdF9JU0FfaXJxcygpOworfQorCisvKgorICogSVJRMiBpcyBjYXNjYWRlIGludGVycnVwdCB0byBzZWNvbmQgaW50ZXJydXB0IGNvbnRyb2xsZXIKKyAqLworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaXJxMiA9IHsgbm9fYWN0aW9uLCAwLCBDUFVfTUFTS19OT05FLCAiY2FzY2FkZSIsIE5VTEwsIE5VTEx9OworCisvKioKKyAqIGludHJfaW5pdF9ob29rIC0gcG9zdCBnYXRlIHNldHVwIGludGVycnVwdCBpbml0aWFsaXNhdGlvbgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJRmlsbCBpbiBhbnkgaW50ZXJydXB0cyB0aGF0IG1heSBoYXZlIGJlZW4gbGVmdCBvdXQgYnkgdGhlIGdlbmVyYWwKKyAqCWluaXRfSVJRKCkgcm91dGluZS4gIGludGVycnVwdHMgaGF2aW5nIHRvIGRvIHdpdGggdGhlIG1hY2hpbmUgcmF0aGVyCisgKgl0aGFuIHRoZSBkZXZpY2VzIG9uIHRoZSBJL08gYnVzIChsaWtlIEFQSUMgaW50ZXJydXB0cyBpbiBpbnRlbCBNUAorICoJc3lzdGVtcykgYXJlIHN0YXJ0ZWQgaGVyZS4KKyAqKi8KK3ZvaWQgX19pbml0IGludHJfaW5pdF9ob29rKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCisJYXBpY19pbnRyX2luaXQoKTsKKyNlbmRpZgorCisJaWYgKCFhY3BpX2lvYXBpYykKKwkJc2V0dXBfaXJxKDIsICZpcnEyKTsKK30KKworLyoqCisgKiBwcmVfc2V0dXBfYXJjaF9ob29rIC0gaG9vayBjYWxsZWQgcHJpb3IgdG8gYW55IHNldHVwX2FyY2goKSBleGVjdXRpb24KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCWdlbmVyYWxseSB1c2VkIHRvIGFjdGl2YXRlIGFueSBtYWNoaW5lIHNwZWNpZmljIGlkZW50aWZpY2F0aW9uCisgKglyb3V0aW5lcyB0aGF0IG1heSBiZSBuZWVkZWQgYmVmb3JlIHNldHVwX2FyY2goKSBydW5zLiAgT24gVklTV1MKKyAqCXRoaXMgaXMgdXNlZCB0byBnZXQgdGhlIGJvYXJkIHJldmlzaW9uIGFuZCB0eXBlLgorICoqLwordm9pZCBfX2luaXQgcHJlX3NldHVwX2FyY2hfaG9vayh2b2lkKQoreworfQorCisvKioKKyAqIHRyYXBfaW5pdF9ob29rIC0gaW5pdGlhbGlzZSBzeXN0ZW0gc3BlY2lmaWMgdHJhcHMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUNhbGxlZCBhcyB0aGUgZmluYWwgYWN0IG9mIHRyYXBfaW5pdCgpLiAgVXNlZCBpbiBWSVNXUyB0byBpbml0aWFsaXNlCisgKgl0aGUgdmFyaW91cyBib2FyZCBzcGVjaWZpYyBBUElDIHRyYXBzLgorICoqLwordm9pZCBfX2luaXQgdHJhcF9pbml0X2hvb2sodm9pZCkKK3sKK30KKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaXJxMCAgPSB7IHRpbWVyX2ludGVycnVwdCwgU0FfSU5URVJSVVBULCBDUFVfTUFTS19OT05FLCAidGltZXIiLCBOVUxMLCBOVUxMfTsKKworLyoqCisgKiB0aW1lX2luaXRfaG9vayAtIGRvIGFueSBzcGVjaWZpYyBpbml0aWFsaXNhdGlvbnMgZm9yIHRoZSBzeXN0ZW0gdGltZXIuCisgKgorICogRGVzY3JpcHRpb246CisgKglNdXN0IHBsdWcgdGhlIHN5c3RlbSB0aW1lciBpbnRlcnJ1cHQgc291cmNlIGF0IEhaIGludG8gdGhlIElSUSBsaXN0ZWQKKyAqCWluIGlycV92ZWN0b3JzLmg6VElNRVJfSVJRCisgKiovCit2b2lkIF9faW5pdCB0aW1lX2luaXRfaG9vayh2b2lkKQoreworCXNldHVwX2lycSgwLCAmaXJxMCk7Cit9CisKKyNpZmRlZiBDT05GSUdfTUNBCisvKioKKyAqIG1jYV9ubWlfaG9vayAtIGhvb2sgaW50byBNQ0Egc3BlY2lmaWMgTk1JIGNoYWluCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGUgTUNBIChNaWNyb2NoYW5uZWwgQXJjaXRlY3R1cmUpIGhhcyBhbiBOTUkgY2hhaW4gZm9yIE5NSSBzb3VyY2VzCisgKglhbG9uZyB0aGUgTUNBIGJ1cy4gIFVzZSB0aGlzIHRvIGhvb2sgaW50byB0aGF0IGNoYWluIGlmIHlvdSB3aWxsIG5lZWQKKyAqCWl0LgorICoqLwordm9pZCBfX2luaXQgbWNhX25taV9ob29rKHZvaWQpCit7CisJLyogSWYgSSByZWNhbGwgY29ycmVjdGx5LCB0aGVyZSdzIGEgd2hvbGUgYnVuY2ggb2Ygb3RoZXIgdGhpbmdzIHRoYXQKKwkgKiB3ZSBjYW4gZG8gdG8gY2hlY2sgZm9yIE5NSSBwcm9ibGVtcywgYnV0IHRoYXQncyBhbGwgSSBrbm93IGFib3V0CisJICogYXQgdGhlIG1vbWVudC4KKwkgKi8KKworCXByaW50aygiTk1JIGdlbmVyYXRlZCBmcm9tIHVua25vd24gc291cmNlIVxuIik7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYWNoLWRlZmF1bHQvdG9wb2xvZ3kuYyBiL2FyY2gvaTM4Ni9tYWNoLWRlZmF1bHQvdG9wb2xvZ3kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjNlODgxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hY2gtZGVmYXVsdC90b3BvbG9neS5jCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBhcmNoL2kzODYvbWFjaC1nZW5lcmljL3RvcG9sb2d5LmMgLSBQb3B1bGF0ZSBkcml2ZXJmcyB3aXRoIHRvcG9sb2d5IGluZm9ybWF0aW9uCisgKgorICogV3JpdHRlbiBieTogTWF0dGhldyBEb2Jzb24sIElCTSBDb3Jwb3JhdGlvbgorICogT3JpZ2luYWwgQ29kZTogUGF1bCBEb3J3aW4sIElCTSBDb3Jwb3JhdGlvbiwgUGF0cmljayBNb2NoZWwsIE9TREwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIElCTSBDb3JwLgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgICAgICAgIAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIFNlbmQgZmVlZGJhY2sgdG8gPGNvbHBhdGNoQHVzLmlibS5jb20+CisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvbm9kZW1hc2suaD4KKyNpbmNsdWRlIDxhc20vY3B1Lmg+CisKK3N0YXRpYyBzdHJ1Y3QgaTM4Nl9jcHUgY3B1X2RldmljZXNbTlJfQ1BVU107CisKK2ludCBhcmNoX3JlZ2lzdGVyX2NwdShpbnQgbnVtKXsKKwlzdHJ1Y3Qgbm9kZSAqcGFyZW50ID0gTlVMTDsKKwkKKyNpZmRlZiBDT05GSUdfTlVNQQorCWludCBub2RlID0gY3B1X3RvX25vZGUobnVtKTsKKwlpZiAobm9kZV9vbmxpbmUobm9kZSkpCisJCXBhcmVudCA9ICZub2RlX2RldmljZXNbbm9kZV0ubm9kZTsKKyNlbmRpZiAvKiBDT05GSUdfTlVNQSAqLworCisJcmV0dXJuIHJlZ2lzdGVyX2NwdSgmY3B1X2RldmljZXNbbnVtXS5jcHUsIG51bSwgcGFyZW50KTsKK30KKworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorCit2b2lkIGFyY2hfdW5yZWdpc3Rlcl9jcHUoaW50IG51bSkgeworCXN0cnVjdCBub2RlICpwYXJlbnQgPSBOVUxMOworCisjaWZkZWYgQ09ORklHX05VTUEKKwlpbnQgbm9kZSA9IGNwdV90b19ub2RlKG51bSk7CisJaWYgKG5vZGVfb25saW5lKG5vZGUpKQorCQlwYXJlbnQgPSAmbm9kZV9kZXZpY2VzW25vZGVdLm5vZGU7CisjZW5kaWYgLyogQ09ORklHX05VTUEgKi8KKworCXJldHVybiB1bnJlZ2lzdGVyX2NwdSgmY3B1X2RldmljZXNbbnVtXS5jcHUsIHBhcmVudCk7Cit9CitFWFBPUlRfU1lNQk9MKGFyY2hfcmVnaXN0ZXJfY3B1KTsKK0VYUE9SVF9TWU1CT0woYXJjaF91bnJlZ2lzdGVyX2NwdSk7CisjZW5kaWYgLypDT05GSUdfSE9UUExVR19DUFUqLworCisKKworI2lmZGVmIENPTkZJR19OVU1BCisjaW5jbHVkZSA8bGludXgvbW16b25lLmg+CisjaW5jbHVkZSA8YXNtL25vZGUuaD4KKworc3RydWN0IGkzODZfbm9kZSBub2RlX2RldmljZXNbTUFYX05VTU5PREVTXTsKKworc3RhdGljIGludCBfX2luaXQgdG9wb2xvZ3lfaW5pdCh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1OT0RFUzsgaSsrKSB7CisJCWlmIChub2RlX29ubGluZShpKSkKKwkJCWFyY2hfcmVnaXN0ZXJfbm9kZShpKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykKKwkJaWYgKGNwdV9wb3NzaWJsZShpKSkgYXJjaF9yZWdpc3Rlcl9jcHUoaSk7CisJcmV0dXJuIDA7Cit9CisKKyNlbHNlIC8qICFDT05GSUdfTlVNQSAqLworCitzdGF0aWMgaW50IF9faW5pdCB0b3BvbG9neV9pbml0KHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKQorCQlpZiAoY3B1X3Bvc3NpYmxlKGkpKSBhcmNoX3JlZ2lzdGVyX2NwdShpKTsKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIENPTkZJR19OVU1BICovCisKK3N1YnN5c19pbml0Y2FsbCh0b3BvbG9neV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYWNoLWVzNzAwMC9NYWtlZmlsZSBiL2FyY2gvaTM4Ni9tYWNoLWVzNzAwMC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWRkNGRhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hY2gtZXM3MDAwL01ha2VmaWxlCkBAIC0wLDAgKzEsNiBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGtlcm5lbC4KKyMKKworb2JqLSQoQ09ORklHX1g4Nl9FUzcwMDApCTo9IGVzNzAwMHBsYXQubworb2JqLSQoQ09ORklHX1g4Nl9HRU5FUklDQVJDSCkJOj0gZXM3MDAwcGxhdC5vCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWFjaC1lczcwMDAvZXM3MDAwLmggYi9hcmNoL2kzODYvbWFjaC1lczcwMDAvZXM3MDAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2OTFmMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYWNoLWVzNzAwMC9lczcwMDAuaApAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIFdyaXR0ZW4gYnk6IEdhcnJ5IEZvcnNncmVuLCBVbmlzeXMgQ29ycG9yYXRpb24KKyAqICAgICAgICAgICAgIE5hdGFsaWUgUHJvdGFzZXZpY2gsIFVuaXN5cyBDb3Jwb3JhdGlvbgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb2RlIHRvIGNvbmZpZ3VyZSBhbmQgaW50ZXJmYWNlIAorICogd2l0aCBVbmlzeXMgRVM3MDAwIHNlcmllcyBoYXJkd2FyZSBzeXN0ZW0gbWFuYWdlci4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgVW5pc3lzIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogVW5pc3lzIENvcnBvcmF0aW9uLCBUb3duc2hpcCBMaW5lICYgVW5pb24gTWVldGluZyAKKyAqIFJvYWRzLUEsIFVuaXN5cyBXYXksIEJsdWUgQmVsbCwgUGVubnN5bHZhbmlhLCAxOTQyNCwgb3I6CisgKgorICogaHR0cDovL3d3dy51bmlzeXMuY29tCisgKi8KKworI2RlZmluZQlNSVBfUkVHCQkJMQorI2RlZmluZQlNSVBfUFNBSV9SRUcJCTQKKworI2RlZmluZQlNSVBfQlVTWQkJMQorI2RlZmluZQlNSVBfU1BJTgkJMHhmMDAwMAorI2RlZmluZQlNSVBfVkFMSUQJCTB4MDEwMDAwMDAwMDAwMDAwMFVMTAorI2RlZmluZQlNSVBfUE9SVChWQUxVRSkJKChWQUxVRSA+PiAzMikgJiAweGZmZmYpCisKKyNkZWZpbmUJTUlQX1JEX0xPKFZBTFVFKQkoVkFMVUUgJiAweGZmZmZmZmZmKSAgIAorCitzdHJ1Y3QgbWlwX3JlZ19pbmZvIHsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbWlwX2luZm87CisJdW5zaWduZWQgbG9uZyBsb25nIGRlbGl2ZXJ5X2luZm87CisJdW5zaWduZWQgbG9uZyBsb25nIGhvc3RfcmVnOworCXVuc2lnbmVkIGxvbmcgbG9uZyBtaXBfcmVnOworfTsKKworc3RydWN0IHBhcnRfaW5mbyB7CisJdW5zaWduZWQgY2hhciB0eXBlOyAgIAorCXVuc2lnbmVkIGNoYXIgbGVuZ3RoOworCXVuc2lnbmVkIGNoYXIgcGFydF9pZDsKKwl1bnNpZ25lZCBjaGFyIGFwaWNfbW9kZTsKKwl1bnNpZ25lZCBsb25nIHNudW07ICAgIAorCWNoYXIgcHR5cGVbMTZdOworCWNoYXIgc25hbWVbNjRdOworCWNoYXIgcG5hbWVbNjRdOworfTsKKworc3RydWN0IHBzYWkgeworCXVuc2lnbmVkIGxvbmcgbG9uZyBlbnRyeV90eXBlOworCXVuc2lnbmVkIGxvbmcgbG9uZyBhZGRyOworCXVuc2lnbmVkIGxvbmcgbG9uZyBiZXBfYWRkcjsKK307CisKK3N0cnVjdCBlczcwMDBfbWVtX2luZm8geworCXVuc2lnbmVkIGNoYXIgdHlwZTsgICAKKwl1bnNpZ25lZCBjaGFyIGxlbmd0aDsKKwl1bnNpZ25lZCBjaGFyIHJlc3ZbNl07CisJdW5zaWduZWQgbG9uZyBsb25nICBzdGFydDsgCisJdW5zaWduZWQgbG9uZyBsb25nICBzaXplOyAKK307CisKK3N0cnVjdCBlczcwMDBfb2VtX3RhYmxlIHsKKwl1bnNpZ25lZCBsb25nIGxvbmcgaGRyOworCXN0cnVjdCBtaXBfcmVnX2luZm8gbWlwOworCXN0cnVjdCBwYXJ0X2luZm8gcGlmOworCXN0cnVjdCBlczcwMDBfbWVtX2luZm8gc2htOworCXN0cnVjdCBwc2FpIHBzYWk7Cit9OworCitzdHJ1Y3QgYWNwaV90YWJsZV9zZHQgeworCXVuc2lnbmVkIGxvbmcgcGE7CisJdW5zaWduZWQgbG9uZyBjb3VudDsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBsb25nIHBhOworCQllbnVtIGFjcGlfdGFibGVfaWQgaWQ7CisJCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwl9CWVudHJ5WzUwXTsKK307CisKK3N0cnVjdCBvZW1fdGFibGUgeworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciBIZWFkZXI7CisJdTMyIE9FTVRhYmxlQWRkcjsKKwl1MzIgT0VNVGFibGVTaXplOworfTsKKworc3RydWN0IG1pcF9yZWcgeworCXVuc2lnbmVkIGxvbmcgbG9uZyBvZmZfMDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgb2ZmXzg7CisJdW5zaWduZWQgbG9uZyBsb25nIG9mZl8xMDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgb2ZmXzE4OworCXVuc2lnbmVkIGxvbmcgbG9uZyBvZmZfMjA7CisJdW5zaWduZWQgbG9uZyBsb25nIG9mZl8yODsKKwl1bnNpZ25lZCBsb25nIGxvbmcgb2ZmXzMwOworCXVuc2lnbmVkIGxvbmcgbG9uZyBvZmZfMzg7Cit9OworCisjZGVmaW5lCU1JUF9TV19BUElDCQkweDEwMjBiCisjZGVmaW5lCU1JUF9GVU5DKFZBTFVFKSAJKFZBTFVFICYgMHhmZikKKworZXh0ZXJuIGludCBwYXJzZV91bmlzeXNfb2VtIChjaGFyICpvZW1wdHIsIGludCBvZW1fZW50cmllcyk7CitleHRlcm4gaW50IGZpbmRfdW5pc3lzX2FjcGlfb2VtX3RhYmxlKHVuc2lnbmVkIGxvbmcgKm9lbV9hZGRyLCBpbnQgKmxlbmd0aCk7CitleHRlcm4gaW50IGVzNzAwMF9zdGFydF9jcHUoaW50IGNwdSwgdW5zaWduZWQgbG9uZyBlaXApOworZXh0ZXJuIHZvaWQgZXM3MDAwX3N3X2FwaWModm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWFjaC1lczcwMDAvZXM3MDAwcGxhdC5jIGIvYXJjaC9pMzg2L21hY2gtZXM3MDAwL2VzNzAwMHBsYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTkzNmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hY2gtZXM3MDAwL2VzNzAwMHBsYXQuYwpAQCAtMCwwICsxLDMxNiBAQAorLyoKKyAqIFdyaXR0ZW4gYnk6IEdhcnJ5IEZvcnNncmVuLCBVbmlzeXMgQ29ycG9yYXRpb24KKyAqICAgICAgICAgICAgIE5hdGFsaWUgUHJvdGFzZXZpY2gsIFVuaXN5cyBDb3Jwb3JhdGlvbgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb2RlIHRvIGNvbmZpZ3VyZSBhbmQgaW50ZXJmYWNlCisgKiB3aXRoIFVuaXN5cyBFUzcwMDAgc2VyaWVzIGhhcmR3YXJlIHN5c3RlbSBtYW5hZ2VyLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBVbmlzeXMgQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBVbmlzeXMgQ29ycG9yYXRpb24sIFRvd25zaGlwIExpbmUgJiBVbmlvbiBNZWV0aW5nCisgKiBSb2Fkcy1BLCBVbmlzeXMgV2F5LCBCbHVlIEJlbGwsIFBlbm5zeWx2YW5pYSwgMTk0MjQsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cudW5pc3lzLmNvbQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL25taS5oPgorI2luY2x1ZGUgPGFzbS9zbXAuaD4KKyNpbmNsdWRlIDxhc20vYXBpY2RlZi5oPgorI2luY2x1ZGUgImVzNzAwMC5oIgorCisvKgorICogRVM3MDAwIEdsb2JhbHMKKyAqLworCit2b2xhdGlsZSB1bnNpZ25lZCBsb25nCSpwc2FpID0gTlVMTDsKK3N0cnVjdCBtaXBfcmVnCQkqbWlwX3JlZzsKK3N0cnVjdCBtaXBfcmVnCQkqaG9zdF9yZWc7CitpbnQgCQkJbWlwX3BvcnQ7Cit1bnNpZ25lZCBsb25nCQltaXBfYWRkciwgaG9zdF9hZGRyOworCisjaWYgZGVmaW5lZChDT05GSUdfWDg2X0lPX0FQSUMpICYmIChkZWZpbmVkKENPTkZJR19BQ1BJX0lOVEVSUFJFVEVSKSB8fCBkZWZpbmVkKENPTkZJR19BQ1BJX0JPT1QpKQorCisvKgorICogR1NJIG92ZXJyaWRlIGZvciBFUzcwMDAgcGxhdGZvcm1zLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYmFzZTsKKworc3RhdGljIGludAorZXM3MDAwX3JlbmFtZV9nc2koaW50IGlvYXBpYywgaW50IGdzaSkKK3sKKwlpZiAoIWJhc2UpIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBucl9pb2FwaWNzOyBpKyspCisJCQliYXNlICs9IG5yX2lvYXBpY19yZWdpc3RlcnNbaV07CisJfQorCisJaWYgKCFpb2FwaWMgJiYgKGdzaSA8IDE2KSkgCisJCWdzaSArPSBiYXNlOworCXJldHVybiBnc2k7Cit9CisKKyNlbmRpZiAvLyAoQ09ORklHX1g4Nl9JT19BUElDKSAmJiAoQ09ORklHX0FDUElfSU5URVJQUkVURVIgfHwgQ09ORklHX0FDUElfQk9PVCkKKworLyoKKyAqIFBhcnNlIHRoZSBPRU0gVGFibGUKKyAqLworCitpbnQgX19pbml0CitwYXJzZV91bmlzeXNfb2VtIChjaGFyICpvZW1wdHIsIGludCBvZW1fZW50cmllcykKK3sKKwlpbnQgICAgICAgICAgICAgICAgICAgICBpOworCWludCAJCQlzdWNjZXNzID0gMDsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICB0eXBlLCBzaXplOworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIHZhbDsKKwljaGFyICAgICAgICAgICAgICAgICAgICAqdHAgPSBOVUxMOworCXN0cnVjdCBwc2FpICAgICAgICAgICAgICpwc2FpcCA9IE5VTEw7CisJc3RydWN0IG1pcF9yZWdfaW5mbyAJKm1pOworCXN0cnVjdCBtaXBfcmVnCQkqaG9zdCwgKm1pcDsKKworCXRwID0gb2VtcHRyOworCisJdHAgKz0gODsKKworCWZvciAoaT0wOyBpIDw9IG9lbV9lbnRyaWVzOyBpKyspIHsKKwkJdHlwZSA9ICp0cCsrOworCQlzaXplID0gKnRwKys7CisJCXRwIC09IDI7CisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIE1JUF9SRUc6CisJCQltaSA9IChzdHJ1Y3QgbWlwX3JlZ19pbmZvICopdHA7CisJCQl2YWwgPSBNSVBfUkRfTE8obWktPmhvc3RfcmVnKTsKKwkJCWhvc3RfYWRkciA9IHZhbDsKKwkJCWhvc3QgPSAoc3RydWN0IG1pcF9yZWcgKil2YWw7CisJCQlob3N0X3JlZyA9IF9fdmEoaG9zdCk7CisJCQl2YWwgPSBNSVBfUkRfTE8obWktPm1pcF9yZWcpOworCQkJbWlwX3BvcnQgPSBNSVBfUE9SVChtaS0+bWlwX2luZm8pOworCQkJbWlwX2FkZHIgPSB2YWw7CisJCQltaXAgPSAoc3RydWN0IG1pcF9yZWcgKil2YWw7CisJCQltaXBfcmVnID0gX192YShtaXApOworCQkJRHByaW50aygiZXM3MDAwX21pcGNmZzogaG9zdF9yZWcgPSAweCVseCBcbiIsCisJCQkJKHVuc2lnbmVkIGxvbmcpaG9zdF9yZWcpOworCQkJRHByaW50aygiZXM3MDAwX21pcGNmZzogbWlwX3JlZyA9IDB4JWx4IFxuIiwKKwkJCQkodW5zaWduZWQgbG9uZyltaXBfcmVnKTsKKwkJCXN1Y2Nlc3MrKzsKKwkJCWJyZWFrOworCQljYXNlIE1JUF9QU0FJX1JFRzoKKwkJCXBzYWlwID0gKHN0cnVjdCBwc2FpICopdHA7CisJCQlpZiAodHAgIT0gTlVMTCkgeworCQkJCWlmIChwc2FpcC0+YWRkcikKKwkJCQkJcHNhaSA9IF9fdmEocHNhaXAtPmFkZHIpOworCQkJCWVsc2UKKwkJCQkJcHNhaSA9IE5VTEw7CisJCQkJc3VjY2VzcysrOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQlpZiAoaSA9PSA2KSBicmVhazsKKwkJdHAgKz0gc2l6ZTsKKwl9CisKKwlpZiAoc3VjY2VzcyA8IDIpIHsKKwkJZXM3MDAwX3BsYXQgPSAwOworCX0gZWxzZSB7CisJCXByaW50aygiXG5FbmFibGluZyBFUzcwMDAgc3BlY2lmaWMgZmVhdHVyZXMuLi5cbiIpOworCQkvKgorCQkgKiBEZXRlcm1pbmUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIEVTNzAwMCBjdXJyZW50bHkgcnVubmluZy4KKwkJICoKKwkJICogZXM3MDAwX3BsYXQgPSAwIGlmIHRoZSBtYWNoaW5lIGlzIE5PVCBhIFVuaXN5cyBFUzcwMDAgYm94CisJCSAqIGVzNzAwMF9wbGF0ID0gMSBpZiB0aGUgbWFjaGluZSBpcyBhIDV4eCBFUzcwMDAgYm94CisJCSAqIGVzNzAwMF9wbGF0ID0gMiBpZiB0aGUgbWFjaGluZSBpcyBhIHg4Nl82NCBFUzcwMDAgYm94CisJCSAqCisJCSAqLworCQlpZiAoIShib290X2NwdV9kYXRhLng4NiA8PSAxNSAmJiBib290X2NwdV9kYXRhLng4Nl9tb2RlbCA8PSAyKSkKKwkJCWVzNzAwMF9wbGF0ID0gMjsKKwkJZWxzZQorCQkJZXM3MDAwX3BsYXQgPSAxOworCisJCWlvYXBpY19yZW51bWJlcl9pcnEgPSBlczcwMDBfcmVuYW1lX2dzaTsKKwl9CisJcmV0dXJuIGVzNzAwMF9wbGF0OworfQorCitpbnQgX19pbml0CitmaW5kX3VuaXN5c19hY3BpX29lbV90YWJsZSh1bnNpZ25lZCBsb25nICpvZW1fYWRkciwgaW50ICpsZW5ndGgpCit7CisJc3RydWN0IGFjcGlfdGFibGVfcnNkcAkJKnJzZHAgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcJCQlyc2RwX3BoeXMgPSAwOworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAJKmhlYWRlciA9IE5VTEw7CisJaW50CQkJCWk7CisJc3RydWN0IGFjcGlfdGFibGVfc2R0CQlzZHQ7CisKKwlyc2RwX3BoeXMgPSBhY3BpX2ZpbmRfcnNkcCgpOworCXJzZHAgPSBfX3ZhKHJzZHBfcGh5cyk7CisJaWYgKHJzZHAtPnJzZHRfYWRkcmVzcykgeworCQlzdHJ1Y3QgYWNwaV90YWJsZV9yc2R0CSptYXBwZWRfcnNkdCA9IE5VTEw7CisJCXNkdC5wYSA9IHJzZHAtPnJzZHRfYWRkcmVzczsKKworCQloZWFkZXIgPSAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICopCisJCQlfX2FjcGlfbWFwX3RhYmxlKHNkdC5wYSwgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOworCQlpZiAoIWhlYWRlcikKKwkJCXJldHVybiAtRU5PREVWOworCisJCXNkdC5jb3VudCA9IChoZWFkZXItPmxlbmd0aCAtIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKSA+PiAzOworCQltYXBwZWRfcnNkdCA9IChzdHJ1Y3QgYWNwaV90YWJsZV9yc2R0ICopCisJCQlfX2FjcGlfbWFwX3RhYmxlKHNkdC5wYSwgaGVhZGVyLT5sZW5ndGgpOworCQlpZiAoIW1hcHBlZF9yc2R0KQorCQkJcmV0dXJuIC1FTk9ERVY7CisKKwkJaGVhZGVyID0gJm1hcHBlZF9yc2R0LT5oZWFkZXI7CisKKwkJZm9yIChpID0gMDsgaSA8IHNkdC5jb3VudDsgaSsrKQorCQkJc2R0LmVudHJ5W2ldLnBhID0gKHVuc2lnbmVkIGxvbmcpIG1hcHBlZF9yc2R0LT5lbnRyeVtpXTsKKwl9OworCWZvciAoaSA9IDA7IGkgPCBzZHQuY291bnQ7IGkrKykgeworCisJCWhlYWRlciA9IChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKikKKwkJCV9fYWNwaV9tYXBfdGFibGUoc2R0LmVudHJ5W2ldLnBhLAorCQkJCXNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKKwkJaWYgKCFoZWFkZXIpCisJCQljb250aW51ZTsKKwkJaWYgKCFzdHJuY21wKChjaGFyICopICZoZWFkZXItPnNpZ25hdHVyZSwgIk9FTTEiLCA0KSkgeworCQkJaWYgKCFzdHJuY21wKChjaGFyICopICZoZWFkZXItPm9lbV9pZCwgIlVOSVNZUyIsIDYpKSB7CisJCQkJdm9pZCAqYWRkcjsKKwkJCQlzdHJ1Y3Qgb2VtX3RhYmxlICp0OworCQkJCWFjcGlfdGFibGVfcHJpbnQoaGVhZGVyLCBzZHQuZW50cnlbaV0ucGEpOworCQkJCXQgPSAoc3RydWN0IG9lbV90YWJsZSAqKSBfX2FjcGlfbWFwX3RhYmxlKHNkdC5lbnRyeVtpXS5wYSwgaGVhZGVyLT5sZW5ndGgpOworCQkJCWFkZHIgPSAodm9pZCAqKSBfX2FjcGlfbWFwX3RhYmxlKHQtPk9FTVRhYmxlQWRkciwgdC0+T0VNVGFibGVTaXplKTsKKwkJCQkqbGVuZ3RoID0gaGVhZGVyLT5sZW5ndGg7CisJCQkJKm9lbV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpIGFkZHI7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisJRHByaW50aygiRVM3MDAwOiBkaWQgbm90IGZpbmQgVW5pc3lzIEFDUEkgT0VNIHRhYmxlIVxuIik7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZAorZXM3MDAwX3NwaW4oaW50IG4pCit7CisJaW50IGkgPSAwOworCisJd2hpbGUgKGkrKyA8IG4pCisJCXJlcF9ub3AoKTsKK30KKworc3RhdGljIGludCBfX2luaXQKK2VzNzAwMF9taXBfd3JpdGUoc3RydWN0IG1pcF9yZWcgKm1pcF9yZWcpCit7CisJaW50CQkJc3RhdHVzID0gMDsKKwlpbnQJCQlzcGluOworCisJc3BpbiA9IE1JUF9TUElOOworCXdoaWxlICgoKHVuc2lnbmVkIGxvbmcgbG9uZylob3N0X3JlZy0+b2ZmXzM4ICYKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZylNSVBfVkFMSUQpICE9IDApIHsKKwkJCWlmICgtLXNwaW4gPD0gMCkgeworCQkJCXByaW50aygiZXM3MDAwX21pcF93cml0ZTogVGltZW91dCB3YWl0aW5nIGZvciBIb3N0IFZhbGlkIEZsYWciKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCWVzNzAwMF9zcGluKE1JUF9TUElOKTsKKwl9CisKKwltZW1jcHkoaG9zdF9yZWcsIG1pcF9yZWcsIHNpemVvZihzdHJ1Y3QgbWlwX3JlZykpOworCW91dGIoMSwgbWlwX3BvcnQpOworCisJc3BpbiA9IE1JUF9TUElOOworCisJd2hpbGUgKCgodW5zaWduZWQgbG9uZyBsb25nKW1pcF9yZWctPm9mZl8zOCAmCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpTUlQX1ZBTElEKSA9PSAwKSB7CisJCWlmICgtLXNwaW4gPD0gMCkgeworCQkJcHJpbnRrKCJlczcwMDBfbWlwX3dyaXRlOiBUaW1lb3V0IHdhaXRpbmcgZm9yIE1JUCBWYWxpZCBGbGFnIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJZXM3MDAwX3NwaW4oTUlQX1NQSU4pOworCX0KKworCXN0YXR1cyA9ICgodW5zaWduZWQgbG9uZyBsb25nKW1pcF9yZWctPm9mZl8wICYKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZykweGZmZmYwMDAwMDAwMDAwVUxMKSA+PiA0ODsKKwltaXBfcmVnLT5vZmZfMzggPSAoKHVuc2lnbmVkIGxvbmcgbG9uZyltaXBfcmVnLT5vZmZfMzggJgorCQkodW5zaWduZWQgbG9uZyBsb25nKX5NSVBfVkFMSUQpOworCXJldHVybiBzdGF0dXM7Cit9CisKK2ludAorZXM3MDAwX3N0YXJ0X2NwdShpbnQgY3B1LCB1bnNpZ25lZCBsb25nIGVpcCkKK3sKKwl1bnNpZ25lZCBsb25nIHZlY3QgPSAwLCBwc2FpdmFsID0gMDsKKworCWlmIChwc2FpID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXZlY3QgPSAoKHVuc2lnbmVkIGxvbmcpX19wYShlaXApLzB4MTAwMCkgPDwgMTY7CisJcHNhaXZhbCA9ICgweDEwMDAwMDAgfCB2ZWN0IHwgY3B1KTsKKworCXdoaWxlICgqcHNhaSAmIDB4MTAwMDAwMCkKKyAgICAgICAgICAgICAgICA7CisKKwkqcHNhaSA9IHBzYWl2YWw7CisKKwlyZXR1cm4gMDsKKworfQorCitpbnQKK2VzNzAwMF9zdG9wX2NwdShpbnQgY3B1KQoreworCWludCBzdGFydHVwOworCisJaWYgKHBzYWkgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJc3RhcnR1cD0gKDB4MTAwMDAwMCB8IGNwdSk7CisKKwl3aGlsZSAoKCpwc2FpICYgMHhmZjAwZmZmZikgIT0gc3RhcnR1cCkKKwkJOworCisJc3RhcnR1cCA9ICgqcHNhaSAmIDB4ZmYwMDAwKSA+PiAxNjsKKwkqcHNhaSAmPSAweGZmZmZmZjsKKworCXJldHVybiAwOworCit9CisKK3ZvaWQgX19pbml0CitlczcwMDBfc3dfYXBpYygpCit7CisJaWYgKGVzNzAwMF9wbGF0KSB7CisJCWludCBtaXBfc3RhdHVzOworCQlzdHJ1Y3QgbWlwX3JlZyBlczcwMDBfbWlwX3JlZzsKKworCQlwcmludGsoIkVTNzAwMDogRW5hYmxpbmcgQVBJQyBtb2RlLlxuIik7CisgICAgICAgIAltZW1zZXQoJmVzNzAwMF9taXBfcmVnLCAwLCBzaXplb2Yoc3RydWN0IG1pcF9yZWcpKTsKKyAgICAgICAgCWVzNzAwMF9taXBfcmVnLm9mZl8wID0gTUlQX1NXX0FQSUM7CisgICAgICAgIAllczcwMDBfbWlwX3JlZy5vZmZfMzggPSAoTUlQX1ZBTElEKTsKKyAgICAgICAgCXdoaWxlICgobWlwX3N0YXR1cyA9IGVzNzAwMF9taXBfd3JpdGUoJmVzNzAwMF9taXBfcmVnKSkgIT0gMCkKKyAgICAgICAgICAgICAgCQlwcmludGsoImVzNzAwMF9zd19hcGljOiBjb21tYW5kIGZhaWxlZCwgc3RhdHVzID0gJXhcbiIsCisJCQkJbWlwX3N0YXR1cyk7CisJCXJldHVybjsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWFjaC1nZW5lcmljL01ha2VmaWxlIGIvYXJjaC9pMzg2L21hY2gtZ2VuZXJpYy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2ZiYzlmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hY2gtZ2VuZXJpYy9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBnZW5lcmljIGFyY2hpdGVjdHVyZQorIworCitFWFRSQV9DRkxBR1MJKz0gLUkuLi9rZXJuZWwKKworb2JqLXkJCQkJOj0gcHJvYmUubyBzdW1taXQubyBiaWdzbXAubyBlczcwMDAubyBkZWZhdWx0Lm8gLi4vbWFjaC1lczcwMDAvCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWFjaC1nZW5lcmljL2JpZ3NtcC5jIGIvYXJjaC9pMzg2L21hY2gtZ2VuZXJpYy9iaWdzbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTg4M2I0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hY2gtZ2VuZXJpYy9iaWdzbXAuYwpAQCAtMCwwICsxLDU0IEBACisvKiAKKyAqIEFQSUMgZHJpdmVyIGZvciAiYmlnc21wIiBYQVBJQyBtYWNoaW5lcyB3aXRoIG1vcmUgdGhhbiA4IHZpcnR1YWwgQ1BVcy4KKyAqIERyaXZlcyB0aGUgbG9jYWwgQVBJQyBpbiAiY2x1c3RlcmVkIG1vZGUiLgorICovCisjZGVmaW5lIEFQSUNfREVGSU5JVElPTiAxCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KKyNpbmNsdWRlIDxhc20vbXBzcGVjLmg+CisjaW5jbHVkZSA8YXNtL2dlbmFwaWMuaD4KKyNpbmNsdWRlIDxhc20vZml4bWFwLmg+CisjaW5jbHVkZSA8YXNtL2FwaWNkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZG1pLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtYmlnc21wL21hY2hfYXBpYy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLWJpZ3NtcC9tYWNoX2FwaWNkZWYuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1iaWdzbXAvbWFjaF9pcGkuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1kZWZhdWx0L21hY2hfbXBwYXJzZS5oPgorCitzdGF0aWMgaW50IGRtaV9iaWdzbXA7IC8qIGNhbiBiZSBzZXQgYnkgZG1pIHNjYW5uZXJzICovCisKK3N0YXRpYyBfX2luaXQgaW50IGhwX2h0X2JpZ3NtcChzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZCkKK3sKKyNpZmRlZiBDT05GSUdfWDg2X0dFTkVSSUNBUkNICisJcHJpbnRrKEtFUk5fTk9USUNFICIlcyBkZXRlY3RlZDogZm9yY2UgdXNlIG9mIGFwaWM9Ymlnc21wXG4iLCBkLT5pZGVudCk7CisJZG1pX2JpZ3NtcCA9IDE7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IGRtaV9zeXN0ZW1faWQgX19pbml0ZGF0YSBiaWdzbXBfZG1pX3RhYmxlW10gPSB7CisJeyBocF9odF9iaWdzbXAsICJIUCBQcm9MaWFudCBETDc2MCBHMiIsIHsKKwkJRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwgIkhQIiksCisJCURNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCAiUDQ0LSIpLAorCX19LAorCisJeyBocF9odF9iaWdzbXAsICJIUCBQcm9MaWFudCBETDc0MCIsIHsKKwkJRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwgIkhQIiksCisJCURNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCAiUDQ3LSIpLAorCSB9fSwKKwkgeyB9Cit9OworCisKK3N0YXRpYyBfX2luaXQgaW50IHByb2JlX2JpZ3NtcCh2b2lkKQoreyAKKwlkbWlfY2hlY2tfc3lzdGVtKGJpZ3NtcF9kbWlfdGFibGUpOworCXJldHVybiBkbWlfYmlnc21wOyAKK30gCisKK3N0cnVjdCBnZW5hcGljIGFwaWNfYmlnc21wID0gQVBJQ19JTklUKCJiaWdzbXAiLCBwcm9iZV9iaWdzbXApOyAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYWNoLWdlbmVyaWMvZGVmYXVsdC5jIGIvYXJjaC9pMzg2L21hY2gtZ2VuZXJpYy9kZWZhdWx0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RhMTRlOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYWNoLWdlbmVyaWMvZGVmYXVsdC5jCkBAIC0wLDAgKzEsMjcgQEAKKy8qIAorICogRGVmYXVsdCBnZW5lcmljIEFQSUMgZHJpdmVyLiBUaGlzIGhhbmRsZXMgdXB0byA4IENQVXMuCisgKi8KKyNkZWZpbmUgQVBJQ19ERUZJTklUSU9OIDEKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CisjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgorI2luY2x1ZGUgPGFzbS9tcHNwZWMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1kZWZhdWx0L21hY2hfYXBpY2RlZi5oPgorI2luY2x1ZGUgPGFzbS9nZW5hcGljLmg+CisjaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgorI2luY2x1ZGUgPGFzbS9hcGljZGVmLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLWRlZmF1bHQvbWFjaF9hcGljLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtZGVmYXVsdC9tYWNoX2lwaS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLWRlZmF1bHQvbWFjaF9tcHBhcnNlLmg+CisKKy8qIHNob3VsZCBiZSBjYWxsZWQgbGFzdC4gKi8KK3N0YXRpYyBfX2luaXQgaW50IHByb2JlX2RlZmF1bHQodm9pZCkKK3sgCisJcmV0dXJuIDE7Cit9IAorCitzdHJ1Y3QgZ2VuYXBpYyBhcGljX2RlZmF1bHQgPSBBUElDX0lOSVQoImRlZmF1bHQiLCBwcm9iZV9kZWZhdWx0KTsgCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWFjaC1nZW5lcmljL2VzNzAwMC5jIGIvYXJjaC9pMzg2L21hY2gtZ2VuZXJpYy9lczcwMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGQzZWMzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hY2gtZ2VuZXJpYy9lczcwMDAuYwpAQCAtMCwwICsxLDI4IEBACisvKgorICogQVBJQyBkcml2ZXIgZm9yIHRoZSBVbmlzeXMgRVM3MDAwIGNoaXBzZXQuCisgKi8KKyNkZWZpbmUgQVBJQ19ERUZJTklUSU9OIDEKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CisjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgorI2luY2x1ZGUgPGFzbS9tcHNwZWMuaD4KKyNpbmNsdWRlIDxhc20vZ2VuYXBpYy5oPgorI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KKyNpbmNsdWRlIDxhc20vYXBpY2RlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1lczcwMDAvbWFjaF9hcGljZGVmLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtZXM3MDAwL21hY2hfYXBpYy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLWVzNzAwMC9tYWNoX2lwaS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLWVzNzAwMC9tYWNoX21wcGFyc2UuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1lczcwMDAvbWFjaF93YWtlY3B1Lmg+CisKK3N0YXRpYyBfX2luaXQgaW50IHByb2JlX2VzNzAwMCh2b2lkKQoreworCS8qIHByb2JlZCBsYXRlciBpbiBtcHRhYmxlL0FDUEkgaG9va3MgKi8KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGdlbmFwaWMgYXBpY19lczcwMDAgPSBBUElDX0lOSVQoImVzNzAwMCIsIHByb2JlX2VzNzAwMCk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWFjaC1nZW5lcmljL3Byb2JlLmMgYi9hcmNoL2kzODYvbWFjaC1nZW5lcmljL3Byb2JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ5N2M2NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYWNoLWdlbmVyaWMvcHJvYmUuYwpAQCAtMCwwICsxLDEwMiBAQAorLyogQ29weXJpZ2h0IDIwMDMgQW5kaSBLbGVlbiwgU3VTRSBMYWJzLiAKKyAqIFN1YmplY3QgdG8gdGhlIEdOVSBQdWJsaWMgTGljZW5zZSwgdi4yIAorICogCisgKiBHZW5lcmljIHg4NiBBUElDIGRyaXZlciBwcm9iZSBsYXllci4KKyAqLyAgCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vZml4bWFwLmg+CisjaW5jbHVkZSA8YXNtL21wc3BlYy5oPgorI2luY2x1ZGUgPGFzbS9hcGljZGVmLmg+CisjaW5jbHVkZSA8YXNtL2dlbmFwaWMuaD4KKworZXh0ZXJuIHN0cnVjdCBnZW5hcGljIGFwaWNfc3VtbWl0OworZXh0ZXJuIHN0cnVjdCBnZW5hcGljIGFwaWNfYmlnc21wOworZXh0ZXJuIHN0cnVjdCBnZW5hcGljIGFwaWNfZXM3MDAwOworZXh0ZXJuIHN0cnVjdCBnZW5hcGljIGFwaWNfZGVmYXVsdDsKKworc3RydWN0IGdlbmFwaWMgKmdlbmFwaWMgPSAmYXBpY19kZWZhdWx0OworCitzdHJ1Y3QgZ2VuYXBpYyAqYXBpY19wcm9iZVtdIF9faW5pdGRhdGEgPSB7IAorCSZhcGljX3N1bW1pdCwKKwkmYXBpY19iaWdzbXAsIAorCSZhcGljX2VzNzAwMCwKKwkmYXBpY19kZWZhdWx0LAkvKiBtdXN0IGJlIGxhc3QgKi8KKwlOVUxMLAorfTsKKwordm9pZCBfX2luaXQgZ2VuZXJpY19hcGljX3Byb2JlKGNoYXIgKmNvbW1hbmRfbGluZSkgCit7IAorCWNoYXIgKnM7CisJaW50IGk7CisJaW50IGNoYW5nZWQgPSAwOworCisJcyA9IHN0cnN0cihjb21tYW5kX2xpbmUsICJhcGljPSIpOworCWlmIChzICYmIChzID09IGNvbW1hbmRfbGluZSB8fCBpc3NwYWNlKHNbLTFdKSkpIHsgCisJCWNoYXIgKnAgPSBzdHJjaHIocywgJyAnKSwgb2xkOyAKKwkJaWYgKCFwKQorCQkJcCA9IHN0cmNocihzLCAnXDAnKTsgCisJCW9sZCA9ICpwOyAKKwkJKnAgPSAwOyAKKwkJZm9yIChpID0gMDsgIWNoYW5nZWQgJiYgYXBpY19wcm9iZVtpXTsgaSsrKSB7CisJCQlpZiAoIXN0cmNtcChhcGljX3Byb2JlW2ldLT5uYW1lLCBzKzUpKSB7IAorCQkJCWNoYW5nZWQgPSAxOworCQkJCWdlbmFwaWMgPSBhcGljX3Byb2JlW2ldOworCQkJfQorCQl9CisJCWlmICghY2hhbmdlZCkKKwkJCXByaW50ayhLRVJOX0VSUiAiVW5rbm93biBnZW5hcGljIGAlcycgc3BlY2lmaWVkLlxuIiwgcyk7CisJCSpwID0gb2xkOworCX0gCisJZm9yIChpID0gMDsgIWNoYW5nZWQgJiYgYXBpY19wcm9iZVtpXTsgaSsrKSB7IAorCQlpZiAoYXBpY19wcm9iZVtpXS0+cHJvYmUoKSkgeworCQkJY2hhbmdlZCA9IDE7CisJCQlnZW5hcGljID0gYXBpY19wcm9iZVtpXTsgCisJCX0gCisJfQorCS8qIE5vdCB2aXNpYmxlIHdpdGhvdXQgZWFybHkgY29uc29sZSAqLyAKKwlpZiAoIWNoYW5nZWQpIAorCQlwYW5pYygiRGlkbid0IGZpbmQgYW4gQVBJQyBkcml2ZXIiKTsgCisKKwlwcmludGsoS0VSTl9JTkZPICJVc2luZyBBUElDIGRyaXZlciAlc1xuIiwgZ2VuYXBpYy0+bmFtZSk7Cit9IAorCisvKiBUaGVzZSBmdW5jdGlvbnMgY2FuIHN3aXRjaCB0aGUgQVBJQyBldmVuIGFmdGVyIHRoZSBpbml0aWFsIC0+cHJvYmUoKSAqLworCitpbnQgX19pbml0IG1wc19vZW1fY2hlY2soc3RydWN0IG1wX2NvbmZpZ190YWJsZSAqbXBjLCBjaGFyICpvZW0sIGNoYXIgKnByb2R1Y3RpZCkKK3sgCisJaW50IGk7CisJZm9yIChpID0gMDsgYXBpY19wcm9iZVtpXTsgKytpKSB7IAorCQlpZiAoYXBpY19wcm9iZVtpXS0+bXBzX29lbV9jaGVjayhtcGMsb2VtLHByb2R1Y3RpZCkpIHsgCisJCQlnZW5hcGljID0gYXBpY19wcm9iZVtpXTsKKwkJCXByaW50ayhLRVJOX0lORk8gIlN3aXRjaGVkIHRvIEFQSUMgZHJpdmVyIGAlcycuXG4iLCAKKwkJCSAgICAgICBnZW5hcGljLT5uYW1lKTsKKwkJCXJldHVybiAxOworCQl9IAorCX0gCisJcmV0dXJuIDA7Cit9IAorCitpbnQgX19pbml0IGFjcGlfbWFkdF9vZW1fY2hlY2soY2hhciAqb2VtX2lkLCBjaGFyICpvZW1fdGFibGVfaWQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgYXBpY19wcm9iZVtpXTsgKytpKSB7IAorCQlpZiAoYXBpY19wcm9iZVtpXS0+YWNwaV9tYWR0X29lbV9jaGVjayhvZW1faWQsIG9lbV90YWJsZV9pZCkpIHsgCisJCQlnZW5hcGljID0gYXBpY19wcm9iZVtpXTsKKwkJCXByaW50ayhLRVJOX0lORk8gIlN3aXRjaGVkIHRvIEFQSUMgZHJpdmVyIGAlcycuXG4iLCAKKwkJCSAgICAgICBnZW5hcGljLT5uYW1lKTsKKwkJCXJldHVybiAxOworCQl9IAorCX0gCisJcmV0dXJuIDA7CQorfQorCitpbnQgaGFyZF9zbXBfcHJvY2Vzc29yX2lkKHZvaWQpCit7CisJcmV0dXJuIGdlbmFwaWMtPmdldF9hcGljX2lkKCoodW5zaWduZWQgbG9uZyAqKShBUElDX0JBU0UrQVBJQ19JRCkpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hY2gtZ2VuZXJpYy9zdW1taXQuYyBiL2FyY2gvaTM4Ni9tYWNoLWdlbmVyaWMvc3VtbWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVkZGY3NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYWNoLWdlbmVyaWMvc3VtbWl0LmMKQEAgLTAsMCArMSwyNyBAQAorLyogCisgKiBBUElDIGRyaXZlciBmb3IgdGhlIElCTSAiU3VtbWl0IiBjaGlwc2V0LgorICovCisjZGVmaW5lIEFQSUNfREVGSU5JVElPTiAxCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KKyNpbmNsdWRlIDxhc20vbXBzcGVjLmg+CisjaW5jbHVkZSA8YXNtL2dlbmFwaWMuaD4KKyNpbmNsdWRlIDxhc20vZml4bWFwLmg+CisjaW5jbHVkZSA8YXNtL2FwaWNkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL21hY2gtc3VtbWl0L21hY2hfYXBpYy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXN1bW1pdC9tYWNoX2FwaWNkZWYuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1zdW1taXQvbWFjaF9pcGkuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1zdW1taXQvbWFjaF9tcHBhcnNlLmg+CisKK3N0YXRpYyBfX2luaXQgaW50IHByb2JlX3N1bW1pdCh2b2lkKQoreyAKKwkvKiBwcm9iZWQgbGF0ZXIgaW4gbXB0YWJsZS9BQ1BJIGhvb2tzICovCisJcmV0dXJuIDA7Cit9IAorCitzdHJ1Y3QgZ2VuYXBpYyBhcGljX3N1bW1pdCA9IEFQSUNfSU5JVCgic3VtbWl0IiwgcHJvYmVfc3VtbWl0KTsgCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWFjaC12aXN3cy9NYWtlZmlsZSBiL2FyY2gvaTM4Ni9tYWNoLXZpc3dzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNWZkOTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWFjaC12aXN3cy9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuCisjCisKK29iai15CQkJCTo9IHNldHVwLm8gdHJhcHMubyByZWJvb3QubworCitvYmotJChDT05GSUdfWDg2X1ZJU1dTX0FQSUMpCSs9IHZpc3dzX2FwaWMubworb2JqLSQoQ09ORklHX1g4Nl9MT0NBTF9BUElDKQkrPSBtcHBhcnNlLm8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYWNoLXZpc3dzL21wcGFyc2UuYyBiL2FyY2gvaTM4Ni9tYWNoLXZpc3dzL21wcGFyc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTIyMDgyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hY2gtdmlzd3MvbXBwYXJzZS5jCkBAIC0wLDAgKzEsMTA1IEBACisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisKKyNpbmNsdWRlIDxhc20vc21wLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICJjb2JhbHQuaCIKKyNpbmNsdWRlICJtYWNoX2FwaWMuaCIKKworLyogSGF2ZSB3ZSBmb3VuZCBhbiBNUCB0YWJsZSAqLworaW50IHNtcF9mb3VuZF9jb25maWc7CisKKy8qCisgKiBWYXJpb3VzIExpbnV4LWludGVybmFsIGRhdGEgc3RydWN0dXJlcyBjcmVhdGVkIGZyb20gdGhlCisgKiBNUC10YWJsZS4KKyAqLworaW50IGFwaWNfdmVyc2lvbiBbTUFYX0FQSUNTXTsKKworaW50IHBpY19tb2RlOwordW5zaWduZWQgbG9uZyBtcF9sYXBpY19hZGRyOworCisvKiBQcm9jZXNzb3IgdGhhdCBpcyBkb2luZyB0aGUgYm9vdCB1cCAqLwordW5zaWduZWQgaW50IGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCA9IC0xVTsKK3Vuc2lnbmVkIGludCBib290X2NwdV9sb2dpY2FsX2FwaWNpZCA9IC0xVTsKKworLyogQml0bWFzayBvZiBwaHlzaWNhbGx5IGV4aXN0aW5nIENQVXMgKi8KK3BoeXNpZF9tYXNrX3QgcGh5c19jcHVfcHJlc2VudF9tYXA7CisKK3Vuc2lnbmVkIGludCBfX2luaXRkYXRhIG1heGNwdXMgPSBOUl9DUFVTOworCisvKgorICogVGhlIFZpc3VhbCBXb3Jrc3RhdGlvbiBpcyBJbnRlbCBNUCBjb21wbGlhbnQgaW4gdGhlIGhhcmR3YXJlCisgKiBzZW5zZSwgYnV0IGl0IGRvZXNuJ3QgaGF2ZSBhIEJJT1MoLWNvbmZpZ3VyYXRpb24gdGFibGUpLgorICogTm8gcHJvYmxlbSBmb3IgTGludXguCisgKi8KKworc3RhdGljIHZvaWQgX19pbml0IE1QX3Byb2Nlc3Nvcl9pbmZvIChzdHJ1Y3QgbXBjX2NvbmZpZ19wcm9jZXNzb3IgKm0pCit7CisgCWludCB2ZXIsIGxvZ2ljYWxfYXBpY2lkOworCXBoeXNpZF9tYXNrX3QgYXBpY19jcHVzOworIAkKKwlpZiAoIShtLT5tcGNfY3B1ZmxhZyAmIENQVV9FTkFCTEVEKSkKKwkJcmV0dXJuOworCisJbG9naWNhbF9hcGljaWQgPSBtLT5tcGNfYXBpY2lkOworCXByaW50ayhLRVJOX0lORk8gIiVzQ1BVICMlZCAlbGQ6JWxkIEFQSUMgdmVyc2lvbiAlZFxuIiwKKwkJbS0+bXBjX2NwdWZsYWcgJiBDUFVfQk9PVFBST0NFU1NPUiA/ICJCb290dXAgIiA6ICIiLAorCQltLT5tcGNfYXBpY2lkLAorCQkobS0+bXBjX2NwdWZlYXR1cmUgJiBDUFVfRkFNSUxZX01BU0spID4+IDgsCisJCShtLT5tcGNfY3B1ZmVhdHVyZSAmIENQVV9NT0RFTF9NQVNLKSA+PiA0LAorCQltLT5tcGNfYXBpY3Zlcik7CisKKwlpZiAobS0+bXBjX2NwdWZsYWcgJiBDUFVfQk9PVFBST0NFU1NPUikgeworCQlib290X2NwdV9waHlzaWNhbF9hcGljaWQgPSBtLT5tcGNfYXBpY2lkOworCQlib290X2NwdV9sb2dpY2FsX2FwaWNpZCA9IGxvZ2ljYWxfYXBpY2lkOworCX0KKworCXZlciA9IG0tPm1wY19hcGljdmVyOworCWlmICgodmVyID49IDB4MTQgJiYgbS0+bXBjX2FwaWNpZCA+PSAweGZmKSB8fCBtLT5tcGNfYXBpY2lkID49IDB4ZikgeworCQlwcmludGsoS0VSTl9FUlIgIlByb2Nlc3NvciAjJWQgSU5WQUxJRC4gKE1heCBJRDogJWQpLlxuIiwKKwkJCW0tPm1wY19hcGljaWQsIE1BWF9BUElDUyk7CisJCXJldHVybjsKKwl9CisKKwlhcGljX2NwdXMgPSBhcGljaWRfdG9fY3B1X3ByZXNlbnQobS0+bXBjX2FwaWNpZCk7CisJcGh5c2lkc19vcihwaHlzX2NwdV9wcmVzZW50X21hcCwgcGh5c19jcHVfcHJlc2VudF9tYXAsIGFwaWNfY3B1cyk7CisJLyoKKwkgKiBWYWxpZGF0ZSB2ZXJzaW9uCisJICovCisJaWYgKHZlciA9PSAweDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJCSU9TIGJ1ZywgQVBJQyB2ZXJzaW9uIGlzIDAgZm9yIENQVSMlZCEgIgorCQkJImZpeGluZyB1cCB0byAweDEwLiAodGVsbCB5b3VyIGh3IHZlbmRvcilcbiIsCisJCQltLT5tcGNfYXBpY2lkKTsKKwkJdmVyID0gMHgxMDsKKwl9CisJYXBpY192ZXJzaW9uW20tPm1wY19hcGljaWRdID0gdmVyOworfQorCit2b2lkIF9faW5pdCBmaW5kX3NtcF9jb25maWcodm9pZCkKK3sKKwlzdHJ1Y3QgbXBjX2NvbmZpZ19wcm9jZXNzb3IgKm1wID0gcGh5c190b192aXJ0KENPX0NQVV9UQUJfUEhZUyk7CisJdW5zaWduZWQgc2hvcnQgbmNwdXMgPSByZWFkdyhwaHlzX3RvX3ZpcnQoQ09fQ1BVX05VTV9QSFlTKSk7CisKKwlpZiAobmNwdXMgPiBDT19DUFVfTUFYKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImZpbmRfdmlzd3Nfc21wOiBnb3QgY3B1IGNvdW50IG9mICVkIGF0ICVwXG4iLAorCQkJbmNwdXMsIG1wKTsKKworCQluY3B1cyA9IENPX0NQVV9NQVg7CisJfQorCisJaWYgKG5jcHVzID4gbWF4Y3B1cykKKwkJbmNwdXMgPSBtYXhjcHVzOworCisJc21wX2ZvdW5kX2NvbmZpZyA9IDE7CisJd2hpbGUgKG5jcHVzLS0pCisJCU1QX3Byb2Nlc3Nvcl9pbmZvKG1wKyspOworCisJbXBfbGFwaWNfYWRkciA9IEFQSUNfREVGQVVMVF9QSFlTX0JBU0U7Cit9CisKK3ZvaWQgX19pbml0IGdldF9zbXBfY29uZmlnICh2b2lkKQoreworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hY2gtdmlzd3MvcmVib290LmMgYi9hcmNoL2kzODYvbWFjaC12aXN3cy9yZWJvb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTgxZTkwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hY2gtdmlzd3MvcmVib290LmMKQEAgLTAsMCArMSw1MSBAQAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm0uaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgInBpaXg0LmgiCisKK3ZvaWQgKCpwbV9wb3dlcl9vZmYpKHZvaWQpOworCit2b2lkIG1hY2hpbmVfcmVzdGFydChjaGFyICogX191bnVzZWQpCit7CisjaWZkZWYgQ09ORklHX1NNUAorCXNtcF9zZW5kX3N0b3AoKTsKKyNlbmRpZgorCisJLyoKKwkgKiBWaXN1YWwgV29ya3N0YXRpb25zIHJlc3RhcnQgYWZ0ZXIgdGhpcworCSAqIHJlZ2lzdGVyIGlzIHBva2VkIG9uIHRoZSBQSUlYNAorCSAqLworCW91dGIoUElJWDRfUkVTRVRfVkFMLCBQSUlYNF9SRVNFVF9QT1JUKTsKK30KKworRVhQT1JUX1NZTUJPTChtYWNoaW5lX3Jlc3RhcnQpOworCit2b2lkIG1hY2hpbmVfcG93ZXJfb2ZmKHZvaWQpCit7CisJdW5zaWduZWQgc2hvcnQgcG1fc3RhdHVzOworCWV4dGVybiB1bnNpZ25lZCBpbnQgcGNpX2J1czA7CisKKwl3aGlsZSAoKHBtX3N0YXR1cyA9IGludyhQTVNUU19QT1JUKSkgJiAweDEwMCkKKwkJb3V0dyhwbV9zdGF0dXMsIFBNU1RTX1BPUlQpOworCisJb3V0dyhQTV9TVVNQRU5EX0VOQUJMRSwgUE1DTlRSTF9QT1JUKTsKKworCW1kZWxheSgxMCk7CisKKyNkZWZpbmUgUENJX0NPTkYxX0FERFJFU1MoYnVzLCBkZXZmbiwgcmVnKSBcCisJKDB4ODAwMDAwMDAgfCAoYnVzIDw8IDE2KSB8IChkZXZmbiA8PCA4KSB8IChyZWcgJiB+MykpCisKKwlvdXRsKFBDSV9DT05GMV9BRERSRVNTKHBjaV9idXMwLCBTUEVDSUFMX0RFViwgU1BFQ0lBTF9SRUcpLCAweENGOCk7CisJb3V0bChQSUlYX1NQRUNJQUxfU1RPUCwgMHhDRkMpOworfQorCitFWFBPUlRfU1lNQk9MKG1hY2hpbmVfcG93ZXJfb2ZmKTsKKwordm9pZCBtYWNoaW5lX2hhbHQodm9pZCkKK3sKK30KKworRVhQT1JUX1NZTUJPTChtYWNoaW5lX2hhbHQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hY2gtdmlzd3Mvc2V0dXAuYyBiL2FyY2gvaTM4Ni9tYWNoLXZpc3dzL3NldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY2ZDJkOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYWNoLXZpc3dzL3NldHVwLmMKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiAgVW5tYWludGFpbmVkIFNHSSBWaXN1YWwgV29ya3N0YXRpb24gc3VwcG9ydC4KKyAqICBTcGxpdCBvdXQgZnJvbSBzZXR1cC5jIGJ5IGRhdmVqQHN1c2UuZGUKKyAqLworCisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoX2hvb2tzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSAiY29iYWx0LmgiCisjaW5jbHVkZSAicGlpeDQuaCIKKworY2hhciB2aXN3c19ib2FyZF90eXBlID0gLTE7CitjaGFyIHZpc3dzX2JvYXJkX3JldiA9IC0xOworCit2b2lkIF9faW5pdCB2aXN3c19nZXRfYm9hcmRfdHlwZV9hbmRfcmV2KHZvaWQpCit7CisJaW50IHJhdzsKKworCXZpc3dzX2JvYXJkX3R5cGUgPSAoY2hhcikoaW5iX3AoUElJWF9HUElfQkRfUkVHKSAmIFBJSVhfR1BJX0JEX1JFRykKKwkJCQkJCQkgPj4gUElJWF9HUElfQkRfU0hJRlQ7CisJLyoKKwkgKiBHZXQgQm9hcmQgcmV2LgorCSAqIEZpcnN0LCB3ZSBoYXZlIHRvIGluaXRpYWxpemUgdGhlIDMwNyBwYXJ0IHRvIGFsbG93IHVzIGFjY2VzcworCSAqIHRvIHRoZSBHUElPIHJlZ2lzdGVycy4gIExldCdzIG1hcCB0aGVtIGF0IDB4MGZjMCB3aGljaCBpcyByaWdodAorCSAqIGFmdGVyIHRoZSBQSUlYNCBQTSBzZWN0aW9uLgorCSAqLworCW91dGJfcChTSU9fREVWX1NFTCwgU0lPX0lOREVYKTsKKwlvdXRiX3AoU0lPX0dQX0RFViwgU0lPX0RBVEEpOwkvKiBUYWxrIHRvIEdQSU8gcmVncy4gKi8KKworCW91dGJfcChTSU9fREVWX01TQiwgU0lPX0lOREVYKTsKKwlvdXRiX3AoU0lPX0dQX01TQiwgU0lPX0RBVEEpOwkvKiBNU0Igb2YgR1BJTyBiYXNlIGFkZHJlc3MgKi8KKworCW91dGJfcChTSU9fREVWX0xTQiwgU0lPX0lOREVYKTsKKwlvdXRiX3AoU0lPX0dQX0xTQiwgU0lPX0RBVEEpOwkvKiBMU0Igb2YgR1BJTyBiYXNlIGFkZHJlc3MgKi8KKworCW91dGJfcChTSU9fREVWX0VOQiwgU0lPX0lOREVYKTsKKwlvdXRiX3AoMSwgU0lPX0RBVEEpOwkJLyogRW5hYmxlIEdQSU8gcmVnaXN0ZXJzLiAqLworCisJLyoKKwkgKiBOb3csIHdlIGhhdmUgdG8gbWFwIHRoZSBwb3dlciBtYW5hZ2VtZW50IHNlY3Rpb24gdG8gd3JpdGUKKwkgKiBhIGJpdCB3aGljaCBlbmFibGVzIGFjY2VzcyB0byB0aGUgR1BJTyByZWdpc3RlcnMuCisJICogV2hhdCBsdW5hdGljIGNhbWUgdXAgd2l0aCB0aGlzIHNoaXQ/CisJICovCisJb3V0Yl9wKFNJT19ERVZfU0VMLCBTSU9fSU5ERVgpOworCW91dGJfcChTSU9fUE1fREVWLCBTSU9fREFUQSk7CS8qIFRhbGsgdG8gR1BJTyByZWdzLiAqLworCisJb3V0Yl9wKFNJT19ERVZfTVNCLCBTSU9fSU5ERVgpOworCW91dGJfcChTSU9fUE1fTVNCLCBTSU9fREFUQSk7CS8qIE1TQiBvZiBQTSBiYXNlIGFkZHJlc3MgKi8KKworCW91dGJfcChTSU9fREVWX0xTQiwgU0lPX0lOREVYKTsKKwlvdXRiX3AoU0lPX1BNX0xTQiwgU0lPX0RBVEEpOwkvKiBMU0Igb2YgUE0gYmFzZSBhZGRyZXNzICovCisKKwlvdXRiX3AoU0lPX0RFVl9FTkIsIFNJT19JTkRFWCk7CisJb3V0Yl9wKDEsIFNJT19EQVRBKTsJCS8qIEVuYWJsZSBQTSByZWdpc3RlcnMuICovCisKKwkvKgorCSAqIE5vdywgd3JpdGUgdGhlIFBNIHJlZ2lzdGVyIHdoaWNoIGVuYWJsZXMgdGhlIEdQSU8gcmVnaXN0ZXJzLgorCSAqLworCW91dGJfcChTSU9fUE1fRkVSMiwgU0lPX1BNX0lOREVYKTsKKwlvdXRiX3AoU0lPX1BNX0dQX0VOLCBTSU9fUE1fREFUQSk7CisKKwkvKgorCSAqIE5vdywgaW5pdGlhbGl6ZSB0aGUgR1BJTyByZWdpc3RlcnMuCisJICogV2Ugd2FudCB0aGVtIGFsbCB0byBiZSBpbnB1dHMgd2hpY2ggaXMgdGhlCisJICogcG93ZXIgb24gZGVmYXVsdCwgc28gbGV0J3MgbGVhdmUgdGhlbSBhbG9uZS4KKwkgKiBTbywgbGV0J3MganVzdCByZWFkIHRoZSBib2FyZCByZXYhCisJICovCisJcmF3ID0gaW5iX3AoU0lPX0dQX0RBVEExKTsKKwlyYXcgJj0gMHg3ZjsJLyogNyBiaXRzIG9mIHZhbGlkIGJvYXJkIHJldmlzaW9uIElELiAqLworCisJaWYgKHZpc3dzX2JvYXJkX3R5cGUgPT0gVklTV1NfMzIwKSB7CisJCWlmIChyYXcgPCAweDYpIHsKKwkJCXZpc3dzX2JvYXJkX3JldiA9IDQ7CisJCX0gZWxzZSBpZiAocmF3IDwgMHhjKSB7CisJCQl2aXN3c19ib2FyZF9yZXYgPSA1OworCQl9IGVsc2UgeworCQkJdmlzd3NfYm9hcmRfcmV2ID0gNjsKKwkJfQorCX0gZWxzZSBpZiAodmlzd3NfYm9hcmRfdHlwZSA9PSBWSVNXU181NDApIHsKKwkJCXZpc3dzX2JvYXJkX3JldiA9IDI7CisJCX0gZWxzZSB7CisJCQl2aXN3c19ib2FyZF9yZXYgPSByYXc7CisJCX0KKworCXByaW50ayhLRVJOX0lORk8gIlNpbGljb24gR3JhcGhpY3MgVmlzdWFsIFdvcmtzdGF0aW9uICVzIChyZXYgJWQpIGRldGVjdGVkXG4iLAorCSAgICAgICAodmlzd3NfYm9hcmRfdHlwZSA9PSBWSVNXU18zMjAgPyAiMzIwIiA6CisJICAgICAgICh2aXN3c19ib2FyZF90eXBlID09IFZJU1dTXzU0MCA/ICI1NDAiIDoKKwkJInVua25vd24iKSksIHZpc3dzX2JvYXJkX3Jldik7Cit9CisKK3ZvaWQgX19pbml0IHByZV9pbnRyX2luaXRfaG9vayh2b2lkKQoreworCWluaXRfVklTV1NfQVBJQ19pcnFzKCk7Cit9CisKK3ZvaWQgX19pbml0IGludHJfaW5pdF9ob29rKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCisJYXBpY19pbnRyX2luaXQoKTsKKyNlbmRpZgorfQorCit2b2lkIF9faW5pdCBwcmVfc2V0dXBfYXJjaF9ob29rKCkKK3sKKwl2aXN3c19nZXRfYm9hcmRfdHlwZV9hbmRfcmV2KCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGlycTAgPSB7CisJLmhhbmRsZXIgPQl0aW1lcl9pbnRlcnJ1cHQsCisJLmZsYWdzID0JU0FfSU5URVJSVVBULAorCS5uYW1lID0JCSJ0aW1lciIsCit9OworCit2b2lkIF9faW5pdCB0aW1lX2luaXRfaG9vayh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIlN0YXJ0aW5nIENvYmFsdCBUaW1lciBzeXN0ZW0gY2xvY2tcbiIpOworCisJLyogU2V0IHRoZSBjb3VudGRvd24gdmFsdWUgKi8KKwljb19jcHVfd3JpdGUoQ09fQ1BVX1RJTUVWQUwsIENPX1RJTUVfSFovSFopOworCisJLyogU3RhcnQgdGhlIHRpbWVyICovCisJY29fY3B1X3dyaXRlKENPX0NQVV9DVFJMLCBjb19jcHVfcmVhZChDT19DUFVfQ1RSTCkgfCBDT19DVFJMX1RJTUVSVU4pOworCisJLyogRW5hYmxlICh1bm1hc2spIHRoZSB0aW1lciBpbnRlcnJ1cHQgKi8KKwljb19jcHVfd3JpdGUoQ09fQ1BVX0NUUkwsIGNvX2NwdV9yZWFkKENPX0NQVV9DVFJMKSAmIH5DT19DVFJMX1RJTUVNQVNLKTsKKworCS8qIFdpcmUgY3B1IElEVCBlbnRyeSB0byBzL3cgaGFuZGxlciAoYW5kIENvYmFsdCBBUElDIHRvIElEVCkgKi8KKwlzZXR1cF9pcnEoMCwgJmlycTApOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hY2gtdmlzd3MvdHJhcHMuYyBiL2FyY2gvaTM4Ni9tYWNoLXZpc3dzL3RyYXBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY0MzUzOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYWNoLXZpc3dzL3RyYXBzLmMKQEAgLTAsMCArMSw2OSBAQAorLyogVklTV1MgdHJhcHMgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaV9pZHMuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoX2hvb2tzLmg+CisjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKyNpbmNsdWRlICJjb2JhbHQuaCIKKyNpbmNsdWRlICJsaXRoaXVtLmgiCisKKworI2RlZmluZSBBMDEyMzQgKExJX0lOVEFfMCB8IExJX0lOVEFfMSB8IExJX0lOVEFfMiB8IExJX0lOVEFfMyB8IExJX0lOVEFfNCkKKyNkZWZpbmUgQkNEIChMSV9JTlRCIHwgTElfSU5UQyB8IExJX0lOVEQpCisjZGVmaW5lIEFMTERFVlMgKEEwMTIzNCB8IEJDRCkKKworc3RhdGljIF9faW5pdCB2b2lkIGxpdGhpdW1faW5pdCh2b2lkKQoreworCXNldF9maXhtYXAoRklYX0xJX1BDSUEsIExJX1BDSV9BX1BIWVMpOworCXNldF9maXhtYXAoRklYX0xJX1BDSUIsIExJX1BDSV9CX1BIWVMpOworCisJaWYgKChsaV9wY2lhX3JlYWQxNihQQ0lfVkVORE9SX0lEKSAhPSBQQ0lfVkVORE9SX0lEX1NHSSkgfHwKKwkgICAgKGxpX3BjaWFfcmVhZDE2KFBDSV9ERVZJQ0VfSUQpICE9IFBDSV9WRU5ET1JfSURfU0dJX0xJVEhJVU0pKSB7CisJCXByaW50ayhLRVJOX0VNRVJHICJMaXRoaXVtIGhvc3RicmlkZ2UgJWMgbm90IGZvdW5kXG4iLCAnQScpOworCQlwYW5pYygiVGhpcyBtYWNoaW5lIGlzIG5vdCBTR0kgVmlzdWFsIFdvcmtzdGF0aW9uIDMyMC81NDAiKTsKKwl9CisKKwlpZiAoKGxpX3BjaWJfcmVhZDE2KFBDSV9WRU5ET1JfSUQpICE9IFBDSV9WRU5ET1JfSURfU0dJKSB8fAorCSAgICAobGlfcGNpYl9yZWFkMTYoUENJX0RFVklDRV9JRCkgIT0gUENJX1ZFTkRPUl9JRF9TR0lfTElUSElVTSkpIHsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgIkxpdGhpdW0gaG9zdGJyaWRnZSAlYyBub3QgZm91bmRcbiIsICdCJyk7CisJCXBhbmljKCJUaGlzIG1hY2hpbmUgaXMgbm90IFNHSSBWaXN1YWwgV29ya3N0YXRpb24gMzIwLzU0MCIpOworCX0KKworCWxpX3BjaWFfd3JpdGUxNihMSV9QQ0lfSU5URU4sIEFMTERFVlMpOworCWxpX3BjaWJfd3JpdGUxNihMSV9QQ0lfSU5URU4sIEFMTERFVlMpOworfQorCitzdGF0aWMgX19pbml0IHZvaWQgY29iYWx0X2luaXQodm9pZCkKK3sKKwkvKgorCSAqIE9uIG5vcm1hbCBTTVAgUEMgdGhpcyBpcyB1c2VkIG9ubHkgd2l0aCBTTVAsIGJ1dCB3ZSBoYXZlIHRvCisJICogdXNlIGl0IGFuZCBzZXQgaXQgdXAgaGVyZSB0byBzdGFydCB0aGUgQ29iYWx0IGNsb2NrCisJICovCisJc2V0X2ZpeG1hcChGSVhfQVBJQ19CQVNFLCBBUElDX0RFRkFVTFRfUEhZU19CQVNFKTsKKwlzZXR1cF9sb2NhbF9BUElDKCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiTG9jYWwgQVBJQyBWZXJzaW9uICUjbHgsIElEICUjbHhcbiIsCisJCWFwaWNfcmVhZChBUElDX0xWUiksIGFwaWNfcmVhZChBUElDX0lEKSk7CisKKwlzZXRfZml4bWFwKEZJWF9DT19DUFUsIENPX0NQVV9QSFlTKTsKKwlzZXRfZml4bWFwKEZJWF9DT19BUElDLCBDT19BUElDX1BIWVMpOworCXByaW50ayhLRVJOX0lORk8gIkNvYmFsdCBSZXZpc2lvbiAlI2x4LCBBUElDIElEICUjbHhcbiIsCisJCWNvX2NwdV9yZWFkKENPX0NQVV9SRVYpLCBjb19hcGljX3JlYWQoQ09fQVBJQ19JRCkpOworCisJLyogRW5hYmxlIENvYmFsdCBBUElDIGJlaW5nIGNhcmVmdWwgdG8gTk9UIGNoYW5nZSB0aGUgSUQhICovCisJY29fYXBpY193cml0ZShDT19BUElDX0lELCBjb19hcGljX3JlYWQoQ09fQVBJQ19JRCkgfCBDT19BUElDX0VOQUJMRSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJDb2JhbHQgQVBJQyBlbmFibGVkOiBJRCByZWcgJSNseFxuIiwKKwkJY29fYXBpY19yZWFkKENPX0FQSUNfSUQpKTsKK30KKwordm9pZCBfX2luaXQgdHJhcF9pbml0X2hvb2sodm9pZCkKK3sKKwlsaXRoaXVtX2luaXQoKTsKKwljb2JhbHRfaW5pdCgpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hY2gtdmlzd3Mvdmlzd3NfYXBpYy5jIGIvYXJjaC9pMzg2L21hY2gtdmlzd3Mvdmlzd3NfYXBpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZTY1ODUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWFjaC12aXN3cy92aXN3c19hcGljLmMKQEAgLTAsMCArMSwzMDMgQEAKKy8qCisgKglsaW51eC9hcmNoL2kzODYvbWFjaF92aXN3cy92aXN3c19hcGljLmMKKyAqCisgKglDb3B5cmlnaHQgKEMpIDE5OTkgQmVudCBIYWdlbWFyaywgSW5nbyBNb2xuYXIKKyAqCisgKiAgU0dJIFZpc3VhbCBXb3Jrc3RhdGlvbiBpbnRlcnJ1cHQgY29udHJvbGxlcgorICoKKyAqICBUaGUgQ29iYWx0IHN5c3RlbSBBU0lDIGluIHRoZSBWaXN1YWwgV29ya3N0YXRpb24gY29udGFpbnMgYSAiQ29iYWx0IiBBUElDCisgKiAgd2hpY2ggc2VydmVzIGFzIHRoZSBtYWluIGludGVycnVwdCBjb250cm9sbGVyIGluIHRoZSBzeXN0ZW0uICBOb24tbGVnYWN5CisgKiAgaGFyZHdhcmUgaW4gdGhlIHN5c3RlbSB1c2VzIHRoaXMgY29udHJvbGxlciBkaXJlY3RseS4gIExlZ2FjeSBkZXZpY2VzCisgKiAgYXJlIGNvbm5lY3RlZCB0byB0aGUgUElJWDQgd2hpY2ggaW4gdHVybiBoYXMgaXRzIDgyNTkocykgY29ubmVjdGVkIHRvCisgKiAgYSBvZiB0aGUgQ29iYWx0IEFQSUMgZW50cnkuCisgKgorICogIDA5LzAyLzIwMDAgLSBVcGRhdGVkIGZvciAyLjQgYnkgamJhcm5lc0BzZ2kuY29tCisgKgorICogIDI1LzExLzIwMDIgLSBVcGRhdGVkIGZvciAyLjUgYnkgQW5kcmV5IFBhbmluIDxwYXprZUBvcmJpdGExLnJ1PgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKyNpbmNsdWRlIDxhc20vaTgyNTkuaD4KKworI2luY2x1ZGUgImNvYmFsdC5oIgorI2luY2x1ZGUgImlycV92ZWN0b3JzLmgiCisKKworc3RhdGljIERFRklORV9TUElOTE9DSyhjb2JhbHRfbG9jayk7CisKKy8qCisgKiBTZXQgdGhlIGdpdmVuIENvYmFsdCBBUElDIFJlZGlyZWN0aW9uIFRhYmxlIGVudHJ5IHRvIHBvaW50CisgKiB0byB0aGUgZ2l2ZW4gSURUIHZlY3Rvci9pbmRleC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGNvX2FwaWNfc2V0KGludCBlbnRyeSwgaW50IGlycSkKK3sKKwljb19hcGljX3dyaXRlKENPX0FQSUNfTE8oZW50cnkpLCBDT19BUElDX0xFVkVMIHwgKGlycSArIEZJUlNUX0VYVEVSTkFMX1ZFQ1RPUikpOworCWNvX2FwaWNfd3JpdGUoQ09fQVBJQ19ISShlbnRyeSksIDApOworfQorCisvKgorICogQ29iYWx0IChJTyktQVBJQyBmdW5jdGlvbnMgdG8gaGFuZGxlIFBDSSBkZXZpY2VzLgorICovCitzdGF0aWMgaW5saW5lIGludCBjb19hcGljX2lkZTBfaGFjayh2b2lkKQoreworCWV4dGVybiBjaGFyIHZpc3dzX2JvYXJkX3R5cGU7CisJZXh0ZXJuIGNoYXIgdmlzd3NfYm9hcmRfcmV2OworCisJaWYgKHZpc3dzX2JvYXJkX3R5cGUgPT0gVklTV1NfMzIwICYmIHZpc3dzX2JvYXJkX3JldiA9PSA1KQorCQlyZXR1cm4gNTsKKwlyZXR1cm4gQ09fQVBJQ19JREUwOworfQorCitzdGF0aWMgaW50IGlzX2NvX2FwaWModW5zaWduZWQgaW50IGlycSkKK3sKKwlpZiAoSVNfQ09fQVBJQyhpcnEpKQorCQlyZXR1cm4gQ09fQVBJQyhpcnEpOworCisJc3dpdGNoIChpcnEpIHsKKwkJY2FzZSAwOiByZXR1cm4gQ09fQVBJQ19DUFU7CisJCWNhc2UgQ09fSVJRX0lERTA6IHJldHVybiBjb19hcGljX2lkZTBfaGFjaygpOworCQljYXNlIENPX0lSUV9JREUxOiByZXR1cm4gQ09fQVBJQ19JREUxOworCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJfQorfQorCisKKy8qCisgKiBUaGlzIGlzIHRoZSBTR0kgQ29iYWx0IChJTy0pQVBJQzoKKyAqLworCitzdGF0aWMgdm9pZCBlbmFibGVfY29iYWx0X2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWNvX2FwaWNfc2V0KGlzX2NvX2FwaWMoaXJxKSwgaXJxKTsKK30KKworc3RhdGljIHZvaWQgZGlzYWJsZV9jb2JhbHRfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJaW50IGVudHJ5ID0gaXNfY29fYXBpYyhpcnEpOworCisJY29fYXBpY193cml0ZShDT19BUElDX0xPKGVudHJ5KSwgQ09fQVBJQ19NQVNLKTsKKwljb19hcGljX3JlYWQoQ09fQVBJQ19MTyhlbnRyeSkpOworfQorCisvKgorICogImlycSIgcmVhbGx5IGp1c3Qgc2VydmVzIHRvIGlkZW50aWZ5IHRoZSBkZXZpY2UuICBIZXJlIGlzIHdoZXJlIHdlCisgKiBtYXAgdGhpcyB0byB0aGUgQ29iYWx0IEFQSUMgZW50cnkgd2hlcmUgaXQncyBwaHlzaWNhbGx5IHdpcmVkLgorICogVGhpcyBpcyBjYWxsZWQgdmlhIHJlcXVlc3RfaXJxIC0+IHNldHVwX2lycSAtPiBpcnFfZGVzYy0+c3RhcnR1cCgpCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9jb2JhbHRfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjb2JhbHRfbG9jaywgZmxhZ3MpOworCWlmICgoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEIHwgSVJRX0lOUFJPR1JFU1MgfCBJUlFfV0FJVElORykpKQorCQlpcnFfZGVzY1tpcnFdLnN0YXR1cyAmPSB+KElSUV9ESVNBQkxFRCB8IElSUV9JTlBST0dSRVNTIHwgSVJRX1dBSVRJTkcpOworCWVuYWJsZV9jb2JhbHRfaXJxKGlycSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29iYWx0X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYWNrX2NvYmFsdF9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvYmFsdF9sb2NrLCBmbGFncyk7CisJZGlzYWJsZV9jb2JhbHRfaXJxKGlycSk7CisJYXBpY193cml0ZShBUElDX0VPSSwgQVBJQ19FSU9fQUNLKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb2JhbHRfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBlbmRfY29iYWx0X2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29iYWx0X2xvY2ssIGZsYWdzKTsKKwlpZiAoIShpcnFfZGVzY1tpcnFdLnN0YXR1cyAmIChJUlFfRElTQUJMRUQgfCBJUlFfSU5QUk9HUkVTUykpKQorCQllbmFibGVfY29iYWx0X2lycShpcnEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvYmFsdF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgY29iYWx0X2lycV90eXBlID0geworCS50eXBlbmFtZSA9CSJDb2JhbHQtQVBJQyIsCisJLnN0YXJ0dXAgPQlzdGFydHVwX2NvYmFsdF9pcnEsCisJLnNodXRkb3duID0JZGlzYWJsZV9jb2JhbHRfaXJxLAorCS5lbmFibGUgPQllbmFibGVfY29iYWx0X2lycSwKKwkuZGlzYWJsZSA9CWRpc2FibGVfY29iYWx0X2lycSwKKwkuYWNrID0JCWFja19jb2JhbHRfaXJxLAorCS5lbmQgPQkJZW5kX2NvYmFsdF9pcnEsCit9OworCisKKy8qCisgKiBUaGlzIGlzIHRoZSBQSUlYNC1iYXNlZCA4MjU5IHRoYXQgaXMgd2lyZWQgdXAgaW5kaXJlY3RseSB0byBDb2JhbHQKKyAqIC0tIG5vdCB0aGUgbWFubmVyIGV4cGVjdGVkIGJ5IHRoZSBjb2RlIGluIGk4MjU5LmMuCisgKgorICogdGhlcmUgaXMgYSAnbWFzdGVyJyBwaHlzaWNhbCBpbnRlcnJ1cHQgc291cmNlIHRoYXQgZ2V0cyBzZW50IHRvCisgKiB0aGUgQ1BVLiBCdXQgaW4gdGhlIGNoaXBzZXQgdGhlcmUgYXJlIHZhcmlvdXMgJ3ZpcnR1YWwnIGludGVycnVwdHMKKyAqIHdhaXRpbmcgdG8gYmUgaGFuZGxlZC4gV2UgcmVwcmVzZW50IHRoaXMgdG8gTGludXggdGhyb3VnaCBhICdtYXN0ZXInCisgKiBpbnRlcnJ1cHQgY29udHJvbGxlciB0eXBlLCBhbmQgdGhyb3VnaCBhIHNwZWNpYWwgdmlydHVhbCBpbnRlcnJ1cHQtCisgKiBjb250cm9sbGVyLiBEZXZpY2UgZHJpdmVycyBvbmx5IHNlZSB0aGUgdmlydHVhbCBpbnRlcnJ1cHQgc291cmNlcy4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX3BpaXg0X21hc3Rlcl9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlpbml0XzgyNTlBKDApOworCisJcmV0dXJuIHN0YXJ0dXBfY29iYWx0X2lycShpcnEpOworfQorCitzdGF0aWMgdm9pZCBlbmRfcGlpeDRfbWFzdGVyX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29iYWx0X2xvY2ssIGZsYWdzKTsKKwllbmFibGVfY29iYWx0X2lycShpcnEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvYmFsdF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgcGlpeDRfbWFzdGVyX2lycV90eXBlID0geworCS50eXBlbmFtZSA9CSJQSUlYNC1tYXN0ZXIiLAorCS5zdGFydHVwID0Jc3RhcnR1cF9waWl4NF9tYXN0ZXJfaXJxLAorCS5hY2sgPQkJYWNrX2NvYmFsdF9pcnEsCisJLmVuZCA9CQllbmRfcGlpeDRfbWFzdGVyX2lycSwKK307CisKKworc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBwaWl4NF92aXJ0dWFsX2lycV90eXBlID0geworCS50eXBlbmFtZSA9CSJQSUlYNC12aXJ0dWFsIiwKKwkuc3RhcnR1cCA9CXN0YXJ0dXBfODI1OUFfaXJxLAorCS5zaHV0ZG93biA9CWRpc2FibGVfODI1OUFfaXJxLAorCS5lbmFibGUgPQllbmFibGVfODI1OUFfaXJxLAorCS5kaXNhYmxlID0JZGlzYWJsZV84MjU5QV9pcnEsCit9OworCisKKy8qCisgKiBQSUlYNC04MjU5IG1hc3Rlci92aXJ0dWFsIGZ1bmN0aW9ucyB0byBoYW5kbGUgaW50ZXJydXB0IHJlcXVlc3RzCisgKiBmcm9tIGxlZ2FjeSBkZXZpY2VzOiBmbG9wcHksIHBhcmFsbGVsLCBzZXJpYWwsIHJ0Yy4KKyAqCisgKiBOb25lIG9mIHRoZXNlIGdldCBDb2JhbHQgQVBJQyBlbnRyaWVzLCBuZWl0aGVyIGRvIHRoZXkgaGF2ZSBJRFQKKyAqIGVudHJpZXMuIFRoZXNlIGludGVycnVwdHMgYXJlIHB1cmVseSB2aXJ0dWFsIGFuZCBkaXN0cmlidXRlZCBmcm9tCisgKiB0aGUgJ21hc3RlcicgaW50ZXJydXB0IHNvdXJjZTogQ09fSVJRXzgyNTkuCisgKgorICogV2hlbiB0aGUgODI1OSBpbnRlcnJ1cHRzIGl0cyBoYW5kbGVyIGZpZ3VyZXMgb3V0IHdoaWNoIG9mIHRoZXNlCisgKiBkZXZpY2VzIGlzIGludGVycnVwdGluZyBhbmQgZGlzcGF0Y2hlcyB0byBpdHMgaGFuZGxlci4KKyAqCisgKiBDQVJFRlVMOiBkZXZpY2VzIHNlZSB0aGUgJ3ZpcnR1YWwnIGludGVycnVwdCBvbmx5LiBUaHVzIGRpc2FibGUvCisgKiBlbmFibGVfaXJxIGdldHMgdGhlIHJpZ2h0IGlycS4gVGhpcyAnbWFzdGVyJyBpcnEgaXMgbmV2ZXIgZGlyZWN0bHkKKyAqIG1hbmlwdWxhdGVkIGJ5IGFueSBkcml2ZXIuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBwaWl4NF9tYXN0ZXJfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwlpbnQgcmVhbGlycTsKKwlpcnFfZGVzY190ICpkZXNjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTgyNTlBX2xvY2ssIGZsYWdzKTsKKworCS8qIEZpbmQgb3V0IHdoYXQncyBpbnRlcnJ1cHRpbmcgaW4gdGhlIFBJSVg0IG1hc3RlciA4MjU5ICovCisJb3V0YigweDBjLCAweDIwKTsJCS8qIE9DVzMgUG9sbCBjb21tYW5kICovCisJcmVhbGlycSA9IGluYigweDIwKTsKKworCS8qCisJICogQml0IDcgPT0gMCBtZWFucyBpbnZhbGlkL3NwdXJpb3VzCisJICovCisJaWYgKHVubGlrZWx5KCEocmVhbGlycSAmIDB4ODApKSkKKwkJZ290byBvdXRfdW5sb2NrOworCisJcmVhbGlycSAmPSA3OworCisJaWYgKHVubGlrZWx5KHJlYWxpcnEgPT0gMikpIHsKKwkJb3V0YigweDBjLCAweGEwKTsKKwkJcmVhbGlycSA9IGluYigweGEwKTsKKworCQlpZiAodW5saWtlbHkoIShyZWFsaXJxICYgMHg4MCkpKQorCQkJZ290byBvdXRfdW5sb2NrOworCisJCXJlYWxpcnEgPSAocmVhbGlycSAmIDcpICsgODsKKwl9CisKKwkvKiBtYXNrIGFuZCBhY2sgaW50ZXJydXB0ICovCisJY2FjaGVkX2lycV9tYXNrIHw9IDEgPDwgcmVhbGlycTsKKwlpZiAodW5saWtlbHkocmVhbGlycSA+IDcpKSB7CisJCWluYigweGExKTsKKwkJb3V0YihjYWNoZWRfc2xhdmVfbWFzaywgMHhhMSk7CisJCW91dGIoMHg2MCArIChyZWFsaXJxICYgNyksIDB4YTApOworCQlvdXRiKDB4NjAgKyAyLCAweDIwKTsKKwl9IGVsc2UgeworCQlpbmIoMHgyMSk7CisJCW91dGIoY2FjaGVkX21hc3Rlcl9tYXNrLCAweDIxKTsKKwkJb3V0YigweDYwICsgcmVhbGlycSwgMHgyMCk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTgyNTlBX2xvY2ssIGZsYWdzKTsKKworCWRlc2MgPSBpcnFfZGVzYyArIHJlYWxpcnE7CisKKwkvKgorCSAqIGhhbmRsZSB0aGlzICd2aXJ0dWFsIGludGVycnVwdCcgYXMgYSBDb2JhbHQgb25lIG5vdy4KKwkgKi8KKwlrc3RhdF9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpKS5pcnFzW3JlYWxpcnFdKys7CisKKwlpZiAobGlrZWx5KGRlc2MtPmFjdGlvbiAhPSBOVUxMKSkKKwkJaGFuZGxlX0lSUV9ldmVudChyZWFsaXJxLCByZWdzLCBkZXNjLT5hY3Rpb24pOworCisJaWYgKCEoZGVzYy0+c3RhdHVzICYgSVJRX0RJU0FCTEVEKSkKKwkJZW5hYmxlXzgyNTlBX2lycShyZWFsaXJxKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKKworb3V0X3VubG9jazoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpODI1OUFfbG9jaywgZmxhZ3MpOworCXJldHVybiBJUlFfTk9ORTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gbWFzdGVyX2FjdGlvbiA9IHsKKwkuaGFuZGxlciA9CXBpaXg0X21hc3Rlcl9pbnRyLAorCS5uYW1lID0JCSJQSUlYNC04MjU5IiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGNhc2NhZGVfYWN0aW9uID0geworCS5oYW5kbGVyID0gCW5vX2FjdGlvbiwKKwkubmFtZSA9CQkiY2FzY2FkZSIsCit9OworCisKK3ZvaWQgaW5pdF9WSVNXU19BUElDX2lycXModm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBDT19JUlFfQVBJQzAgKyBDT19BUElDX0xBU1QgKyAxOyBpKyspIHsKKwkJaXJxX2Rlc2NbaV0uc3RhdHVzID0gSVJRX0RJU0FCTEVEOworCQlpcnFfZGVzY1tpXS5hY3Rpb24gPSAwOworCQlpcnFfZGVzY1tpXS5kZXB0aCA9IDE7CisKKwkJaWYgKGkgPT0gMCkgeworCQkJaXJxX2Rlc2NbaV0uaGFuZGxlciA9ICZjb2JhbHRfaXJxX3R5cGU7CisJCX0KKwkJZWxzZSBpZiAoaSA9PSBDT19JUlFfSURFMCkgeworCQkJaXJxX2Rlc2NbaV0uaGFuZGxlciA9ICZjb2JhbHRfaXJxX3R5cGU7CisJCX0KKwkJZWxzZSBpZiAoaSA9PSBDT19JUlFfSURFMSkgeworCQkJaXJxX2Rlc2NbaV0uaGFuZGxlciA9ICZjb2JhbHRfaXJxX3R5cGU7CisJCX0KKwkJZWxzZSBpZiAoaSA9PSBDT19JUlFfODI1OSkgeworCQkJaXJxX2Rlc2NbaV0uaGFuZGxlciA9ICZwaWl4NF9tYXN0ZXJfaXJxX3R5cGU7CisJCX0KKwkJZWxzZSBpZiAoaSA8IENPX0lSUV9BUElDMCkgeworCQkJaXJxX2Rlc2NbaV0uaGFuZGxlciA9ICZwaWl4NF92aXJ0dWFsX2lycV90eXBlOworCQl9CisJCWVsc2UgaWYgKElTX0NPX0FQSUMoaSkpIHsKKwkJCWlycV9kZXNjW2ldLmhhbmRsZXIgPSAmY29iYWx0X2lycV90eXBlOworCQl9CisJfQorCisJc2V0dXBfaXJxKENPX0lSUV84MjU5LCAmbWFzdGVyX2FjdGlvbik7CisJc2V0dXBfaXJxKDIsICZjYXNjYWRlX2FjdGlvbik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWFjaC12b3lhZ2VyL01ha2VmaWxlIGIvYXJjaC9pMzg2L21hY2gtdm95YWdlci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjRkMjk2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hY2gtdm95YWdlci9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuCisjCisKK0VYVFJBX0NGTEFHUwkrPSAtSS4uL2tlcm5lbAorb2JqLXkJCQk6PSBzZXR1cC5vIHZveWFnZXJfYmFzaWMubyB2b3lhZ2VyX3RocmVhZC5vCisKK29iai0kKENPTkZJR19TTVApCSs9IHZveWFnZXJfc21wLm8gdm95YWdlcl9jYXQubwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hY2gtdm95YWdlci9zZXR1cC5jIGIvYXJjaC9pMzg2L21hY2gtdm95YWdlci9zZXR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMTIzZmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWFjaC12b3lhZ2VyL3NldHVwLmMKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqCU1hY2hpbmUgc3BlY2lmaWMgc2V0dXAgZm9yIGdlbmVyaWMKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9hY3BpLmg+CisjaW5jbHVkZSA8YXNtL2FyY2hfaG9va3MuaD4KKwordm9pZCBfX2luaXQgcHJlX2ludHJfaW5pdF9ob29rKHZvaWQpCit7CisJaW5pdF9JU0FfaXJxcygpOworfQorCisvKgorICogSVJRMiBpcyBjYXNjYWRlIGludGVycnVwdCB0byBzZWNvbmQgaW50ZXJydXB0IGNvbnRyb2xsZXIKKyAqLworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaXJxMiA9IHsgbm9fYWN0aW9uLCAwLCBDUFVfTUFTS19OT05FLCAiY2FzY2FkZSIsIE5VTEwsIE5VTEx9OworCit2b2lkIF9faW5pdCBpbnRyX2luaXRfaG9vayh2b2lkKQoreworI2lmZGVmIENPTkZJR19TTVAKKwlzbXBfaW50cl9pbml0KCk7CisjZW5kaWYKKworCWlmICghYWNwaV9pb2FwaWMpCisJCXNldHVwX2lycSgyLCAmaXJxMik7Cit9CisKK3ZvaWQgX19pbml0IHByZV9zZXR1cF9hcmNoX2hvb2sodm9pZCkKK3sKKwkvKiBWb3lhZ2VycyBydW4gdGhlaXIgQ1BVcyBmcm9tIGluZGVwZW5kZW50IGNsb2Nrcywgc28gZGlzYWJsZQorCSAqIHRoZSBUU0MgY29kZSBiZWNhdXNlIHdlIGNhbid0IHN5bmMgdGhlbSAqLworCXRzY19kaXNhYmxlID0gMTsKK30KKwordm9pZCBfX2luaXQgdHJhcF9pbml0X2hvb2sodm9pZCkKK3sKK30KKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaXJxMCAgPSB7IHRpbWVyX2ludGVycnVwdCwgU0FfSU5URVJSVVBULCBDUFVfTUFTS19OT05FLCAidGltZXIiLCBOVUxMLCBOVUxMfTsKKwordm9pZCBfX2luaXQgdGltZV9pbml0X2hvb2sodm9pZCkKK3sKKwlzZXR1cF9pcnEoMCwgJmlycTApOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hY2gtdm95YWdlci92b3lhZ2VyX2Jhc2ljLmMgYi9hcmNoL2kzODYvbWFjaC12b3lhZ2VyL3ZveWFnZXJfYmFzaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDJhZWEyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hY2gtdm95YWdlci92b3lhZ2VyX2Jhc2ljLmMKQEAgLTAsMCArMSwzMjUgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5OSwyMDAxIAorICoKKyAqIEF1dGhvcjogSi5FLkouQm90dG9tbGV5QEhhbnNlblBhcnRuZXJzaGlwLmNvbQorICoKKyAqIGxpbnV4L2FyY2gvaTM4Ni9rZXJuZWwvdm95YWdlci5jCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCB0aGUgdm95YWdlciBzcGVjaWZpYyByb3V0aW5lcyBmb3IgZ2V0dGluZworICogaW5pdGlhbGlzYXRpb24gb2YgdGhlIGFyY2hpdGVjdHVyZSB0byBmdW5jdGlvbi4gIEZvciBhZGRpdGlvbmFsCisgKiBmZWF0dXJlcyBzZWU6CisgKgorICoJdm95YWdlcl9jYXQuYyAtIFZveWFnZXIgQ0FUIGJ1cyBpbnRlcmZhY2UKKyAqCXZveWFnZXJfc21wLmMgLSBWb3lhZ2VyIFNNUCBoYWwgKGVtdWxhdGVzIGxpbnV4IHNtcC5jKQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzcnEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdm95YWdlci5oPgorI2luY2x1ZGUgPGFzbS92aWMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoX2hvb2tzLmg+CisKKy8qCisgKiBQb3dlciBvZmYgZnVuY3Rpb24sIGlmIGFueQorICovCit2b2lkICgqcG1fcG93ZXJfb2ZmKSh2b2lkKTsKKworaW50IHZveWFnZXJfbGV2ZWwgPSAwOworCitzdHJ1Y3Qgdm95YWdlcl9TVVMgKnZveWFnZXJfU1VTID0gTlVMTDsKKworI2lmZGVmIENPTkZJR19TTVAKK3N0YXRpYyB2b2lkCit2b3lhZ2VyX2R1bXAoaW50IGR1bW15MSwgc3RydWN0IHB0X3JlZ3MgKmR1bW15Miwgc3RydWN0IHR0eV9zdHJ1Y3QgKmR1bW15MykKK3sKKwkvKiBnZXQgaGVyZSB2aWEgYSBzeXNycSAqLworCXZveWFnZXJfc21wX2R1bXAoKTsKK30KKworc3RhdGljIHN0cnVjdCBzeXNycV9rZXlfb3Agc3lzcnFfdm95YWdlcl9kdW1wX29wID0geworCS5oYW5kbGVyCT0gdm95YWdlcl9kdW1wLAorCS5oZWxwX21zZwk9ICJWb3lhZ2VyIiwKKwkuYWN0aW9uX21zZwk9ICJEdW1wIFZveWFnZXIgU3RhdHVzIiwKK307CisjZW5kaWYKKwordm9pZAordm95YWdlcl9kZXRlY3Qoc3RydWN0IHZveWFnZXJfYmlvc19pbmZvICpiaW9zKQoreworCWlmKGJpb3MtPmxlbiAhPSAweGZmKSB7CisJCWludCBjbGFzcyA9IChiaW9zLT5jbGFzc18xIDw8IDgpIAorCQkJfCAoYmlvcy0+Y2xhc3NfMiAmIDB4ZmYpOworCisJCXByaW50aygiVm95YWdlciBTeXN0ZW0gZGV0ZWN0ZWQuXG4iCisJCSAgICAgICAiICAgICAgICBDbGFzcyAleCwgUmV2aXNpb24gJWQuJWRcbiIsCisJCSAgICAgICBjbGFzcywgYmlvcy0+bWFqb3IsIGJpb3MtPm1pbm9yKTsKKwkJaWYoY2xhc3MgPT0gVk9ZQUdFUl9MRVZFTDQpIAorCQkJdm95YWdlcl9sZXZlbCA9IDQ7CisJCWVsc2UgaWYoY2xhc3MgPCBWT1lBR0VSX0xFVkVMNV9BTkRfQUJPVkUpCisJCQl2b3lhZ2VyX2xldmVsID0gMzsKKwkJZWxzZQorCQkJdm95YWdlcl9sZXZlbCA9IDU7CisJCXByaW50aygiICAgICAgICBBcmNoaXRlY3R1cmUgTGV2ZWwgJWRcbiIsIHZveWFnZXJfbGV2ZWwpOworCQlpZih2b3lhZ2VyX2xldmVsIDwgNCkKKwkJCXByaW50aygiXG4qKldBUk5JTkcqKjogVm95YWdlciBIQUwgb25seSBzdXBwb3J0cyBMZXZlbHMgNCBhbmQgNSBBcmNoaXRlY3R1cmVzIGF0IHRoZSBtb21lbnRcblxuIik7CisJCS8qIGluc3RhbGwgdGhlIHBvd2VyIG9mZiBoYW5kbGVyICovCisJCXBtX3Bvd2VyX29mZiA9IHZveWFnZXJfcG93ZXJfb2ZmOworI2lmZGVmIENPTkZJR19TTVAKKwkJcmVnaXN0ZXJfc3lzcnFfa2V5KCd2JywgJnN5c3JxX3ZveWFnZXJfZHVtcF9vcCk7CisjZW5kaWYKKwl9IGVsc2UgeworCQlwcmludGsoIlxuXG4qKldBUk5JTkcqKjogTm8gVm95YWdlciBTdWJzeXN0ZW0gRm91bmRcbiIpOworCX0KK30KKwordm9pZAordm95YWdlcl9zeXN0ZW1faW50ZXJydXB0KGludCBjcGwsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcHJpbnRrKCJWb3lhZ2VyOiBkZXRlY3RlZCBzeXN0ZW0gaW50ZXJydXB0XG4iKTsKK30KKworLyogUm91dGluZSB0byByZWFkIGluZm9ybWF0aW9uIGZyb20gdGhlIGV4dGVuZGVkIENNT1MgYXJlYSAqLworX191OAordm95YWdlcl9leHRlbmRlZF9jbW9zX3JlYWQoX191MTYgYWRkcikKK3sKKwlvdXRiKGFkZHIgJiAweGZmLCAweDc0KTsKKwlvdXRiKChhZGRyID4+IDgpICYgMHhmZiwgMHg3NSk7CisJcmV0dXJuIGluYigweDc2KTsKK30KKworLyogaW50ZXJuYWwgZGVmaW5pdGlvbnMgZm9yIHRoZSBTVVMgQ2xpY2sgTWFwIG9mIG1lbW9yeSAqLworCisjZGVmaW5lIENMSUNLX0VOVFJJRVMJMTYKKyNkZWZpbmUgQ0xJQ0tfU0laRQk0MDk2CS8qIGNsaWNrIHRvIGJ5dGUgY29udmVyc2lvbiBmb3IgTGVuZ3RoICovCisKK3R5cGVkZWYgc3RydWN0IENsaWNrTWFwIHsKKwlzdHJ1Y3QgRW50cnkgeworCQlfX3UzMglBZGRyZXNzOworCQlfX3UzMglMZW5ndGg7CisJfSBFbnRyeVtDTElDS19FTlRSSUVTXTsKK30gQ2xpY2tNYXBfdDsKKworCisvKiBUaGlzIHJvdXRpbmUgaXMgcHJldHR5IG11Y2ggYW4gYXdmdWwgaGFjayB0byByZWFkIHRoZSBiaW9zIGNsaWNrbWFwIGJ5CisgKiBtYXBwaW5nIGl0IGludG8gcGFnZSAwLiAgVGhlcmUgYXJlIHVzdWFsbHkgdGhyZWUgcmVnaW9ucyBpbiB0aGUgbWFwOgorICogCUJhc2UgTWVtb3J5CisgKiAJRXh0ZW5kZWQgTWVtb3J5CisgKgl6ZXJvIGxlbmd0aCBtYXJrZXIgZm9yIGVuZCBvZiBtYXAKKyAqCisgKiBSZXR1cm5zIGFyZSAwIGZvciBmYWlsdXJlIGFuZCAxIGZvciBzdWNjZXNzIG9uIGV4dHJhY3RpbmcgcmVnaW9uLgorICovCitpbnQgX19pbml0Cit2b3lhZ2VyX21lbW9yeV9kZXRlY3QoaW50IHJlZ2lvbiwgX191MzIgKnN0YXJ0LCBfX3UzMiAqbGVuZ3RoKQoreworCWludCBpOworCWludCByZXR2YWwgPSAwOworCV9fdTggY21vc1s0XTsKKwlDbGlja01hcF90ICptYXA7CisJdW5zaWduZWQgbG9uZyBtYXBfYWRkcjsKKwl1bnNpZ25lZCBsb25nIG9sZDsKKworCWlmKHJlZ2lvbiA+PSBDTElDS19FTlRSSUVTKSB7CisJCXByaW50aygiVm95YWdlcjogSWxsZWdhbCBDbGlja01hcCByZWdpb24gJWRcbiIsIHJlZ2lvbik7CisJCXJldHVybiAwOworCX0KKworCWZvcihpID0gMDsgaSA8IHNpemVvZihjbW9zKTsgaSsrKQorCQljbW9zW2ldID0gdm95YWdlcl9leHRlbmRlZF9jbW9zX3JlYWQoVk9ZQUdFUl9NRU1PUllfQ0xJQ0tNQVAgKyBpKTsKKworCW1hcF9hZGRyID0gKih1bnNpZ25lZCBsb25nICopY21vczsKKworCS8qIHN0ZWFsIHBhZ2UgMCBmb3IgdGhpcyAqLworCW9sZCA9IHBnMFswXTsKKwlwZzBbMF0gPSAoKG1hcF9hZGRyICYgUEFHRV9NQVNLKSB8IF9QQUdFX1JXIHwgX1BBR0VfUFJFU0VOVCk7CisJbG9jYWxfZmx1c2hfdGxiKCk7CisJLyogbm93IGNsZWFyIGV2ZXJ5dGhpbmcgb3V0IGJ1dCBwYWdlIDAgKi8KKwltYXAgPSAoQ2xpY2tNYXBfdCAqKShtYXBfYWRkciAmICh+UEFHRV9NQVNLKSk7CisKKwkvKiB6ZXJvIGxlbmd0aCBpcyB0aGUgZW5kIG9mIHRoZSBjbGlja21hcCAqLworCWlmKG1hcC0+RW50cnlbcmVnaW9uXS5MZW5ndGggIT0gMCkgeworCQkqbGVuZ3RoID0gbWFwLT5FbnRyeVtyZWdpb25dLkxlbmd0aCAqIENMSUNLX1NJWkU7CisJCSpzdGFydCA9IG1hcC0+RW50cnlbcmVnaW9uXS5BZGRyZXNzOworCQlyZXR2YWwgPSAxOworCX0KKworCS8qIHJlcGxhY2UgdGhlIG1hcHBpbmcgKi8KKwlwZzBbMF0gPSBvbGQ7CisJbG9jYWxfZmx1c2hfdGxiKCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyogdm95YWdlciBzcGVjaWZpYyBoYW5kbGluZyBjb2RlIGZvciB0aW1lciBpbnRlcnJ1cHRzLiAgVXNlZCB0byBoYW5kCisgKiBvZmYgdGhlIHRpbWVyIHRpY2sgdG8gdGhlIFNNUCBjb2RlLCBzaW5jZSB0aGUgVklDIGRvZXNuJ3QgaGF2ZSBhbgorICogaW50ZXJuYWwgdGltZXIgKFRoZSBRSUMgZG9lcywgYnV0IHRoYXQncyBhbm90aGVyIHN0b3J5KS4gKi8KK3ZvaWQKK3ZveWFnZXJfdGltZXJfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmKChqaWZmaWVzICYgMHgzZmYpID09IDApIHsKKworCQkvKiBUaGVyZSBzZWVtcyB0byBiZSBzb21ldGhpbmcgZmxha3kgaW4gZWl0aGVyCisJCSAqIGhhcmR3YXJlIG9yIHNvZnR3YXJlIHRoYXQgaXMgcmVzZXR0aW5nIHRoZSB0aW1lciAwCisJCSAqIGNvdW50IHRvIHNvbWV0aGluZyBtdWNoIGhpZ2hlciB0aGFuIGl0IHNob3VsZCBiZQorCQkgKiBUaGlzIHNlZW1zIHRvIG9jY3VyIGluIHRoZSBib290IHNlcXVlbmNlLCBqdXN0CisJCSAqIGJlZm9yZSByb290IGlzIG1vdW50ZWQuICBUaGVyZWZvcmUsIGV2ZXJ5IDEwCisJCSAqIHNlY29uZHMgb3Igc28sIHdlIHNhbml0eSBjaGVjayB0aGUgdGltZXIgemVybyBjb3VudAorCQkgKiBhbmQga2ljayBpdCBiYWNrIHRvIHdoZXJlIGl0IHNob3VsZCBiZS4KKwkJICoKKwkJICogRklYTUU6IFRoaXMgaXMgdGhlIG1vc3QgYXdmdWwgaGFjayB5ZXQgc2Vlbi4gIEkKKwkJICogc2hvdWxkIHdvcmsgb3V0IGV4YWN0bHkgd2hhdCBpcyBpbnRlcmZlcmluZyB3aXRoCisJCSAqIHRoZSB0aW1lciBjb3VudCBzZXR0aW5ncyBlYXJseSBpbiB0aGUgYm9vdCBzZXF1ZW5jZQorCQkgKiBhbmQgc3dpZnRseSBpbnRyb2R1Y2UgaXQgdG8gc29tZXRoaW5nIHNoYXJwIGFuZAorCQkgKiBwb2ludHkuICAqLworCQlfX3UxNiB2YWw7CisJCWV4dGVybiBzcGlubG9ja190IGk4MjUzX2xvY2s7CisKKwkJc3Bpbl9sb2NrKCZpODI1M19sb2NrKTsKKwkJCisJCW91dGJfcCgweDAwLCAweDQzKTsKKwkJdmFsID0gaW5iX3AoMHg0MCk7CisJCXZhbCB8PSBpbmIoMHg0MCkgPDwgODsKKwkJc3Bpbl91bmxvY2soJmk4MjUzX2xvY2spOworCisJCWlmKHZhbCA+IExBVENIKSB7CisJCQlwcmludGsoIlxuVk9ZQUdFUjogY291bnRkb3duIHRpbWVyIHZhbHVlIHRvbyBoaWdoICglZCksIHJlc2V0dGluZ1xuXG4iLCB2YWwpOworCQkJc3Bpbl9sb2NrKCZpODI1M19sb2NrKTsKKwkJCW91dGIoMHgzNCwweDQzKTsKKwkJCW91dGJfcChMQVRDSCAmIDB4ZmYgLCAweDQwKTsJLyogTFNCICovCisJCQlvdXRiKExBVENIID4+IDggLCAweDQwKTsJLyogTVNCICovCisJCQlzcGluX3VubG9jaygmaTgyNTNfbG9jayk7CisJCX0KKwl9CisjaWZkZWYgQ09ORklHX1NNUAorCXNtcF92aWNfdGltZXJfaW50ZXJydXB0KHJlZ3MpOworI2VuZGlmCit9CisKK3ZvaWQKK3ZveWFnZXJfcG93ZXJfb2ZmKHZvaWQpCit7CisJcHJpbnRrKCJWT1lBR0VSIFBvd2VyIE9mZlxuIik7CisKKwlpZih2b3lhZ2VyX2xldmVsID09IDUpIHsKKwkJdm95YWdlcl9jYXRfcG93ZXJfb2ZmKCk7CisJfSBlbHNlIGlmKHZveWFnZXJfbGV2ZWwgPT0gNCkgeworCQkvKiBUaGlzIGRvZXNuJ3QgYXBwYXJlbnRseSB3b3JrIG9uIG1vc3QgTDQgbWFjaGluZXMsCisJCSAqIGJ1dCB0aGUgc3BlY3Mgc2F5IHRvIGRvIHRoaXMgdG8gZ2V0IGF1dG9tYXRpYyBwb3dlcgorCQkgKiBvZmYuICBVbmZvcnR1bmF0ZWx5LCBpZiBpdCBkb2Vzbid0IHBvd2VyIG9mZiB0aGUKKwkJICogbWFjaGluZSwgaXQgZW5kcyB1cCBkb2luZyBhIGNvbGQgcmVzdGFydCwgd2hpY2gKKwkJICogaXNuJ3QgcmVhbGx5IGludGVuZGVkLCBzbyBjb21tZW50IG91dCB0aGUgY29kZSAqLworI2lmIDAKKwkJaW50IHBvcnQ7CisKKwkgIAorCQkvKiBlbmFibGUgdGhlIHZveWFnZXIgQ29uZmlndXJhdGlvbiBTcGFjZSAqLworCQlvdXRiKChpbmIoVk9ZQUdFUl9NQ19TRVRVUCkgJiAweGYwKSB8IDB4OCwgCisJCSAgICAgVk9ZQUdFUl9NQ19TRVRVUCk7CisJCS8qIHRoZSBwb3J0IGZvciB0aGUgcG93ZXIgb2ZmIGZsYWcgaXMgYW4gb2Zmc2V0IGZyb20gdGhlCisJCSAgIGZsb2F0aW5nIGJhc2UgKi8KKwkJcG9ydCA9IChpbmIoVk9ZQUdFUl9TU1BCX1JFTE9DQVRJT05fUE9SVCkgPDwgOCkgKyAweDIxOworCQkvKiBzZXQgdGhlIHBvd2VyIG9mZiBmbGFnICovCisJCW91dGIoaW5iKHBvcnQpIHwgMHgxLCBwb3J0KTsKKyNlbmRpZgorCX0KKwkvKiBhbmQgd2FpdCBmb3IgaXQgdG8gaGFwcGVuICovCisJZm9yKDs7KSB7CisJCV9fYXNtKCJjbGkiKTsKKwkJX19hc20oImhsdCIpOworCX0KK30KKworLyogY29waWVkIGZyb20gcHJvY2Vzcy5jICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2tiX3dhaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaT0wOyBpPDB4MTAwMDA7IGkrKykKKwkJaWYgKChpbmJfcCgweDY0KSAmIDB4MDIpID09IDApCisJCQlicmVhazsKK30KKwordm9pZAorbWFjaGluZV9yZXN0YXJ0KGNoYXIgKmNtZCkKK3sKKwlwcmludGsoIlZveWFnZXIgV2FybSBSZXN0YXJ0XG4iKTsKKwlrYl93YWl0KCk7CisKKwlpZih2b3lhZ2VyX2xldmVsID09IDUpIHsKKwkJLyogd3JpdGUgbWFnaWMgdmFsdWVzIHRvIHRoZSBSVEMgdG8gaW5mb3JtIHN5c3RlbSB0aGF0CisJCSAqIHNodXRkb3duIGlzIGJlZ2lubmluZyAqLworCQlvdXRiKDB4OGYsIDB4NzApOworCQlvdXRiKDB4NSAsIDB4NzEpOworCQkKKwkJdWRlbGF5KDUwKTsKKwkJb3V0YigweGZlLDB4NjQpOyAgICAgICAgIC8qIHB1bGwgcmVzZXQgbG93ICovCisJfSBlbHNlIGlmKHZveWFnZXJfbGV2ZWwgPT0gNCkgeworCQlfX3UxNiBjYXRiYXNlID0gaW5iKFZPWUFHRVJfU1NQQl9SRUxPQ0FUSU9OX1BPUlQpPDw4OworCQlfX3U4IGJhc2ViZCA9IGluYihWT1lBR0VSX01DX1NFVFVQKTsKKwkJCisJCW91dGIoYmFzZWJkIHwgMHgwOCwgVk9ZQUdFUl9NQ19TRVRVUCk7CisJCW91dGIoMHgwMiwgY2F0YmFzZSArIDB4MjEpOworCX0KKwlmb3IoOzspIHsKKwkJYXNtKCJjbGkiKTsKKwkJYXNtKCJobHQiKTsKKwl9Cit9CisKK0VYUE9SVF9TWU1CT0wobWFjaGluZV9yZXN0YXJ0KTsKKwordm9pZAorbWNhX25taV9ob29rKHZvaWQpCit7CisJX191OCBkdW1wdmFsIF9fYXR0cmlidXRlX18oKHVudXNlZCkpID0gaW5iKDB4ZjgyMyk7CisJX191OCBzd25taSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSA9IGluYigweGY4MTMpOworCisJLyogRklYTUU6IGFzc3VtZSBkdW1wIHN3aXRjaCBwcmVzc2VkICovCisJLyogY2hlY2sgdG8gc2VlIGlmIHRoZSBkdW1wIHN3aXRjaCB3YXMgcHJlc3NlZCAqLworCVZERUJVRygoIlZPWUFHRVI6IGR1bXB2YWwgPSAweCV4LCBzd25taSA9IDB4JXhcbiIsIGR1bXB2YWwsIHN3bm1pKSk7CisJLyogY2xlYXIgc3dubWkgKi8KKwlvdXRiKDB4ZmYsIDB4ZjgxMyk7CisJLyogdGVsbCBTVVMgdG8gaWdub3JlIGR1bXAgKi8KKwlpZih2b3lhZ2VyX2xldmVsID09IDUgJiYgdm95YWdlcl9TVVMgIT0gTlVMTCkgeworCQlpZih2b3lhZ2VyX1NVUy0+U1VTX21ib3ggPT0gVk9ZQUdFUl9EVU1QX0JVVFRPTl9OTUkpIHsKKwkJCXZveWFnZXJfU1VTLT5rZXJuZWxfbWJveCA9IFZPWUFHRVJfTk9fQ09NTUFORDsKKwkJCXZveWFnZXJfU1VTLT5rZXJuZWxfZmxhZ3MgfD0gVk9ZQUdFUl9PU19JTl9QUk9HUkVTUzsKKwkJCXVkZWxheSgxMDAwKTsKKwkJCXZveWFnZXJfU1VTLT5rZXJuZWxfbWJveCA9IFZPWUFHRVJfSUdOT1JFX0RVTVA7CisJCQl2b3lhZ2VyX1NVUy0+a2VybmVsX2ZsYWdzICY9IH5WT1lBR0VSX09TX0lOX1BST0dSRVNTOworCQl9CisJfQorCXByaW50ayhLRVJOX0VSUiAiVk9ZQUdFUjogRHVtcCBzd2l0Y2ggcHJlc3NlZCwgcHJpbnRpbmcgQ1BVJWQgdHJhY2ViYWNrc1xuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwlzaG93X3N0YWNrKE5VTEwsIE5VTEwpOworCXNob3dfc3RhdGUoKTsKK30KKworCisKK3ZvaWQKK21hY2hpbmVfaGFsdCh2b2lkKQoreworCS8qIHRyZWF0IGEgaGFsdCBsaWtlIGEgcG93ZXIgb2ZmICovCisJbWFjaGluZV9wb3dlcl9vZmYoKTsKK30KKworRVhQT1JUX1NZTUJPTChtYWNoaW5lX2hhbHQpOworCit2b2lkIG1hY2hpbmVfcG93ZXJfb2ZmKHZvaWQpCit7CisJaWYgKHBtX3Bvd2VyX29mZikKKwkJcG1fcG93ZXJfb2ZmKCk7Cit9CisKK0VYUE9SVF9TWU1CT0wobWFjaGluZV9wb3dlcl9vZmYpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hY2gtdm95YWdlci92b3lhZ2VyX2NhdC5jIGIvYXJjaC9pMzg2L21hY2gtdm95YWdlci92b3lhZ2VyX2NhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzOTY3ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWFjaC12b3lhZ2VyL3ZveWFnZXJfY2F0LmMKQEAgLTAsMCArMSwxMTc4IEBACisvKiAtKi0gbW9kZTogYzsgYy1iYXNpYy1vZmZzZXQ6IDggLSotICovCisKKy8qIENvcHlyaWdodCAoQykgMTk5OSwyMDAxCisgKgorICogQXV0aG9yOiBKLkUuSi5Cb3R0b21sZXlASGFuc2VuUGFydG5lcnNoaXAuY29tCisgKgorICogbGludXgvYXJjaC9pMzg2L2tlcm5lbC92b3lhZ2VyX2NhdC5jCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCB0aGUgbG9naWMgZm9yIG1hbmlwdWxhdGluZyB0aGUgQ0FUIGJ1cworICogaW4gYSBsZXZlbCA1IG1hY2hpbmUuCisgKgorICogVGhlIENBVCBidXMgaXMgYSBzZXJpYWwgY29uZmlndXJhdGlvbiBhbmQgdGVzdCBidXMuICBJdHMgcHJpbWFyeQorICogdXNlcyBhcmUgdG8gcHJvYmUgdGhlIGluaXRpYWwgY29uZmlndXJhdGlvbiBvZiB0aGUgc3lzdGVtIGFuZCB0bworICogZGlhZ25vc2UgZXJyb3IgY29uZGl0aW9ucyB3aGVuIGEgc3lzdGVtIGludGVycnVwdCBvY2N1cnMuICBUaGUgbG93CisgKiBsZXZlbCBpbnRlcmZhY2UgaXMgZmFpcmx5IHByaW1pdGl2ZSwgc28gbW9zdCBvZiB0aGlzIGZpbGUgY29uc2lzdHMKKyAqIG9mIGJpdCBzaGlmdCBtYW5pcHVsYXRpb25zIHRvIHNlbmQgYW5kIHJlY2VpdmUgcGFja2V0cyBvbiB0aGUKKyAqIHNlcmlhbCBidXMgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8YXNtL3ZveWFnZXIuaD4KKyNpbmNsdWRlIDxhc20vdmljLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaWZkZWYgVk9ZQUdFUl9DQVRfREVCVUcKKyNkZWZpbmUgQ0RFQlVHKHgpCXByaW50ayB4CisjZWxzZQorI2RlZmluZSBDREVCVUcoeCkKKyNlbmRpZgorCisvKiB0aGUgQ0FUIGNvbW1hbmQgcG9ydCAqLworI2RlZmluZSBDQVRfQ01ECQkoc3NwYiArIDB4ZSkKKy8qIHRoZSBDQVQgZGF0YSBwb3J0ICovCisjZGVmaW5lIENBVF9EQVRBCShzc3BiICsgMHhkKQorCisvKiB0aGUgaW50ZXJuYWwgY2F0IGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgY2F0X3BhY2soX191OCAqbXNnLCBfX3UxNiBzdGFydF9iaXQsIF9fdTggKmRhdGEsIAorCQkgICAgIF9fdTE2IG51bV9iaXRzKTsKK3N0YXRpYyB2b2lkIGNhdF91bnBhY2soX191OCAqbXNnLCBfX3UxNiBzdGFydF9iaXQsIF9fdTggKmRhdGEsCisJCSAgICAgICBfX3UxNiBudW1fYml0cyk7CitzdGF0aWMgdm9pZCBjYXRfYnVpbGRfaGVhZGVyKF9fdTggKmhlYWRlciwgY29uc3QgX191MTYgbGVuLCAKKwkJCSAgICAgY29uc3QgX191MTYgc21hbGxlc3RfcmVnX2JpdHMsCisJCQkgICAgIGNvbnN0IF9fdTE2IGxvbmdlc3RfcmVnX2JpdHMpOworc3RhdGljIGludCBjYXRfc2VuZGluc3Qodm95YWdlcl9tb2R1bGVfdCAqbW9kcCwgdm95YWdlcl9hc2ljX3QgKmFzaWNwLAorCQkJX191OCByZWcsIF9fdTggb3ApOworc3RhdGljIGludCBjYXRfZ2V0ZGF0YSh2b3lhZ2VyX21vZHVsZV90ICptb2RwLCB2b3lhZ2VyX2FzaWNfdCAqYXNpY3AsCisJCSAgICAgICBfX3U4IHJlZywgX191OCAqdmFsdWUpOworc3RhdGljIGludCBjYXRfc2hpZnRvdXQoX191OCAqZGF0YSwgX191MTYgZGF0YV9ieXRlcywgX191MTYgaGVhZGVyX2J5dGVzLAorCQkJX191OCBwYWRfYml0cyk7CitzdGF0aWMgaW50IGNhdF93cml0ZSh2b3lhZ2VyX21vZHVsZV90ICptb2RwLCB2b3lhZ2VyX2FzaWNfdCAqYXNpY3AsIF9fdTggcmVnLAorCQkgICAgIF9fdTggdmFsdWUpOworc3RhdGljIGludCBjYXRfcmVhZCh2b3lhZ2VyX21vZHVsZV90ICptb2RwLCB2b3lhZ2VyX2FzaWNfdCAqYXNpY3AsIF9fdTggcmVnLAorCQkgICAgX191OCAqdmFsdWUpOworc3RhdGljIGludCBjYXRfc3VicmVhZCh2b3lhZ2VyX21vZHVsZV90ICptb2RwLCB2b3lhZ2VyX2FzaWNfdCAqYXNpY3AsCisJCSAgICAgICBfX3UxNiBvZmZzZXQsIF9fdTE2IGxlbiwgdm9pZCAqYnVmKTsKK3N0YXRpYyBpbnQgY2F0X3NlbmRkYXRhKHZveWFnZXJfbW9kdWxlX3QgKm1vZHAsIHZveWFnZXJfYXNpY190ICphc2ljcCwKKwkJCV9fdTggcmVnLCBfX3U4IHZhbHVlKTsKK3N0YXRpYyBpbnQgY2F0X2Rpc2Nvbm5lY3Qodm95YWdlcl9tb2R1bGVfdCAqbW9kcCwgdm95YWdlcl9hc2ljX3QgKmFzaWNwKTsKK3N0YXRpYyBpbnQgY2F0X2Nvbm5lY3Qodm95YWdlcl9tb2R1bGVfdCAqbW9kcCwgdm95YWdlcl9hc2ljX3QgKmFzaWNwKTsKKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICoKK2NhdF9tb2R1bGVfbmFtZShpbnQgbW9kdWxlX2lkKQoreworCXN3aXRjaChtb2R1bGVfaWQpIHsKKwljYXNlIDB4MTA6CisJCXJldHVybiAiUHJvY2Vzc29yIFNsb3QgMCI7CisJY2FzZSAweDExOgorCQlyZXR1cm4gIlByb2Nlc3NvciBTbG90IDEiOworCWNhc2UgMHgxMjoKKwkJcmV0dXJuICJQcm9jZXNzb3IgU2xvdCAyIjsKKwljYXNlIDB4MTM6CisJCXJldHVybiAiUHJvY2Vzc29yIFNsb3QgNCI7CisJY2FzZSAweDE0OgorCQlyZXR1cm4gIk1lbW9yeSBTbG90IDAiOworCWNhc2UgMHgxNToKKwkJcmV0dXJuICJNZW1vcnkgU2xvdCAxIjsKKwljYXNlIDB4MTg6CisJCXJldHVybiAiUHJpbWFyeSBNaWNyb2NoYW5uZWwiOworCWNhc2UgMHgxOToKKwkJcmV0dXJuICJTZWNvbmRhcnkgTWljcm9jaGFubmVsIjsKKwljYXNlIDB4MWE6CisJCXJldHVybiAiUG93ZXIgU3VwcGx5IEludGVyZmFjZSI7CisJY2FzZSAweDFjOgorCQlyZXR1cm4gIlByb2Nlc3NvciBTbG90IDUiOworCWNhc2UgMHgxZDoKKwkJcmV0dXJuICJQcm9jZXNzb3IgU2xvdCA2IjsKKwljYXNlIDB4MWU6CisJCXJldHVybiAiUHJvY2Vzc29yIFNsb3QgNyI7CisJY2FzZSAweDFmOgorCQlyZXR1cm4gIlByb2Nlc3NvciBTbG90IDgiOworCWRlZmF1bHQ6CisJCXJldHVybiAiVW5rbm93biBNb2R1bGUiOworCX0KK30KKworc3RhdGljIGludCBzc3BiID0gMDsJCS8qIHN0b3JlcyB0aGUgc3VwZXIgcG9ydCBsb2NhdGlvbiAqLworaW50IHZveWFnZXJfOHNsb3QgPSAwOwkJLyogc2V0IHRvIHRydWUgaWYgYSA1MXh4IG1vbnN0ZXIgKi8KKwordm95YWdlcl9tb2R1bGVfdCAqdm95YWdlcl9jYXRfbGlzdDsKKworLyogdGhlIEkvTyBwb3J0IGFzc2lnbm1lbnRzIGZvciB0aGUgVklDIGFuZCBRSUMgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdmljX3JlcyA9IHsKKwkiVm95YWdlciBJbnRlcnJ1cHQgQ29udHJvbGxlciIsIDB4RkMwMCwgMHhGQzZGIH07CitzdGF0aWMgc3RydWN0IHJlc291cmNlIHFpY19yZXMgPSB7CisJIlF1YWQgSW50ZXJydXB0IENvbnRyb2xsZXIiLCAweEZDNzAsIDB4RkNGRiB9OworCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcGFjayBhIGRhdGEgYml0IHN0cmVhbSBpbnNpZGUgYSBtZXNzYWdlLgorICogSXQgd3JpdGVzIG51bV9iaXRzIG9mIHRoZSBkYXRhIGJ1ZmZlciBpbiBtc2cgc3RhcnRpbmcgYXQgc3RhcnRfYml0LgorICogTm90ZTogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgYW55IHVudXNlZCBiaXQgaW4gdGhlIGRhdGEgc3RyZWFtCisgKiBpcyBzZXQgdG8gemVybyBzbyB0aGF0IHRoZSBvcnMgd2lsbCB3b3JrIGNvcnJlY3RseSAqLworI2RlZmluZSBCSVRTX1BFUl9CWVRFIDgKK3N0YXRpYyB2b2lkCitjYXRfcGFjayhfX3U4ICptc2csIGNvbnN0IF9fdTE2IHN0YXJ0X2JpdCwgX191OCAqZGF0YSwgY29uc3QgX191MTYgbnVtX2JpdHMpCit7CisJLyogY29tcHV0ZSBpbml0aWFsIHNoaWZ0IG5lZWRlZCAqLworCWNvbnN0IF9fdTE2IG9mZnNldCA9IHN0YXJ0X2JpdCAlIEJJVFNfUEVSX0JZVEU7CisJX191MTYgbGVuID0gbnVtX2JpdHMgLyBCSVRTX1BFUl9CWVRFOworCV9fdTE2IGJ5dGUgPSBzdGFydF9iaXQgLyBCSVRTX1BFUl9CWVRFOworCV9fdTE2IHJlc2lkdWUgPSAobnVtX2JpdHMgJSBCSVRTX1BFUl9CWVRFKSArIG9mZnNldDsKKwlpbnQgaTsKKworCS8qIGFkanVzdCBpZiB3ZSBoYXZlIG1vcmUgdGhhbiBhIGJ5dGUgb2YgcmVzaWR1ZSAqLworCWlmKHJlc2lkdWUgPj0gQklUU19QRVJfQllURSkgeworCQlyZXNpZHVlIC09IEJJVFNfUEVSX0JZVEU7CisJCWxlbisrOworCX0KKworCS8qIGNsZWFyIG91dCB0aGUgYml0cy4gIFdlIGFzc3VtZSBoZXJlIHRoYXQgaWYgbGVuPT0wIHRoZW4KKwkgKiByZXNpZHVlID49IG9mZnNldC4gIFRoaXMgaXMgYWx3YXlzIHRydWUgZm9yIHRoZSBjYXRidXMKKwkgKiBvcGVyYXRpb25zICovCisJbXNnW2J5dGVdICY9IDB4ZmYgPDwgKEJJVFNfUEVSX0JZVEUgLSBvZmZzZXQpOyAKKwltc2dbYnl0ZSsrXSB8PSBkYXRhWzBdID4+IG9mZnNldDsKKwlpZihsZW4gPT0gMCkKKwkJcmV0dXJuOworCWZvcihpID0gMTsgaSA8IGxlbjsgaSsrKQorCQltc2dbYnl0ZSsrXSA9IChkYXRhW2ktMV0gPDwgKEJJVFNfUEVSX0JZVEUgLSBvZmZzZXQpKQorCQkJfCAoZGF0YVtpXSA+PiBvZmZzZXQpOworCWlmKHJlc2lkdWUgIT0gMCkgeworCQlfX3U4IG1hc2sgPSAweGZmID4+IHJlc2lkdWU7CisJCV9fdTggbGFzdF9ieXRlID0gZGF0YVtpLTFdIDw8IChCSVRTX1BFUl9CWVRFIC0gb2Zmc2V0KQorCQkJfCAoZGF0YVtpXSA+PiBvZmZzZXQpOworCQkKKwkJbGFzdF9ieXRlICY9IH5tYXNrOworCQltc2dbYnl0ZV0gJj0gbWFzazsKKwkJbXNnW2J5dGVdIHw9IGxhc3RfYnl0ZTsKKwl9CisJcmV0dXJuOworfQorLyogdW5wYWNrIHRoZSBkYXRhIGFnYWluIChzYW1lIGFyZ3VtZW50cyBhcyBjYXRfcGFjaygpKS4gZGF0YSBidWZmZXIKKyAqIG11c3QgYmUgemVybyBwb3B1bGF0ZWQuCisgKgorICogRnVuY3Rpb246IGdpdmVuIGEgbWVzc2FnZSBzdHJpbmcgbW92ZSB0byBzdGFydF9iaXQgYW5kIGNvcHkgbnVtX2JpdHMgaW50bworICogZGF0YSAoc3RhcnRpbmcgYXQgYml0IDAgaW4gZGF0YSkuCisgKi8KK3N0YXRpYyB2b2lkCitjYXRfdW5wYWNrKF9fdTggKm1zZywgY29uc3QgX191MTYgc3RhcnRfYml0LCBfX3U4ICpkYXRhLCBjb25zdCBfX3UxNiBudW1fYml0cykKK3sKKwkvKiBjb21wdXRlIGluaXRpYWwgc2hpZnQgbmVlZGVkICovCisJY29uc3QgX191MTYgb2Zmc2V0ID0gc3RhcnRfYml0ICUgQklUU19QRVJfQllURTsKKwlfX3UxNiBsZW4gPSBudW1fYml0cyAvIEJJVFNfUEVSX0JZVEU7CisJY29uc3QgX191OCBsYXN0X2JpdHMgPSBudW1fYml0cyAlIEJJVFNfUEVSX0JZVEU7CisJX191MTYgYnl0ZSA9IHN0YXJ0X2JpdCAvIEJJVFNfUEVSX0JZVEU7CisJaW50IGk7CisKKwlpZihsYXN0X2JpdHMgIT0gMCkKKwkJbGVuKys7CisKKwkvKiBzcGVjaWFsIGNhc2U6IHdhbnQgPCA4IGJpdHMgZnJvbSBtc2cgYW5kIHdlIGNhbiBnZXQgaXQgZnJvbQorCSAqIGEgc2luZ2xlIGJ5dGUgb2YgdGhlIG1zZyAqLworCWlmKGxlbiA9PSAwICYmIEJJVFNfUEVSX0JZVEUgLSBvZmZzZXQgPj0gbnVtX2JpdHMpIHsKKwkJZGF0YVswXSA9IG1zZ1tieXRlXSA8PCBvZmZzZXQ7CisJCWRhdGFbMF0gJj0gMHhmZiA+PiAoQklUU19QRVJfQllURSAtIG51bV9iaXRzKTsKKwkJcmV0dXJuOworCX0KKwlmb3IoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQkvKiB0aGlzIGFubm95aW5nIGlmIGhhcyB0byBiZSBkb25lIGp1c3QgaW4gY2FzZSBhIHJlYWQgb2YKKwkJICogbXNnIG9uZSBiZXlvbmQgdGhlIGFycmF5IGNhdXNlcyBhIHBhbmljICovCisJCWlmKG9mZnNldCAhPSAwKSB7CisJCQlkYXRhW2ldID0gbXNnW2J5dGUrK10gPDwgb2Zmc2V0OworCQkJZGF0YVtpXSB8PSBtc2dbYnl0ZV0gPj4gKEJJVFNfUEVSX0JZVEUgLSBvZmZzZXQpOworCQl9CisJCWVsc2UgeworCQkJZGF0YVtpXSA9IG1zZ1tieXRlKytdOworCQl9CisJfQorCS8qIGRvIHdlIG5lZWQgdG8gdHJ1bmNhdGUgdGhlIGZpbmFsIGJ5dGUgKi8KKwlpZihsYXN0X2JpdHMgIT0gMCkgeworCQlkYXRhW2ktMV0gJj0gMHhmZiA8PCAoQklUU19QRVJfQllURSAtIGxhc3RfYml0cyk7CisJfQorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2NhdF9idWlsZF9oZWFkZXIoX191OCAqaGVhZGVyLCBjb25zdCBfX3UxNiBsZW4sIGNvbnN0IF9fdTE2IHNtYWxsZXN0X3JlZ19iaXRzLAorCQkgY29uc3QgX191MTYgbG9uZ2VzdF9yZWdfYml0cykKK3sKKwlpbnQgaTsKKwlfX3UxNiBzdGFydF9iaXQgPSAoc21hbGxlc3RfcmVnX2JpdHMgLSAxKSAlIEJJVFNfUEVSX0JZVEU7CisJX191OCAqbGFzdF9ieXRlID0gJmhlYWRlcltsZW4gLSAxXTsKKworCWlmKHN0YXJ0X2JpdCA9PSAwKQorCQlzdGFydF9iaXQgPSAxOwkvKiBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGJpdCBpbiB0aGUgaGRyICovCisJCisJZm9yKGk9MDsgaSA8IGxlbjsgaSsrKQorCQloZWFkZXJbaV0gPSAwOworCisJZm9yKGkgPSBzdGFydF9iaXQ7IGkgPiAwOyBpLS0pCisJCSpsYXN0X2J5dGUgPSAoKCpsYXN0X2J5dGUpIDw8IDEpICsgMTsKKworfQorCitzdGF0aWMgaW50CitjYXRfc2VuZGluc3Qodm95YWdlcl9tb2R1bGVfdCAqbW9kcCwgdm95YWdlcl9hc2ljX3QgKmFzaWNwLCBfX3U4IHJlZywgX191OCBvcCkKK3sKKwlfX3U4IHBhcml0eSwgaW5zdCwgaW5zdF9idWZbNF0gPSB7IDAgfTsKKwlfX3U4IGlzZXFbVk9ZQUdFUl9NQVhfU0NBTl9QQVRIXSwgaHNlcVtWT1lBR0VSX01BWF9SRUdfU0laRV07CisJX191MTYgaWJ5dGVzLCBoYnl0ZXMsIHBhZGJpdHM7CisJaW50IGk7CisJCisJLyogCisJICogUGFyaXR5IGlzIHRoZSBwYXJpdHkgb2YgdGhlIHJlZ2lzdGVyIG51bWJlciArIDEgKFJFQURfUkVHSVNURVIKKwkgKiBhbmQgV1JJVEVfUkVHSVNURVIgYWx3YXlzIGFkZCAnMScgdG8gdGhlIG51bWJlciBvZiBiaXRzID09IDEpCisJICovCisJcGFyaXR5ID0gKF9fdTgpKDEgKyAocmVnICYgMHgwMSkgKworCSAgICAgICAgICgoX191OCkocmVnICYgMHgwMikgPj4gMSkgKworCSAgICAgICAgICgoX191OCkocmVnICYgMHgwNCkgPj4gMikgKworCSAgICAgICAgICgoX191OCkocmVnICYgMHgwOCkgPj4gMykpICUgMjsKKworCWluc3QgPSAoKHBhcml0eSA8PCA3KSB8IChyZWcgPDwgMikgfCBvcCk7CisKKwlvdXRiKFZPWUFHRVJfQ0FUX0lSQ1lDLCBDQVRfQ01EKTsKKwlpZighbW9kcC0+c2Nhbl9wYXRoX2Nvbm5lY3RlZCkgeworCQlpZihhc2ljcC0+YXNpY19pZCAhPSBWT1lBR0VSX0NBVF9JRCkgeworCQkJcHJpbnRrKCIqKldBUk5JTkcqKio6IGNhdF9zZW5kaW5zdCBoYXMgZGlzY29ubmVjdGVkIHNjYW4gcGF0aCBub3QgdG8gQ0FUIGFzaWNcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJb3V0YihWT1lBR0VSX0NBVF9IRUFERVIsIENBVF9EQVRBKTsKKwkJb3V0YihpbnN0LCBDQVRfREFUQSk7CisJCWlmKGluYihDQVRfREFUQSkgIT0gVk9ZQUdFUl9DQVRfSEVBREVSKSB7CisJCQlDREVCVUcoKCJWT1lBR0VSIENBVDogY2F0X3NlbmRpbnN0IGZhaWxlZCB0byBnZXQgQ0FUX0hFQURFUlxuIikpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCWlieXRlcyA9IG1vZHAtPmluc3RfYml0cyAvIEJJVFNfUEVSX0JZVEU7CisJaWYoKHBhZGJpdHMgPSBtb2RwLT5pbnN0X2JpdHMgJSBCSVRTX1BFUl9CWVRFKSAhPSAwKSB7CisJCXBhZGJpdHMgPSBCSVRTX1BFUl9CWVRFIC0gcGFkYml0czsKKwkJaWJ5dGVzKys7CisJfQorCWhieXRlcyA9IG1vZHAtPmxhcmdlc3RfcmVnIC8gQklUU19QRVJfQllURTsKKwlpZihtb2RwLT5sYXJnZXN0X3JlZyAlIEJJVFNfUEVSX0JZVEUpCisJCWhieXRlcysrOworCUNERUJVRygoImNhdF9zZW5kaW5zdDogaWJ5dGVzPSVkLCBoYnl0ZXM9JWRcbiIsIGlieXRlcywgaGJ5dGVzKSk7CisJLyogaW5pdGlhbGlzZSB0aGUgaW5zdHJ1Y3Rpb24gc2VxdWVuY2UgdG8gMHhmZiAqLworCWZvcihpPTA7IGkgPCBpYnl0ZXMgKyBoYnl0ZXM7IGkrKykKKwkJaXNlcVtpXSA9IDB4ZmY7CisJY2F0X2J1aWxkX2hlYWRlcihoc2VxLCBoYnl0ZXMsIG1vZHAtPnNtYWxsZXN0X3JlZywgbW9kcC0+bGFyZ2VzdF9yZWcpOworCWNhdF9wYWNrKGlzZXEsIG1vZHAtPmluc3RfYml0cywgaHNlcSwgaGJ5dGVzICogQklUU19QRVJfQllURSk7CisJaW5zdF9idWZbMF0gPSBpbnN0OworCWluc3RfYnVmWzFdID0gMHhGRiA+PiAobW9kcC0+bGFyZ2VzdF9yZWcgJSBCSVRTX1BFUl9CWVRFKTsKKwljYXRfcGFjayhpc2VxLCBhc2ljcC0+Yml0X2xvY2F0aW9uLCBpbnN0X2J1ZiwgYXNpY3AtPmlyZWdfbGVuZ3RoKTsKKyNpZmRlZiBWT1lBR0VSX0NBVF9ERUJVRworCXByaW50aygiaW5zID0gMHgleCwgaXNlcTogIiwgaW5zdCk7CisJZm9yKGk9MDsgaTwgaWJ5dGVzICsgaGJ5dGVzOyBpKyspCisJCXByaW50aygiMHgleCAiLCBpc2VxW2ldKTsKKwlwcmludGsoIlxuIik7CisjZW5kaWYKKwlpZihjYXRfc2hpZnRvdXQoaXNlcSwgaWJ5dGVzLCBoYnl0ZXMsIHBhZGJpdHMpKSB7CisJCUNERUJVRygoIlZPWUFHRVIgQ0FUOiBjYXRfc2VuZGluc3Q6IGNhdF9zaGlmdG91dCBmYWlsZWRcbiIpKTsKKwkJcmV0dXJuIDE7CisJfQorCUNERUJVRygoIkNBVCBTSElGVE9VVCBET05FXG4iKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2NhdF9nZXRkYXRhKHZveWFnZXJfbW9kdWxlX3QgKm1vZHAsIHZveWFnZXJfYXNpY190ICphc2ljcCwgX191OCByZWcsIAorCSAgICBfX3U4ICp2YWx1ZSkKK3sKKwlpZighbW9kcC0+c2Nhbl9wYXRoX2Nvbm5lY3RlZCkgeworCQlpZihhc2ljcC0+YXNpY19pZCAhPSBWT1lBR0VSX0NBVF9JRCkgeworCQkJQ0RFQlVHKCgiVk9ZQUdFUiBDQVQ6IEVSUk9SOiBjYXRfZ2V0ZGF0YSB0byBDQVQgYXNpYyB3aXRoIHNjYW4gcGF0aCBjb25uZWN0ZWRcbiIpKTsKKwkJCXJldHVybiAxOworCQl9CisJCWlmKHJlZyA+IFZPWUFHRVJfU1VCQUREUkhJKSAKKwkJCW91dGIoVk9ZQUdFUl9DQVRfUlVOLCBDQVRfQ01EKTsKKwkJb3V0YihWT1lBR0VSX0NBVF9EUkNZQywgQ0FUX0NNRCk7CisJCW91dGIoVk9ZQUdFUl9DQVRfSEVBREVSLCBDQVRfREFUQSk7CisJCSp2YWx1ZSA9IGluYihDQVRfREFUQSk7CisJCW91dGIoMHhBQSwgQ0FUX0RBVEEpOworCQlpZihpbmIoQ0FUX0RBVEEpICE9IFZPWUFHRVJfQ0FUX0hFQURFUikgeworCQkJQ0RFQlVHKCgiY2F0X2dldGRhdGE6IGZhaWxlZCB0byBnZXQgVk9ZQUdFUl9DQVRfSEVBREVSXG4iKSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJZWxzZSB7CisJCV9fdTE2IHNiaXRzID0gbW9kcC0+bnVtX2FzaWNzIC0xICsgYXNpY3AtPmlyZWdfbGVuZ3RoOworCQlfX3UxNiBzYnl0ZXMgPSBzYml0cyAvIEJJVFNfUEVSX0JZVEU7CisJCV9fdTE2IHRieXRlczsKKwkJX191OCBzdHJpbmdbVk9ZQUdFUl9NQVhfU0NBTl9QQVRIXSwgdHJhaWxlcltWT1lBR0VSX01BWF9SRUdfU0laRV07CisJCV9fdTggcGFkYml0czsKKwkJaW50IGk7CisJCQorCQlvdXRiKFZPWUFHRVJfQ0FUX0RSQ1lDLCBDQVRfQ01EKTsKKworCQlpZigocGFkYml0cyA9IHNiaXRzICUgQklUU19QRVJfQllURSkgIT0gMCkgeworCQkJcGFkYml0cyA9IEJJVFNfUEVSX0JZVEUgLSBwYWRiaXRzOworCQkJc2J5dGVzKys7CisJCX0KKwkJdGJ5dGVzID0gYXNpY3AtPmlyZWdfbGVuZ3RoIC8gQklUU19QRVJfQllURTsKKwkJaWYoYXNpY3AtPmlyZWdfbGVuZ3RoICUgQklUU19QRVJfQllURSkKKwkJCXRieXRlcysrOworCQlDREVCVUcoKCJjYXRfZ2V0ZGF0YTogdGJ5dGVzID0gJWQsIHNieXRlcyA9ICVkLCBwYWRiaXRzID0gJWRcbiIsCisJCQl0Ynl0ZXMsCXNieXRlcywgcGFkYml0cykpOworCQljYXRfYnVpbGRfaGVhZGVyKHRyYWlsZXIsIHRieXRlcywgMSwgYXNpY3AtPmlyZWdfbGVuZ3RoKTsKKworCQkKKwkJZm9yKGkgPSB0Ynl0ZXMgLSAxOyBpID49IDA7IGktLSkgeworCQkJb3V0Yih0cmFpbGVyW2ldLCBDQVRfREFUQSk7CisJCQlzdHJpbmdbc2J5dGVzICsgaV0gPSBpbmIoQ0FUX0RBVEEpOworCQl9CisKKwkJZm9yKGkgPSBzYnl0ZXMgLSAxOyBpID49IDA7IGktLSkgeworCQkJb3V0YigweGFhLCBDQVRfREFUQSk7CisJCQlzdHJpbmdbaV0gPSBpbmIoQ0FUX0RBVEEpOworCQl9CisJCSp2YWx1ZSA9IDA7CisJCWNhdF91bnBhY2soc3RyaW5nLCBwYWRiaXRzICsgKHRieXRlcyAqIEJJVFNfUEVSX0JZVEUpICsgYXNpY3AtPmFzaWNfbG9jYXRpb24sIHZhbHVlLCBhc2ljcC0+aXJlZ19sZW5ndGgpOworI2lmZGVmIFZPWUFHRVJfQ0FUX0RFQlVHCisJCXByaW50aygidmFsdWU9MHgleCwgc3RyaW5nOiAiLCAqdmFsdWUpOworCQlmb3IoaT0wOyBpPCB0Ynl0ZXMrc2J5dGVzOyBpKyspCisJCQlwcmludGsoIjB4JXggIiwgc3RyaW5nW2ldKTsKKwkJcHJpbnRrKCJcbiIpOworI2VuZGlmCisJCQorCQkvKiBzYW5pdHkgY2hlY2sgdGhlIHJlc3Qgb2YgdGhlIHJldHVybiAqLworCQlmb3IoaT0wOyBpIDwgdGJ5dGVzOyBpKyspIHsKKwkJCV9fdTggaW5wdXQgPSAwOworCisJCQljYXRfdW5wYWNrKHN0cmluZywgcGFkYml0cyArIChpICogQklUU19QRVJfQllURSksICZpbnB1dCwgQklUU19QRVJfQllURSk7CisJCQlpZih0cmFpbGVyW2ldICE9IGlucHV0KSB7CisJCQkJQ0RFQlVHKCgiY2F0X2dldGRhdGE6IGZhaWxlZCB0byBzYW5pdHkgY2hlY2sgcmVzdCBvZiByZXQoJWQpIDB4JXggIT0gMHgleFxuIiwgaSwgaW5wdXQsIHRyYWlsZXJbaV0pKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCQlDREVCVUcoKCJjYXRfZ2V0ZGF0YSBET05FXG4iKSk7CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIGludAorY2F0X3NoaWZ0b3V0KF9fdTggKmRhdGEsIF9fdTE2IGRhdGFfYnl0ZXMsIF9fdTE2IGhlYWRlcl9ieXRlcywgX191OCBwYWRfYml0cykKK3sKKwlpbnQgaTsKKwkKKwlmb3IoaSA9IGRhdGFfYnl0ZXMgKyBoZWFkZXJfYnl0ZXMgLSAxOyBpID49IGhlYWRlcl9ieXRlczsgaS0tKQorCQlvdXRiKGRhdGFbaV0sIENBVF9EQVRBKTsKKworCWZvcihpID0gaGVhZGVyX2J5dGVzIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJX191OCBoZWFkZXIgPSAwOworCQlfX3U4IGlucHV0OworCisJCW91dGIoZGF0YVtpXSwgQ0FUX0RBVEEpOworCQlpbnB1dCA9IGluYihDQVRfREFUQSk7CisJCUNERUJVRygoImNhdF9zaGlmdG91dDogcmV0dXJuZWQgMHgleFxuIiwgaW5wdXQpKTsKKwkJY2F0X3VucGFjayhkYXRhLCAoKGRhdGFfYnl0ZXMgKyBpKSAqIEJJVFNfUEVSX0JZVEUpIC0gcGFkX2JpdHMsCisJCQkgICAmaGVhZGVyLCBCSVRTX1BFUl9CWVRFKTsKKwkJaWYoaW5wdXQgIT0gaGVhZGVyKSB7CisJCQlDREVCVUcoKCJWT1lBR0VSIENBVDogY2F0X3NoaWZ0b3V0IGZhaWxlZCB0byByZXR1cm4gaGVhZGVyIDB4JXggIT0gMHgleFxuIiwgaW5wdXQsIGhlYWRlcikpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2NhdF9zZW5kZGF0YSh2b3lhZ2VyX21vZHVsZV90ICptb2RwLCB2b3lhZ2VyX2FzaWNfdCAqYXNpY3AsIAorCSAgICAgX191OCByZWcsIF9fdTggdmFsdWUpCit7CisJb3V0YihWT1lBR0VSX0NBVF9EUkNZQywgQ0FUX0NNRCk7CisJaWYoIW1vZHAtPnNjYW5fcGF0aF9jb25uZWN0ZWQpIHsKKwkJaWYoYXNpY3AtPmFzaWNfaWQgIT0gVk9ZQUdFUl9DQVRfSUQpIHsKKwkJCUNERUJVRygoIlZPWUFHRVIgQ0FUOiBFUlJPUjogc2NhbiBwYXRoIGRpc2Nvbm5lY3RlZCB3aGVuIGFzaWMgIT0gQ0FUXG4iKSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlvdXRiKFZPWUFHRVJfQ0FUX0hFQURFUiwgQ0FUX0RBVEEpOworCQlvdXRiKHZhbHVlLCBDQVRfREFUQSk7CisJCWlmKGluYihDQVRfREFUQSkgIT0gVk9ZQUdFUl9DQVRfSEVBREVSKSB7CisJCQlDREVCVUcoKCJjYXRfc2VuZGRhdGE6IGZhaWxlZCB0byBnZXQgY29ycmVjdCBoZWFkZXIgcmVzcG9uc2UgdG8gc2VudCBkYXRhXG4iKSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlpZihyZWcgPiBWT1lBR0VSX1NVQkFERFJISSkgeworCQkJb3V0YihWT1lBR0VSX0NBVF9SVU4sIENBVF9DTUQpOworCQkJb3V0YihWT1lBR0VSX0NBVF9FTkQsIENBVF9DTUQpOworCQkJb3V0YihWT1lBR0VSX0NBVF9SVU4sIENBVF9DTUQpOworCQl9CisJCQorCQlyZXR1cm4gMDsKKwl9CisJZWxzZSB7CisJCV9fdTE2IGhieXRlcyA9IGFzaWNwLT5pcmVnX2xlbmd0aCAvIEJJVFNfUEVSX0JZVEU7CisJCV9fdTE2IGRieXRlcyA9IChtb2RwLT5udW1fYXNpY3MgLSAxICsgYXNpY3AtPmlyZWdfbGVuZ3RoKS9CSVRTX1BFUl9CWVRFOworCQlfX3U4IHBhZGJpdHMsIGRzZXFbVk9ZQUdFUl9NQVhfU0NBTl9QQVRIXSwgCisJCQloc2VxW1ZPWUFHRVJfTUFYX1JFR19TSVpFXTsKKwkJaW50IGk7CisKKwkJaWYoKHBhZGJpdHMgPSAobW9kcC0+bnVtX2FzaWNzIC0gMSAKKwkJCSAgICAgICArIGFzaWNwLT5pcmVnX2xlbmd0aCkgJSBCSVRTX1BFUl9CWVRFKSAhPSAwKSB7CisJCQlwYWRiaXRzID0gQklUU19QRVJfQllURSAtIHBhZGJpdHM7CisJCQlkYnl0ZXMrKzsKKwkJfQorCQlpZihhc2ljcC0+aXJlZ19sZW5ndGggJSBCSVRTX1BFUl9CWVRFKQorCQkJaGJ5dGVzKys7CisJCQorCQljYXRfYnVpbGRfaGVhZGVyKGhzZXEsIGhieXRlcywgMSwgYXNpY3AtPmlyZWdfbGVuZ3RoKTsKKwkJCisJCWZvcihpID0gMDsgaSA8IGRieXRlcyArIGhieXRlczsgaSsrKQorCQkJZHNlcVtpXSA9IDB4ZmY7CisJCUNERUJVRygoImNhdF9zZW5kZGF0YTogZGJ5dGVzPSVkLCBoYnl0ZXM9JWQsIHBhZGJpdHM9JWRcbiIsCisJCQlkYnl0ZXMsIGhieXRlcywgcGFkYml0cykpOworCQljYXRfcGFjayhkc2VxLCBtb2RwLT5udW1fYXNpY3MgLSAxICsgYXNpY3AtPmlyZWdfbGVuZ3RoLAorCQkJIGhzZXEsIGhieXRlcyAqIEJJVFNfUEVSX0JZVEUpOworCQljYXRfcGFjayhkc2VxLCBhc2ljcC0+YXNpY19sb2NhdGlvbiwgJnZhbHVlLCAKKwkJCSBhc2ljcC0+aXJlZ19sZW5ndGgpOworI2lmZGVmIFZPWUFHRVJfQ0FUX0RFQlVHCisJCXByaW50aygiZHNlcSAiKTsKKwkJZm9yKGk9MDsgaTxoYnl0ZXMrZGJ5dGVzOyBpKyspIHsKKwkJCXByaW50aygiMHgleCAiLCBkc2VxW2ldKTsKKwkJfQorCQlwcmludGsoIlxuIik7CisjZW5kaWYKKwkJcmV0dXJuIGNhdF9zaGlmdG91dChkc2VxLCBkYnl0ZXMsIGhieXRlcywgcGFkYml0cyk7CisJfQorfQorCitzdGF0aWMgaW50CitjYXRfd3JpdGUodm95YWdlcl9tb2R1bGVfdCAqbW9kcCwgdm95YWdlcl9hc2ljX3QgKmFzaWNwLCBfX3U4IHJlZywKKwkgX191OCB2YWx1ZSkKK3sKKwlpZihjYXRfc2VuZGluc3QobW9kcCwgYXNpY3AsIHJlZywgVk9ZQUdFUl9XUklURV9DT05GSUcpKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gY2F0X3NlbmRkYXRhKG1vZHAsIGFzaWNwLCByZWcsIHZhbHVlKTsKK30KKworc3RhdGljIGludAorY2F0X3JlYWQodm95YWdlcl9tb2R1bGVfdCAqbW9kcCwgdm95YWdlcl9hc2ljX3QgKmFzaWNwLCBfX3U4IHJlZywKKwkgX191OCAqdmFsdWUpCit7CisJaWYoY2F0X3NlbmRpbnN0KG1vZHAsIGFzaWNwLCByZWcsIFZPWUFHRVJfUkVBRF9DT05GSUcpKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gY2F0X2dldGRhdGEobW9kcCwgYXNpY3AsIHJlZywgdmFsdWUpOworfQorCitzdGF0aWMgaW50CitjYXRfc3ViYWRkcnNldHVwKHZveWFnZXJfbW9kdWxlX3QgKm1vZHAsIHZveWFnZXJfYXNpY190ICphc2ljcCwgX191MTYgb2Zmc2V0LAorCQkgX191MTYgbGVuKQoreworCV9fdTggdmFsOworCisJaWYobGVuID4gMSkgeworCQkvKiBzZXQgYXV0byBpbmNyZW1lbnQgKi8KKwkJX191OCBuZXd2YWw7CisJCQorCQlpZihjYXRfcmVhZChtb2RwLCBhc2ljcCwgVk9ZQUdFUl9BVVRPX0lOQ19SRUcsICZ2YWwpKSB7CisJCQlDREVCVUcoKCJjYXRfc3ViYWRkcnNldHVwOiByZWFkIG9mIFZPWUFHRVJfQVVUT19JTkNfUkVHIGZhaWxlZFxuIikpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJQ0RFQlVHKCgiY2F0X3N1YmFkZHJzZXR1cDogVk9ZQUdFUl9BVVRPX0lOQ19SRUcgPSAweCV4XG4iLCB2YWwpKTsKKwkJbmV3dmFsID0gdmFsIHwgVk9ZQUdFUl9BVVRPX0lOQzsKKwkJaWYobmV3dmFsICE9IHZhbCkgeworCQkJaWYoY2F0X3dyaXRlKG1vZHAsIGFzaWNwLCBWT1lBR0VSX0FVVE9fSU5DX1JFRywgdmFsKSkgeworCQkJCUNERUJVRygoImNhdF9zdWJhZGRyc2V0dXA6IHdyaXRlIHRvIFZPWUFHRVJfQVVUT19JTkNfUkVHIGZhaWxlZFxuIikpOworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJfQorCWlmKGNhdF93cml0ZShtb2RwLCBhc2ljcCwgVk9ZQUdFUl9TVUJBRERSTE8sIChfX3U4KShvZmZzZXQgJjB4ZmYpKSkgeworCQlDREVCVUcoKCJjYXRfc3ViYWRkcnNldHVwOiB3cml0ZSB0byBTVUJBRERSTE8gZmFpbGVkXG4iKSk7CisJCXJldHVybiAxOworCX0KKwlpZihhc2ljcC0+c3ViYWRkciA+IFZPWUFHRVJfU1VCQUREUl9MTykgeworCQlpZihjYXRfd3JpdGUobW9kcCwgYXNpY3AsIFZPWUFHRVJfU1VCQUREUkhJLCAoX191OCkob2Zmc2V0ID4+IDgpKSkgeworCQkJQ0RFQlVHKCgiY2F0X3N1YmFkZHJzZXR1cDogd3JpdGUgdG8gU1VCQUREUkhJIGZhaWxlZFxuIikpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJY2F0X3JlYWQobW9kcCwgYXNpY3AsIFZPWUFHRVJfU1VCQUREUkhJLCAmdmFsKTsKKwkJQ0RFQlVHKCgiY2F0X3N1YmFkZHJzZXR1cDogb2Zmc2V0ID0gJWQsIGhpID0gJWRcbiIsIG9mZnNldCwgdmFsKSk7CisJfQorCWNhdF9yZWFkKG1vZHAsIGFzaWNwLCBWT1lBR0VSX1NVQkFERFJMTywgJnZhbCk7CisJQ0RFQlVHKCgiY2F0X3N1YmFkZHJzZXR1cDogb2Zmc2V0ID0gJWQsIGxvID0gJWRcbiIsIG9mZnNldCwgdmFsKSk7CisJcmV0dXJuIDA7Cit9CisJCQorc3RhdGljIGludAorY2F0X3N1YndyaXRlKHZveWFnZXJfbW9kdWxlX3QgKm1vZHAsIHZveWFnZXJfYXNpY190ICphc2ljcCwgX191MTYgb2Zmc2V0LAorCSAgICBfX3UxNiBsZW4sIHZvaWQgKmJ1ZikKK3sKKwlpbnQgaSwgcmV0dmFsOworCisJLyogRklYTUU6IG5lZWQgc3BlY2lhbCBhY3Rpb25zIGZvciBWT1lBR0VSX0NBVF9JRCBoZXJlICovCisJaWYoYXNpY3AtPmFzaWNfaWQgPT0gVk9ZQUdFUl9DQVRfSUQpIHsKKwkJQ0RFQlVHKCgiY2F0X3N1YndyaXRlOiBBVFRFTVBUIFRPIFdSSVRFIFRPIENBVCBBU0lDXG4iKSk7CisJCS8qIEZJWE1FIC0tIFRoaXMgaXMgc3VwcG9zZWQgdG8gYmUgaGFuZGxlZCBiZXR0ZXIKKwkJICogVGhlcmUgaXMgYSBwcm9ibGVtIHdyaXRpbmcgdG8gdGhlIGNhdCBhc2ljIGluIHRoZQorCQkgKiBQU0kuICBUaGUgMzB1cyBkZWxheSBzZWVtcyB0byB3b3JrLCB0aG91Z2ggKi8KKwkJdWRlbGF5KDMwKTsKKwl9CisJCQorCWlmKChyZXR2YWwgPSBjYXRfc3ViYWRkcnNldHVwKG1vZHAsIGFzaWNwLCBvZmZzZXQsIGxlbikpICE9IDApIHsKKwkJcHJpbnRrKCJjYXRfc3Vid3JpdGU6IGNhdF9zdWJhZGRyc2V0dXAgRkFJTEVEXG4iKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJCisJaWYoY2F0X3NlbmRpbnN0KG1vZHAsIGFzaWNwLCBWT1lBR0VSX1NVQkFERFJEQVRBLCBWT1lBR0VSX1dSSVRFX0NPTkZJRykpIHsKKwkJcHJpbnRrKCJjYXRfc3Vid3JpdGU6IGNhdF9zZW5kaW5zdCBGQUlMRURcbiIpOworCQlyZXR1cm4gMTsKKwl9CisJZm9yKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJaWYoY2F0X3NlbmRkYXRhKG1vZHAsIGFzaWNwLCAweEZGLCAoKF9fdTggKilidWYpW2ldKSkgeworCQkJcHJpbnRrKCJjYXRfc3Vid3JpdGU6IGNhdF9zZW5kYXRhIGVsZW1lbnQgYXQgJWQgRkFJTEVEXG4iLCBpKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfQorc3RhdGljIGludAorY2F0X3N1YnJlYWQodm95YWdlcl9tb2R1bGVfdCAqbW9kcCwgdm95YWdlcl9hc2ljX3QgKmFzaWNwLCBfX3UxNiBvZmZzZXQsCisJICAgIF9fdTE2IGxlbiwgdm9pZCAqYnVmKQoreworCWludCBpLCByZXR2YWw7CisKKwlpZigocmV0dmFsID0gY2F0X3N1YmFkZHJzZXR1cChtb2RwLCBhc2ljcCwgb2Zmc2V0LCBsZW4pKSAhPSAwKSB7CisJCUNERUJVRygoImNhdF9zdWJyZWFkOiBjYXRfc3ViYWRkcnNldHVwIEZBSUxFRFxuIikpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCWlmKGNhdF9zZW5kaW5zdChtb2RwLCBhc2ljcCwgVk9ZQUdFUl9TVUJBRERSREFUQSwgVk9ZQUdFUl9SRUFEX0NPTkZJRykpIHsKKwkJQ0RFQlVHKCgiY2F0X3N1YnJlYWQ6IGNhdF9zZW5kaW5zdCBmYWlsZWRcbiIpKTsKKwkJcmV0dXJuIDE7CisJfQorCWZvcihpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWlmKGNhdF9nZXRkYXRhKG1vZHAsIGFzaWNwLCAweEZGLAorCQkJICAgICAgICYoKF9fdTggKilidWYpW2ldKSkgeworCQkJQ0RFQlVHKCgiY2F0X3N1YnJlYWQ6IGNhdF9nZXRkYXRhIGVsZW1lbnQgJWQgZmFpbGVkXG4iLCBpKSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworCisvKiBidWZmZXIgZm9yIHN0b3JpbmcgRVBST00gZGF0YSByZWFkIGluIGR1cmluZyBpbml0aWFsaXNhdGlvbiAqLworc3RhdGljIF9faW5pdGRhdGEgX191OCBlcHJvbV9idWZbMHhGRkZGXTsKK3N0YXRpYyB2b3lhZ2VyX21vZHVsZV90ICp2b3lhZ2VyX2luaXRpYWxfbW9kdWxlOworCisvKiBJbml0aWFsaXNlIHRoZSBjYXQgYnVzIGNvbXBvbmVudHMuICBXZSBhc3N1bWUgdGhpcyBpcyBjYWxsZWQgYnkgdGhlCisgKiBib290IGNwdSAqYWZ0ZXIqIGFsbCBtZW1vcnkgaW5pdGlhbGlzYXRpb24gaGFzIGJlZW4gZG9uZSAoc28gd2UgY2FuCisgKiB1c2Uga21hbGxvYykgYnV0IGJlZm9yZSBzbXAgaW5pdGlhbGlzYXRpb24sIHNvIHdlIGNhbiBwcm9iZSB0aGUgU01QCisgKiBjb25maWd1cmF0aW9uIGFuZCBwaWNrIHVwIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbi4gICovCit2b2lkCit2b3lhZ2VyX2NhdF9pbml0KHZvaWQpCit7CisJdm95YWdlcl9tb2R1bGVfdCAqKm1vZHBwID0gJnZveWFnZXJfaW5pdGlhbF9tb2R1bGU7CisJdm95YWdlcl9hc2ljX3QgKiphc2ljcHA7CisJdm95YWdlcl9hc2ljX3QgKnFhYmNfYXNpYyA9IE5VTEw7CisJaW50IGksIGo7CisJdW5zaWduZWQgbG9uZyBxaWNfYWRkciA9IDA7CisJX191OCBxYWJjX2RhdGFbMHgyMF07CisJX191OCBudW1fc3VibW9kdWxlcywgdmFsOworCXZveWFnZXJfZXByb21faGRyX3QgKmVwcm9tX2hkciA9ICh2b3lhZ2VyX2Vwcm9tX2hkcl90ICopJmVwcm9tX2J1ZlswXTsKKwkKKwlfX3U4IGNtb3NbNF07CisJdW5zaWduZWQgbG9uZyBhZGRyOworCQorCS8qIGluaXRpYWxsaXNlIHRoZSBTVVMgbWFpbGJveCAqLworCWZvcihpPTA7IGk8c2l6ZW9mKGNtb3MpOyBpKyspCisJCWNtb3NbaV0gPSB2b3lhZ2VyX2V4dGVuZGVkX2Ntb3NfcmVhZChWT1lBR0VSX0RVTVBfTE9DQVRJT04gKyBpKTsKKwlhZGRyID0gKih1bnNpZ25lZCBsb25nICopY21vczsKKwlpZigoYWRkciAmIDB4ZmYwMDAwMDApICE9IDB4ZmYwMDAwMDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJWb3lhZ2VyIGZhaWxlZCB0byBnZXQgU1VTIG1haWxib3ggKGFkZHIgPSAweCVseFxuIiwgYWRkcik7CisJfSBlbHNlIHsKKwkJc3RhdGljIHN0cnVjdCByZXNvdXJjZSByZXM7CisJCQorCQlyZXMubmFtZSA9ICJ2b3lhZ2VyIFNVUyI7CisJCXJlcy5zdGFydCA9IGFkZHI7CisJCXJlcy5lbmQgPSBhZGRyKzB4M2ZmOworCQkKKwkJcmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZyZXMpOworCQl2b3lhZ2VyX1NVUyA9IChzdHJ1Y3Qgdm95YWdlcl9TVVMgKikKKwkJCWlvcmVtYXAoYWRkciwgMHg0MDApOworCQlwcmludGsoS0VSTl9OT1RJQ0UgIlZveWFnZXIgU1VTIG1haWxib3ggdmVyc2lvbiAweCV4XG4iLAorCQkgICAgICAgdm95YWdlcl9TVVMtPlNVU192ZXJzaW9uKTsKKwkJdm95YWdlcl9TVVMtPmtlcm5lbF92ZXJzaW9uID0gVk9ZQUdFUl9NQUlMQk9YX1ZFUlNJT047CisJCXZveWFnZXJfU1VTLT5rZXJuZWxfZmxhZ3MgPSBWT1lBR0VSX09TX0hBU19TWVNJTlQ7CisJfQorCisJLyogY2xlYXIgdGhlIHByb2Nlc3NvciBjb3VudHMgKi8KKwl2b3lhZ2VyX2V4dGVuZGVkX3ZpY19wcm9jZXNzb3JzID0gMDsKKwl2b3lhZ2VyX3F1YWRfcHJvY2Vzc29ycyA9IDA7CisKKworCisJcHJpbnRrKCJWT1lBR0VSOiBiZWdpbm5pbmcgQ0FUIGJ1cyBwcm9iZVxuIik7CisJLyogc2V0IHVwIHRoZSBTdXBlclNldCBQb3J0IEJsb2NrIHdoaWNoIHRlbGxzIHVzIHdoZXJlIHRoZQorCSAqIENBVCBjb21tdW5pY2F0aW9uIHBvcnQgaXMgKi8KKwlzc3BiID0gaW5iKFZPWUFHRVJfU1NQQl9SRUxPQ0FUSU9OX1BPUlQpICogMHgxMDA7CisJVkRFQlVHKCgiVk9ZQUdFUiBERUJVRzogc3NwYiA9IDB4JXhcbiIsIHNzcGIpKTsKKworCS8qIG5vdyBmaW5kIG91dCBpZiB3ZXJlIDggc2xvdCBvciBub3JtYWwgKi8KKwlpZigoaW5iKFZJQ19QUk9DX1dIT19BTV9JKSAmIEVJR0hUX1NMT1RfSURFTlRJRklFUikKKwkgICA9PSBFSUdIVF9TTE9UX0lERU5USUZJRVIpIHsKKwkJdm95YWdlcl84c2xvdCA9IDE7CisJCXByaW50ayhLRVJOX05PVElDRSAiVm95YWdlcjogRWlnaHQgc2xvdCA1MXh4IGNvbmZpZ3VyYXRpb24gZGV0ZWN0ZWRcbiIpOworCX0KKworCWZvcihpID0gVk9ZQUdFUl9NSU5fTU9EVUxFOworCSAgICBpIDw9IFZPWUFHRVJfTUFYX01PRFVMRTsgaSsrKSB7CisJCV9fdTggaW5wdXQ7CisJCWludCBhc2ljOworCQlfX3UxNiBlcHJvbV9zaXplOworCQlfX3UxNiBzcF9vZmZzZXQ7CisKKwkJb3V0YihWT1lBR0VSX0NBVF9ERVNFTEVDVCwgVk9ZQUdFUl9DQVRfQ09ORklHX1BPUlQpOworCQlvdXRiKGksIFZPWUFHRVJfQ0FUX0NPTkZJR19QT1JUKTsKKworCQkvKiBjaGVjayB0aGUgcHJlc2VuY2Ugb2YgdGhlIG1vZHVsZSAqLworCQlvdXRiKFZPWUFHRVJfQ0FUX1JVTiwgQ0FUX0NNRCk7CisJCW91dGIoVk9ZQUdFUl9DQVRfSVJDWUMsIENBVF9DTUQpOworCQlvdXRiKFZPWUFHRVJfQ0FUX0hFQURFUiwgQ0FUX0RBVEEpOworCQkvKiBzdHJlYW0gc2VyaWVzIG9mIGFsdGVybmF0aW5nIDEncyBhbmQgMCdzIHRvIHN0aW11bGF0ZQorCQkgKiByZXNwb25zZSAqLworCQlvdXRiKDB4QUEsIENBVF9EQVRBKTsKKwkJaW5wdXQgPSBpbmIoQ0FUX0RBVEEpOworCQlvdXRiKFZPWUFHRVJfQ0FUX0VORCwgQ0FUX0NNRCk7CisJCWlmKGlucHV0ICE9IFZPWUFHRVJfQ0FUX0hFQURFUikgeworCQkJY29udGludWU7CisJCX0KKwkJQ0RFQlVHKCgiVk9ZQUdFUiBERUJVRzogZm91bmQgbW9kdWxlIGlkIDB4JXgsICVzXG4iLCBpLAorCQkJY2F0X21vZHVsZV9uYW1lKGkpKSk7CisJCSptb2RwcCA9IGttYWxsb2Moc2l6ZW9mKHZveWFnZXJfbW9kdWxlX3QpLCBHRlBfS0VSTkVMKTsgLyomdm95YWdlcl9tb2R1bGVfc3RvcmFnZVtjYXRfY291bnQrK107Ki8KKwkJaWYoKm1vZHBwID09IE5VTEwpIHsKKwkJCXByaW50aygiKipXQVJOSU5HKioga21hbGxvYyBmYWlsdXJlIGluIGNhdF9pbml0XG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCW1lbXNldCgqbW9kcHAsIDAsIHNpemVvZih2b3lhZ2VyX21vZHVsZV90KSk7CisJCS8qIG5lZWQgdGVtcG9yYXJ5IGFzaWMgZm9yIGNhdF9zdWJyZWFkLiAgSXQgd2lsbCBiZQorCQkgKiBmaWxsZWQgaW4gY29ycmVjdGx5IGxhdGVyICovCisJCSgqbW9kcHApLT5hc2ljID0ga21hbGxvYyhzaXplb2Yodm95YWdlcl9hc2ljX3QpLCBHRlBfS0VSTkVMKTsgLyomdm95YWdlcl9hc2ljX3N0b3JhZ2VbYXNpY19jb3VudF07Ki8KKwkJaWYoKCptb2RwcCktPmFzaWMgPT0gTlVMTCkgeworCQkJcHJpbnRrKCIqKldBUk5JTkcqKiBrbWFsbG9jIGZhaWx1cmUgaW4gY2F0X2luaXRcbiIpOworCQkJY29udGludWU7CisJCX0KKwkJbWVtc2V0KCgqbW9kcHApLT5hc2ljLCAwLCBzaXplb2Yodm95YWdlcl9hc2ljX3QpKTsKKwkJKCptb2RwcCktPmFzaWMtPmFzaWNfaWQgPSBWT1lBR0VSX0NBVF9JRDsKKwkJKCptb2RwcCktPmFzaWMtPnN1YmFkZHIgPSBWT1lBR0VSX1NVQkFERFJfSEk7CisJCSgqbW9kcHApLT5tb2R1bGVfYWRkciA9IGk7CisJCSgqbW9kcHApLT5zY2FuX3BhdGhfY29ubmVjdGVkID0gMDsKKwkJaWYoaSA9PSBWT1lBR0VSX1BTSSkgeworCQkJLyogRXhjZXB0aW9uIGxlZyBmb3IgbW9kdWxlcyB3aXRoIG5vIEVFUFJPTSAqLworCQkJcHJpbnRrKCJNb2R1bGUgXCIlc1wiXG4iLCBjYXRfbW9kdWxlX25hbWUoaSkpOworCQkJY29udGludWU7CisJCX0KKwkJCSAgICAgICAKKwkJQ0RFQlVHKCgiY2F0X2luaXQ6IFJlYWRpbmcgZWVwcm9tIGZvciBtb2R1bGUgMHgleCBhdCBvZmZzZXQgJWRcbiIsIGksIFZPWUFHRVJfWFNVTV9FTkRfT0ZGU0VUKSk7CisJCW91dGIoVk9ZQUdFUl9DQVRfUlVOLCBDQVRfQ01EKTsKKwkJY2F0X2Rpc2Nvbm5lY3QoKm1vZHBwLCAoKm1vZHBwKS0+YXNpYyk7CisJCWlmKGNhdF9zdWJyZWFkKCptb2RwcCwgKCptb2RwcCktPmFzaWMsCisJCQkgICAgICAgVk9ZQUdFUl9YU1VNX0VORF9PRkZTRVQsIHNpemVvZihlcHJvbV9zaXplKSwKKwkJCSAgICAgICAmZXByb21fc2l6ZSkpIHsKKwkJCXByaW50aygiKipXQVJOSU5HKio6IFZveWFnZXIgY291bGRuJ3QgcmVhZCBFUFJPTSBzaXplIGZvciBtb2R1bGUgMHgleFxuIiwgaSk7CisJCQlvdXRiKFZPWUFHRVJfQ0FUX0VORCwgQ0FUX0NNRCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZihlcHJvbV9zaXplID4gc2l6ZW9mKGVwcm9tX2J1ZikpIHsKKwkJCXByaW50aygiKipXQVJOSU5HKio6IFZveWFnZXIgaW5zdWZmaWNpZW50IHNpemUgdG8gcmVhZCBFUFJPTSBkYXRhLCBtb2R1bGUgMHgleC4gIE5lZWQgJWRcbiIsIGksIGVwcm9tX3NpemUpOworCQkJb3V0YihWT1lBR0VSX0NBVF9FTkQsIENBVF9DTUQpOworCQkJY29udGludWU7CisJCX0KKwkJb3V0YihWT1lBR0VSX0NBVF9FTkQsIENBVF9DTUQpOworCQlvdXRiKFZPWUFHRVJfQ0FUX1JVTiwgQ0FUX0NNRCk7CisJCUNERUJVRygoImNhdF9pbml0OiBtb2R1bGUgMHgleCwgZWVwcm9tX3NpemUgJWRcbiIsIGksIGVwcm9tX3NpemUpKTsKKwkJaWYoY2F0X3N1YnJlYWQoKm1vZHBwLCAoKm1vZHBwKS0+YXNpYywgMCwgCisJCQkgICAgICAgZXByb21fc2l6ZSwgZXByb21fYnVmKSkgeworCQkJb3V0YihWT1lBR0VSX0NBVF9FTkQsIENBVF9DTUQpOworCQkJY29udGludWU7CisJCX0KKwkJb3V0YihWT1lBR0VSX0NBVF9FTkQsIENBVF9DTUQpOworCQlwcmludGsoIk1vZHVsZSBcIiVzXCIsIHZlcnNpb24gMHgleCwgdHJhY2VyIDB4JXgsIGFzaWNzICVkXG4iLAorCQkgICAgICAgY2F0X21vZHVsZV9uYW1lKGkpLCBlcHJvbV9oZHItPnZlcnNpb25faWQsCisJCSAgICAgICAqKChfX3UzMiAqKWVwcm9tX2hkci0+dHJhY2VyKSwgIGVwcm9tX2hkci0+bnVtX2FzaWNzKTsKKwkJKCptb2RwcCktPmVlX3NpemUgPSBlcHJvbV9oZHItPmVlX3NpemU7CisJCSgqbW9kcHApLT5udW1fYXNpY3MgPSBlcHJvbV9oZHItPm51bV9hc2ljczsKKwkJYXNpY3BwID0gJigoKm1vZHBwKS0+YXNpYyk7CisJCXNwX29mZnNldCA9IGVwcm9tX2hkci0+c2Nhbl9wYXRoX29mZnNldDsKKwkJLyogQWxsIHdlIHJlYWxseSBjYXJlIGFib3V0IGFyZSB0aGUgUXVhZCBjYXJkcy4gIFdlCisgICAgICAgICAgICAgICAgICogaWRlbnRpZnkgdGhlbSBiZWNhdXNlIHRoZXkgYXJlIGluIGEgcHJvY2Vzc29yIHNsb3QKKyAgICAgICAgICAgICAgICAgKiBhbmQgaGF2ZSBvbmx5IGZvdXIgYXNpY3MgKi8KKwkJaWYoKGkgPCAweDEwIHx8IChpPj0weDE0ICYmIGkgPCAweDFjKSB8fCBpPjB4MWYpKSB7CisJCQltb2RwcCA9ICYoKCptb2RwcCktPm5leHQpOworCQkJY29udGludWU7CisJCX0KKwkJLyogTm93IHdlIGtub3cgaXQncyBpbiBhIHByb2Nlc3NvciBzbG90LCBkb2VzIGl0IGhhdmUKKwkJICogYSBxdWFkIGJhc2Vib2FyZCBzdWJtb2R1bGUgKi8KKwkJb3V0YihWT1lBR0VSX0NBVF9SVU4sIENBVF9DTUQpOworCQljYXRfcmVhZCgqbW9kcHAsICgqbW9kcHApLT5hc2ljLCBWT1lBR0VSX1NVQk1PRFBSRVNFTlQsCisJCQkgJm51bV9zdWJtb2R1bGVzKTsKKwkJLyogbG93ZXN0IHR3byBiaXRzLCBhY3RpdmUgbG93ICovCisJCW51bV9zdWJtb2R1bGVzID0gfigweGZjIHwgbnVtX3N1Ym1vZHVsZXMpOworCQlDREVCVUcoKCJWT1lBR0VSIENBVDogJWQgc3VibW9kdWxlcyBwcmVzZW50XG4iLCBudW1fc3VibW9kdWxlcykpOworCQlpZihudW1fc3VibW9kdWxlcyA9PSAwKSB7CisJCQkvKiBmaWxsIGluIHRoZSBkeWFkaWMgZXh0ZW5kZWQgcHJvY2Vzc29ycyAqLworCQkJX191OCBjcHUgPSBpICYgMHgwNzsKKworCQkJcHJpbnRrKCJNb2R1bGUgXCIlc1wiOiBEeWFkaWMgUHJvY2Vzc29yIENhcmRcbiIsCisJCQkgICAgICAgY2F0X21vZHVsZV9uYW1lKGkpKTsKKwkJCXZveWFnZXJfZXh0ZW5kZWRfdmljX3Byb2Nlc3NvcnMgfD0gKDE8PGNwdSk7CisJCQljcHUgKz0gNDsKKwkJCXZveWFnZXJfZXh0ZW5kZWRfdmljX3Byb2Nlc3NvcnMgfD0gKDE8PGNwdSk7CisJCQlvdXRiKFZPWUFHRVJfQ0FUX0VORCwgQ0FUX0NNRCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIG5vdyB3ZSB3YW50IHRvIHJlYWQgdGhlIGFzaWNzIG9uIHRoZSBmaXJzdCBzdWJtb2R1bGUsCisJCSAqIHdoaWNoIHNob3VsZCBiZSB0aGUgcXVhZCBiYXNlIGJvYXJkICovCisKKwkJY2F0X3JlYWQoKm1vZHBwLCAoKm1vZHBwKS0+YXNpYywgVk9ZQUdFUl9TVUJNT0RTRUxFQ1QsICZ2YWwpOworCQlDREVCVUcoKCJjYXRfaW5pdDogU1VCTU9EU0VMRUNUIHZhbHVlID0gMHgleFxuIiwgdmFsKSk7CisJCXZhbCA9ICh2YWwgJiAweDdjKSB8IFZPWUFHRVJfUVVBRF9CQVNFQk9BUkQ7CisJCWNhdF93cml0ZSgqbW9kcHAsICgqbW9kcHApLT5hc2ljLCBWT1lBR0VSX1NVQk1PRFNFTEVDVCwgdmFsKTsKKworCQlvdXRiKFZPWUFHRVJfQ0FUX0VORCwgQ0FUX0NNRCk7CisJCQkgCisKKwkJQ0RFQlVHKCgiY2F0X2luaXQ6IFJlYWRpbmcgZWVwcm9tIGZvciBtb2R1bGUgMHgleCBhdCBvZmZzZXQgJWRcbiIsIGksIFZPWUFHRVJfWFNVTV9FTkRfT0ZGU0VUKSk7CisJCW91dGIoVk9ZQUdFUl9DQVRfUlVOLCBDQVRfQ01EKTsKKwkJY2F0X2Rpc2Nvbm5lY3QoKm1vZHBwLCAoKm1vZHBwKS0+YXNpYyk7CisJCWlmKGNhdF9zdWJyZWFkKCptb2RwcCwgKCptb2RwcCktPmFzaWMsCisJCQkgICAgICAgVk9ZQUdFUl9YU1VNX0VORF9PRkZTRVQsIHNpemVvZihlcHJvbV9zaXplKSwKKwkJCSAgICAgICAmZXByb21fc2l6ZSkpIHsKKwkJCXByaW50aygiKipXQVJOSU5HKio6IFZveWFnZXIgY291bGRuJ3QgcmVhZCBFUFJPTSBzaXplIGZvciBtb2R1bGUgMHgleFxuIiwgaSk7CisJCQlvdXRiKFZPWUFHRVJfQ0FUX0VORCwgQ0FUX0NNRCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZihlcHJvbV9zaXplID4gc2l6ZW9mKGVwcm9tX2J1ZikpIHsKKwkJCXByaW50aygiKipXQVJOSU5HKio6IFZveWFnZXIgaW5zdWZmaWNpZW50IHNpemUgdG8gcmVhZCBFUFJPTSBkYXRhLCBtb2R1bGUgMHgleC4gIE5lZWQgJWRcbiIsIGksIGVwcm9tX3NpemUpOworCQkJb3V0YihWT1lBR0VSX0NBVF9FTkQsIENBVF9DTUQpOworCQkJY29udGludWU7CisJCX0KKwkJb3V0YihWT1lBR0VSX0NBVF9FTkQsIENBVF9DTUQpOworCQlvdXRiKFZPWUFHRVJfQ0FUX1JVTiwgQ0FUX0NNRCk7CisJCUNERUJVRygoImNhdF9pbml0OiBtb2R1bGUgMHgleCwgZWVwcm9tX3NpemUgJWRcbiIsIGksIGVwcm9tX3NpemUpKTsKKwkJaWYoY2F0X3N1YnJlYWQoKm1vZHBwLCAoKm1vZHBwKS0+YXNpYywgMCwgCisJCQkgICAgICAgZXByb21fc2l6ZSwgZXByb21fYnVmKSkgeworCQkJb3V0YihWT1lBR0VSX0NBVF9FTkQsIENBVF9DTUQpOworCQkJY29udGludWU7CisJCX0KKwkJb3V0YihWT1lBR0VSX0NBVF9FTkQsIENBVF9DTUQpOworCQkvKiBOb3cgZG8gZXZlcnl0aGluZyBmb3IgdGhlIFFCQiBzdWJtb2R1bGUgMSAqLworCQkoKm1vZHBwKS0+ZWVfc2l6ZSA9IGVwcm9tX2hkci0+ZWVfc2l6ZTsKKwkJKCptb2RwcCktPm51bV9hc2ljcyA9IGVwcm9tX2hkci0+bnVtX2FzaWNzOworCQlhc2ljcHAgPSAmKCgqbW9kcHApLT5hc2ljKTsKKwkJc3Bfb2Zmc2V0ID0gZXByb21faGRyLT5zY2FuX3BhdGhfb2Zmc2V0OworCQkvKiBnZXQgcmlkIG9mIHRoZSBkdW1teSBDQVQgYXNpYyBhbmQgcmVhZCB0aGUgcmVhbCBvbmUgKi8KKwkJa2ZyZWUoKCptb2RwcCktPmFzaWMpOworCQlmb3IoYXNpYz0wOyBhc2ljIDwgKCptb2RwcCktPm51bV9hc2ljczsgYXNpYysrKSB7CisJCQlpbnQgajsKKwkJCXZveWFnZXJfYXNpY190ICphc2ljcCA9ICphc2ljcHAgCisJCQkJPSBrbWFsbG9jKHNpemVvZih2b3lhZ2VyX2FzaWNfdCksIEdGUF9LRVJORUwpOyAvKiZ2b3lhZ2VyX2FzaWNfc3RvcmFnZVthc2ljX2NvdW50KytdOyovCisJCQl2b3lhZ2VyX3NwX3RhYmxlX3QgKnNwX3RhYmxlOworCQkJdm95YWdlcl9hdF90ICphc2ljX3RhYmxlOworCQkJdm95YWdlcl9qdHRfdCAqanRhZ190YWJsZTsKKworCQkJaWYoYXNpY3AgPT0gTlVMTCkgeworCQkJCXByaW50aygiKipXQVJOSU5HKioga21hbGxvYyBmYWlsdXJlIGluIGNhdF9pbml0XG4iKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCW1lbXNldChhc2ljcCwgMCwgc2l6ZW9mKHZveWFnZXJfYXNpY190KSk7CisJCQlhc2ljcHAgPSAmKGFzaWNwLT5uZXh0KTsKKwkJCWFzaWNwLT5hc2ljX2xvY2F0aW9uID0gYXNpYzsKKwkJCXNwX3RhYmxlID0gKHZveWFnZXJfc3BfdGFibGVfdCAqKShlcHJvbV9idWYgKyBzcF9vZmZzZXQpOworCQkJYXNpY3AtPmFzaWNfaWQgPSBzcF90YWJsZS0+YXNpY19pZDsKKwkJCWFzaWNfdGFibGUgPSAodm95YWdlcl9hdF90ICopKGVwcm9tX2J1ZiArIHNwX3RhYmxlLT5hc2ljX2RhdGFfb2Zmc2V0KTsKKwkJCWZvcihqPTA7IGo8NDsgaisrKQorCQkJCWFzaWNwLT5qdGFnX2lkW2pdID0gYXNpY190YWJsZS0+anRhZ19pZFtqXTsKKwkJCWp0YWdfdGFibGUgPSAodm95YWdlcl9qdHRfdCAqKShlcHJvbV9idWYgKyBhc2ljX3RhYmxlLT5qdGFnX29mZnNldCk7CisJCQlhc2ljcC0+aXJlZ19sZW5ndGggPSBqdGFnX3RhYmxlLT5pcmVnX2xlbjsKKwkJCWFzaWNwLT5iaXRfbG9jYXRpb24gPSAoKm1vZHBwKS0+aW5zdF9iaXRzOworCQkJKCptb2RwcCktPmluc3RfYml0cyArPSBhc2ljcC0+aXJlZ19sZW5ndGg7CisJCQlpZihhc2ljcC0+aXJlZ19sZW5ndGggPiAoKm1vZHBwKS0+bGFyZ2VzdF9yZWcpCisJCQkJKCptb2RwcCktPmxhcmdlc3RfcmVnID0gYXNpY3AtPmlyZWdfbGVuZ3RoOworCQkJaWYgKGFzaWNwLT5pcmVnX2xlbmd0aCA8ICgqbW9kcHApLT5zbWFsbGVzdF9yZWcgfHwKKwkJCSAgICAoKm1vZHBwKS0+c21hbGxlc3RfcmVnID09IDApCisJCQkJKCptb2RwcCktPnNtYWxsZXN0X3JlZyA9IGFzaWNwLT5pcmVnX2xlbmd0aDsKKwkJCUNERUJVRygoImFzaWMgMHgleCwgaXJlZ19sZW5ndGg9JWQsIGJpdF9sb2NhdGlvbj0lZFxuIiwKKwkJCQlhc2ljcC0+YXNpY19pZCwgYXNpY3AtPmlyZWdfbGVuZ3RoLAorCQkJCWFzaWNwLT5iaXRfbG9jYXRpb24pKTsKKwkJCWlmKGFzaWNwLT5hc2ljX2lkID09IFZPWUFHRVJfUVVBRF9RQUJDKSB7CisJCQkJQ0RFQlVHKCgiVk9ZQUdFUiBDQVQ6IFFBQkMgQVNJQyBmb3VuZFxuIikpOworCQkJCXFhYmNfYXNpYyA9IGFzaWNwOworCQkJfQorCQkJc3Bfb2Zmc2V0ICs9IHNpemVvZih2b3lhZ2VyX3NwX3RhYmxlX3QpOworCQl9CisJCUNERUJVRygoIk1vZHVsZSBpbnN0X2JpdHMgPSAlZCwgbGFyZ2VzdF9yZWcgPSAlZCwgc21hbGxlc3RfcmVnPSVkXG4iLAorCQkJKCptb2RwcCktPmluc3RfYml0cywgKCptb2RwcCktPmxhcmdlc3RfcmVnLAorCQkJKCptb2RwcCktPnNtYWxsZXN0X3JlZykpOworCQkvKiBPSywgbm93IHdlIGhhdmUgdGhlIFFVQUQgQVNJQ3Mgc2V0IHVwLCB1c2UgdGhlbS4KKwkJICogd2UgbmVlZCB0bzoKKwkJICoKKwkJICogMS4gRmluZCB0aGUgTWVtb3J5IGFyZWEgZm9yIHRoZSBRdWFkIENQSXMuCisJCSAqIDIuIEZpbmQgdGhlIEV4dGVuZGVkIFZJQyBwcm9jZXNzb3IKKwkJICogMy4gQ29uZmlndXJlIGEgc2Vjb25kIGV4dGVuZGVkIFZJQyBwcm9jZXNzb3IgKFRoaXMKKwkJICogICAgY2Fubm90IGJlIGRvbmUgZm9yIHRoZSA1MXh4LgorCQkgKiAqLworCQlvdXRiKFZPWUFHRVJfQ0FUX1JVTiwgQ0FUX0NNRCk7CisJCWNhdF9jb25uZWN0KCptb2RwcCwgKCptb2RwcCktPmFzaWMpOworCQlDREVCVUcoKCJDQVQgQ09OTkVDVEVEISFcbiIpKTsKKwkJY2F0X3N1YnJlYWQoKm1vZHBwLCBxYWJjX2FzaWMsIDAsIHNpemVvZihxYWJjX2RhdGEpLCBxYWJjX2RhdGEpOworCQlxaWNfYWRkciA9IHFhYmNfZGF0YVs1XSA8PCA4OworCQlxaWNfYWRkciA9IChxaWNfYWRkciB8IHFhYmNfZGF0YVs2XSkgPDwgODsKKwkJcWljX2FkZHIgPSAocWljX2FkZHIgfCBxYWJjX2RhdGFbN10pIDw8IDg7CisJCXByaW50aygiTW9kdWxlIFwiJXNcIjogUXVhZCBQcm9jZXNzb3IgQ2FyZDsgQ1BJIDB4JWx4LCBTRVQ9MHgleFxuIiwKKwkJICAgICAgIGNhdF9tb2R1bGVfbmFtZShpKSwgcWljX2FkZHIsIHFhYmNfZGF0YVs4XSk7CisjaWYgMAkJCQkvKiBwbHVtYmluZyBmYWlscy0tLUZJWE1FICovCisJCWlmKChxYWJjX2RhdGFbOF0gJiAweGYwKSA9PSAwKSB7CisJCQkvKiBGSVhNRTogMzIgd2F5IDggQ1BVIHNsb3QgbW9uc3RlciBjYW5ub3QgYmUKKwkJCSAqIHBsdW1iZWQgdGhpcyB3YXktLS1uZWVkIHRvIGNoZWNrIGZvciBpdCAqLworCisJCQlwcmludGsoIlBsdW1iaW5nIHNlY29uZCBFeHRlbmRlZCBRdWFkIFByb2Nlc3NvclxuIik7CisJCQkvKiBzZWNvbmQgVklDIGxpbmUgaGFyZHdpcmVkIHRvIFF1YWQgQ1BVIDEgKi8KKwkJCXFhYmNfZGF0YVs4XSB8PSAweDIwOworCQkJY2F0X3N1YndyaXRlKCptb2RwcCwgcWFiY19hc2ljLCA4LCAxLCAmcWFiY19kYXRhWzhdKTsKKyNpZmRlZiBWT1lBR0VSX0NBVF9ERUJVRworCQkJLyogdmVyaWZ5IHBsdW1iaW5nICovCisJCQljYXRfc3VicmVhZCgqbW9kcHAsIHFhYmNfYXNpYywgOCwgMSwgJnFhYmNfZGF0YVs4XSk7CisJCQlpZigocWFiY19kYXRhWzhdICYgMHhmMCkgPT0gMCkgeworCQkJCUNERUJVRygoIlBMVU1CSU5HIEZBSUxFRDogMHgleFxuIiwgcWFiY19kYXRhWzhdKSk7CisJCQl9CisjZW5kaWYKKwkJfQorI2VuZGlmCisKKwkJeworCQkJc3RydWN0IHJlc291cmNlICpyZXMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpLEdGUF9LRVJORUwpOworCQkJbWVtc2V0KHJlcywgMCwgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOworCQkJcmVzLT5uYW1lID0ga21hbGxvYygxMjgsIEdGUF9LRVJORUwpOworCQkJc3ByaW50ZigoY2hhciAqKXJlcy0+bmFtZSwgIlZveWFnZXIgJXMgUXVhZCBDUEkiLCBjYXRfbW9kdWxlX25hbWUoaSkpOworCQkJcmVzLT5zdGFydCA9IHFpY19hZGRyOworCQkJcmVzLT5lbmQgPSBxaWNfYWRkciArIDB4M2ZmOworCQkJcmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsIHJlcyk7CisJCX0KKworCQlxaWNfYWRkciA9ICh1bnNpZ25lZCBsb25nKWlvcmVtYXAocWljX2FkZHIsIDB4NDAwKTsKKwkJCQkKKwkJZm9yKGogPSAwOyBqIDwgNDsgaisrKSB7CisJCQlfX3U4IGNwdTsKKworCQkJaWYodm95YWdlcl84c2xvdCkgeworCQkJCS8qIDggc2xvdCBoYXMgYSBkaWZmZXJlbnQgbWFwcGluZywKKwkJCQkgKiBlYWNoIHNsb3QgaGFzIG9ubHkgb25lIHZpYyBsaW5lLCBzbworCQkJCSAqIDEgY3B1IGluIGVhY2ggc2xvdCBtdXN0IGJlIDwgOCAqLworCQkJCWNwdSA9IChpICYgMHgwNykgKyBqKjg7CisJCQl9IGVsc2UgeworCQkJCWNwdSA9IChpICYgMHgwMykgKyBqKjQ7CisJCQl9CisJCQlpZiggKHFhYmNfZGF0YVs4XSAmICgxPDxqKSkpIHsKKwkJCQl2b3lhZ2VyX2V4dGVuZGVkX3ZpY19wcm9jZXNzb3JzIHw9ICgxPDxjcHUpOworCQkJfQorCQkJaWYocWFiY19kYXRhWzhdICYgKDE8PChqKzQpKSApIHsKKwkJCQkvKiBTZWNvbmQgU0VUIHJlZ2lzdGVyIHBsdW1iZWQ6IFF1YWQKKwkJCQkgKiBjYXJkIGhhcyB0d28gVklDIGNvbm5lY3RlZCBDUFVzLgorCQkJCSAqIFNlY29uZGFyeSBjYW5ub3QgYmUgYm9vdGVkIGFzIGEgVklDCisJCQkJICogQ1BVICovCisJCQkJdm95YWdlcl9leHRlbmRlZF92aWNfcHJvY2Vzc29ycyB8PSAoMTw8Y3B1KTsKKwkJCQl2b3lhZ2VyX2FsbG93ZWRfYm9vdF9wcm9jZXNzb3JzICY9ICh+KDE8PGNwdSkpOworCQkJfQorCisJCQl2b3lhZ2VyX3F1YWRfcHJvY2Vzc29ycyB8PSAoMTw8Y3B1KTsKKwkJCXZveWFnZXJfcXVhZF9jcGlfYWRkcltjcHVdID0gKHN0cnVjdCB2b3lhZ2VyX3FpY19jcGkgKikKKwkJCQkocWljX2FkZHIrKGo8PDgpKTsKKwkJCUNERUJVRygoIkNQVSVkOiBDUEkgYWRkcmVzcyAweCVseFxuIiwgY3B1LAorCQkJCSh1bnNpZ25lZCBsb25nKXZveWFnZXJfcXVhZF9jcGlfYWRkcltjcHVdKSk7CisJCX0KKwkJb3V0YihWT1lBR0VSX0NBVF9FTkQsIENBVF9DTUQpOworCisJCQorCQkKKwkJKmFzaWNwcCA9IE5VTEw7CisJCW1vZHBwID0gJigoKm1vZHBwKS0+bmV4dCk7CisJfQorCSptb2RwcCA9IE5VTEw7CisJcHJpbnRrKCJDQVQgQnVzIEluaXRpYWxpc2F0aW9uIGZpbmlzaGVkOiBleHRlbmRlZCBwcm9jcyAweCV4LCBxdWFkIHByb2NzIDB4JXgsIGFsbG93ZWQgdmljIGJvb3QgPSAweCV4XG4iLCB2b3lhZ2VyX2V4dGVuZGVkX3ZpY19wcm9jZXNzb3JzLCB2b3lhZ2VyX3F1YWRfcHJvY2Vzc29ycywgdm95YWdlcl9hbGxvd2VkX2Jvb3RfcHJvY2Vzc29ycyk7CisJcmVxdWVzdF9yZXNvdXJjZSgmaW9wb3J0X3Jlc291cmNlLCAmdmljX3Jlcyk7CisJaWYodm95YWdlcl9xdWFkX3Byb2Nlc3NvcnMpCisJCXJlcXVlc3RfcmVzb3VyY2UoJmlvcG9ydF9yZXNvdXJjZSwgJnFpY19yZXMpOworCS8qIHNldCB1cCB0aGUgZnJvbnQgcG93ZXIgc3dpdGNoICovCit9CisKK2ludAordm95YWdlcl9jYXRfcmVhZGIoX191OCBtb2R1bGUsIF9fdTggYXNpYywgaW50IHJlZykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorY2F0X2Rpc2Nvbm5lY3Qodm95YWdlcl9tb2R1bGVfdCAqbW9kcCwgdm95YWdlcl9hc2ljX3QgKmFzaWNwKSAKK3sKKwlfX3U4IHZhbDsKKwlpbnQgZXJyID0gMDsKKworCWlmKCFtb2RwLT5zY2FuX3BhdGhfY29ubmVjdGVkKQorCQlyZXR1cm4gMDsKKwlpZihhc2ljcC0+YXNpY19pZCAhPSBWT1lBR0VSX0NBVF9JRCkgeworCQlDREVCVUcoKCJjYXRfZGlzY29ubmVjdDogQVNJQyBpcyBub3QgQ0FUXG4iKSk7CisJCXJldHVybiAxOworCX0KKwllcnIgPSBjYXRfcmVhZChtb2RwLCBhc2ljcCwgVk9ZQUdFUl9TQ0FOUEFUSCwgJnZhbCk7CisJaWYoZXJyKSB7CisJCUNERUJVRygoImNhdF9kaXNjb25uZWN0OiBmYWlsZWQgdG8gcmVhZCBTQ0FOUEFUSFxuIikpOworCQlyZXR1cm4gZXJyOworCX0KKwl2YWwgJj0gVk9ZQUdFUl9ESVNDT05ORUNUX0FTSUM7CisJZXJyID0gY2F0X3dyaXRlKG1vZHAsIGFzaWNwLCBWT1lBR0VSX1NDQU5QQVRILCB2YWwpOworCWlmKGVycikgeworCQlDREVCVUcoKCJjYXRfZGlzY29ubmVjdDogZmFpbGVkIHRvIHdyaXRlIFNDQU5QQVRIXG4iKSk7CisJCXJldHVybiBlcnI7CisJfQorCW91dGIoVk9ZQUdFUl9DQVRfRU5ELCBDQVRfQ01EKTsKKwlvdXRiKFZPWUFHRVJfQ0FUX1JVTiwgQ0FUX0NNRCk7CisJbW9kcC0+c2Nhbl9wYXRoX2Nvbm5lY3RlZCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorY2F0X2Nvbm5lY3Qodm95YWdlcl9tb2R1bGVfdCAqbW9kcCwgdm95YWdlcl9hc2ljX3QgKmFzaWNwKSAKK3sKKwlfX3U4IHZhbDsKKwlpbnQgZXJyID0gMDsKKworCWlmKG1vZHAtPnNjYW5fcGF0aF9jb25uZWN0ZWQpCisJCXJldHVybiAwOworCWlmKGFzaWNwLT5hc2ljX2lkICE9IFZPWUFHRVJfQ0FUX0lEKSB7CisJCUNERUJVRygoImNhdF9jb25uZWN0OiBBU0lDIGlzIG5vdCBDQVRcbiIpKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZXJyID0gY2F0X3JlYWQobW9kcCwgYXNpY3AsIFZPWUFHRVJfU0NBTlBBVEgsICZ2YWwpOworCWlmKGVycikgeworCQlDREVCVUcoKCJjYXRfY29ubmVjdDogZmFpbGVkIHRvIHJlYWQgU0NBTlBBVEhcbiIpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJdmFsIHw9IFZPWUFHRVJfQ09OTkVDVF9BU0lDOworCWVyciA9IGNhdF93cml0ZShtb2RwLCBhc2ljcCwgVk9ZQUdFUl9TQ0FOUEFUSCwgdmFsKTsKKwlpZihlcnIpIHsKKwkJQ0RFQlVHKCgiY2F0X2Nvbm5lY3Q6IGZhaWxlZCB0byB3cml0ZSBTQ0FOUEFUSFxuIikpOworCQlyZXR1cm4gZXJyOworCX0KKwlvdXRiKFZPWUFHRVJfQ0FUX0VORCwgQ0FUX0NNRCk7CisJb3V0YihWT1lBR0VSX0NBVF9SVU4sIENBVF9DTUQpOworCW1vZHAtPnNjYW5fcGF0aF9jb25uZWN0ZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK3ZveWFnZXJfY2F0X3Bvd2VyX29mZih2b2lkKQoreworCS8qIFBvd2VyIHRoZSBtYWNoaW5lIG9mZiBieSB3cml0aW5nIHRvIHRoZSBQU0kgb3ZlciB0aGUgQ0FUCisgICAgICAgICAqIGJ1cyAqLworCV9fdTggZGF0YTsKKwl2b3lhZ2VyX21vZHVsZV90IHBzaSA9IHsgMCB9OworCXZveWFnZXJfYXNpY190IHBzaV9hc2ljID0geyAwIH07CisKKwlwc2kuYXNpYyA9ICZwc2lfYXNpYzsKKwlwc2kuYXNpYy0+YXNpY19pZCA9IFZPWUFHRVJfQ0FUX0lEOworCXBzaS5hc2ljLT5zdWJhZGRyID0gVk9ZQUdFUl9TVUJBRERSX0hJOworCXBzaS5tb2R1bGVfYWRkciA9IFZPWUFHRVJfUFNJOworCXBzaS5zY2FuX3BhdGhfY29ubmVjdGVkID0gMDsKKworCW91dGIoVk9ZQUdFUl9DQVRfRU5ELCBDQVRfQ01EKTsKKwkvKiBDb25uZWN0IHRoZSBQU0kgdG8gdGhlIENBVCBCdXMgKi8KKwlvdXRiKFZPWUFHRVJfQ0FUX0RFU0VMRUNULCBWT1lBR0VSX0NBVF9DT05GSUdfUE9SVCk7CisJb3V0YihWT1lBR0VSX1BTSSwgVk9ZQUdFUl9DQVRfQ09ORklHX1BPUlQpOworCW91dGIoVk9ZQUdFUl9DQVRfUlVOLCBDQVRfQ01EKTsKKwljYXRfZGlzY29ubmVjdCgmcHNpLCAmcHNpX2FzaWMpOworCS8qIFJlYWQgdGhlIHN0YXR1cyAqLworCWNhdF9zdWJyZWFkKCZwc2ksICZwc2lfYXNpYywgVk9ZQUdFUl9QU0lfR0VORVJBTF9SRUcsIDEsICZkYXRhKTsKKwlvdXRiKFZPWUFHRVJfQ0FUX0VORCwgQ0FUX0NNRCk7CisJQ0RFQlVHKCgiUFNJIFNUQVRVUyAweCV4XG4iLCBkYXRhKSk7CisJLyogVGhlc2UgdHdvIHdyaXRlcyBhcmUgcG93ZXIgb2ZmIHByZXAgYW5kIHBlcmZvcm0gKi8KKwlkYXRhID0gUFNJX0NMRUFSOworCW91dGIoVk9ZQUdFUl9DQVRfUlVOLCBDQVRfQ01EKTsKKwljYXRfc3Vid3JpdGUoJnBzaSwgJnBzaV9hc2ljLCBWT1lBR0VSX1BTSV9HRU5FUkFMX1JFRywgMSwgJmRhdGEpOworCW91dGIoVk9ZQUdFUl9DQVRfRU5ELCBDQVRfQ01EKTsKKwlkYXRhID0gUFNJX1BPV0VSX0RPV047CisJb3V0YihWT1lBR0VSX0NBVF9SVU4sIENBVF9DTUQpOworCWNhdF9zdWJ3cml0ZSgmcHNpLCAmcHNpX2FzaWMsIFZPWUFHRVJfUFNJX0dFTkVSQUxfUkVHLCAxLCAmZGF0YSk7CisJb3V0YihWT1lBR0VSX0NBVF9FTkQsIENBVF9DTUQpOworfQorCitzdHJ1Y3Qgdm95YWdlcl9zdGF0dXMgdm95YWdlcl9zdGF0dXMgPSB7IDAgfTsKKwordm9pZAordm95YWdlcl9jYXRfcHNpKF9fdTggY21kLCBfX3UxNiByZWcsIF9fdTggKmRhdGEpCit7CisJdm95YWdlcl9tb2R1bGVfdCBwc2kgPSB7IDAgfTsKKwl2b3lhZ2VyX2FzaWNfdCBwc2lfYXNpYyA9IHsgMCB9OworCisJcHNpLmFzaWMgPSAmcHNpX2FzaWM7CisJcHNpLmFzaWMtPmFzaWNfaWQgPSBWT1lBR0VSX0NBVF9JRDsKKwlwc2kuYXNpYy0+c3ViYWRkciA9IFZPWUFHRVJfU1VCQUREUl9ISTsKKwlwc2kubW9kdWxlX2FkZHIgPSBWT1lBR0VSX1BTSTsKKwlwc2kuc2Nhbl9wYXRoX2Nvbm5lY3RlZCA9IDA7CisKKwlvdXRiKFZPWUFHRVJfQ0FUX0VORCwgQ0FUX0NNRCk7CisJLyogQ29ubmVjdCB0aGUgUFNJIHRvIHRoZSBDQVQgQnVzICovCisJb3V0YihWT1lBR0VSX0NBVF9ERVNFTEVDVCwgVk9ZQUdFUl9DQVRfQ09ORklHX1BPUlQpOworCW91dGIoVk9ZQUdFUl9QU0ksIFZPWUFHRVJfQ0FUX0NPTkZJR19QT1JUKTsKKwlvdXRiKFZPWUFHRVJfQ0FUX1JVTiwgQ0FUX0NNRCk7CisJY2F0X2Rpc2Nvbm5lY3QoJnBzaSwgJnBzaV9hc2ljKTsKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBWT1lBR0VSX1BTSV9SRUFEOgorCQljYXRfcmVhZCgmcHNpLCAmcHNpX2FzaWMsIHJlZywgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgVk9ZQUdFUl9QU0lfV1JJVEU6CisJCWNhdF93cml0ZSgmcHNpLCAmcHNpX2FzaWMsIHJlZywgKmRhdGEpOworCQlicmVhazsKKwljYXNlIFZPWUFHRVJfUFNJX1NVQlJFQUQ6CisJCWNhdF9zdWJyZWFkKCZwc2ksICZwc2lfYXNpYywgcmVnLCAxLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBWT1lBR0VSX1BTSV9TVUJXUklURToKKwkJY2F0X3N1YndyaXRlKCZwc2ksICZwc2lfYXNpYywgcmVnLCAxLCBkYXRhKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJWb3lhZ2VyIFBTSSwgdW5yZWNvZ25pc2VkIGNvbW1hbmQgJWRcbiIsIGNtZCk7CisJCWJyZWFrOworCX0KKwlvdXRiKFZPWUFHRVJfQ0FUX0VORCwgQ0FUX0NNRCk7Cit9CisKK3ZvaWQKK3ZveWFnZXJfY2F0X2RvX2NvbW1vbl9pbnRlcnJ1cHQodm9pZCkKK3sKKwkvKiBUaGlzIGlzIGNhdXNlZCBlaXRoZXIgYnkgYSBtZW1vcnkgcGFyaXR5IGVycm9yIG9yIHNvbWV0aGluZworCSAqIGluIHRoZSBQU0kgKi8KKwlfX3U4IGRhdGE7CisJdm95YWdlcl9tb2R1bGVfdCBwc2kgPSB7IDAgfTsKKwl2b3lhZ2VyX2FzaWNfdCBwc2lfYXNpYyA9IHsgMCB9OworCXN0cnVjdCB2b3lhZ2VyX3BzaSBwc2lfcmVnOworCWludCBpOworIHJlX3JlYWQ6CisJcHNpLmFzaWMgPSAmcHNpX2FzaWM7CisJcHNpLmFzaWMtPmFzaWNfaWQgPSBWT1lBR0VSX0NBVF9JRDsKKwlwc2kuYXNpYy0+c3ViYWRkciA9IFZPWUFHRVJfU1VCQUREUl9ISTsKKwlwc2kubW9kdWxlX2FkZHIgPSBWT1lBR0VSX1BTSTsKKwlwc2kuc2Nhbl9wYXRoX2Nvbm5lY3RlZCA9IDA7CisKKwlvdXRiKFZPWUFHRVJfQ0FUX0VORCwgQ0FUX0NNRCk7CisJLyogQ29ubmVjdCB0aGUgUFNJIHRvIHRoZSBDQVQgQnVzICovCisJb3V0YihWT1lBR0VSX0NBVF9ERVNFTEVDVCwgVk9ZQUdFUl9DQVRfQ09ORklHX1BPUlQpOworCW91dGIoVk9ZQUdFUl9QU0ksIFZPWUFHRVJfQ0FUX0NPTkZJR19QT1JUKTsKKwlvdXRiKFZPWUFHRVJfQ0FUX1JVTiwgQ0FUX0NNRCk7CisJY2F0X2Rpc2Nvbm5lY3QoJnBzaSwgJnBzaV9hc2ljKTsKKwkvKiBSZWFkIHRoZSBzdGF0dXMuICBOT1RFOiBOZWVkIHRvIHJlYWQgKmFsbCogdGhlIFBTSSByZWdzIGhlcmUKKwkgKiBvdGhlcndpc2UgdGhlIGNtbiBpbnQgd2lsbCBiZSByZWFzc2VydGVkICovCisJZm9yKGkgPSAwOyBpIDwgc2l6ZW9mKHBzaV9yZWcucmVncyk7IGkrKykgeworCQljYXRfcmVhZCgmcHNpLCAmcHNpX2FzaWMsIGksICYoKF9fdTggKikmcHNpX3JlZy5yZWdzKVtpXSk7CisJfQorCW91dGIoVk9ZQUdFUl9DQVRfRU5ELCBDQVRfQ01EKTsKKwlpZigocHNpX3JlZy5yZWdzLmNoZWNrYml0ICYgMHgwMikgPT0gMCkgeworCQlwc2lfcmVnLnJlZ3MuY2hlY2tiaXQgfD0gMHgwMjsKKwkJY2F0X3dyaXRlKCZwc2ksICZwc2lfYXNpYywgNSwgcHNpX3JlZy5yZWdzLmNoZWNrYml0KTsKKwkJcHJpbnRrKCJWT1lBR0VSIFJFLVJFQUQgUFNJXG4iKTsKKwkJZ290byByZV9yZWFkOworCX0KKwlvdXRiKFZPWUFHRVJfQ0FUX1JVTiwgQ0FUX0NNRCk7CisJZm9yKGkgPSAwOyBpIDwgc2l6ZW9mKHBzaV9yZWcuc3VicmVncyk7IGkrKykgeworCQkvKiBUaGlzIGxvb2tzIHN0cmFuZ2UsIGJ1dCB0aGUgUFNJIGRvZXNuJ3QgZG8gYXV0byBpbmNyZW1lbnQKKwkJICogY29ycmVjdGx5ICovCisJCWNhdF9zdWJyZWFkKCZwc2ksICZwc2lfYXNpYywgVk9ZQUdFUl9QU0lfU1VQUExZX1JFRyArIGksIAorCQkJICAgIDEsICYoKF9fdTggKikmcHNpX3JlZy5zdWJyZWdzKVtpXSk7IAorCX0KKwlvdXRiKFZPWUFHRVJfQ0FUX0VORCwgQ0FUX0NNRCk7CisjaWZkZWYgVk9ZQUdFUl9DQVRfREVCVUcKKwlwcmludGsoIlZPWUFHRVIgUFNJOiAiKTsKKwlmb3IoaT0wOyBpPHNpemVvZihwc2lfcmVnLnJlZ3MpOyBpKyspCisJCXByaW50aygiJTAyeCAiLCAoKF9fdTggKikmcHNpX3JlZy5yZWdzKVtpXSk7CisJcHJpbnRrKCJcbiAgICAgICAgICAgIik7CisJZm9yKGk9MDsgaTxzaXplb2YocHNpX3JlZy5zdWJyZWdzKTsgaSsrKQorCQlwcmludGsoIiUwMnggIiwgKChfX3U4ICopJnBzaV9yZWcuc3VicmVncylbaV0pOworCXByaW50aygiXG4iKTsKKyNlbmRpZgorCWlmKHBzaV9yZWcucmVncy5pbnRzdGF0dXMgJiBQU0lfTU9OKSB7CisJCS8qIHN3aXRjaCBvZmYgb3IgcG93ZXIgZmFpbCAqLworCisJCWlmKHBzaV9yZWcuc3VicmVncy5zdXBwbHkgJiBQU0lfU1dJVENIX09GRikgeworCQkJaWYodm95YWdlcl9zdGF0dXMuc3dpdGNoX29mZikgeworCQkJCXByaW50ayhLRVJOX0VSUiAiVm95YWdlciBmcm9udCBwYW5lbCBzd2l0Y2ggdHVybmVkIG9mZiBhZ2Fpbi0tLUltbWVkaWF0ZSBwb3dlciBvZmYhXG4iKTsKKwkJCQl2b3lhZ2VyX2NhdF9wb3dlcl9vZmYoKTsKKwkJCQkvKiBub3QgcmVhY2hlZCAqLworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIlZveWFnZXIgZnJvbnQgcGFuZWwgc3dpdGNoIHR1cm5lZCBvZmZcbiIpOworCQkJCXZveWFnZXJfc3RhdHVzLnN3aXRjaF9vZmYgPSAxOworCQkJCXZveWFnZXJfc3RhdHVzLnJlcXVlc3RfZnJvbV9rZXJuZWwgPSAxOworCQkJCXVwKCZrdm95YWdlcmRfc2VtKTsKKwkJCX0KKwkJCS8qIFRlbGwgdGhlIGhhcmR3YXJlIHdlJ3JlIHRha2luZyBjYXJlIG9mIHRoZQorCQkJICogc2h1dGRvd24sIG90aGVyd2lzZSBpdCB3aWxsIHBvd2VyIHRoZSBib3ggb2ZmCisJCQkgKiB3aXRoaW4gMyBzZWNvbmRzIG9mIHRoZSBzd2l0Y2ggYmVpbmcgcHJlc3NlZCBhbmQsCisJCQkgKiB3aGljaCBpcyBtdWNoIG1vcmUgaW1wb3J0YW50IHRvIHVzLCBjb250aW51ZSB0byAKKwkJCSAqIGFzc2VydCB0aGUgY29tbW9uIGludGVycnVwdCAqLworCQkJZGF0YSA9IFBTSV9DTFJfU1dJVENIX09GRjsKKwkJCW91dGIoVk9ZQUdFUl9DQVRfUlVOLCBDQVRfQ01EKTsKKwkJCWNhdF9zdWJ3cml0ZSgmcHNpLCAmcHNpX2FzaWMsIFZPWUFHRVJfUFNJX1NVUFBMWV9SRUcsCisJCQkJICAgICAxLCAmZGF0YSk7CisJCQlvdXRiKFZPWUFHRVJfQ0FUX0VORCwgQ0FUX0NNRCk7CisJCX0gZWxzZSB7CisKKwkJCVZERUJVRygoIlZveWFnZXIgYWMgZmFpbCByZWcgMHgleFxuIiwKKwkJCQlwc2lfcmVnLnN1YnJlZ3MuQUNmYWlsKSk7CisJCQlpZigocHNpX3JlZy5zdWJyZWdzLkFDZmFpbCAmIEFDX0ZBSUxfU1RBVF9DSEFOR0UpID09IDApIHsKKwkJCQkvKiBObyBmdXJ0aGVyIHVwZGF0ZSAqLworCQkJCXJldHVybjsKKwkJCX0KKyNpZiAwCisJCQkvKiBEb24ndCBib3RoZXIgdHJ5aW5nIHRvIGZpbmQgb3V0IHdobyBmYWlsZWQuCisJCQkgKiBGSVhNRTogVGhpcyBwcm9iYWJseSBtYWtlcyB0aGUgY29kZSBpbmNvcnJlY3Qgb24KKwkJCSAqIGFueXRoaW5nIG90aGVyIHRoYW4gYSAzNDV4ICovCisJCQlmb3IoaT0wOyBpPCA1OyBpKyspIHsKKwkJCQlpZiggcHNpX3JlZy5zdWJyZWdzLkFDZmFpbCAmKDE8PGkpKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCXByaW50ayhLRVJOX05PVElDRSAiQUMgRkFJTCBJTiBTVVBQTFkgJWRcbiIsIGkpOworI2VuZGlmCisJCQkvKiBET04nVCBkbyB0aGlzOiBpdCBzaHV0cyBkb3duIHRoZSBBQyBQU0kgCisJCQlvdXRiKFZPWUFHRVJfQ0FUX1JVTiwgQ0FUX0NNRCk7CisJCQlkYXRhID0gUFNJX01BU0tfTUFTSyB8IGk7CisJCQljYXRfc3Vid3JpdGUoJnBzaSwgJnBzaV9hc2ljLCBWT1lBR0VSX1BTSV9NQVNLLAorCQkJCSAgICAgMSwgJmRhdGEpOworCQkJb3V0YihWT1lBR0VSX0NBVF9FTkQsIENBVF9DTUQpOworCQkJKi8KKwkJCXByaW50ayhLRVJOX0VSUiAiVm95YWdlciBBQyBwb3dlciBmYWlsdXJlXG4iKTsKKwkJCW91dGIoVk9ZQUdFUl9DQVRfUlVOLCBDQVRfQ01EKTsKKwkJCWRhdGEgPSBQU0lfQ09MRF9TVEFSVDsKKwkJCWNhdF9zdWJ3cml0ZSgmcHNpLCAmcHNpX2FzaWMsIFZPWUFHRVJfUFNJX0dFTkVSQUxfUkVHLAorCQkJCSAgICAgMSwgJmRhdGEpOworCQkJb3V0YihWT1lBR0VSX0NBVF9FTkQsIENBVF9DTUQpOworCQkJdm95YWdlcl9zdGF0dXMucG93ZXJfZmFpbCA9IDE7CisJCQl2b3lhZ2VyX3N0YXR1cy5yZXF1ZXN0X2Zyb21fa2VybmVsID0gMTsKKwkJCXVwKCZrdm95YWdlcmRfc2VtKTsKKwkJfQorCQkKKwkJCisJfSBlbHNlIGlmKHBzaV9yZWcucmVncy5pbnRzdGF0dXMgJiBQU0lfRkFVTFQpIHsKKwkJLyogTWFqb3IgZmF1bHQhICovCisJCXByaW50ayhLRVJOX0VSUiAiVm95YWdlciBQU0kgRGV0ZWN0ZWQgbWFqb3IgZmF1bHQsIGltbWVkaWF0ZSBwb3dlciBvZmYhXG4iKTsKKwkJdm95YWdlcl9jYXRfcG93ZXJfb2ZmKCk7CisJCS8qIG5vdCByZWFjaGVkICovCisJfSBlbHNlIGlmKHBzaV9yZWcucmVncy5pbnRzdGF0dXMgJiAoUFNJX0RDX0ZBSUwgfCBQU0lfQUxBUk0KKwkJCQkJICAgIHwgUFNJX0NVUlJFTlQgfCBQU0lfRFZNCisJCQkJCSAgICB8IFBTSV9QU0NGQVVMVCB8IFBTSV9TVEFUX0NIRykpIHsKKwkJLyogb3RoZXIgcHNpIGZhdWx0ICovCisKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVm95YWdlciBQU0kgc3RhdHVzIDB4JXhcbiIsIGRhdGEpOworCQkvKiBjbGVhciB0aGUgUFNJIGZhdWx0ICovCisJCW91dGIoVk9ZQUdFUl9DQVRfUlVOLCBDQVRfQ01EKTsKKwkJY2F0X3dyaXRlKCZwc2ksICZwc2lfYXNpYywgVk9ZQUdFUl9QU0lfU1RBVFVTX1JFRywgMCk7CisJCW91dGIoVk9ZQUdFUl9DQVRfRU5ELCBDQVRfQ01EKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWFjaC12b3lhZ2VyL3ZveWFnZXJfc21wLmMgYi9hcmNoL2kzODYvbWFjaC12b3lhZ2VyL3ZveWFnZXJfc21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAzZDczOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYWNoLXZveWFnZXIvdm95YWdlcl9zbXAuYwpAQCAtMCwwICsxLDE5MzEgQEAKKy8qIC0qLSBtb2RlOiBjOyBjLWJhc2ljLW9mZnNldDogOCAtKi0gKi8KKworLyogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDEKKyAqCisgKiBBdXRob3I6IEouRS5KLkJvdHRvbWxleUBIYW5zZW5QYXJ0bmVyc2hpcC5jb20KKyAqCisgKiBsaW51eC9hcmNoL2kzODYva2VybmVsL3ZveWFnZXJfc21wLmMKKyAqCisgKiBUaGlzIGZpbGUgcHJvdmlkZXMgYWxsIHRoZSBzYW1lIGV4dGVybmFsIGVudHJpZXMgYXMgc21wLmMgYnV0IHVzZXMKKyAqIHRoZSB2b3lhZ2VyIGhhbCB0byBwcm92aWRlIHRoZSBmdW5jdGlvbmFsaXR5CisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxhc20vZGVzYy5oPgorI2luY2x1ZGUgPGFzbS92b3lhZ2VyLmg+CisjaW5jbHVkZSA8YXNtL3ZpYy5oPgorI2luY2x1ZGUgPGFzbS9tdHJyLmg+CisjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vYXJjaF9ob29rcy5oPgorCisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisKKy8qIFRMQiBzdGF0ZSAtLSB2aXNpYmxlIGV4dGVybmFsbHksIGluZGV4ZWQgcGh5c2ljYWxseSAqLworREVGSU5FX1BFUl9DUFUoc3RydWN0IHRsYl9zdGF0ZSwgY3B1X3RsYnN0YXRlKSBfX19fY2FjaGVsaW5lX2FsaWduZWQgPSB7ICZpbml0X21tLCAwIH07CisKKy8qIENQVSBJUlEgYWZmaW5pdHkgLS0gc2V0IHRvIGFsbCBvbmVzIGluaXRpYWxseSAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgY3B1X2lycV9hZmZpbml0eVtOUl9DUFVTXSBfX2NhY2hlbGluZV9hbGlnbmVkID0geyBbMCAuLi4gTlJfQ1BVUy0xXSAgPSB+MFVMIH07CisKKy8qIHBlciBDUFUgZGF0YSBzdHJ1Y3R1cmUgKGZvciAvcHJvYy9jcHVpbmZvIGV0IGFsKSwgdmlzaWJsZSBleHRlcm5hbGx5CisgKiBpbmRleGVkIHBoeXNpY2FsbHkgKi8KK3N0cnVjdCBjcHVpbmZvX3g4NiBjcHVfZGF0YVtOUl9DUFVTXSBfX2NhY2hlbGluZV9hbGlnbmVkOworCisvKiBwaHlzaWNhbCBJRCBvZiB0aGUgQ1BVIHVzZWQgdG8gYm9vdCB0aGUgc3lzdGVtICovCit1bnNpZ25lZCBjaGFyIGJvb3RfY3B1X2lkOworCisvKiBUaGUgbWVtb3J5IGxpbmUgYWRkcmVzc2VzIGZvciB0aGUgUXVhZCBDUElzICovCitzdHJ1Y3Qgdm95YWdlcl9xaWNfY3BpICp2b3lhZ2VyX3F1YWRfY3BpX2FkZHJbTlJfQ1BVU10gX19jYWNoZWxpbmVfYWxpZ25lZDsKKworLyogVGhlIG1hc2tzIGZvciB0aGUgRXh0ZW5kZWQgVklDIHByb2Nlc3NvcnMsIGZpbGxlZCBpbiBieSBjYXRfaW5pdCAqLworX191MzIgdm95YWdlcl9leHRlbmRlZF92aWNfcHJvY2Vzc29ycyA9IDA7CisKKy8qIE1hc2tzIGZvciB0aGUgZXh0ZW5kZWQgUXVhZCBwcm9jZXNzb3JzIHdoaWNoIGNhbm5vdCBiZSBWSUMgYm9vdGVkICovCitfX3UzMiB2b3lhZ2VyX2FsbG93ZWRfYm9vdF9wcm9jZXNzb3JzID0gMDsKKworLyogVGhlIG1hc2sgZm9yIHRoZSBRdWFkIFByb2Nlc3NvcnMgKGJvdGggZXh0ZW5kZWQgYW5kIG5vbi1leHRlbmRlZCkgKi8KK19fdTMyIHZveWFnZXJfcXVhZF9wcm9jZXNzb3JzID0gMDsKKworLyogVG90YWwgY291bnQgb2YgbGl2ZSBDUFVzLCB1c2VkIGluIHByb2Nlc3MuYyB0byBkaXNwbGF5CisgKiB0aGUgQ1BVIGluZm9ybWF0aW9uIGFuZCBpbiBpcnEuYyBmb3IgdGhlIHBlciBDUFUgaXJxCisgKiBhY3Rpdml0eSBjb3VudC4gIEZpbmFsbHkgZXhwb3J0ZWQgYnkgaTM4Nl9rc3ltcy5jICovCitzdGF0aWMgaW50IHZveWFnZXJfZXh0ZW5kZWRfY3B1cyA9IDE7CisKKy8qIEhhdmUgd2UgZm91bmQgYW4gU01QIGJveCAtIHVzZWQgYnkgdGltZS5jIHRvIGRvIHRoZSBwcm9maWxpbmcKKyAgIGludGVycnVwdCBmb3IgdGltZXNsaWNpbmc7IGRvIG5vdCBzZXQgdG8gMSB1bnRpbCB0aGUgcGVyIENQVSB0aW1lcgorICAgaW50ZXJydXB0IGlzIGFjdGl2ZSAqLworaW50IHNtcF9mb3VuZF9jb25maWcgPSAwOworCisvKiBVc2VkIGZvciB0aGUgaW52YWxpZGF0ZSBtYXAgdGhhdCdzIGFsc28gY2hlY2tlZCBpbiB0aGUgc3BpbmxvY2sgKi8KK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHNtcF9pbnZhbGlkYXRlX25lZWRlZDsKKworLyogQml0bWFzayBvZiBjdXJyZW50bHkgb25saW5lIENQVXMgLSB1c2VkIGJ5IHNldHVwLmMgZm9yCisgICAvcHJvYy9jcHVpbmZvLCB2aXNpYmxlIGV4dGVybmFsbHkgYnV0IHN0aWxsIHBoeXNpY2FsICovCitjcHVtYXNrX3QgY3B1X29ubGluZV9tYXAgPSBDUFVfTUFTS19OT05FOworCisvKiBCaXRtYXNrIG9mIENQVXMgcHJlc2VudCBpbiB0aGUgc3lzdGVtIC0gZXhwb3J0ZWQgYnkgaTM4Nl9zeW1zLmMsIHVzZWQKKyAqIGJ5IHNjaGVkdWxlciBidXQgaW5kZXhlZCBwaHlzaWNhbGx5ICovCitjcHVtYXNrX3QgcGh5c19jcHVfcHJlc2VudF9tYXAgPSBDUFVfTUFTS19OT05FOworCisKKy8qIFRoZSBpbnRlcm5hbCBmdW5jdGlvbnMgKi8KK3N0YXRpYyB2b2lkIHNlbmRfQ1BJKF9fdTMyIGNwdXNldCwgX191OCBjcGkpOworc3RhdGljIHZvaWQgYWNrX0NQSShfX3U4IGNwaSk7CitzdGF0aWMgaW50IGFja19RSUNfQ1BJKF9fdTggY3BpKTsKK3N0YXRpYyB2b2lkIGFja19zcGVjaWFsX1FJQ19DUEkoX191OCBjcGkpOworc3RhdGljIHZvaWQgYWNrX1ZJQ19DUEkoX191OCBjcGkpOworc3RhdGljIHZvaWQgc2VuZF9DUElfYWxsYnV0c2VsZihfX3U4IGNwaSk7CitzdGF0aWMgdm9pZCBlbmFibGVfdmljX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKK3N0YXRpYyB2b2lkIGRpc2FibGVfdmljX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF92aWNfaXJxKHVuc2lnbmVkIGludCBpcnEpOworc3RhdGljIHZvaWQgZW5hYmxlX2xvY2FsX3ZpY19pcnEodW5zaWduZWQgaW50IGlycSk7CitzdGF0aWMgdm9pZCBkaXNhYmxlX2xvY2FsX3ZpY19pcnEodW5zaWduZWQgaW50IGlycSk7CitzdGF0aWMgdm9pZCBiZWZvcmVfaGFuZGxlX3ZpY19pcnEodW5zaWduZWQgaW50IGlycSk7CitzdGF0aWMgdm9pZCBhZnRlcl9oYW5kbGVfdmljX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKK3N0YXRpYyB2b2lkIHNldF92aWNfaXJxX2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNwdW1hc2tfdCBtYXNrKTsKK3N0YXRpYyB2b2lkIGFja192aWNfaXJxKHVuc2lnbmVkIGludCBpcnEpOworc3RhdGljIHZvaWQgdmljX2VuYWJsZV9jcGkodm9pZCk7CitzdGF0aWMgdm9pZCBkb19ib290X2NwdShfX3U4IGNwdWlkKTsKK3N0YXRpYyB2b2lkIGRvX3F1YWRfYm9vdHN0cmFwKHZvaWQpOworc3RhdGljIGlubGluZSB2b2lkIHdyYXBwZXJfc21wX2xvY2FsX3RpbWVyX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqKTsKKworaW50IGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCh2b2lkKTsKKworLyogSW5saW5lIGZ1bmN0aW9ucyAqLworc3RhdGljIGlubGluZSB2b2lkCitzZW5kX29uZV9RSUNfQ1BJKF9fdTggY3B1LCBfX3U4IGNwaSkKK3sKKwl2b3lhZ2VyX3F1YWRfY3BpX2FkZHJbY3B1XS0+cWljX2NwaVtjcGldLmNwaSA9CisJCShzbXBfcHJvY2Vzc29yX2lkKCkgPDwgMTYpICsgY3BpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3NlbmRfUUlDX0NQSShfX3UzMiBjcHVzZXQsIF9fdTggY3BpKQoreworCWludCBjcHU7CisKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQlpZihjcHVzZXQgJiAoMTw8Y3B1KSkgeworI2lmZGVmIFZPWUFHRVJfREVCVUcKKwkJCWlmKCFjcHVfaXNzZXQoY3B1LCBjcHVfb25saW5lX21hcCkpCisJCQkJVkRFQlVHKCgiQ1BVJWQgc2VuZGluZyBjcGkgJWQgdG8gQ1BVJWQgbm90IGluIGNwdV9vbmxpbmVfbWFwXG4iLCBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKSwgY3BpLCBjcHUpKTsKKyNlbmRpZgorCQkJc2VuZF9vbmVfUUlDX0NQSShjcHUsIGNwaSAtIFFJQ19DUElfT0ZGU0VUKTsKKwkJfQorCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkCitzZW5kX29uZV9DUEkoX191OCBjcHUsIF9fdTggY3BpKQoreworCWlmKHZveWFnZXJfcXVhZF9wcm9jZXNzb3JzICYgKDE8PGNwdSkpCisJCXNlbmRfb25lX1FJQ19DUEkoY3B1LCBjcGkgLSBRSUNfQ1BJX09GRlNFVCk7CisJZWxzZQorCQlzZW5kX0NQSSgxPDxjcHUsIGNwaSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc2VuZF9DUElfYWxsYnV0c2VsZihfX3U4IGNwaSkKK3sKKwlfX3U4IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlfX3UzMiBtYXNrID0gY3B1c19hZGRyKGNwdV9vbmxpbmVfbWFwKVswXSAmIH4oMSA8PCBjcHUpOworCXNlbmRfQ1BJKG1hc2ssIGNwaSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Citpc19jcHVfcXVhZCh2b2lkKQoreworCV9fdTggY3B1bWFzayA9IGluYihWSUNfUFJPQ19XSE9fQU1fSSk7CisJcmV0dXJuICgoY3B1bWFzayAmIFFVQURfSURFTlRJRklFUikgPT0gUVVBRF9JREVOVElGSUVSKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2lzX2NwdV9leHRlbmRlZCh2b2lkKQoreworCV9fdTggY3B1ID0gaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlyZXR1cm4odm95YWdlcl9leHRlbmRlZF92aWNfcHJvY2Vzc29ycyAmICgxPDxjcHUpKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2lzX2NwdV92aWNfYm9vdCh2b2lkKQoreworCV9fdTggY3B1ID0gaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlyZXR1cm4odm95YWdlcl9leHRlbmRlZF92aWNfcHJvY2Vzc29ycworCSAgICAgICAmIHZveWFnZXJfYWxsb3dlZF9ib290X3Byb2Nlc3NvcnMgJiAoMTw8Y3B1KSk7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkCithY2tfQ1BJKF9fdTggY3BpKQoreworCXN3aXRjaChjcGkpIHsKKwljYXNlIFZJQ19DUFVfQk9PVF9DUEk6CisJCWlmKGlzX2NwdV9xdWFkKCkgJiYgIWlzX2NwdV92aWNfYm9vdCgpKQorCQkJYWNrX1FJQ19DUEkoY3BpKTsKKwkJZWxzZQorCQkJYWNrX1ZJQ19DUEkoY3BpKTsKKwkJYnJlYWs7CisJY2FzZSBWSUNfU1lTX0lOVDoKKwljYXNlIFZJQ19DTU5fSU5UOiAKKwkJLyogVGhlc2UgYXJlIHNsaWdodGx5IHN0cmFuZ2UuICBFdmVuIG9uIHRoZSBRdWFkIGNhcmQsCisJCSAqIFRoZXkgYXJlIHZlY3RvcmVkIGFzIFZJQyBDUElzICovCisJCWlmKGlzX2NwdV9xdWFkKCkpCisJCQlhY2tfc3BlY2lhbF9RSUNfQ1BJKGNwaSk7CisJCWVsc2UKKwkJCWFja19WSUNfQ1BJKGNwaSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50aygiVk9ZQUdFUiBFUlJPUjogQ1BJJWQgaXMgaW4gY29tbW9uIENQSSBjb2RlXG4iLCBjcGkpOworCQlicmVhazsKKwl9Cit9CisKKy8qIGxvY2FsIHZhcmlhYmxlcyAqLworCisvKiBUaGUgVklDIElSUSBkZXNjcmlwdG9ycyAtLSB0aGVzZSBsb29rIGFsbW9zdCBpZGVudGljYWwgdG8gdGhlCisgKiA4MjU5IElSUXMgZXhjZXB0IHRoYXQgbWFza3MgYW5kIHRoaW5ncyBtdXN0IGJlIGtlcHQgcGVyIHByb2Nlc3NvcgorICovCitzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIHZpY19pcnFfdHlwZSA9IHsKKwkudHlwZW5hbWUgPSAiVklDLWxldmVsIiwKKwkuc3RhcnR1cCA9IHN0YXJ0dXBfdmljX2lycSwKKwkuc2h1dGRvd24gPSBkaXNhYmxlX3ZpY19pcnEsCisJLmVuYWJsZSA9IGVuYWJsZV92aWNfaXJxLAorCS5kaXNhYmxlID0gZGlzYWJsZV92aWNfaXJxLAorCS5hY2sgPSBiZWZvcmVfaGFuZGxlX3ZpY19pcnEsCisJLmVuZCA9IGFmdGVyX2hhbmRsZV92aWNfaXJxLAorCS5zZXRfYWZmaW5pdHkgPSBzZXRfdmljX2lycV9hZmZpbml0eSwKK307CisKKy8qIHVzZWQgdG8gY291bnQgdXAgYXMgQ1BVcyBhcmUgYnJvdWdodCBvbiBsaW5lIChzdGFydHMgYXQgMCkgKi8KK3N0YXRpYyBpbnQgY3B1Y291bnQgPSAwOworCisvKiBzdGVhbCBhIHBhZ2UgZnJvbSB0aGUgYm90dG9tIG9mIG1lbW9yeSBmb3IgdGhlIHRyYW1wb2xpbmUgYW5kCisgKiBzcXVpcnJlbCBpdHMgYWRkcmVzcyBhd2F5IGhlcmUuICBUaGlzIHdpbGwgYmUgaW4ga2VybmVsIHZpcnR1YWwKKyAqIHNwYWNlICovCitzdGF0aWMgX191MzIgdHJhbXBvbGluZV9iYXNlOworCisvKiBUaGUgcGVyIGNwdSBwcm9maWxlIHN0dWZmIC0gdXNlZCBpbiBzbXBfbG9jYWxfdGltZXJfaW50ZXJydXB0ICovCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCBwcm9mX211bHRpcGxpZXIpID0gMTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIHByb2Zfb2xkX211bHRpcGxpZXIpID0gMTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIHByb2ZfY291bnRlcikgPSAgMTsKKworLyogdGhlIG1hcCB1c2VkIHRvIGNoZWNrIGlmIGEgQ1BVIGhhcyBib290ZWQgKi8KK3N0YXRpYyBfX3UzMiBjcHVfYm9vdGVkX21hcDsKKworLyogdGhlIHN5bmNocm9uaXplIGZsYWcgdXNlZCB0byBob2xkIGFsbCBzZWNvbmRhcnkgQ1BVcyBzcGlubmluZyBpbgorICogYSB0aWdodCBsb29wIHVudGlsIHRoZSBib290IHNlcXVlbmNlIGlzIHJlYWR5IGZvciB0aGVtICovCitzdGF0aWMgY3B1bWFza190IHNtcF9jb21tZW5jZWRfbWFzayA9IENQVV9NQVNLX05PTkU7CisKKy8qIFRoaXMgaXMgZm9yIHRoZSBuZXcgZHluYW1pYyBDUFUgYm9vdCBjb2RlICovCitjcHVtYXNrX3QgY3B1X2NhbGxpbl9tYXAgPSBDUFVfTUFTS19OT05FOworY3B1bWFza190IGNwdV9jYWxsb3V0X21hcCA9IENQVV9NQVNLX05PTkU7CisKKy8qIFRoZSBwZXIgcHJvY2Vzc29yIElSUSBtYXNrcyAodGhlc2UgYXJlIHVzdWFsbHkga2VwdCBpbiBzeW5jKSAqLworc3RhdGljIF9fdTE2IHZpY19pcnFfbWFza1tOUl9DUFVTXSBfX2NhY2hlbGluZV9hbGlnbmVkOworCisvKiB0aGUgbGlzdCBvZiBJUlFzIHRvIGJlIGVuYWJsZWQgYnkgdGhlIFZJQ19FTkFCTEVfSVJRX0NQSSAqLworc3RhdGljIF9fdTE2IHZpY19pcnFfZW5hYmxlX21hc2tbTlJfQ1BVU10gX19jYWNoZWxpbmVfYWxpZ25lZCA9IHsgMCB9OworCisvKiBMb2NrIGZvciBlbmFibGUvZGlzYWJsZSBvZiBWSUMgaW50ZXJydXB0cyAqLworc3RhdGljICBfX2NhY2hlbGluZV9hbGlnbmVkIERFRklORV9TUElOTE9DSyh2aWNfaXJxX2xvY2spOworCisvKiBUaGUgYm9vdCBwcm9jZXNzb3IgaXMgY29ycmVjdGx5IHNldCB1cCBpbiBQQyBtb2RlIHdoZW4gaXQgCisgKiBjb21lcyB1cCwgYnV0IHRoZSBzZWNvbmRhcmllcyBuZWVkIHRoZWlyIG1hc3Rlci9zbGF2ZSA4MjU5CisgKiBwYWlycyBpbml0aWFsaXppbmcgY29ycmVjdGx5ICovCisKKy8qIEludGVycnVwdCBjb3VudGVycyAocGVyIGNwdSkgYW5kIHRvdGFsIC0gdXNlZCB0byB0cnkgdG8KKyAqIGV2ZW4gdXAgdGhlIGludGVycnVwdCBoYW5kbGluZyByb3V0aW5lcyAqLworc3RhdGljIGxvbmcgdmljX2ludHJfdG90YWwgPSAwOworc3RhdGljIGxvbmcgdmljX2ludHJfY291bnRbTlJfQ1BVU10gX19jYWNoZWxpbmVfYWxpZ25lZCA9IHsgMCB9Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgdmljX3RpY2tbTlJfQ1BVU10gX19jYWNoZWxpbmVfYWxpZ25lZCA9IHsgMCB9OworCisvKiBTaW5jZSB3ZSBjYW4gb25seSB1c2UgQ1BJMCwgd2UgZmFrZSBhbGwgdGhlIG90aGVyIENQSXMgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHZpY19jcGlfbWFpbGJveFtOUl9DUFVTXSBfX2NhY2hlbGluZV9hbGlnbmVkOworCisvKiBkZWJ1Z2dpbmcgcm91dGluZSB0byByZWFkIHRoZSBpc3Igb2YgdGhlIGNwdSdzIHBpYyAqLworc3RhdGljIGlubGluZSBfX3UxNgordmljX3JlYWRfaXNyKHZvaWQpCit7CisJX191MTYgaXNyOworCisJb3V0YigweDBiLCAweGEwKTsKKwlpc3IgPSBpbmIoMHhhMCkgPDwgODsKKwlvdXRiKDB4MGIsIDB4MjApOworCWlzciB8PSBpbmIoMHgyMCk7CisKKwlyZXR1cm4gaXNyOworfQorCitzdGF0aWMgX19pbml0IHZvaWQKK3FpY19zZXR1cCh2b2lkKQoreworCWlmKCFpc19jcHVfcXVhZCgpKSB7CisJCS8qIG5vdCBhIHF1YWQsIG5vIHNldHVwICovCisJCXJldHVybjsKKwl9CisJb3V0YihRSUNfREVGQVVMVF9NQVNLMCwgUUlDX01BU0tfUkVHSVNURVIwKTsKKwlvdXRiKFFJQ19DUElfRU5BQkxFLCBRSUNfTUFTS19SRUdJU1RFUjEpOworCQorCWlmKGlzX2NwdV9leHRlbmRlZCgpKSB7CisJCS8qIHRoZSBRSUMgZHVwbGljYXRlIG9mIHRoZSBWSUMgYmFzZSByZWdpc3RlciAqLworCQlvdXRiKFZJQ19ERUZBVUxUX0NQSV9CQVNFLCBRSUNfVklDX0NQSV9CQVNFX1JFR0lTVEVSKTsKKwkJb3V0YihRSUNfREVGQVVMVF9DUElfQkFTRSwgUUlDX0NQSV9CQVNFX1JFR0lTVEVSKTsKKworCQkvKiBGSVhNRTogc2hvdWxkIHNldCB1cCB0aGUgUUlDIHRpbWVyIGFuZCBtZW1vcnkgcGFyaXR5CisJCSAqIGVycm9yIHZlY3RvcnMgaGVyZSAqLworCX0KK30KKworc3RhdGljIF9faW5pdCB2b2lkCit2aWNfc2V0dXBfcGljKHZvaWQpCit7CisJb3V0YigxLCBWSUNfUkVESVJFQ1RfUkVHSVNURVJfMSk7CisJLyogY2xlYXIgdGhlIGNsYWltIHJlZ2lzdGVycyBmb3IgZHluYW1pYyByb3V0aW5nICovCisJb3V0YigwLCBWSUNfQ0xBSU1fUkVHSVNURVJfMCk7CisJb3V0YigwLCBWSUNfQ0xBSU1fUkVHSVNURVJfMSk7CisKKwlvdXRiKDAsIFZJQ19QUklPUklUWV9SRUdJU1RFUik7CisJLyogU2V0IHRoZSBQcmltYXJ5IGFuZCBTZWNvbmRhcnkgTWljcm9jaGFubmVsIHZlY3RvcgorCSAqIGJhc2VzIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBvcmRpbmFyeSBpbnRlcnJ1cHRzCisJICoKKwkgKiBGSVhNRTogVGhpcyB3b3VsZCBiZSBtb3JlIGVmZmljaWVudCB1c2luZyBzZXBhcmF0ZQorCSAqIHZlY3RvcnMuICovCisJb3V0YihGSVJTVF9FWFRFUk5BTF9WRUNUT1IsIFZJQ19QUklNQVJZX01DX0JBU0UpOworCW91dGIoRklSU1RfRVhURVJOQUxfVkVDVE9SLCBWSUNfU0VDT05EQVJZX01DX0JBU0UpOworCS8qIE5vdyBpbml0aWFsbGlzZSB0aGUgbWFzdGVyIFBJQyBiZWxvbmdpbmcgdG8gdGhpcyBDUFUgYnkKKwkgKiBzZW5kaW5nIHRoZSBmb3VyIElDV3MgKi8KKworCS8qIElDVzE6IGxldmVsIHRyaWdnZXJlZCwgSUNXNCBuZWVkZWQgKi8KKwlvdXRiKDB4MTksIDB4MjApOworCisJLyogSUNXMjogdmVjdG9yIGJhc2UgKi8KKwlvdXRiKEZJUlNUX0VYVEVSTkFMX1ZFQ1RPUiwgMHgyMSk7CisKKwkvKiBJQ1czOiBzbGF2ZSBhdCBsaW5lIDIgKi8KKwlvdXRiKDB4MDQsIDB4MjEpOworCisJLyogSUNXNDogODA4NiBtb2RlICovCisJb3V0YigweDAxLCAweDIxKTsKKworCS8qIG5vdyB0aGUgc2FtZSBmb3IgdGhlIHNsYXZlIFBJQyAqLworCisJLyogSUNXMTogbGV2ZWwgdHJpZ2dlciwgSUNXNCBuZWVkZWQgKi8KKwlvdXRiKDB4MTksIDB4QTApOworCisJLyogSUNXMjogc2xhdmUgdmVjdG9yIGJhc2UgKi8KKwlvdXRiKEZJUlNUX0VYVEVSTkFMX1ZFQ1RPUiArIDgsIDB4QTEpOworCQorCS8qIElDVzM6IHNsYXZlIElEICovCisJb3V0YigweDAyLCAweEExKTsKKworCS8qIElDVzQ6IDgwODYgbW9kZSAqLworCW91dGIoMHgwMSwgMHhBMSk7Cit9CisKK3N0YXRpYyB2b2lkCitkb19xdWFkX2Jvb3RzdHJhcCh2b2lkKQoreworCWlmKGlzX2NwdV9xdWFkKCkgJiYgaXNfY3B1X3ZpY19ib290KCkpIHsKKwkJaW50IGk7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCV9fdTggY3B1aWQgPSBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKTsKKworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwkJZm9yKGkgPSAwOyBpPDQ7IGkrKykgeworCQkJLyogRklYTUU6IHRoaXMgd291bGQgYmUgPj4zICYweDcgb24gdGhlIDMyIHdheSAqLworCQkJaWYoKChjcHVpZCA+PiAyKSAmIDB4MDMpID09IGkpCisJCQkJLyogZG9uJ3QgbG93ZXIgb3VyIG93biBtYXNrISAqLworCQkJCWNvbnRpbnVlOworCisJCQkvKiBtYXNxdWVyYWRlIGFzIGxvY2FsIFF1YWQgQ1BVICovCisJCQlvdXRiKFFJQ19DUFVJRF9FTkFCTEUgfCBpLCBRSUNfUFJPQ0VTU09SX0lEKTsKKwkJCS8qIGVuYWJsZSB0aGUgc3RhcnR1cCBDUEkgKi8KKwkJCW91dGIoUUlDX0JPT1RfQ1BJX01BU0ssIFFJQ19NQVNLX1JFR0lTVEVSMSk7CisJCQkvKiByZXN0b3JlIGNwdSBpZCAqLworCQkJb3V0YigwLCBRSUNfUFJPQ0VTU09SX0lEKTsKKwkJfQorCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJfQorfQorCisKKy8qIFNldCB1cCBhbGwgdGhlIGJhc2ljIHN0dWZmOiByZWFkIHRoZSBTTVAgY29uZmlnIGFuZCBtYWtlIGFsbCB0aGUKKyAqIFNNUCBpbmZvcm1hdGlvbiByZWZsZWN0IG9ubHkgdGhlIGJvb3QgY3B1LiAgQWxsIG90aGVycyB3aWxsIGJlCisgKiBicm91Z2h0IG9uLWxpbmUgbGF0ZXIuICovCit2b2lkIF9faW5pdCAKK2ZpbmRfc21wX2NvbmZpZyh2b2lkKQoreworCWludCBpOworCisJYm9vdF9jcHVfaWQgPSBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKTsKKworCXByaW50aygiVk9ZQUdFUiBTTVA6IEJvb3QgY3B1IGlzICVkXG4iLCBib290X2NwdV9pZCk7CisKKwkvKiBpbml0aWFsaXplIHRoZSBDUFUgc3RydWN0dXJlcyAobW92ZWQgZnJvbSBzbXBfYm9vdF9jcHVzKSAqLworCWZvcihpPTA7IGk8TlJfQ1BVUzsgaSsrKSB7CisJCWNwdV9pcnFfYWZmaW5pdHlbaV0gPSB+MDsKKwl9CisJY3B1X29ubGluZV9tYXAgPSBjcHVtYXNrX29mX2NwdShib290X2NwdV9pZCk7CisKKwkvKiBUaGUgYm9vdCBDUFUgbXVzdCBiZSBleHRlbmRlZCAqLworCXZveWFnZXJfZXh0ZW5kZWRfdmljX3Byb2Nlc3NvcnMgPSAxPDxib290X2NwdV9pZDsKKwkvKiBpbml0aWFsbHksIGFsbCBvZiB0aGUgZmlyc3QgOCBjcHUncyBjYW4gYm9vdCAqLworCXZveWFnZXJfYWxsb3dlZF9ib290X3Byb2Nlc3NvcnMgPSAweGZmOworCS8qIHNldCB1cCBldmVyeXRoaW5nIGZvciBqdXN0IHRoaXMgQ1BVLCB3ZSBjYW4gYWx0ZXIKKwkgKiB0aGlzIGFzIHdlIHN0YXJ0IHRoZSBvdGhlciBDUFVzIGxhdGVyICovCisJLyogbm93IGdldCB0aGUgQ1BVIGRpc3Bvc2l0aW9uIGZyb20gdGhlIGV4dGVuZGVkIENNT1MgKi8KKwljcHVzX2FkZHIocGh5c19jcHVfcHJlc2VudF9tYXApWzBdID0gdm95YWdlcl9leHRlbmRlZF9jbW9zX3JlYWQoVk9ZQUdFUl9QUk9DRVNTT1JfUFJFU0VOVF9NQVNLKTsKKwljcHVzX2FkZHIocGh5c19jcHVfcHJlc2VudF9tYXApWzBdIHw9IHZveWFnZXJfZXh0ZW5kZWRfY21vc19yZWFkKFZPWUFHRVJfUFJPQ0VTU09SX1BSRVNFTlRfTUFTSyArIDEpIDw8IDg7CisJY3B1c19hZGRyKHBoeXNfY3B1X3ByZXNlbnRfbWFwKVswXSB8PSB2b3lhZ2VyX2V4dGVuZGVkX2Ntb3NfcmVhZChWT1lBR0VSX1BST0NFU1NPUl9QUkVTRU5UX01BU0sgKyAyKSA8PCAxNjsKKwljcHVzX2FkZHIocGh5c19jcHVfcHJlc2VudF9tYXApWzBdIHw9IHZveWFnZXJfZXh0ZW5kZWRfY21vc19yZWFkKFZPWUFHRVJfUFJPQ0VTU09SX1BSRVNFTlRfTUFTSyArIDMpIDw8IDI0OworCXByaW50aygiVk9ZQUdFUiBTTVA6IHBoeXNfY3B1X3ByZXNlbnRfbWFwID0gMHglbHhcbiIsIGNwdXNfYWRkcihwaHlzX2NwdV9wcmVzZW50X21hcClbMF0pOworCS8qIEhlcmUgd2Ugc2V0IHVwIHRoZSBWSUMgdG8gZW5hYmxlIFNNUCAqLworCS8qIGVuYWJsZSB0aGUgQ1BJcyBieSB3cml0aW5nIHRoZSBiYXNlIHZlY3RvciB0byB0aGVpciByZWdpc3RlciAqLworCW91dGIoVklDX0RFRkFVTFRfQ1BJX0JBU0UsIFZJQ19DUElfQkFTRV9SRUdJU1RFUik7CisJb3V0YigxLCBWSUNfUkVESVJFQ1RfUkVHSVNURVJfMSk7CisJLyogc2V0IHRoZSBjbGFpbSByZWdpc3RlcnMgZm9yIHN0YXRpYyByb3V0aW5nIC0tLSBCb290IENQVSBnZXRzCisJICogYWxsIGludGVycnVwdHMgdW50aWxsIGFsbCBvdGhlciBDUFVzIHN0YXJ0ZWQgKi8KKwlvdXRiKDB4ZmYsIFZJQ19DTEFJTV9SRUdJU1RFUl8wKTsKKwlvdXRiKDB4ZmYsIFZJQ19DTEFJTV9SRUdJU1RFUl8xKTsKKwkvKiBTZXQgdGhlIFByaW1hcnkgYW5kIFNlY29uZGFyeSBNaWNyb2NoYW5uZWwgdmVjdG9yCisJICogYmFzZXMgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIG9yZGluYXJ5IGludGVycnVwdHMKKwkgKgorCSAqIEZJWE1FOiBUaGlzIHdvdWxkIGJlIG1vcmUgZWZmaWNpZW50IHVzaW5nIHNlcGFyYXRlCisJICogdmVjdG9ycy4gKi8KKwlvdXRiKEZJUlNUX0VYVEVSTkFMX1ZFQ1RPUiwgVklDX1BSSU1BUllfTUNfQkFTRSk7CisJb3V0YihGSVJTVF9FWFRFUk5BTF9WRUNUT1IsIFZJQ19TRUNPTkRBUllfTUNfQkFTRSk7CisKKwkvKiBGaW5hbGx5IHRlbGwgdGhlIGZpcm13YXJlIHRoYXQgd2UncmUgZHJpdmluZyAqLworCW91dGIoaW5iKFZPWUFHRVJfU1VTX0lOX0NPTlRST0xfUE9SVCkgfCBWT1lBR0VSX0lOX0NPTlRST0xfRkxBRywKKwkgICAgIFZPWUFHRVJfU1VTX0lOX0NPTlRST0xfUE9SVCk7CisKKwljdXJyZW50X3RocmVhZF9pbmZvKCktPmNwdSA9IGJvb3RfY3B1X2lkOworfQorCisvKgorICoJVGhlIGJvb3RzdHJhcCBrZXJuZWwgZW50cnkgY29kZSBoYXMgc2V0IHRoZXNlIHVwLiBTYXZlIHRoZW0KKyAqCWZvciBhIGdpdmVuIENQVSwgaWQgaXMgcGh5c2ljYWwgKi8KK3ZvaWQgX19pbml0CitzbXBfc3RvcmVfY3B1X2luZm8oaW50IGlkKQoreworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYz0mY3B1X2RhdGFbaWRdOworCisJKmMgPSBib290X2NwdV9kYXRhOworCisJaWRlbnRpZnlfY3B1KGMpOworfQorCisvKiBzZXQgdXAgdGhlIHRyYW1wb2xpbmUgYW5kIHJldHVybiB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgY29kZSAqLworc3RhdGljIF9fdTMyIF9faW5pdAorc2V0dXBfdHJhbXBvbGluZSh2b2lkKQoreworCS8qIHRoZXNlIHR3byBhcmUgZ2xvYmFsIHN5bWJvbHMgaW4gdHJhbXBvbGluZS5TICovCisJZXh0ZXJuIF9fdTggdHJhbXBvbGluZV9lbmRbXTsKKwlleHRlcm4gX191OCB0cmFtcG9saW5lX2RhdGFbXTsKKworCW1lbWNweSgoX191OCAqKXRyYW1wb2xpbmVfYmFzZSwgdHJhbXBvbGluZV9kYXRhLAorCSAgICAgICB0cmFtcG9saW5lX2VuZCAtIHRyYW1wb2xpbmVfZGF0YSk7CisJcmV0dXJuIHZpcnRfdG9fcGh5cygoX191OCAqKXRyYW1wb2xpbmVfYmFzZSk7Cit9CisKKy8qIFJvdXRpbmUgaW5pdGlhbGx5IGNhbGxlZCB3aGVuIGEgbm9uLWJvb3QgQ1BVIGlzIGJyb3VnaHQgb25saW5lICovCitzdGF0aWMgdm9pZCBfX2luaXQKK3N0YXJ0X3NlY29uZGFyeSh2b2lkICp1bnVzZWQpCit7CisJX191OCBjcHVpZCA9IGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpOworCS8qIGV4dGVybmFsIGZ1bmN0aW9ucyBub3QgZGVmaW5lZCBpbiB0aGUgaGVhZGVycyAqLworCWV4dGVybiB2b2lkIGNhbGlicmF0ZV9kZWxheSh2b2lkKTsKKworCWNwdV9pbml0KCk7CisKKwkvKiBPSywgd2UncmUgaW4gdGhlIHJvdXRpbmUgKi8KKwlhY2tfQ1BJKFZJQ19DUFVfQk9PVF9DUEkpOworCisJLyogc2V0dXAgdGhlIDgyNTkgbWFzdGVyIHNsYXZlIHBhaXIgYmVsb25naW5nIHRvIHRoaXMgQ1BVIC0tLQorICAgICAgICAgKiB3ZSB3b24ndCBhY3R1YWxseSByZWNlaXZlIGFueSB1bnRpbCB0aGUgYm9vdCBDUFUKKyAgICAgICAgICogcmVsaW5xdWlzaGVzIGl0J3Mgc3RhdGljIHJvdXRpbmcgbWFzayAqLworCXZpY19zZXR1cF9waWMoKTsKKworCXFpY19zZXR1cCgpOworCisJaWYoaXNfY3B1X3F1YWQoKSAmJiAhaXNfY3B1X3ZpY19ib290KCkpIHsKKwkJLyogY2xlYXIgdGhlIGJvb3QgQ1BJICovCisJCV9fdTggZHVtbXk7CisKKwkJZHVtbXkgPSB2b3lhZ2VyX3F1YWRfY3BpX2FkZHJbY3B1aWRdLT5xaWNfY3BpW1ZJQ19DUFVfQk9PVF9DUEldLmNwaTsKKwkJcHJpbnRrKCJyZWFkIGR1bW15ICVkXG4iLCBkdW1teSk7CisJfQorCisJLyogbG93ZXIgdGhlIG1hc2sgdG8gcmVjZWl2ZSBDUElzICovCisJdmljX2VuYWJsZV9jcGkoKTsKKworCVZERUJVRygoIlZPWUFHRVIgU01QOiBDUFUlZCwgc3RhY2sgYXQgYWJvdXQgJXBcbiIsIGNwdWlkLCAmY3B1aWQpKTsKKworCS8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJLyogZ2V0IG91ciBib2dvbWlwcyAqLworCWNhbGlicmF0ZV9kZWxheSgpOworCisJLyogc2F2ZSBvdXIgcHJvY2Vzc29yIHBhcmFtZXRlcnMgKi8KKwlzbXBfc3RvcmVfY3B1X2luZm8oY3B1aWQpOworCisJLyogaWYgd2UncmUgYSBxdWFkLCB3ZSBtYXkgbmVlZCB0byBib290c3RyYXAgb3RoZXIgQ1BVcyAqLworCWRvX3F1YWRfYm9vdHN0cmFwKCk7CisKKwkvKiBGSVhNRTogdGhpcyBpcyByYXRoZXIgYSBwb29yIGhhY2sgdG8gcHJldmVudCB0aGUgQ1BVCisJICogYWN0aXZhdGluZyBzb2Z0aXJxcyB3aGlsZSBpdCdzIHN1cHBvc2VkIHRvIGJlIHdhaXRpbmcgZm9yCisJICogcGVybWlzc2lvbiB0byBwcm9jZWVkLiAgV2l0aG91dCB0aGlzLCB0aGUgbmV3IHBlciBDUFUgc3R1ZmYKKwkgKiBpbiB0aGUgc29mdGlycXMgd2lsbCBmYWlsICovCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwljcHVfc2V0KGNwdWlkLCBjcHVfY2FsbGluX21hcCk7CisKKwkvKiBzaWduYWwgdGhhdCB3ZSdyZSBkb25lICovCisJY3B1X2Jvb3RlZF9tYXAgPSAxOworCisJd2hpbGUgKCFjcHVfaXNzZXQoY3B1aWQsIHNtcF9jb21tZW5jZWRfbWFzaykpCisJCXJlcF9ub3AoKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwlsb2NhbF9mbHVzaF90bGIoKTsKKworCWNwdV9zZXQoY3B1aWQsIGNwdV9vbmxpbmVfbWFwKTsKKwl3bWIoKTsKKwljcHVfaWRsZSgpOworfQorCisKKy8qIFJvdXRpbmUgdG8ga2ljayBzdGFydCB0aGUgZ2l2ZW4gQ1BVIGFuZCB3YWl0IGZvciBpdCB0byByZXBvcnQgcmVhZHkKKyAqIChvciB0aW1lb3V0IGluIHN0YXJ0dXApLiAgV2hlbiB0aGlzIHJvdXRpbmUgcmV0dXJucywgdGhlIHJlcXVlc3RlZAorICogQ1BVIGlzIGVpdGhlciBmdWxseSBydW5uaW5nIGFuZCBjb25maWd1cmVkIG9yIGtub3duIHRvIGJlIGRlYWQuCisgKgorICogV2UgY2FsbCB0aGlzIHJvdXRpbmUgc2VxdWVudGlhbGx5IDEgQ1BVIGF0IGEgdGltZSwgc28gbm8gbmVlZCBmb3IKKyAqIGxvY2tpbmcgKi8KKworc3RhdGljIHZvaWQgX19pbml0Citkb19ib290X2NwdShfX3U4IGNwdSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGU7CisJaW50IHRpbWVvdXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcXVhZF9ib290ID0gKDE8PGNwdSkgJiB2b3lhZ2VyX3F1YWRfcHJvY2Vzc29ycyAKKwkJJiB+KCB2b3lhZ2VyX2V4dGVuZGVkX3ZpY19wcm9jZXNzb3JzCisJCSAgICAgJiB2b3lhZ2VyX2FsbG93ZWRfYm9vdF9wcm9jZXNzb3JzKTsKKworCS8qIEZvciB0aGUgNDg2LCB3ZSBjYW4ndCB1c2UgdGhlIDRNYiBwYWdlIHRhYmxlIHRyaWNrLCBzbworCSAqIG11c3QgbWFwIGEgcmVnaW9uIG9mIG1lbW9yeSAqLworI2lmZGVmIENPTkZJR19NNDg2CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyAqcGFnZV90YWJsZV9jb3BpZXMgPSAodW5zaWduZWQgbG9uZyAqKQorCQlfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CisjZW5kaWYKKwlwZ2RfdCBvcmlnX3N3YXBwZXJfcGdfZGlyMDsKKworCS8qIFRoaXMgaXMgYW4gYXJlYSBpbiBoZWFkLlMgd2hpY2ggd2FzIHVzZWQgdG8gc2V0IHVwIHRoZQorCSAqIGluaXRpYWwga2VybmVsIHN0YWNrLiAgV2UgbmVlZCB0byBhbHRlciB0aGlzIHRvIGdpdmUgdGhlCisJICogYm9vdGluZyBDUFUgYSBuZXcgc3RhY2sgKHRha2VuIGZyb20gaXRzIGlkbGUgcHJvY2VzcykgKi8KKwlleHRlcm4gc3RydWN0IHsKKwkJX191OCAqZXNwOworCQl1bnNpZ25lZCBzaG9ydCBzczsKKwl9IHN0YWNrX3N0YXJ0OworCS8qIFRoaXMgaXMgdGhlIGZvcm1hdCBvZiB0aGUgQ1BJIElEVCBnYXRlIChpbiByZWFsIG1vZGUpIHdoaWNoCisJICogd2UncmUgaGlqYWNraW5nIHRvIGJvb3QgdGhlIENQVSAqLworCXVuaW9uIAlJRFRGb3JtYXQgeworCQlzdHJ1Y3Qgc2VnIHsKKwkJCV9fdTE2CU9mZnNldDsKKwkJCV9fdTE2CVNlZ21lbnQ7CisJCX0gaWR0OworCQlfX3UzMiB2YWw7CisJfSBoaWphY2tfc291cmNlOworCisJX191MzIgKmhpamFja192ZWN0b3I7CisJX191MzIgc3RhcnRfcGh5c19hZGRyZXNzID0gc2V0dXBfdHJhbXBvbGluZSgpOworCisJLyogVGhlcmUncyBhIGNsZXZlciB0cmljayB0byB0aGlzOiBUaGUgbGludXggdHJhbXBvbGluZSBpcworCSAqIGNvbXBpbGVkIHRvIGJlZ2luIGF0IGFic29sdXRlIGxvY2F0aW9uIHplcm8sIHNvIG1ha2UgdGhlCisJICogYWRkcmVzcyB6ZXJvIGJ1dCBoYXZlIHRoZSBkYXRhIHNlZ21lbnQgc2VsZWN0b3IgY29tcGVuc2F0ZQorCSAqIGZvciB0aGUgYWN0dWFsIGFkZHJlc3MgKi8KKwloaWphY2tfc291cmNlLmlkdC5PZmZzZXQgPSBzdGFydF9waHlzX2FkZHJlc3MgJiAweDAwMEY7CisJaGlqYWNrX3NvdXJjZS5pZHQuU2VnbWVudCA9IChzdGFydF9waHlzX2FkZHJlc3MgPj4gNCkgJiAweEZGRkY7CisKKwljcHVjb3VudCsrOworCWlkbGUgPSBmb3JrX2lkbGUoY3B1KTsKKwlpZihJU19FUlIoaWRsZSkpCisJCXBhbmljKCJmYWlsZWQgZm9yayBmb3IgQ1BVJWQiLCBjcHUpOworCWlkbGUtPnRocmVhZC5laXAgPSAodW5zaWduZWQgbG9uZykgc3RhcnRfc2Vjb25kYXJ5OworCS8qIGluaXRfdGFza3MgKGluIHNjaGVkLmMpIGlzIGluZGV4ZWQgbG9naWNhbGx5ICovCisJc3RhY2tfc3RhcnQuZXNwID0gKHZvaWQgKikgaWRsZS0+dGhyZWFkLmVzcDsKKworCWlycV9jdHhfaW5pdChjcHUpOworCisJLyogTm90ZTogRG9uJ3QgbW9kaWZ5IGluaXRpYWwgc3Mgb3ZlcnJpZGUgKi8KKwlWREVCVUcoKCJWT1lBR0VSIFNNUDogQm9vdGluZyBDUFUlZCBhdCAweCVseFsleDoleF0sIHN0YWNrICVwXG4iLCBjcHUsIAorCQkodW5zaWduZWQgbG9uZyloaWphY2tfc291cmNlLnZhbCwgaGlqYWNrX3NvdXJjZS5pZHQuU2VnbWVudCwKKwkJaGlqYWNrX3NvdXJjZS5pZHQuT2Zmc2V0LCBzdGFja19zdGFydC5lc3ApKTsKKwkvKiBzZXQgdGhlIG9yaWdpbmFsIHN3YXBwZXJfcGdfZGlyWzBdIHRvIG1hcCAwIHRvIDRNYiB0cmFuc3BhcmVudGx5CisJICogKHNvIHRoYXQgdGhlIGJvb3RpbmcgQ1BVIGNhbiBmaW5kIHN0YXJ0XzMyICovCisJb3JpZ19zd2FwcGVyX3BnX2RpcjAgPSBzd2FwcGVyX3BnX2RpclswXTsKKyNpZmRlZiBDT05GSUdfTTQ4NgorCWlmKHBhZ2VfdGFibGVfY29waWVzID09IE5VTEwpCisJCXBhbmljKCJObyBmcmVlIG1lbW9yeSBmb3IgNDg2IHBhZ2UgdGFibGVzXG4iKTsKKwlmb3IoaSA9IDA7IGkgPCBQQUdFX1NJWkUvc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOyBpKyspCisJCXBhZ2VfdGFibGVfY29waWVzW2ldID0gKGkgKiBQQUdFX1NJWkUpIAorCQkJfCBfUEFHRV9SVyB8IF9QQUdFX1VTRVIgfCBfUEFHRV9QUkVTRU5UOworCisJKCh1bnNpZ25lZCBsb25nICopc3dhcHBlcl9wZ19kaXIpWzBdID0gCisJCSgodmlydF90b19waHlzKHBhZ2VfdGFibGVfY29waWVzKSkgJiBQQUdFX01BU0spCisJCXwgX1BBR0VfUlcgfCBfUEFHRV9VU0VSIHwgX1BBR0VfUFJFU0VOVDsKKyNlbHNlCisJKCh1bnNpZ25lZCBsb25nICopc3dhcHBlcl9wZ19kaXIpWzBdID0gCisJCSh2aXJ0X3RvX3BoeXMocGcwKSAmIFBBR0VfTUFTSykKKwkJfCBfUEFHRV9SVyB8IF9QQUdFX1VTRVIgfCBfUEFHRV9QUkVTRU5UOworI2VuZGlmCisKKwlpZihxdWFkX2Jvb3QpIHsKKwkJcHJpbnRrKCJDUFUgJWQ6IG5vbiBleHRlbmRlZCBRdWFkIGJvb3RcbiIsIGNwdSk7CisJCWhpamFja192ZWN0b3IgPSAoX191MzIgKilwaHlzX3RvX3ZpcnQoKFZJQ19DUFVfQk9PVF9DUEkgKyBRSUNfREVGQVVMVF9DUElfQkFTRSkqNCk7CisJCSpoaWphY2tfdmVjdG9yID0gaGlqYWNrX3NvdXJjZS52YWw7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCJDUFUlZDogZXh0ZW5kZWQgVklDIGJvb3RcbiIsIGNwdSk7CisJCWhpamFja192ZWN0b3IgPSAoX191MzIgKilwaHlzX3RvX3ZpcnQoKFZJQ19DUFVfQk9PVF9DUEkgKyBWSUNfREVGQVVMVF9DUElfQkFTRSkqNCk7CisJCSpoaWphY2tfdmVjdG9yID0gaGlqYWNrX3NvdXJjZS52YWw7CisJCS8qIFZJQyBlcnJhdGEsIG1heSBhbHNvIHJlY2VpdmUgaW50ZXJydXB0IGF0IHRoaXMgYWRkcmVzcyAqLworCQloaWphY2tfdmVjdG9yID0gKF9fdTMyICopcGh5c190b192aXJ0KChWSUNfQ1BVX0JPT1RfRVJSQVRBX0NQSSArIFZJQ19ERUZBVUxUX0NQSV9CQVNFKSo0KTsKKwkJKmhpamFja192ZWN0b3IgPSBoaWphY2tfc291cmNlLnZhbDsKKwl9CisJLyogQWxsIG5vbi1ib290IENQVXMgc3RhcnQgd2l0aCBpbnRlcnJ1cHRzIGZ1bGx5IG1hc2tlZC4gIE5lZWQKKwkgKiB0byBsb3dlciB0aGUgbWFzayBvZiB0aGUgQ1BJIHdlJ3JlIGFib3V0IHRvIHNlbmQuICBXZSBkbworCSAqIHRoaXMgaW4gdGhlIFZJQyBieSBtYXNxdWVyYWRpbmcgYXMgdGhlIHByb2Nlc3NvciB3ZSdyZQorCSAqIGFib3V0IHRvIGJvb3QgYW5kIGxvd2VyaW5nIGl0cyBpbnRlcnJ1cHQgbWFzayAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlpZihxdWFkX2Jvb3QpIHsKKwkJc2VuZF9vbmVfUUlDX0NQSShjcHUsIFZJQ19DUFVfQk9PVF9DUEkpOworCX0gZWxzZSB7CisJCW91dGIoVklDX0NQVV9NQVNRVUVSQURFX0VOQUJMRSB8IGNwdSwgVklDX1BST0NFU1NPUl9JRCk7CisJCS8qIGhlcmUgd2UncmUgYWx0ZXJpbmcgcmVnaXN0ZXJzIGJlbG9uZ2luZyB0byBgY3B1JyAqLworCQkKKwkJb3V0YihWSUNfQk9PVF9JTlRFUlJVUFRfTUFTSywgMHgyMSk7CisJCS8qIG5vdyBnbyBiYWNrIHRvIG91ciBvcmlnaW5hbCBpZGVudGl0eSAqLworCQlvdXRiKGJvb3RfY3B1X2lkLCBWSUNfUFJPQ0VTU09SX0lEKTsKKworCQkvKiBhbmQgYm9vdCB0aGUgQ1BVICovCisKKwkJc2VuZF9DUEkoKDE8PGNwdSksIFZJQ19DUFVfQk9PVF9DUEkpOworCX0KKwljcHVfYm9vdGVkX21hcCA9IDA7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJLyogbm93IHdhaXQgZm9yIGl0IHRvIGJlY29tZSByZWFkeSAob3IgdGltZW91dCkgKi8KKwlmb3IodGltZW91dCA9IDA7IHRpbWVvdXQgPCA1MDAwMDsgdGltZW91dCsrKSB7CisJCWlmKGNwdV9ib290ZWRfbWFwKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMDApOworCX0KKwkvKiByZXNldCB0aGUgcGFnZSB0YWJsZSAqLworCXN3YXBwZXJfcGdfZGlyWzBdID0gb3JpZ19zd2FwcGVyX3BnX2RpcjA7CisJbG9jYWxfZmx1c2hfdGxiKCk7CisjaWZkZWYgQ09ORklHX000ODYKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGFnZV90YWJsZV9jb3BpZXMpOworI2VuZGlmCisJICAKKwlpZiAoY3B1X2Jvb3RlZF9tYXApIHsKKwkJVkRFQlVHKCgiQ1BVJWQ6IEJvb3RlZCBzdWNjZXNzZnVsbHksIGJhY2sgaW4gQ1BVICVkXG4iLAorCQkJY3B1LCBzbXBfcHJvY2Vzc29yX2lkKCkpKTsKKwkKKwkJcHJpbnRrKCJDUFUlZDogIiwgY3B1KTsKKwkJcHJpbnRfY3B1X2luZm8oJmNwdV9kYXRhW2NwdV0pOworCQl3bWIoKTsKKwkJY3B1X3NldChjcHUsIGNwdV9jYWxsb3V0X21hcCk7CisJfQorCWVsc2UgeworCQlwcmludGsoIkNQVSVkIEZBSUxFRCBUTyBCT09UOiAiLCBjcHUpOworCQlpZiAoKigodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKXBoeXNfdG9fdmlydChzdGFydF9waHlzX2FkZHJlc3MpKT09MHhBNSkKKwkJCXByaW50aygiU3R1Y2suXG4iKTsKKwkJZWxzZQorCQkJcHJpbnRrKCJOb3QgcmVzcG9uZGluZy5cbiIpOworCQkKKwkJY3B1Y291bnQtLTsKKwl9Cit9CisKK3ZvaWQgX19pbml0CitzbXBfYm9vdF9jcHVzKHZvaWQpCit7CisJaW50IGk7CisKKwkvKiBDQVQgQlVTIGluaXRpYWxpc2F0aW9uIG11c3QgYmUgZG9uZSBhZnRlciB0aGUgbWVtb3J5ICovCisJLyogRklYTUU6IFRoZSBMNCBoYXMgYSBjYXRidXMgdG9vLCBpdCBqdXN0IG5lZWRzIHRvIGJlCisJICogYWNjZXNzZWQgaW4gYSB0b3RhbGx5IGRpZmZlcmVudCB3YXkgKi8KKwlpZih2b3lhZ2VyX2xldmVsID09IDUpIHsKKwkJdm95YWdlcl9jYXRfaW5pdCgpOworCisJCS8qIG5vdyB0aGF0IHRoZSBjYXQgaGFzIHByb2JlZCB0aGUgVm95YWdlciBTeXN0ZW0gQnVzLCBzYW5pdHkKKwkJICogY2hlY2sgdGhlIGNwdSBtYXAgKi8KKwkJaWYoICgodm95YWdlcl9xdWFkX3Byb2Nlc3NvcnMgfCB2b3lhZ2VyX2V4dGVuZGVkX3ZpY19wcm9jZXNzb3JzKQorCQkgICAgICYgY3B1c19hZGRyKHBoeXNfY3B1X3ByZXNlbnRfbWFwKVswXSkgIT0gY3B1c19hZGRyKHBoeXNfY3B1X3ByZXNlbnRfbWFwKVswXSkgeworCQkJLyogc2hvdWxkIHBhbmljICovCisJCQlwcmludGsoIlxuXG4qKipXQVJOSU5HKioqIFNhbml0eSBjaGVjayBvZiBDUFUgcHJlc2VudCBtYXAgRkFJTEVEXG4iKTsKKwkJfQorCX0gZWxzZSBpZih2b3lhZ2VyX2xldmVsID09IDQpCisJCXZveWFnZXJfZXh0ZW5kZWRfdmljX3Byb2Nlc3NvcnMgPSBjcHVzX2FkZHIocGh5c19jcHVfcHJlc2VudF9tYXApWzBdOworCisJLyogdGhpcyBzZXRzIHVwIHRoZSBpZGxlIHRhc2sgdG8gcnVuIG9uIHRoZSBjdXJyZW50IGNwdSAqLworCXZveWFnZXJfZXh0ZW5kZWRfY3B1cyA9IDE7CisJLyogUmVtb3ZlIHRoZSBnbG9iYWxfaXJxX2hvbGRlciBzZXR0aW5nLCBpdCB0cmlnZ2VycyBhIEJVRygpIG9uCisJICogc2NoZWR1bGUgYXQgdGhlIG1vbWVudCAqLworCS8vZ2xvYmFsX2lycV9ob2xkZXIgPSBib290X2NwdV9pZDsKKworCS8qIEZJWE1FOiBOZWVkIHRvIGRvIHNvbWV0aGluZyBhYm91dCB0aGlzIGJ1dCBjdXJyZW50bHkgb25seSB3b3JrcworCSAqIG9uIENQVXMgd2l0aCBhIHRzYyB3aGljaCBub25lIG9mIG1pbmUgaGF2ZS4gCisJc21wX3R1bmVfc2NoZWR1bGluZygpOworCSAqLworCXNtcF9zdG9yZV9jcHVfaW5mbyhib290X2NwdV9pZCk7CisJcHJpbnRrKCJDUFUlZDogIiwgYm9vdF9jcHVfaWQpOworCXByaW50X2NwdV9pbmZvKCZjcHVfZGF0YVtib290X2NwdV9pZF0pOworCisJaWYoaXNfY3B1X3F1YWQoKSkgeworCQkvKiBib290aW5nIG9uIGEgUXVhZCBDUFUgKi8KKwkJcHJpbnRrKCJWT1lBR0VSIFNNUDogQm9vdCBDUFUgaXMgUXVhZFxuIik7CisJCXFpY19zZXR1cCgpOworCQlkb19xdWFkX2Jvb3RzdHJhcCgpOworCX0KKworCS8qIGVuYWJsZSBvdXIgb3duIENQSXMgKi8KKwl2aWNfZW5hYmxlX2NwaSgpOworCisJY3B1X3NldChib290X2NwdV9pZCwgY3B1X29ubGluZV9tYXApOworCWNwdV9zZXQoYm9vdF9jcHVfaWQsIGNwdV9jYWxsb3V0X21hcCk7CisJCisJLyogbG9vcCBvdmVyIGFsbCB0aGUgZXh0ZW5kZWQgVklDIENQVXMgYW5kIGJvb3QgdGhlbS4gIFRoZSAKKwkgKiBRdWFkIENQVXMgbXVzdCBiZSBib290c3RyYXBwZWQgYnkgdGhlaXIgZXh0ZW5kZWQgVklDIGNwdSAqLworCWZvcihpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgeworCQlpZihpID09IGJvb3RfY3B1X2lkIHx8ICFjcHVfaXNzZXQoaSwgcGh5c19jcHVfcHJlc2VudF9tYXApKQorCQkJY29udGludWU7CisJCWRvX2Jvb3RfY3B1KGkpOworCQkvKiBUaGlzIHVkZWxheSBzZWVtcyB0byBiZSBuZWVkZWQgZm9yIHRoZSBRdWFkIGJvb3RzCisJCSAqIGRvbid0IHJlbW92ZSB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcgKi8KKwkJdWRlbGF5KDEwMDApOworCX0KKwkvKiB3ZSBjb3VsZCBjb21wdXRlIHRoZSB0b3RhbCBib2dvbWlwcyBoZXJlLCBidXQgd2h5IGJvdGhlcj8sCisJICogQ29kZSBhZGRlZCBmcm9tIHNtcGJvb3QuYyAqLworCXsKKwkJdW5zaWduZWQgbG9uZyBib2dvc3VtID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykKKwkJCWlmIChjcHVfaXNzZXQoaSwgY3B1X29ubGluZV9tYXApKQorCQkJCWJvZ29zdW0gKz0gY3B1X2RhdGFbaV0ubG9vcHNfcGVyX2ppZmZ5OworCQlwcmludGsoS0VSTl9JTkZPICJUb3RhbCBvZiAlZCBwcm9jZXNzb3JzIGFjdGl2YXRlZCAoJWx1LiUwMmx1IEJvZ29NSVBTKS5cbiIsCisJCQljcHVjb3VudCsxLAorCQkJYm9nb3N1bS8oNTAwMDAwL0haKSwKKwkJCShib2dvc3VtLyg1MDAwL0haKSklMTAwKTsKKwl9CisJdm95YWdlcl9leHRlbmRlZF9jcHVzID0gaHdlaWdodDMyKHZveWFnZXJfZXh0ZW5kZWRfdmljX3Byb2Nlc3NvcnMpOworCXByaW50aygiVk9ZQUdFUjogRXh0ZW5kZWQgKGludGVycnVwdCBoYW5kbGluZyBDUFVzKTogJWQsIG5vbi1leHRlbmRlZDogJWRcbiIsIHZveWFnZXJfZXh0ZW5kZWRfY3B1cywgbnVtX2Jvb3RpbmdfY3B1cygpIC0gdm95YWdlcl9leHRlbmRlZF9jcHVzKTsKKwkvKiB0aGF0J3MgaXQsIHN3aXRjaCB0byBzeW1tZXRyaWMgbW9kZSAqLworCW91dGIoMCwgVklDX1BSSU9SSVRZX1JFR0lTVEVSKTsKKwlvdXRiKDAsIFZJQ19DTEFJTV9SRUdJU1RFUl8wKTsKKwlvdXRiKDAsIFZJQ19DTEFJTV9SRUdJU1RFUl8xKTsKKwkKKwlWREVCVUcoKCJWT1lBR0VSIFNNUDogQm9vdGVkIHdpdGggJWQgQ1BVc1xuIiwgbnVtX2Jvb3RpbmdfY3B1cygpKSk7Cit9CisKKy8qIFJlbG9hZCB0aGUgc2Vjb25kYXJ5IENQVXMgdGFzayBzdHJ1Y3R1cmUgKHRoaXMgZnVuY3Rpb24gZG9lcyBub3QKKyAqIHJldHVybiApICovCit2b2lkIF9faW5pdCAKK2luaXRpYWxpemVfc2Vjb25kYXJ5KHZvaWQpCit7CisjaWYgMAorCS8vIEFDIGtlcm5lbHMgb25seQorCXNldF9jdXJyZW50KGhhcmRfZ2V0X2N1cnJlbnQoKSk7CisjZW5kaWYKKworCS8qCisJICogV2UgZG9uJ3QgYWN0dWFsbHkgbmVlZCB0byBsb2FkIHRoZSBmdWxsIFRTUywKKwkgKiBiYXNpY2FsbHkganVzdCB0aGUgc3RhY2sgcG9pbnRlciBhbmQgdGhlIGVpcC4KKwkgKi8KKworCWFzbSB2b2xhdGlsZSgKKwkJIm1vdmwgJTAsJSVlc3Bcblx0IgorCQkiam1wIColMSIKKwkJOgorCQk6InIiIChjdXJyZW50LT50aHJlYWQuZXNwKSwiciIgKGN1cnJlbnQtPnRocmVhZC5laXApKTsKK30KKworLyogaGFuZGxlIGEgVm95YWdlciBTWVNfSU5UIC0tIElmIHdlIGRvbid0LCB0aGUgYmFzZSBib2FyZCB3aWxsCisgKiBwYW5pYyB0aGUgc3lzdGVtLgorICoKKyAqIFN5c3RlbSBpbnRlcnJ1cHRzIG9jY3VyIGJlY2F1c2Ugc29tZSBwcm9ibGVtIHdhcyBkZXRlY3RlZCBvbiB0aGUKKyAqIHZhcmlvdXMgYnVzc2VzLiAgVG8gZmluZCBvdXQgd2hhdCB5b3UgaGF2ZSB0byBwcm9iZSBhbGwgdGhlCisgKiBoYXJkd2FyZSB2aWEgdGhlIENBVCBidXMuICBGSVhNRTogQXQgdGhlIG1vbWVudCB3ZSBkbyBub3RoaW5nLiAqLworZmFzdGNhbGwgdm9pZAorc21wX3ZpY19zeXNfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWFja19DUEkoVklDX1NZU19JTlQpOworCXByaW50aygiVm95YWdlciBTWVNURU0gSU5URVJSVVBUXG4iKTsKK30KKworLyogSGFuZGxlIGEgdm95YWdlciBDTU5fSU5UOyBUaGVzZSBpbnRlcnJ1cHRzIG9jY3VyIGVpdGhlciBiZWNhdXNlIG9mCisgKiBhIHN5c3RlbSBzdGF0dXMgY2hhbmdlIG9yIGJlY2F1c2UgYSBzaW5nbGUgYml0IG1lbW9yeSBlcnJvcgorICogb2NjdXJyZWQuICBGSVhNRTogQXQgdGhlIG1vbWVudCwgaWdub3JlIGFsbCB0aGlzLiAqLworZmFzdGNhbGwgdm9pZAorc21wX3ZpY19jbW5faW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0YXRpYyBfX3U4IGluX2Ntbl9pbnQgPSAwOworCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soY21uX2ludF9sb2NrKTsKKworCS8qIGNvbW1vbiBpbnRzIGFyZSBicm9hZGNhc3QsIHNvIG1ha2Ugc3VyZSB3ZSBvbmx5IGRvIHRoaXMgb25jZSAqLworCV9yYXdfc3Bpbl9sb2NrKCZjbW5faW50X2xvY2spOworCWlmKGluX2Ntbl9pbnQpCisJCWdvdG8gdW5sb2NrX2VuZDsKKworCWluX2Ntbl9pbnQrKzsKKwlfcmF3X3NwaW5fdW5sb2NrKCZjbW5faW50X2xvY2spOworCisJVkRFQlVHKCgiVm95YWdlciBDT01NT04gSU5URVJSVVBUXG4iKSk7CisKKwlpZih2b3lhZ2VyX2xldmVsID09IDUpCisJCXZveWFnZXJfY2F0X2RvX2NvbW1vbl9pbnRlcnJ1cHQoKTsKKworCV9yYXdfc3Bpbl9sb2NrKCZjbW5faW50X2xvY2spOworCWluX2Ntbl9pbnQgPSAwOworIHVubG9ja19lbmQ6CisJX3Jhd19zcGluX3VubG9jaygmY21uX2ludF9sb2NrKTsKKwlhY2tfQ1BJKFZJQ19DTU5fSU5UKTsKK30KKworLyoKKyAqIFJlc2NoZWR1bGUgY2FsbCBiYWNrLiBOb3RoaW5nIHRvIGRvLCBhbGwgdGhlIHdvcmsgaXMgZG9uZQorICogYXV0b21hdGljYWxseSB3aGVuIHdlIHJldHVybiBmcm9tIHRoZSBpbnRlcnJ1cHQuICAqLworc3RhdGljIHZvaWQKK3NtcF9yZXNjaGVkdWxlX2ludGVycnVwdCh2b2lkKQoreworCS8qIGRvIG5vdGhpbmcgKi8KK30KKworc3RhdGljIHN0cnVjdCBtbV9zdHJ1Y3QgKiBmbHVzaF9tbTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZsdXNoX3ZhOworc3RhdGljIERFRklORV9TUElOTE9DSyh0bGJzdGF0ZV9sb2NrKTsKKyNkZWZpbmUgRkxVU0hfQUxMCTB4ZmZmZmZmZmYKKworLyoKKyAqIFdlIGNhbm5vdCBjYWxsIG1tZHJvcCgpIGJlY2F1c2Ugd2UgYXJlIGluIGludGVycnVwdCBjb250ZXh0LCAKKyAqIGluc3RlYWQgdXBkYXRlIG1tLT5jcHVfdm1fbWFzay4KKyAqCisgKiBXZSBuZWVkIHRvIHJlbG9hZCAlY3IzIHNpbmNlIHRoZSBwYWdlIHRhYmxlcyBtYXkgYmUgZ29pbmcKKyAqIGF3YXkgZnJvbSB1bmRlciB1cy4uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorbGVhdmVfbW0gKHVuc2lnbmVkIGxvbmcgY3B1KQoreworCWlmIChwZXJfY3B1KGNwdV90bGJzdGF0ZSwgY3B1KS5zdGF0ZSA9PSBUTEJTVEFURV9PSykKKwkJQlVHKCk7CisJY3B1X2NsZWFyKGNwdSwgcGVyX2NwdShjcHVfdGxic3RhdGUsIGNwdSkuYWN0aXZlX21tLT5jcHVfdm1fbWFzayk7CisJbG9hZF9jcjMoc3dhcHBlcl9wZ19kaXIpOworfQorCisKKy8qCisgKiBJbnZhbGlkYXRlIGNhbGwtYmFjaworICovCitzdGF0aWMgdm9pZCAKK3NtcF9pbnZhbGlkYXRlX2ludGVycnVwdCh2b2lkKQoreworCV9fdTggY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJaWYgKCF0ZXN0X2JpdChjcHUsICZzbXBfaW52YWxpZGF0ZV9uZWVkZWQpKQorCQlyZXR1cm47CisJLyogVGhpcyB3aWxsIGZsb29kIG1lc3NhZ2VzLiAgRG9uJ3QgdW5jb21tZW50IHVubGVzcyB5b3Ugc2VlCisJICogUHJvYmxlbXMgd2l0aCBjcm9zcyBjcHUgaW52YWxpZGF0aW9uCisJVkRFQlVHKCgiVk9ZQUdFUiBTTVA6IENQVSVkIHJlY2VpdmVkIElOVkFMSURBVEVfQ1BJXG4iLAorCQlzbXBfcHJvY2Vzc29yX2lkKCkpKTsKKwkqLworCisJaWYgKGZsdXNoX21tID09IHBlcl9jcHUoY3B1X3RsYnN0YXRlLCBjcHUpLmFjdGl2ZV9tbSkgeworCQlpZiAocGVyX2NwdShjcHVfdGxic3RhdGUsIGNwdSkuc3RhdGUgPT0gVExCU1RBVEVfT0spIHsKKwkJCWlmIChmbHVzaF92YSA9PSBGTFVTSF9BTEwpCisJCQkJbG9jYWxfZmx1c2hfdGxiKCk7CisJCQllbHNlCisJCQkJX19mbHVzaF90bGJfb25lKGZsdXNoX3ZhKTsKKwkJfSBlbHNlCisJCQlsZWF2ZV9tbShjcHUpOworCX0KKwlzbXBfbWJfX2JlZm9yZV9jbGVhcl9iaXQoKTsKKwljbGVhcl9iaXQoY3B1LCAmc21wX2ludmFsaWRhdGVfbmVlZGVkKTsKKwlzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpOworfQorCisvKiBBbGwgdGhlIG5ldyBmbHVzaCBvcGVyYXRpb25zIGZvciAyLjQgKi8KKworCisvKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdpdGggYSBwaHlzaWNhbCBjcHUgbWFzayAqLworc3RhdGljIHZvaWQKK2ZsdXNoX3RsYl9vdGhlcnMgKHVuc2lnbmVkIGxvbmcgY3B1bWFzaywgc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCQkJCQl1bnNpZ25lZCBsb25nIHZhKQoreworCWludCBzdHVjayA9IDUwMDAwOworCisJaWYgKCFjcHVtYXNrKQorCQlCVUcoKTsKKwlpZiAoKGNwdW1hc2sgJiBjcHVzX2FkZHIoY3B1X29ubGluZV9tYXApWzBdKSAhPSBjcHVtYXNrKQorCQlCVUcoKTsKKwlpZiAoY3B1bWFzayAmICgxIDw8IHNtcF9wcm9jZXNzb3JfaWQoKSkpCisJCUJVRygpOworCWlmICghbW0pCisJCUJVRygpOworCisJc3Bpbl9sb2NrKCZ0bGJzdGF0ZV9sb2NrKTsKKwkKKwlmbHVzaF9tbSA9IG1tOworCWZsdXNoX3ZhID0gdmE7CisJYXRvbWljX3NldF9tYXNrKGNwdW1hc2ssICZzbXBfaW52YWxpZGF0ZV9uZWVkZWQpOworCS8qCisJICogV2UgaGF2ZSB0byBzZW5kIHRoZSBDUEkgb25seSB0bworCSAqIENQVXMgYWZmZWN0ZWQuCisJICovCisJc2VuZF9DUEkoY3B1bWFzaywgVklDX0lOVkFMSURBVEVfQ1BJKTsKKworCXdoaWxlIChzbXBfaW52YWxpZGF0ZV9uZWVkZWQpIHsKKwkJbWIoKTsKKwkJaWYoLS1zdHVjayA9PSAwKSB7CisJCQlwcmludGsoIioqKldBUk5JTkcqKiogU3R1Y2sgZG9pbmcgaW52YWxpZGF0ZSBDUEkgKENQVSVkKVxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogVW5jb21tZW50IG9ubHkgdG8gZGVidWcgaW52YWxpZGF0aW9uIHByb2JsZW1zCisJVkRFQlVHKCgiVk9ZQUdFUiBTTVA6IENvbXBsZXRlZCBpbnZhbGlkYXRlIENQSSAoQ1BVJWQpXG4iLCBjcHUpKTsKKwkqLworCisJZmx1c2hfbW0gPSBOVUxMOworCWZsdXNoX3ZhID0gMDsKKwlzcGluX3VubG9jaygmdGxic3RhdGVfbG9jayk7Cit9CisKK3ZvaWQKK2ZsdXNoX3RsYl9jdXJyZW50X3Rhc2sodm9pZCkKK3sKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOworCXVuc2lnbmVkIGxvbmcgY3B1X21hc2s7CisKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKworCWNwdV9tYXNrID0gY3B1c19hZGRyKG1tLT5jcHVfdm1fbWFzaylbMF0gJiB+KDEgPDwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwlsb2NhbF9mbHVzaF90bGIoKTsKKwlpZiAoY3B1X21hc2spCisJCWZsdXNoX3RsYl9vdGhlcnMoY3B1X21hc2ssIG1tLCBGTFVTSF9BTEwpOworCisJcHJlZW1wdF9lbmFibGUoKTsKK30KKworCit2b2lkCitmbHVzaF90bGJfbW0gKHN0cnVjdCBtbV9zdHJ1Y3QgKiBtbSkKK3sKKwl1bnNpZ25lZCBsb25nIGNwdV9tYXNrOworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisKKwljcHVfbWFzayA9IGNwdXNfYWRkcihtbS0+Y3B1X3ZtX21hc2spWzBdICYgfigxIDw8IHNtcF9wcm9jZXNzb3JfaWQoKSk7CisKKwlpZiAoY3VycmVudC0+YWN0aXZlX21tID09IG1tKSB7CisJCWlmIChjdXJyZW50LT5tbSkKKwkJCWxvY2FsX2ZsdXNoX3RsYigpOworCQllbHNlCisJCQlsZWF2ZV9tbShzbXBfcHJvY2Vzc29yX2lkKCkpOworCX0KKwlpZiAoY3B1X21hc2spCisJCWZsdXNoX3RsYl9vdGhlcnMoY3B1X21hc2ssIG1tLCBGTFVTSF9BTEwpOworCisJcHJlZW1wdF9lbmFibGUoKTsKK30KKwordm9pZCBmbHVzaF90bGJfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWEsIHVuc2lnbmVkIGxvbmcgdmEpCit7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtPnZtX21tOworCXVuc2lnbmVkIGxvbmcgY3B1X21hc2s7CisKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKworCWNwdV9tYXNrID0gY3B1c19hZGRyKG1tLT5jcHVfdm1fbWFzaylbMF0gJiB+KDEgPDwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwlpZiAoY3VycmVudC0+YWN0aXZlX21tID09IG1tKSB7CisJCWlmKGN1cnJlbnQtPm1tKQorCQkJX19mbHVzaF90bGJfb25lKHZhKTsKKwkJIGVsc2UKKwkJIAlsZWF2ZV9tbShzbXBfcHJvY2Vzc29yX2lkKCkpOworCX0KKworCWlmIChjcHVfbWFzaykKKwkJZmx1c2hfdGxiX290aGVycyhjcHVfbWFzaywgbW0sIHZhKTsKKworCXByZWVtcHRfZW5hYmxlKCk7Cit9CisKKy8qIGVuYWJsZSB0aGUgcmVxdWVzdGVkIElSUXMgKi8KK3N0YXRpYyB2b2lkCitzbXBfZW5hYmxlX2lycV9pbnRlcnJ1cHQodm9pZCkKK3sKKwlfX3U4IGlycTsKKwlfX3U4IGNwdSA9IGdldF9jcHUoKTsKKworCVZERUJVRygoIlZPWUFHRVIgU01QOiBDUFUlZCBlbmFibGluZyBpcnEgbWFzayAweCV4XG4iLCBjcHUsCisJICAgICAgIHZpY19pcnFfZW5hYmxlX21hc2tbY3B1XSkpOworCisJc3Bpbl9sb2NrKCZ2aWNfaXJxX2xvY2spOworCWZvcihpcnEgPSAwOyBpcnEgPCAxNjsgaXJxKyspIHsKKwkJaWYodmljX2lycV9lbmFibGVfbWFza1tjcHVdICYgKDE8PGlycSkpCisJCQllbmFibGVfbG9jYWxfdmljX2lycShpcnEpOworCX0KKwl2aWNfaXJxX2VuYWJsZV9tYXNrW2NwdV0gPSAwOworCXNwaW5fdW5sb2NrKCZ2aWNfaXJxX2xvY2spOworCisJcHV0X2NwdV9ub19yZXNjaGVkKCk7Cit9CisJCisvKgorICoJQ1BVIGhhbHQgY2FsbC1iYWNrCisgKi8KK3N0YXRpYyB2b2lkCitzbXBfc3RvcF9jcHVfZnVuY3Rpb24odm9pZCAqZHVtbXkpCit7CisJVkRFQlVHKCgiVk9ZQUdFUiBTTVA6IENQVSVkIGlzIFNUT1BQSU5HXG4iLCBzbXBfcHJvY2Vzc29yX2lkKCkpKTsKKwljcHVfY2xlYXIoc21wX3Byb2Nlc3Nvcl9pZCgpLCBjcHVfb25saW5lX21hcCk7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlmb3IoOzspCisJICAgICAgIF9fYXNtX18oImhsdCIpOworfQorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNhbGxfbG9jayk7CisKK3N0cnVjdCBjYWxsX2RhdGFfc3RydWN0IHsKKwl2b2lkICgqZnVuYykgKHZvaWQgKmluZm8pOworCXZvaWQgKmluZm87CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBzdGFydGVkOworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgZmluaXNoZWQ7CisJaW50IHdhaXQ7Cit9OworCitzdGF0aWMgc3RydWN0IGNhbGxfZGF0YV9zdHJ1Y3QgKiBjYWxsX2RhdGE7CisKKy8qIGV4ZWN1dGUgYSB0aHJlYWQgb24gYSBuZXcgQ1BVLiAgVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBtdXN0IGJlCisgKiBwcmV2aW91c2x5IHNldCB1cC4gIFRoaXMgaXMgdXNlZCB0byBzY2hlZHVsZSBhIGZ1bmN0aW9uIGZvcgorICogZXhlY3V0aW9uIG9uIGFsbCBDUFUncyAtIHNldCB1cCB0aGUgZnVuY3Rpb24gdGhlbiBicm9hZGNhc3QgYQorICogZnVuY3Rpb25faW50ZXJydXB0IENQSSB0byBjb21lIGhlcmUgb24gZWFjaCBDUFUgKi8KK3N0YXRpYyB2b2lkCitzbXBfY2FsbF9mdW5jdGlvbl9pbnRlcnJ1cHQodm9pZCkKK3sKKwl2b2lkICgqZnVuYykgKHZvaWQgKmluZm8pID0gY2FsbF9kYXRhLT5mdW5jOworCXZvaWQgKmluZm8gPSBjYWxsX2RhdGEtPmluZm87CisJLyogbXVzdCB0YWtlIGNvcHkgb2Ygd2FpdCBiZWNhdXNlIGNhbGxfZGF0YSBtYXkgYmUgcmVwbGFjZWQKKwkgKiB1bmxlc3MgdGhlIGZ1bmN0aW9uIGlzIHdhaXRpbmcgZm9yIHVzIHRvIGZpbmlzaCAqLworCWludCB3YWl0ID0gY2FsbF9kYXRhLT53YWl0OworCV9fdTggY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJLyoKKwkgKiBOb3RpZnkgaW5pdGlhdGluZyBDUFUgdGhhdCBJJ3ZlIGdyYWJiZWQgdGhlIGRhdGEgYW5kIGFtCisJICogYWJvdXQgdG8gZXhlY3V0ZSB0aGUgZnVuY3Rpb24KKwkgKi8KKwltYigpOworCWlmKCF0ZXN0X2FuZF9jbGVhcl9iaXQoY3B1LCAmY2FsbF9kYXRhLT5zdGFydGVkKSkgeworCQkvKiBJZiB0aGUgYml0IHdhc24ndCBzZXQsIHRoaXMgY291bGQgYmUgYSByZXBsYXkgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVk9ZQUdFUiBTTVA6IENQVSAlZCByZWNlaXZlZCBjYWxsIGZ1bnRpb24gd2l0aCBubyBjYWxsIHBlbmRpbmdcbiIsIGNwdSk7CisJCXJldHVybjsKKwl9CisJLyoKKwkgKiBBdCB0aGlzIHBvaW50IHRoZSBpbmZvIHN0cnVjdHVyZSBtYXkgYmUgb3V0IG9mIHNjb3BlIHVubGVzcyB3YWl0PT0xCisJICovCisJaXJxX2VudGVyKCk7CisJKCpmdW5jKShpbmZvKTsKKwlpcnFfZXhpdCgpOworCWlmICh3YWl0KSB7CisJCW1iKCk7CisJCWNsZWFyX2JpdChjcHUsICZjYWxsX2RhdGEtPmZpbmlzaGVkKTsKKwl9Cit9CisKKy8qIENhbGwgdGhpcyBmdW5jdGlvbiBvbiBhbGwgQ1BVcyB1c2luZyB0aGUgZnVuY3Rpb25faW50ZXJydXB0IGFib3ZlIAorICAgIDxmdW5jPiBUaGUgZnVuY3Rpb24gdG8gcnVuLiBUaGlzIG11c3QgYmUgZmFzdCBhbmQgbm9uLWJsb2NraW5nLgorICAgIDxpbmZvPiBBbiBhcmJpdHJhcnkgcG9pbnRlciB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbi4KKyAgICA8cmV0cnk+IElmIHRydWUsIGtlZXAgcmV0cnlpbmcgdW50aWwgcmVhZHkuCisgICAgPHdhaXQ+IElmIHRydWUsIHdhaXQgdW50aWwgZnVuY3Rpb24gaGFzIGNvbXBsZXRlZCBvbiBvdGhlciBDUFVzLgorICAgIFtSRVRVUk5TXSAwIG9uIHN1Y2Nlc3MsIGVsc2UgYSBuZWdhdGl2ZSBzdGF0dXMgY29kZS4gRG9lcyBub3QgcmV0dXJuIHVudGlsCisgICAgcmVtb3RlIENQVXMgYXJlIG5lYXJseSByZWFkeSB0byBleGVjdXRlIDw8ZnVuYz4+IG9yIGFyZSBvciBoYXZlIGV4ZWN1dGVkLgorKi8KK2ludAorc21wX2NhbGxfZnVuY3Rpb24gKHZvaWQgKCpmdW5jKSAodm9pZCAqaW5mbyksIHZvaWQgKmluZm8sIGludCByZXRyeSwKKwkJICAgaW50IHdhaXQpCit7CisJc3RydWN0IGNhbGxfZGF0YV9zdHJ1Y3QgZGF0YTsKKwlfX3UzMiBtYXNrID0gY3B1c19hZGRyKGNwdV9vbmxpbmVfbWFwKVswXTsKKworCW1hc2sgJj0gfigxPDxzbXBfcHJvY2Vzc29yX2lkKCkpOworCisJaWYgKCFtYXNrKQorCQlyZXR1cm4gMDsKKworCS8qIENhbiBkZWFkbG9jayB3aGVuIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQgKi8KKwlXQVJOX09OKGlycXNfZGlzYWJsZWQoKSk7CisKKwlkYXRhLmZ1bmMgPSBmdW5jOworCWRhdGEuaW5mbyA9IGluZm87CisJZGF0YS5zdGFydGVkID0gbWFzazsKKwlkYXRhLndhaXQgPSB3YWl0OworCWlmICh3YWl0KQorCQlkYXRhLmZpbmlzaGVkID0gbWFzazsKKworCXNwaW5fbG9jaygmY2FsbF9sb2NrKTsKKwljYWxsX2RhdGEgPSAmZGF0YTsKKwl3bWIoKTsKKwkvKiBTZW5kIGEgbWVzc2FnZSB0byBhbGwgb3RoZXIgQ1BVcyBhbmQgd2FpdCBmb3IgdGhlbSB0byByZXNwb25kICovCisJc2VuZF9DUElfYWxsYnV0c2VsZihWSUNfQ0FMTF9GVU5DVElPTl9DUEkpOworCisJLyogV2FpdCBmb3IgcmVzcG9uc2UgKi8KKwl3aGlsZSAoZGF0YS5zdGFydGVkKQorCQliYXJyaWVyKCk7CisKKwlpZiAod2FpdCkKKwkJd2hpbGUgKGRhdGEuZmluaXNoZWQpCisJCQliYXJyaWVyKCk7CisKKwlzcGluX3VubG9jaygmY2FsbF9sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKiBTb3JyeSBhYm91dCB0aGUgbmFtZS4gIEluIGFuIEFQSUMgYmFzZWQgc3lzdGVtLCB0aGUgQVBJQ3MKKyAqIHRoZW1zZWx2ZXMgYXJlIHByb2dyYW1tZWQgdG8gc2VuZCBhIHRpbWVyIGludGVycnVwdC4gIFRoaXMgaXMgdXNlZAorICogYnkgbGludXggdG8gcmVzY2hlZHVsZSB0aGUgcHJvY2Vzc29yLiAgVm95YWdlciBkb2Vzbid0IGhhdmUgdGhpcywKKyAqIHNvIHdlIHVzZSB0aGUgc3lzdGVtIGNsb2NrIHRvIGludGVycnVwdCBvbmUgcHJvY2Vzc29yLCB3aGljaCBpbgorICogdHVybiwgYnJvYWRjYXN0cyBhIHRpbWVyIENQSSB0byBhbGwgdGhlIG90aGVycyAtLS0gd2UgcmVjZWl2ZSB0aGF0CisgKiBDUEkgaGVyZS4gIFdlIGRvbid0IHVzZSB0aGlzIGFjdHVhbGx5IGZvciBjb3VudGluZyBzbyBsb3NpbmcKKyAqIHRpY2tzIGRvZXNuJ3QgbWF0dGVyIAorICoKKyAqIEZJWE1FOiBGb3IgdGhvc2UgQ1BVJ3Mgd2hpY2ggYWN0dWFsbHkgaGF2ZSBhIGxvY2FsIEFQSUMsIHdlIGNvdWxkCisgKiB0cnkgdG8gdXNlIGl0IHRvIHRyaWdnZXIgdGhpcyBpbnRlcnJ1cHQgaW5zdGVhZCBvZiBoYXZpbmcgdG8KKyAqIGJyb2FkY2FzdCB0aGUgdGltZXIgdGljay4gIFVuZm9ydHVuYXRlbHksIGFsbCBteSBwZW50aXVtIERZQURzIGhhdmUKKyAqIG5vIGxvY2FsIEFQSUMsIHNvIEkgY2FuJ3QgZG8gdGhpcworICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY3VycmVudGx5IGEgcGxhY2Vob2xkZXIgYW5kIGlzIHVudXNlZCBpbiB0aGUgY29kZSAqLworZmFzdGNhbGwgdm9pZCAKK3NtcF9hcGljX3RpbWVyX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl3cmFwcGVyX3NtcF9sb2NhbF90aW1lcl9pbnRlcnJ1cHQocmVncyk7Cit9CisKKy8qIEFsbCBvZiB0aGUgUVVBRCBpbnRlcnJ1cHQgR0FURVMgKi8KK2Zhc3RjYWxsIHZvaWQKK3NtcF9xaWNfdGltZXJfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWFja19RSUNfQ1BJKFFJQ19USU1FUl9DUEkpOworCXdyYXBwZXJfc21wX2xvY2FsX3RpbWVyX2ludGVycnVwdChyZWdzKTsKK30KKworZmFzdGNhbGwgdm9pZAorc21wX3FpY19pbnZhbGlkYXRlX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlhY2tfUUlDX0NQSShRSUNfSU5WQUxJREFURV9DUEkpOworCXNtcF9pbnZhbGlkYXRlX2ludGVycnVwdCgpOworfQorCitmYXN0Y2FsbCB2b2lkCitzbXBfcWljX3Jlc2NoZWR1bGVfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWFja19RSUNfQ1BJKFFJQ19SRVNDSEVEVUxFX0NQSSk7CisJc21wX3Jlc2NoZWR1bGVfaW50ZXJydXB0KCk7Cit9CisKK2Zhc3RjYWxsIHZvaWQKK3NtcF9xaWNfZW5hYmxlX2lycV9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJYWNrX1FJQ19DUEkoUUlDX0VOQUJMRV9JUlFfQ1BJKTsKKwlzbXBfZW5hYmxlX2lycV9pbnRlcnJ1cHQoKTsKK30KKworZmFzdGNhbGwgdm9pZAorc21wX3FpY19jYWxsX2Z1bmN0aW9uX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlhY2tfUUlDX0NQSShRSUNfQ0FMTF9GVU5DVElPTl9DUEkpOworCXNtcF9jYWxsX2Z1bmN0aW9uX2ludGVycnVwdCgpOworfQorCitmYXN0Y2FsbCB2b2lkCitzbXBfdmljX2NwaV9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJX191OCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlpZihpc19jcHVfcXVhZCgpKQorCQlhY2tfUUlDX0NQSShWSUNfQ1BJX0xFVkVMMCk7CisJZWxzZQorCQlhY2tfVklDX0NQSShWSUNfQ1BJX0xFVkVMMCk7CisKKwlpZih0ZXN0X2FuZF9jbGVhcl9iaXQoVklDX1RJTUVSX0NQSSwgJnZpY19jcGlfbWFpbGJveFtjcHVdKSkKKwkJd3JhcHBlcl9zbXBfbG9jYWxfdGltZXJfaW50ZXJydXB0KHJlZ3MpOworCWlmKHRlc3RfYW5kX2NsZWFyX2JpdChWSUNfSU5WQUxJREFURV9DUEksICZ2aWNfY3BpX21haWxib3hbY3B1XSkpCisJCXNtcF9pbnZhbGlkYXRlX2ludGVycnVwdCgpOworCWlmKHRlc3RfYW5kX2NsZWFyX2JpdChWSUNfUkVTQ0hFRFVMRV9DUEksICZ2aWNfY3BpX21haWxib3hbY3B1XSkpCisJCXNtcF9yZXNjaGVkdWxlX2ludGVycnVwdCgpOworCWlmKHRlc3RfYW5kX2NsZWFyX2JpdChWSUNfRU5BQkxFX0lSUV9DUEksICZ2aWNfY3BpX21haWxib3hbY3B1XSkpCisJCXNtcF9lbmFibGVfaXJxX2ludGVycnVwdCgpOworCWlmKHRlc3RfYW5kX2NsZWFyX2JpdChWSUNfQ0FMTF9GVU5DVElPTl9DUEksICZ2aWNfY3BpX21haWxib3hbY3B1XSkpCisJCXNtcF9jYWxsX2Z1bmN0aW9uX2ludGVycnVwdCgpOworfQorCitzdGF0aWMgdm9pZAorZG9fZmx1c2hfdGxiX2FsbCh2b2lkKiBpbmZvKQoreworCXVuc2lnbmVkIGxvbmcgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJX19mbHVzaF90bGJfYWxsKCk7CisJaWYgKHBlcl9jcHUoY3B1X3RsYnN0YXRlLCBjcHUpLnN0YXRlID09IFRMQlNUQVRFX0xBWlkpCisJCWxlYXZlX21tKGNwdSk7Cit9CisKKworLyogZmx1c2ggdGhlIFRMQiBvZiBldmVyeSBhY3RpdmUgQ1BVIGluIHRoZSBzeXN0ZW0gKi8KK3ZvaWQKK2ZsdXNoX3RsYl9hbGwodm9pZCkKK3sKKwlvbl9lYWNoX2NwdShkb19mbHVzaF90bGJfYWxsLCAwLCAxLCAxKTsKK30KKworLyogdXNlZCB0byBzZXQgdXAgdGhlIHRyYW1wb2xpbmUgZm9yIG90aGVyIENQVXMgd2hlbiB0aGUgbWVtb3J5IG1hbmFnZXIKKyAqIGlzIHNvcnRlZCBvdXQgKi8KK3ZvaWQgX19pbml0CitzbXBfYWxsb2NfbWVtb3J5KHZvaWQpCit7CisJdHJhbXBvbGluZV9iYXNlID0gKF9fdTMyKWFsbG9jX2Jvb3RtZW1fbG93X3BhZ2VzKFBBR0VfU0laRSk7CisJaWYoX19wYSh0cmFtcG9saW5lX2Jhc2UpID49IDB4OTMwMDApCisJCUJVRygpOworfQorCisvKiBzZW5kIGEgcmVzY2hlZHVsZSBDUEkgdG8gb25lIENQVSBieSBwaHlzaWNhbCBDUFUgbnVtYmVyKi8KK3ZvaWQKK3NtcF9zZW5kX3Jlc2NoZWR1bGUoaW50IGNwdSkKK3sKKwlzZW5kX29uZV9DUEkoY3B1LCBWSUNfUkVTQ0hFRFVMRV9DUEkpOworfQorCisKK2ludAoraGFyZF9zbXBfcHJvY2Vzc29yX2lkKHZvaWQpCit7CisJX191OCBpOworCV9fdTggY3B1bWFzayA9IGluYihWSUNfUFJPQ19XSE9fQU1fSSk7CisJaWYoKGNwdW1hc2sgJiBRVUFEX0lERU5USUZJRVIpID09IFFVQURfSURFTlRJRklFUikKKwkJcmV0dXJuIGNwdW1hc2sgJiAweDFGOworCisJZm9yKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWlmKGNwdW1hc2sgJiAoMTw8aSkpCisJCQlyZXR1cm4gaTsKKwl9CisJcHJpbnRrKCIqKiBXQVJOSU5HICoqIElsbGVnYWwgY3B1aWQgcmV0dXJuZWQgYnkgVklDOiAlZCIsIGNwdW1hc2spOworCXJldHVybiAwOworfQorCisvKiBicm9hZGNhc3QgYSBoYWx0IHRvIGFsbCBvdGhlciBDUFVzICovCit2b2lkCitzbXBfc2VuZF9zdG9wKHZvaWQpCit7CisJc21wX2NhbGxfZnVuY3Rpb24oc21wX3N0b3BfY3B1X2Z1bmN0aW9uLCBOVUxMLCAxLCAxKTsKK30KKworLyogdGhpcyBmdW5jdGlvbiBpcyB0cmlnZ2VyZWQgaW4gdGltZS5jIHdoZW4gYSBjbG9jayB0aWNrIGZpcmVzCisgKiB3ZSBuZWVkIHRvIHJlLWJyb2FkY2FzdCB0aGUgdGljayB0byBhbGwgQ1BVcyAqLwordm9pZAorc21wX3ZpY190aW1lcl9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc2VuZF9DUElfYWxsYnV0c2VsZihWSUNfVElNRVJfQ1BJKTsKKwlzbXBfbG9jYWxfdGltZXJfaW50ZXJydXB0KHJlZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3dyYXBwZXJfc21wX2xvY2FsX3RpbWVyX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpcnFfZW50ZXIoKTsKKwlzbXBfbG9jYWxfdGltZXJfaW50ZXJydXB0KHJlZ3MpOworCWlycV9leGl0KCk7Cit9CisKKy8qIGxvY2FsIChwZXIgQ1BVKSB0aW1lciBpbnRlcnJ1cHQuICBJdCBkb2VzIGJvdGggcHJvZmlsaW5nIGFuZAorICogcHJvY2VzcyBzdGF0aXN0aWNzL3Jlc2NoZWR1bGluZy4KKyAqCisgKiBXZSBkbyBwcm9maWxpbmcgaW4gZXZlcnkgbG9jYWwgdGljaywgc3RhdGlzdGljcy9yZXNjaGVkdWxpbmcKKyAqIGhhcHBlbiBvbmx5IGV2ZXJ5ICdwcm9maWxpbmcgbXVsdGlwbGllcicgdGlja3MuIFRoZSBkZWZhdWx0CisgKiBtdWx0aXBsaWVyIGlzIDEgYW5kIGl0IGNhbiBiZSBjaGFuZ2VkIGJ5IHdyaXRpbmcgdGhlIG5ldyBtdWx0aXBsaWVyCisgKiB2YWx1ZSBpbnRvIC9wcm9jL3Byb2ZpbGUuCisgKi8KK3ZvaWQKK3NtcF9sb2NhbF90aW1lcl9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJbG9uZyB3ZWlnaHQ7CisKKwlwcm9maWxlX3RpY2soQ1BVX1BST0ZJTElORywgcmVncyk7CisJaWYgKC0tcGVyX2NwdShwcm9mX2NvdW50ZXIsIGNwdSkgPD0gMCkgeworCQkvKgorCQkgKiBUaGUgbXVsdGlwbGllciBtYXkgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2UgZ290CisJCSAqIHRvIHRoaXMgcG9pbnQgYXMgYSByZXN1bHQgb2YgdGhlIHVzZXIgd3JpdGluZyB0bworCQkgKiAvcHJvYy9wcm9maWxlLiBJbiB0aGlzIGNhc2Ugd2UgbmVlZCB0byBhZGp1c3QgdGhlIEFQSUMKKwkJICogdGltZXIgYWNjb3JkaW5nbHkuCisJCSAqCisJCSAqIEludGVycnVwdHMgYXJlIGFscmVhZHkgbWFza2VkIG9mZiBhdCB0aGlzIHBvaW50LgorCQkgKi8KKwkJcGVyX2NwdShwcm9mX2NvdW50ZXIsY3B1KSA9IHBlcl9jcHUocHJvZl9tdWx0aXBsaWVyLCBjcHUpOworCQlpZiAocGVyX2NwdShwcm9mX2NvdW50ZXIsIGNwdSkgIT0KKwkJCQkJcGVyX2NwdShwcm9mX29sZF9tdWx0aXBsaWVyLCBjcHUpKSB7CisJCQkvKiBGSVhNRTogbmVlZCB0byB1cGRhdGUgdGhlIHZpYyB0aW1lciB0aWNrIGhlcmUgKi8KKwkJCXBlcl9jcHUocHJvZl9vbGRfbXVsdGlwbGllciwgY3B1KSA9CisJCQkJCQlwZXJfY3B1KHByb2ZfY291bnRlciwgY3B1KTsKKwkJfQorCisJCXVwZGF0ZV9wcm9jZXNzX3RpbWVzKHVzZXJfbW9kZShyZWdzKSk7CisJfQorCisJaWYoICgoMTw8Y3B1KSAmIHZveWFnZXJfZXh0ZW5kZWRfdmljX3Byb2Nlc3NvcnMpID09IDApCisJCS8qIG9ubHkgZXh0ZW5kZWQgVklDIHByb2Nlc3NvcnMgcGFydGljaXBhdGUgaW4KKwkJICogaW50ZXJydXB0IGRpc3RyaWJ1dGlvbiAqLworCQlyZXR1cm47CisKKwkvKgorCSAqIFdlIHRha2UgdGhlICdsb25nJyByZXR1cm4gcGF0aCwgYW5kIHRoZXJlIGV2ZXJ5IHN1YnN5c3RlbQorCSAqIGdyYWJzIHRoZSBhcHJvcHJpYXRlIGxvY2tzIChrZXJuZWwgbG9jay8gaXJxIGxvY2spLgorCSAqCisJICogd2UgbWlnaHQgd2FudCB0byBkZWNvdXBsZSBwcm9maWxpbmcgZnJvbSB0aGUgJ2xvbmcgcGF0aCcsCisJICogYW5kIGRvIHRoZSBwcm9maWxpbmcgdG90YWxseSBpbiBhc3NlbWJseS4KKwkgKgorCSAqIEN1cnJlbnRseSB0aGlzIGlzbid0IHRvbyBtdWNoIG9mIGFuIGlzc3VlIChwZXJmb3JtYW5jZSB3aXNlKSwKKwkgKiB3ZSBjYW4gdGFrZSBtb3JlIHRoYW4gMTAwSyBsb2NhbCBpcnFzIHBlciBzZWNvbmQgb24gYSAxMDAgTUh6IFA1LgorCSAqLworCisJaWYoKCsrdmljX3RpY2tbY3B1XSAmIDB4NykgIT0gMCkKKwkJcmV0dXJuOworCS8qIGdldCBoZXJlIGV2ZXJ5IDE2IHRpY2tzIChhYm91dCBldmVyeSAxLzYgb2YgYSBzZWNvbmQpICovCisKKwkvKiBDaGFuZ2Ugb3VyIHByaW9yaXR5IHRvIGdpdmUgc29tZW9uZSBlbHNlIGEgY2hhbmNlIGF0IGdldHRpbmcKKyAgICAgICAgICogdGhlIElSUS4gVGhlIGFsZ29yaXRobSBnb2VzIGxpa2UgdGhpczoKKwkgKgorCSAqIEluIHRoZSBWSUMsIHRoZSBkeW5hbWljYWxseSByb3V0ZWQgaW50ZXJydXB0IGlzIGFsd2F5cworCSAqIGhhbmRsZWQgYnkgdGhlIGxvd2VzdCBwcmlvcml0eSBlbGlnaWJsZSAoaS5lLiByZWNlaXZpbmcKKwkgKiBpbnRlcnJ1cHRzKSBDUFUuICBJZiA+MSBlbGlnaWJsZSBDUFVzIGFyZSBlcXVhbCBsb3dlc3QsIHRoZQorCSAqIGxvd2VzdCBwcm9jZXNzb3IgbnVtYmVyIGdldHMgaXQuCisJICoKKwkgKiBUaGUgcHJpb3JpdHkgb2YgYSBDUFUgaXMgY29udHJvbGxlZCBieSBhIHNwZWNpYWwgcGVyLUNQVQorCSAqIFZJQyBwcmlvcml0eSByZWdpc3RlciB3aGljaCBpcyAzIGJpdHMgd2lkZSAwIGJlaW5nIGxvd2VzdAorCSAqIGFuZCA3IGhpZ2hlc3QgcHJpb3JpdHkuLgorCSAqCisJICogVGhlcmVmb3JlIHdlIHN1YnRyYWN0IHRoZSBhdmVyYWdlIG51bWJlciBvZiBpbnRlcnJ1cHRzIGZyb20KKwkgKiB0aGUgbnVtYmVyIHdlJ3ZlIGZpZWxkZWQuICBJZiB0aGlzIG51bWJlciBpcyBuZWdhdGl2ZSwgd2UKKwkgKiBsb3dlciB0aGUgYWN0aXZpdHkgY291bnQgYW5kIGlmIGl0IGlzIHBvc2l0aXZlLCB3ZSByYWlzZQorCSAqIGl0LgorCSAqCisJICogSSdtIGFmcmFpZCB0aGlzIHN0aWxsIGxlYWRzIHRvIG9kZCBsb29raW5nIGludGVycnVwdCBjb3VudHM6CisJICogdGhlIHRvdGFscyBhcmUgYWxsIHJvdWdobHkgZXF1YWwsIGJ1dCB0aGUgaW5kaXZpZHVhbCBvbmVzCisJICogbG9vayByYXRoZXIgc2tld2VkLgorCSAqCisJICogRklYTUU6IFRoaXMgYWxnb3JpdGhtIGlzIHRvdGFsIGNyYXAgd2hlbiBtaXhlZCB3aXRoIFNNUAorCSAqIGFmZmluaXR5IGNvZGUgc2luY2Ugd2Ugbm93IHRyeSB0byBldmVuIHVwIHRoZSBpbnRlcnJ1cHQKKwkgKiBjb3VudHMgd2hlbiBhbiBhZmZpbml0eSBiaW5kaW5nIGlzIGtlZXBpbmcgdGhlbSBvbiBhCisJICogcGFydGljdWxhciBDUFUqLworCXdlaWdodCA9ICh2aWNfaW50cl9jb3VudFtjcHVdKnZveWFnZXJfZXh0ZW5kZWRfY3B1cworCQkgIC0gdmljX2ludHJfdG90YWwpID4+IDQ7CisJd2VpZ2h0ICs9IDQ7CisJaWYod2VpZ2h0ID4gNykKKwkJd2VpZ2h0ID0gNzsKKwlpZih3ZWlnaHQgPCAwKQorCQl3ZWlnaHQgPSAwOworCQorCW91dGIoKF9fdTgpd2VpZ2h0LCBWSUNfUFJJT1JJVFlfUkVHSVNURVIpOworCisjaWZkZWYgVk9ZQUdFUl9ERUJVRworCWlmKCh2aWNfdGlja1tjcHVdICYgMHhGRkYpID09IDApIHsKKwkJLyogcHJpbnQgdGhpcyBtZXNzYWdlIHJvdWdobHkgZXZlcnkgMjUgc2VjcyAqLworCQlwcmludGsoIlZPWUFHRVIgU01QOiB2aWNfdGlja1slZF0gPSAlbHUsIHdlaWdodCA9ICVsZFxuIiwKKwkJICAgICAgIGNwdSwgdmljX3RpY2tbY3B1XSwgd2VpZ2h0KTsKKwl9CisjZW5kaWYKK30KKworLyogc2V0dXAgdGhlIHByb2ZpbGluZyB0aW1lciAqLworaW50IAorc2V0dXBfcHJvZmlsaW5nX3RpbWVyKHVuc2lnbmVkIGludCBtdWx0aXBsaWVyKQoreworCWludCBpOworCisJaWYgKCAoIW11bHRpcGxpZXIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIAorCSAqIFNldCB0aGUgbmV3IG11bHRpcGxpZXIgZm9yIGVhY2ggQ1BVLiBDUFVzIGRvbid0IHN0YXJ0IHVzaW5nIHRoZQorCSAqIG5ldyB2YWx1ZXMgdW50aWwgdGhlIG5leHQgdGltZXIgaW50ZXJydXB0IGluIHdoaWNoIHRoZXkgZG8gcHJvY2VzcworCSAqIGFjY291bnRpbmcuCisJICovCisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7ICsraSkKKwkJcGVyX2NwdShwcm9mX211bHRpcGxpZXIsIGkpID0gbXVsdGlwbGllcjsKKworCXJldHVybiAwOworfQorCisKKy8qICBUaGUgQ1BJcyBhcmUgaGFuZGxlZCBpbiB0aGUgcGVyIGNwdSA4MjU5cywgc28gdGhleSBtdXN0IGJlCisgKiAgZW5hYmxlZCB0byBiZSByZWNlaXZlZDogRklYOiBlbmFibGluZyB0aGUgQ1BJcyBpbiB0aGUgZWFybHkKKyAqICBib290IHNlcXVlbmNlIGludGVyZmVyZXMgd2l0aCBidWcgY2hlY2tpbmc7IGVuYWJsZSB0aGVtIGxhdGVyCisgKiAgb24gaW4gc21wX2luaXQgKi8KKyNkZWZpbmUgVklDX1NFVF9HQVRFKGNwaSwgdmVjdG9yKSBcCisJc2V0X2ludHJfZ2F0ZSgoY3BpKSArIFZJQ19ERUZBVUxUX0NQSV9CQVNFLCAodmVjdG9yKSkKKyNkZWZpbmUgUUlDX1NFVF9HQVRFKGNwaSwgdmVjdG9yKSBcCisJc2V0X2ludHJfZ2F0ZSgoY3BpKSArIFFJQ19ERUZBVUxUX0NQSV9CQVNFLCAodmVjdG9yKSkKKwordm9pZCBfX2luaXQKK3NtcF9pbnRyX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCS8qIGluaXRpYWxpemUgdGhlIHBlciBjcHUgaXJxIG1hc2sgdG8gYWxsIGRpc2FibGVkICovCisJZm9yKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKQorCQl2aWNfaXJxX21hc2tbaV0gPSAweEZGRkY7CisKKwlWSUNfU0VUX0dBVEUoVklDX0NQSV9MRVZFTDAsIHZpY19jcGlfaW50ZXJydXB0KTsKKworCVZJQ19TRVRfR0FURShWSUNfU1lTX0lOVCwgdmljX3N5c19pbnRlcnJ1cHQpOworCVZJQ19TRVRfR0FURShWSUNfQ01OX0lOVCwgdmljX2Ntbl9pbnRlcnJ1cHQpOworCisJUUlDX1NFVF9HQVRFKFFJQ19USU1FUl9DUEksIHFpY190aW1lcl9pbnRlcnJ1cHQpOworCVFJQ19TRVRfR0FURShRSUNfSU5WQUxJREFURV9DUEksIHFpY19pbnZhbGlkYXRlX2ludGVycnVwdCk7CisJUUlDX1NFVF9HQVRFKFFJQ19SRVNDSEVEVUxFX0NQSSwgcWljX3Jlc2NoZWR1bGVfaW50ZXJydXB0KTsKKwlRSUNfU0VUX0dBVEUoUUlDX0VOQUJMRV9JUlFfQ1BJLCBxaWNfZW5hYmxlX2lycV9pbnRlcnJ1cHQpOworCVFJQ19TRVRfR0FURShRSUNfQ0FMTF9GVU5DVElPTl9DUEksIHFpY19jYWxsX2Z1bmN0aW9uX2ludGVycnVwdCk7CisJCisKKwkvKiBub3cgcHV0IHRoZSBWSUMgZGVzY3JpcHRvciBpbnRvIHRoZSBmaXJzdCA0OCBJUlFzIAorCSAqCisJICogVGhpcyBpcyBmb3IgbGF0ZXI6IGZpcnN0IDE2IGNvcnJlc3BvbmQgdG8gUEMgSVJRczsgbmV4dCAxNgorCSAqIGFyZSBQcmltYXJ5IE1DIElSUXMgYW5kIGZpbmFsIDE2IGFyZSBTZWNvbmRhcnkgTUMgSVJRcyAqLworCWZvcihpID0gMDsgaSA8IDQ4OyBpKyspCisJCWlycV9kZXNjW2ldLmhhbmRsZXIgPSAmdmljX2lycV90eXBlOworfQorCisvKiBzZW5kIGEgQ1BJIGF0IGxldmVsIGNwaSB0byBhIHNldCBvZiBjcHVzIGluIGNwdXNldCAoc2V0IDEgYml0IHBlcgorICogcHJvY2Vzc29yIHRvIHJlY2VpdmUgQ1BJICovCitzdGF0aWMgdm9pZAorc2VuZF9DUEkoX191MzIgY3B1c2V0LCBfX3U4IGNwaSkKK3sKKwlpbnQgY3B1OworCV9fdTMyIHF1YWRfY3B1c2V0ID0gKGNwdXNldCAmIHZveWFnZXJfcXVhZF9wcm9jZXNzb3JzKTsKKworCWlmKGNwaSA8IFZJQ19TVEFSVF9GQUtFX0NQSSkgeworCQkvKiBmYWtlIENQSSBhcmUgb25seSB1c2VkIGZvciBib290aW5nLCBzbyBzZW5kIHRvIHRoZSAKKwkJICogZXh0ZW5kZWQgcXVhZHMgYXMgd2VsbC0tLVF1YWRzIG11c3QgYmUgVklDIGJvb3RlZCAqLworCQlvdXRiKChfX3U4KShjcHVzZXQpLCBWSUNfQ1BJX1JlZ2lzdGVyc1tjcGldKTsKKwkJcmV0dXJuOworCX0KKwlpZihxdWFkX2NwdXNldCkKKwkJc2VuZF9RSUNfQ1BJKHF1YWRfY3B1c2V0LCBjcGkpOworCWNwdXNldCAmPSB+cXVhZF9jcHVzZXQ7CisJY3B1c2V0ICY9IDB4ZmY7CQkvKiBvbmx5IGZpcnN0IDggQ1BVcyB2YWlsZCBmb3IgVklDIENQSSAqLworCWlmKGNwdXNldCA9PSAwKQorCQlyZXR1cm47CisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJaWYoY3B1c2V0ICYgKDE8PGNwdSkpCisJCQlzZXRfYml0KGNwaSwgJnZpY19jcGlfbWFpbGJveFtjcHVdKTsKKwl9CisJaWYoY3B1c2V0KQorCQlvdXRiKChfX3U4KWNwdXNldCwgVklDX0NQSV9SZWdpc3RlcnNbVklDX0NQSV9MRVZFTDBdKTsKK30KKworLyogQWNrbm93bGVkZ2UgcmVjZWlwdCBvZiBDUEkgaW4gdGhlIFFJQywgY2xlYXIgaW4gUUlDIGhhcmR3YXJlIGFuZAorICogc2V0IHRoZSBjYWNoZSBsaW5lIHRvIHNoYXJlZCBieSByZWFkaW5nIGl0LgorICoKKyAqIERPTidUIG1ha2UgdGhpcyBpbmxpbmUgb3RoZXJ3aXNlIHRoZSBjYWNoZSBsaW5lIHJlYWQgd2lsbCBiZQorICogb3B0aW1pc2VkIGF3YXkKKyAqICovCitzdGF0aWMgaW50CithY2tfUUlDX0NQSShfX3U4IGNwaSkgeworCV9fdTggY3B1ID0gaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCk7CisKKwljcGkgJj0gNzsKKworCW91dGIoMTw8Y3BpLCBRSUNfSU5URVJSVVBUX0NMRUFSMSk7CisJcmV0dXJuIHZveWFnZXJfcXVhZF9jcGlfYWRkcltjcHVdLT5xaWNfY3BpW2NwaV0uY3BpOworfQorCitzdGF0aWMgdm9pZAorYWNrX3NwZWNpYWxfUUlDX0NQSShfX3U4IGNwaSkKK3sKKwlzd2l0Y2goY3BpKSB7CisJY2FzZSBWSUNfQ01OX0lOVDoKKwkJb3V0YihRSUNfQ01OX0lOVCwgUUlDX0lOVEVSUlVQVF9DTEVBUjApOworCQlicmVhazsKKwljYXNlIFZJQ19TWVNfSU5UOgorCQlvdXRiKFFJQ19TWVNfSU5ULCBRSUNfSU5URVJSVVBUX0NMRUFSMCk7CisJCWJyZWFrOworCX0KKwkvKiBhbHNvIGNsZWFyIGF0IHRoZSBWSUMsIGp1c3QgaW4gY2FzZSAobm9wIGZvciBub24tZXh0ZW5kZWQgcHJvYykgKi8KKwlhY2tfVklDX0NQSShjcGkpOworfQorCisvKiBBY2tub3dsZWRnZSByZWNlaXB0IG9mIENQSSBpbiB0aGUgVklDIChlc3NlbnRpYWxseSBhbiBFT0kpICovCitzdGF0aWMgdm9pZAorYWNrX1ZJQ19DUEkoX191OCBjcGkpCit7CisjaWZkZWYgVk9ZQUdFUl9ERUJVRworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJX191MTYgaXNyOworCV9fdTggY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWlzciA9IHZpY19yZWFkX2lzcigpOworCWlmKChpc3IgJiAoMTw8KGNwaSAmNykpKSA9PSAwKSB7CisJCXByaW50aygiVk9ZQUdFUiBTTVA6IENQVSVkIGxvc3QgQ1BJJWRcbiIsIGNwdSwgY3BpKTsKKwl9CisjZW5kaWYKKwkvKiBzZW5kIHNwZWNpZmljIEVPSTsgdGhlIHR3byBzeXN0ZW0gaW50ZXJydXB0cyBoYXZlCisJICogYml0IDQgc2V0IGZvciBhIHNlcGFyYXRlIHZlY3RvciBidXQgYmVoYXZlIGFzIHRoZQorCSAqIGNvcnJlc3BvbmRpbmcgMyBiaXQgaW50ciAqLworCW91dGJfcCgweDYwfChjcGkgJiA3KSwweDIwKTsKKworI2lmZGVmIFZPWUFHRVJfREVCVUcKKwlpZigodmljX3JlYWRfaXNyKCkgJiAoMTw8KGNwaSAmNykpKSAhPSAwKSB7CisJCXByaW50aygiVk9ZQUdFUiBTTVA6IENQVSVkIHN0aWxsIGFzc2VydGluZyBDUEklZFxuIiwgY3B1LCBjcGkpOworCX0KKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisjZW5kaWYKK30KKworLyogY3JpYmJlZCB3aXRoIHRoYW5rcyBmcm9tIGlycS5jICovCisjZGVmaW5lIF9fYnl0ZSh4LHkpIAkoKCh1bnNpZ25lZCBjaGFyICopJih5KSlbeF0pCisjZGVmaW5lIGNhY2hlZF8yMShjcHUpCShfX2J5dGUoMCx2aWNfaXJxX21hc2tbY3B1XSkpCisjZGVmaW5lIGNhY2hlZF9BMShjcHUpCShfX2J5dGUoMSx2aWNfaXJxX21hc2tbY3B1XSkpCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3N0YXJ0dXBfdmljX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWVuYWJsZV92aWNfaXJxKGlycSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogVGhlIGVuYWJsZSBhbmQgZGlzYWJsZSByb3V0aW5lcy4gIFRoaXMgaXMgd2hlcmUgd2UgcnVuIGludG8KKyAqIGNvbmZsaWN0aW5nIGFyY2hpdGVjdHVyYWwgcGhpbG9zb3BoeS4gIEZ1bmRhbWVudGFsbHksIHRoZSB2b3lhZ2VyCisgKiBhcmNoaXRlY3R1cmUgZG9lcyBub3QgZXhwZWN0IHRvIGhhdmUgdG8gZGlzYWJsZSBpbnRlcnJ1cHRzIGdsb2JhbGx5CisgKiAodGhlIElSUSBjb250cm9sbGVycyBiZWxvbmcgdG8gZWFjaCBDUFUpLiAgVGhlIHByb2Nlc3NvciBtYXNxdWVyYWRlCisgKiB3aGljaCBpcyB1c2VkIHRvIHN0YXJ0IHRoZSBzeXN0ZW0gc2hvdWxkbid0IGJlIHVzZWQgaW4gYSBydW5uaW5nIE9TCisgKiBzaW5jZSBpdCB3aWxsIGNhdXNlIGdyZWF0IGNvbmZ1c2lvbiBpZiB0d28gc2VwYXJhdGUgQ1BVcyBkcml2ZSB0bworICogdGhlIHNhbWUgSVJRIGNvbnRyb2xsZXIgKEkga25vdywgSSd2ZSB0cmllZCBpdCkuCisgKgorICogVGhlIHNvbHV0aW9uIGlzIGEgdmFyaWFudCBvbiB0aGUgTkNSIGxhenkgU1BMIGRlc2lnbjoKKyAqCisgKiAxKSBUbyBkaXNhYmxlIGFuIGludGVycnVwdCwgZG8gbm90aGluZyAob3RoZXIgdGhhbiBzZXQgdGhlCisgKiAgICBJUlFfRElTQUJMRUQgZmxhZykuICBUaGlzIGRhcmVzIHRoZSBpbnRlcnJ1cHQgYWN0dWFsbHkgdG8gYXJyaXZlLgorICoKKyAqIDIpIElmIHRoZSBpbnRlcnJ1cHQgZGFyZXMgdG8gY29tZSBpbiwgcmFpc2UgdGhlIGxvY2FsIG1hc2sgYWdhaW5zdAorICogICAgaXQgKHRoaXMgd2lsbCByZXN1bHQgaW4gYWxsIHRoZSBDUFUgbWFza3MgYmVpbmcgcmFpc2VkCisgKiAgICBldmVudHVhbGx5KS4KKyAqCisgKiAzKSBUbyBlbmFibGUgdGhlIGludGVycnVwdCwgbG93ZXIgdGhlIG1hc2sgb24gdGhlIGxvY2FsIENQVSBhbmQKKyAqICAgIGJyb2FkY2FzdCBhbiBJbnRlcnJ1cHQgZW5hYmxlIENQSSB3aGljaCBjYXVzZXMgYWxsIG90aGVyIENQVXMgdG8KKyAqICAgIGFkanVzdCB0aGVpciBtYXNrcyBhY2NvcmRpbmdseS4gICovCisKK3N0YXRpYyB2b2lkCitlbmFibGVfdmljX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCS8qIGxpbnV4IGRvZXNuJ3QgdG8gcHJvY2Vzc29yLWlycSBhZmZpbml0eSwgc28gZW5hYmxlIG9uCisJICogYWxsIENQVXMgd2Uga25vdyBhYm91dCAqLworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCksIHJlYWxfY3B1OworCV9fdTE2IG1hc2sgPSAoMTw8aXJxKTsKKwlfX3UzMiBwcm9jZXNzb3JMaXN0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJVkRFQlVHKCgiVk9ZQUdFUjogZW5hYmxlX3ZpY19pcnEoJWQpIENQVSVkIGFmZmluaXR5IDB4JWx4XG4iLAorCQlpcnEsIGNwdSwgY3B1X2lycV9hZmZpbml0eVtjcHVdKSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnZpY19pcnFfbG9jaywgZmxhZ3MpOworCWZvcl9lYWNoX29ubGluZV9jcHUocmVhbF9jcHUpIHsKKwkJaWYoISh2b3lhZ2VyX2V4dGVuZGVkX3ZpY19wcm9jZXNzb3JzICYgKDE8PHJlYWxfY3B1KSkpCisJCQljb250aW51ZTsKKwkJaWYoIShjcHVfaXJxX2FmZmluaXR5W3JlYWxfY3B1XSAmIG1hc2spKSB7CisJCQkvKiBpcnEgaGFzIG5vIGFmZmluaXR5IGZvciB0aGlzIENQVSwgaWdub3JlICovCisJCQljb250aW51ZTsKKwkJfQorCQlpZihyZWFsX2NwdSA9PSBjcHUpIHsKKwkJCWVuYWJsZV9sb2NhbF92aWNfaXJxKGlycSk7CisJCX0KKwkJZWxzZSBpZih2aWNfaXJxX21hc2tbcmVhbF9jcHVdICYgbWFzaykgeworCQkJdmljX2lycV9lbmFibGVfbWFza1tyZWFsX2NwdV0gfD0gbWFzazsKKwkJCXByb2Nlc3Nvckxpc3QgfD0gKDE8PHJlYWxfY3B1KTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aWNfaXJxX2xvY2ssIGZsYWdzKTsKKwlpZihwcm9jZXNzb3JMaXN0KQorCQlzZW5kX0NQSShwcm9jZXNzb3JMaXN0LCBWSUNfRU5BQkxFX0lSUV9DUEkpOworfQorCitzdGF0aWMgdm9pZAorZGlzYWJsZV92aWNfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJLyogbGF6eSBkaXNhYmxlLCBkbyBub3RoaW5nICovCit9CisKK3N0YXRpYyB2b2lkCitlbmFibGVfbG9jYWxfdmljX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCV9fdTggY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCV9fdTE2IG1hc2sgPSB+KDEgPDwgaXJxKTsKKwlfX3UxNiBvbGRfbWFzayA9IHZpY19pcnFfbWFza1tjcHVdOworCisJdmljX2lycV9tYXNrW2NwdV0gJj0gbWFzazsKKwlpZih2aWNfaXJxX21hc2tbY3B1XSA9PSBvbGRfbWFzaykKKwkJcmV0dXJuOworCisJVkRFQlVHKCgiVk9ZQUdFUiBERUJVRzogRW5hYmxpbmcgaXJxICVkIGluIGhhcmR3YXJlIG9uIENQVSAlZFxuIiwKKwkJaXJxLCBjcHUpKTsKKworCWlmIChpcnEgJiA4KSB7CisJCW91dGJfcChjYWNoZWRfQTEoY3B1KSwweEExKTsKKwkJKHZvaWQpaW5iX3AoMHhBMSk7CisJfQorCWVsc2UgeworCQlvdXRiX3AoY2FjaGVkXzIxKGNwdSksMHgyMSk7CisJCSh2b2lkKWluYl9wKDB4MjEpOworCX0KK30KKworc3RhdGljIHZvaWQKK2Rpc2FibGVfbG9jYWxfdmljX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCV9fdTggY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCV9fdTE2IG1hc2sgPSAoMSA8PCBpcnEpOworCV9fdTE2IG9sZF9tYXNrID0gdmljX2lycV9tYXNrW2NwdV07CisKKwlpZihpcnEgPT0gNykKKwkJcmV0dXJuOworCisJdmljX2lycV9tYXNrW2NwdV0gfD0gbWFzazsKKwlpZihvbGRfbWFzayA9PSB2aWNfaXJxX21hc2tbY3B1XSkKKwkJcmV0dXJuOworCisJVkRFQlVHKCgiVk9ZQUdFUiBERUJVRzogRGlzYWJsaW5nIGlycSAlZCBpbiBoYXJkd2FyZSBvbiBDUFUgJWRcbiIsCisJCWlycSwgY3B1KSk7CisKKwlpZiAoaXJxICYgOCkgeworCQlvdXRiX3AoY2FjaGVkX0ExKGNwdSksMHhBMSk7CisJCSh2b2lkKWluYl9wKDB4QTEpOworCX0KKwllbHNlIHsKKwkJb3V0Yl9wKGNhY2hlZF8yMShjcHUpLDB4MjEpOworCQkodm9pZClpbmJfcCgweDIxKTsKKwl9Cit9CisKKy8qIFRoZSBWSUMgaXMgbGV2ZWwgdHJpZ2dlcmVkLCBzbyB0aGUgYWNrIGNhbiBvbmx5IGJlIGlzc3VlZCBhZnRlciB0aGUKKyAqIGludGVycnVwdCBjb21wbGV0ZXMuICBIb3dldmVyLCB3ZSBkbyBWb3lhZ2VyIGxhenkgaW50ZXJydXB0CisgKiBoYW5kbGluZyBoZXJlOiBJdCBpcyBhbiBleHRyZW1lbHkgZXhwZW5zaXZlIG9wZXJhdGlvbiB0byBtYXNrIGFuCisgKiBpbnRlcnJ1cHQgaW4gdGhlIHZpYywgc28gd2UgbWVyZWx5IHNldCBhIGZsYWcgKElSUV9ESVNBQkxFRCkuICBJZgorICogdGhpcyBpbnRlcnJ1cHQgYWN0dWFsbHkgY29tZXMgaW4sIHRoZW4gd2UgbWFzayBhbmQgYWNrIGhlcmUgdG8gcHVzaAorICogdGhlIGludGVycnVwdCBvZmYgdG8gYW5vdGhlciBDUFUgKi8KK3N0YXRpYyB2b2lkCitiZWZvcmVfaGFuZGxlX3ZpY19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlpcnFfZGVzY190ICpkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CisJX191OCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlfcmF3X3NwaW5fbG9jaygmdmljX2lycV9sb2NrKTsKKwl2aWNfaW50cl90b3RhbCsrOworCXZpY19pbnRyX2NvdW50W2NwdV0rKzsKKworCWlmKCEoY3B1X2lycV9hZmZpbml0eVtjcHVdICYgKDE8PGlycSkpKSB7CisJCS8qIFRoZSBpcnEgaXMgbm90IGluIG91ciBhZmZpbml0eSBtYXNrLCBwdXNoIGl0IG9mZgorCQkgKiBvbnRvIGFub3RoZXIgQ1BVICovCisJCVZERUJVRygoIlZPWUFHRVIgREVCVUc6IGFmZmluaXR5IHRyaWdnZXJlZCBkaXNhYmxlIG9mIGlycSAlZCBvbiBjcHUgJWRcbiIsCisJCQlpcnEsIGNwdSkpOworCQlkaXNhYmxlX2xvY2FsX3ZpY19pcnEoaXJxKTsKKwkJLyogc2V0IElSUV9JTlBST0dSRVNTIHRvIHByZXZlbnQgdGhlIGhhbmRsZXIgaW4gaXJxLmMgZnJvbQorCQkgKiBhY3R1YWxseSBjYWxsaW5nIHRoZSBpbnRlcnJ1cHQgcm91dGluZSAqLworCQlkZXNjLT5zdGF0dXMgfD0gSVJRX1JFUExBWSB8IElSUV9JTlBST0dSRVNTOworCX0gZWxzZSBpZihkZXNjLT5zdGF0dXMgJiBJUlFfRElTQUJMRUQpIHsKKwkJLyogRGFtbiwgdGhlIGludGVycnVwdCBhY3R1YWxseSBhcnJpdmVkLCBkbyB0aGUgbGF6eQorCQkgKiBkaXNhYmxlIHRoaW5nLiBUaGUgaW50ZXJydXB0IHJvdXRpbmUgaW4gaXJxLmMgd2lsbAorCQkgKiBub3QgaGFuZGxlIGEgSVJRX0RJU0FCTEVEIGludGVycnVwdCwgc28gbm90aGluZyBtb3JlCisJCSAqIG5lZWQgYmUgZG9uZSBoZXJlICovCisJCVZERUJVRygoIlZPWUFHRVIgREVCVUc6IGxhenkgZGlzYWJsZSBvZiBpcnEgJWQgb24gQ1BVICVkXG4iLAorCQkJaXJxLCBjcHUpKTsKKwkJZGlzYWJsZV9sb2NhbF92aWNfaXJxKGlycSk7CisJCWRlc2MtPnN0YXR1cyB8PSBJUlFfUkVQTEFZOworCX0gZWxzZSB7CisJCWRlc2MtPnN0YXR1cyAmPSB+SVJRX1JFUExBWTsKKwl9CisKKwlfcmF3X3NwaW5fdW5sb2NrKCZ2aWNfaXJxX2xvY2spOworfQorCisvKiBGaW5pc2ggdGhlIFZJQyBpbnRlcnJ1cHQ6IGJhc2ljYWxseSBtYXNrICovCitzdGF0aWMgdm9pZAorYWZ0ZXJfaGFuZGxlX3ZpY19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlpcnFfZGVzY190ICpkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CisKKwlfcmF3X3NwaW5fbG9jaygmdmljX2lycV9sb2NrKTsKKwl7CisJCXVuc2lnbmVkIGludCBzdGF0dXMgPSBkZXNjLT5zdGF0dXMgJiB+SVJRX0lOUFJPR1JFU1M7CisjaWZkZWYgVk9ZQUdFUl9ERUJVRworCQlfX3UxNiBpc3I7CisjZW5kaWYKKworCQlkZXNjLT5zdGF0dXMgPSBzdGF0dXM7CisJCWlmICgoc3RhdHVzICYgSVJRX0RJU0FCTEVEKSkKKwkJCWRpc2FibGVfbG9jYWxfdmljX2lycShpcnEpOworI2lmZGVmIFZPWUFHRVJfREVCVUcKKwkJLyogREVCVUc6IGJlZm9yZSB3ZSBhY2ssIGNoZWNrIHdoYXQncyBpbiBwcm9ncmVzcyAqLworCQlpc3IgPSB2aWNfcmVhZF9pc3IoKTsKKwkJaWYoKGlzciAmICgxPDxpcnEpICYmICEoc3RhdHVzICYgSVJRX1JFUExBWSkpID09IDApIHsKKwkJCWludCBpOworCQkJX191OCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJCQlfX3U4IHJlYWxfY3B1OworCQkJaW50IG1hc2s7IC8qIFVtLi4uIGluaXRpYWxpemUgbWU/Pz8gLS1SUiAqLworCisJCQlwcmludGsoIlZPWUFHRVIgU01QOiBDUFUlZCBsb3N0IGludGVycnVwdCAlZFxuIiwKKwkJCSAgICAgICBjcHUsIGlycSk7CisJCQlmb3JfZWFjaF9jcHUocmVhbF9jcHUsIG1hc2spIHsKKworCQkJCW91dGIoVklDX0NQVV9NQVNRVUVSQURFX0VOQUJMRSB8IHJlYWxfY3B1LAorCQkJCSAgICAgVklDX1BST0NFU1NPUl9JRCk7CisJCQkJaXNyID0gdmljX3JlYWRfaXNyKCk7CisJCQkJaWYoaXNyICYgKDE8PGlycSkpIHsKKwkJCQkJcHJpbnRrKCJWT1lBR0VSIFNNUDogQ1BVJWQgYWNrIGlycSAlZFxuIiwKKwkJCQkJICAgICAgIHJlYWxfY3B1LCBpcnEpOworCQkJCQlhY2tfdmljX2lycShpcnEpOworCQkJCX0KKwkJCQlvdXRiKGNwdSwgVklDX1BST0NFU1NPUl9JRCk7CisJCQl9CisJCX0KKyNlbmRpZiAvKiBWT1lBR0VSX0RFQlVHICovCisJCS8qIGFzIHNvb24gYXMgd2UgYWNrLCB0aGUgaW50ZXJydXB0IGlzIGVsaWdpYmxlIGZvcgorCQkgKiByZWNlaXB0IGJ5IGFub3RoZXIgQ1BVIHNvIGV2ZXJ5dGhpbmcgbXVzdCBiZSBpbgorCQkgKiBvcmRlciBoZXJlICAqLworCQlhY2tfdmljX2lycShpcnEpOworCQlpZihzdGF0dXMgJiBJUlFfUkVQTEFZKSB7CisJCQkvKiByZXBsYXkgaXMgc2V0IGlmIHdlIGRpc2FibGUgdGhlIGludGVycnVwdAorCQkJICogaW4gdGhlIGJlZm9yZV9oYW5kbGVfdmljX2lycSgpIHJvdXRpbmUsIHNvCisJCQkgKiBjbGVhciB0aGUgaW4gcHJvZ3Jlc3MgYml0IGhlcmUgdG8gYWxsb3cgdGhlCisJCQkgKiBuZXh0IENQVSB0byBoYW5kbGUgdGhpcyBjb3JyZWN0bHkgKi8KKwkJCWRlc2MtPnN0YXR1cyAmPSB+KElSUV9SRVBMQVkgfCBJUlFfSU5QUk9HUkVTUyk7CisJCX0KKyNpZmRlZiBWT1lBR0VSX0RFQlVHCisJCWlzciA9IHZpY19yZWFkX2lzcigpOworCQlpZigoaXNyICYgKDE8PGlycSkpICE9IDApCisJCQlwcmludGsoIlZPWUFHRVIgU01QOiBhZnRlcl9oYW5kbGVfdmljX2lycSgpIGFmdGVyIGFjayBpcnE9JWQsIGlzcj0weCV4XG4iLAorCQkJICAgICAgIGlycSwgaXNyKTsKKyNlbmRpZiAvKiBWT1lBR0VSX0RFQlVHICovCisJfQorCV9yYXdfc3Bpbl91bmxvY2soJnZpY19pcnFfbG9jayk7CisKKwkvKiBBbGwgY29kZSBhZnRlciB0aGlzIHBvaW50IGlzIG91dCBvZiB0aGUgbWFpbiBwYXRoIC0gdGhlIElSUQorCSAqIG1heSBiZSBpbnRlcmNlcHRlZCBieSBhbm90aGVyIENQVSBpZiByZWFzc2VydGVkICovCit9CisKKworLyogTGludXggcHJvY2Vzc29yIC0gaW50ZXJydXB0IGFmZmluaXR5IG1hbmlwdWxhdGlvbnMuCisgKgorICogRm9yIGVhY2ggcHJvY2Vzc29yLCB3ZSBtYWludGFpbiBhIDMyIGJpdCBpcnEgYWZmaW5pdHkgbWFzay4KKyAqIEluaXRpYWxseSBpdCBpcyBzZXQgdG8gYWxsIDEncyBzbyBldmVyeSBwcm9jZXNzb3IgYWNjZXB0cyBldmVyeQorICogaW50ZXJydXB0LiAgSW4gdGhpcyBjYWxsLCB3ZSBjaGFuZ2UgdGhlIHByb2Nlc3NvcidzIGFmZmluaXR5IG1hc2s6CisgKgorICogQ2hhbmdlIGZyb20gZW5hYmxlIHRvIGRpc2FibGU6CisgKgorICogSWYgdGhlIGludGVycnVwdCBldmVyIGNvbWVzIGluIHRvIHRoZSBwcm9jZXNzb3IsIHdlIHdpbGwgZGlzYWJsZSBpdAorICogYW5kIGFjayBpdCB0byBwdXNoIGl0IG9mZiB0byBhbm90aGVyIENQVSwgc28ganVzdCBhY2NlcHQgdGhlIG1hc2sgaGVyZS4KKyAqCisgKiBDaGFuZ2UgZnJvbSBkaXNhYmxlIHRvIGVuYWJsZToKKyAqCisgKiBjaGFuZ2UgdGhlIG1hc2sgYW5kIHRoZW4gZG8gYW4gaW50ZXJydXB0IGVuYWJsZSBDUEkgdG8gcmUtZW5hYmxlIG9uCisgKiB0aGUgc2VsZWN0ZWQgcHJvY2Vzc29ycyAqLworCit2b2lkCitzZXRfdmljX2lycV9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjcHVtYXNrX3QgbWFzaykKK3sKKwkvKiBPbmx5IGV4dGVuZGVkIHByb2Nlc3NvcnMgaGFuZGxlIGludGVycnVwdHMgKi8KKwl1bnNpZ25lZCBsb25nIHJlYWxfbWFzazsKKwl1bnNpZ25lZCBsb25nIGlycV9tYXNrID0gMSA8PCBpcnE7CisJaW50IGNwdTsKKworCXJlYWxfbWFzayA9IGNwdXNfYWRkcihtYXNrKVswXSAmIHZveWFnZXJfZXh0ZW5kZWRfdmljX3Byb2Nlc3NvcnM7CisJCisJaWYoY3B1c19hZGRyKG1hc2spWzBdID09IDApCisJCS8qIGNhbid0IGhhdmUgbm8gY3B1J3MgdG8gYWNjZXB0IHRoZSBpbnRlcnJ1cHQgLS0gZXh0cmVtZWx5CisJCSAqIGJhZCB0aGluZ3Mgd2lsbCBoYXBwZW4gKi8KKwkJcmV0dXJuOworCisJaWYoaXJxID09IDApCisJCS8qIGNhbid0IGNoYW5nZSB0aGUgYWZmaW5pdHkgb2YgdGhlIHRpbWVyIElSUS4gIFRoaXMKKwkJICogaXMgZHVlIHRvIHRoZSBjb25zdHJhaW50IGluIHRoZSB2b3lhZ2VyCisJCSAqIGFyY2hpdGVjdHVyZSB0aGF0IHRoZSBDUEkgYWxzbyBjb21lcyBpbiBvbiBhbmQgSVJRCisJCSAqIGxpbmUgYW5kIHdlIGhhdmUgY2hvc2VuIElSUTAgZm9yIHRoaXMuICBJZiB5b3UKKwkJICogcmFpc2UgdGhlIG1hc2sgb24gdGhpcyBpbnRlcnJ1cHQsIHRoZSBwcm9jZXNzb3IKKwkJICogd2lsbCBuby1sb25nZXIgYmUgYWJsZSB0byBhY2NlcHQgVklDIENQSXMgKi8KKwkJcmV0dXJuOworCisJaWYoaXJxID49IDMyKSAKKwkJLyogWW91IGNhbiBvbmx5IGhhdmUgMzIgaW50ZXJydXB0cyBpbiBhIHZveWFnZXIgc3lzdGVtCisJCSAqIChhbmQgMzIgb25seSBpZiB5b3UgaGF2ZSBhIHNlY29uZGFyeSBtaWNyb2NoYW5uZWwKKwkJICogYnVzKSAqLworCQlyZXR1cm47CisKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQl1bnNpZ25lZCBsb25nIGNwdV9tYXNrID0gMSA8PCBjcHU7CisJCQorCQlpZihjcHVfbWFzayAmIHJlYWxfbWFzaykgeworCQkJLyogZW5hYmxlIHRoZSBpbnRlcnJ1cHQgZm9yIHRoaXMgY3B1ICovCisJCQljcHVfaXJxX2FmZmluaXR5W2NwdV0gfD0gaXJxX21hc2s7CisJCX0gZWxzZSB7CisJCQkvKiBkaXNhYmxlIHRoZSBpbnRlcnJ1cHQgZm9yIHRoaXMgY3B1ICovCisJCQljcHVfaXJxX2FmZmluaXR5W2NwdV0gJj0gfmlycV9tYXNrOworCQl9CisJfQorCS8qIHRoaXMgaXMgbWFnaWMsIHdlIG5vdyBoYXZlIHRoZSBjb3JyZWN0IGFmZmluaXR5IG1hcHMsIHNvCisJICogZW5hYmxlIHRoZSBpbnRlcnJ1cHQuICBUaGlzIHdpbGwgc2VuZCBhbiBlbmFibGUgQ1BJIHRvCisJICogdGhvc2UgY3B1J3Mgd2hvIG5lZWQgdG8gZW5hYmxlIGl0IGluIHRoZWlyIGxvY2FsIG1hc2tzLAorCSAqIGNhdXNpbmcgdGhlbSB0byBjb3JyZWN0IGZvciB0aGUgbmV3IGFmZmluaXR5IC4gSWYgdGhlCisJICogaW50ZXJydXB0IGlzIGN1cnJlbnRseSBnbG9iYWxseSBkaXNhYmxlZCwgaXQgd2lsbCBzaW1wbHkgYmUKKwkgKiBkaXNhYmxlZCBhZ2FpbiBhcyBpdCBjb21lcyBpbiAodm95YWdlciBsYXp5IGRpc2FibGUpLiAgSWYKKwkgKiB0aGUgYWZmaW5pdHkgbWFwIGlzIHRpZ2h0ZW5lZCB0byBkaXNhYmxlIHRoZSBpbnRlcnJ1cHQgb24gYQorCSAqIGNwdSwgaXQgd2lsbCBiZSBwdXNoZWQgb2ZmIHdoZW4gaXQgY29tZXMgaW4gKi8KKwllbmFibGVfdmljX2lycShpcnEpOworfQorCitzdGF0aWMgdm9pZAorYWNrX3ZpY19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlpZiAoaXJxICYgOCkgeworCQlvdXRiKDB4NjIsMHgyMCk7CS8qIFNwZWNpZmljIEVPSSB0byBjYXNjYWRlICovCisJCW91dGIoMHg2MHwoaXJxICYgNyksMHhBMCk7CisJfSBlbHNlIHsKKwkJb3V0YigweDYwIHwgKGlycSAmIDcpLDB4MjApOworCX0KK30KKworLyogZW5hYmxlIHRoZSBDUElzLiAgSW4gdGhlIFZJQywgdGhlIENQSXMgYXJlIGRlbGl2ZXJlZCBieSB0aGUgODI1OQorICogYnV0IGFyZSBub3QgdmVjdG9yZWQgYnkgaXQuICBUaGlzIG1lYW5zIHRoYXQgdGhlIDgyNTkgbWFzayBtdXN0IGJlCisgKiBsb3dlcmVkIHRvIHJlY2VpdmUgdGhlbSAqLworc3RhdGljIF9faW5pdCB2b2lkCit2aWNfZW5hYmxlX2NwaSh2b2lkKQoreworCV9fdTggY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCQorCS8qIGp1c3QgdGFrZSBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgbWFzayAobm9wIGZvciBib290IGNwdSkgKi8KKwl2aWNfaXJxX21hc2tbY3B1XSA9IHZpY19pcnFfbWFza1tib290X2NwdV9pZF07CisKKwllbmFibGVfbG9jYWxfdmljX2lycShWSUNfQ1BJX0xFVkVMMCk7CisJZW5hYmxlX2xvY2FsX3ZpY19pcnEoVklDX0NQSV9MRVZFTDEpOworCS8qIGZvciBzeXMgaW50IGFuZCBjbW4gaW50ICovCisJZW5hYmxlX2xvY2FsX3ZpY19pcnEoNyk7CisKKwlpZihpc19jcHVfcXVhZCgpKSB7CisJCW91dGIoUUlDX0RFRkFVTFRfTUFTSzAsIFFJQ19NQVNLX1JFR0lTVEVSMCk7CisJCW91dGIoUUlDX0NQSV9FTkFCTEUsIFFJQ19NQVNLX1JFR0lTVEVSMSk7CisJCVZERUJVRygoIlZPWUFHRVIgU01QOiBRSUMgRU5BQkxFIENQSTogQ1BVJWQ6IE1BU0sgMHgleFxuIiwKKwkJCWNwdSwgUUlDX0NQSV9FTkFCTEUpKTsKKwl9CisKKwlWREVCVUcoKCJWT1lBR0VSIFNNUDogRU5BQkxFIENQSTogQ1BVJWQ6IE1BU0sgMHgleFxuIiwKKwkJY3B1LCB2aWNfaXJxX21hc2tbY3B1XSkpOworfQorCit2b2lkCit2b3lhZ2VyX3NtcF9kdW1wKCkKK3sKKwlpbnQgb2xkX2NwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKSwgY3B1OworCisJLyogZHVtcCB0aGUgaW50ZXJydXB0IG1hc2tzIG9mIGVhY2ggcHJvY2Vzc29yICovCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJX191MTYgaW1yLCBpc3IsIGlycjsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCW91dGIoVklDX0NQVV9NQVNRVUVSQURFX0VOQUJMRSB8IGNwdSwgVklDX1BST0NFU1NPUl9JRCk7CisJCWltciA9IChpbmIoMHhhMSkgPDwgOCkgfCBpbmIoMHgyMSk7CisJCW91dGIoMHgwYSwgMHhhMCk7CisJCWlyciA9IGluYigweGEwKSA8PCA4OworCQlvdXRiKDB4MGEsIDB4MjApOworCQlpcnIgfD0gaW5iKDB4MjApOworCQlvdXRiKDB4MGIsIDB4YTApOworCQlpc3IgPSBpbmIoMHhhMCkgPDwgODsKKwkJb3V0YigweDBiLCAweDIwKTsKKwkJaXNyIHw9IGluYigweDIwKTsKKwkJb3V0YihvbGRfY3B1LCBWSUNfUFJPQ0VTU09SX0lEKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlwcmludGsoIlx0Q1BVJWQ6IG1hc2s9MHgleCwgSU1SPTB4JXgsIElSUj0weCV4LCBJU1I9MHgleFxuIiwKKwkJICAgICAgIGNwdSwgdmljX2lycV9tYXNrW2NwdV0sIGltciwgaXJyLCBpc3IpOworI2lmIDAKKwkJLyogVGhlc2UgbGluZXMgYXJlIHB1dCBpbiB0byB0cnkgdG8gdW5zdGljayBhbiB1biBhY2snZCBpcnEgKi8KKwkJaWYoaXNyICE9IDApIHsKKwkJCWludCBpcnE7CisJCQlmb3IoaXJxPTA7IGlycTwxNjsgaXJxKyspIHsKKwkJCQlpZihpc3IgJiAoMTw8aXJxKSkgeworCQkJCQlwcmludGsoIlx0Q1BVJWQ6IGFjayBpcnEgJWRcbiIsCisJCQkJCSAgICAgICBjcHUsIGlycSk7CisJCQkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJCQkJb3V0YihWSUNfQ1BVX01BU1FVRVJBREVfRU5BQkxFIHwgY3B1LAorCQkJCQkgICAgIFZJQ19QUk9DRVNTT1JfSUQpOworCQkJCQlhY2tfdmljX2lycShpcnEpOworCQkJCQlvdXRiKG9sZF9jcHUsIFZJQ19QUk9DRVNTT1JfSUQpOworCQkJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCQkJfQorCQkJfQorCQl9CisjZW5kaWYKKwl9Cit9CisKK3ZvaWQKK3NtcF92b3lhZ2VyX3Bvd2VyX29mZih2b2lkICpkdW1teSkKK3sKKwlpZihzbXBfcHJvY2Vzc29yX2lkKCkgPT0gYm9vdF9jcHVfaWQpIAorCQl2b3lhZ2VyX3Bvd2VyX29mZigpOworCWVsc2UKKwkJc21wX3N0b3BfY3B1X2Z1bmN0aW9uKE5VTEwpOworfQorCit2b2lkIF9faW5pdAorc21wX3ByZXBhcmVfY3B1cyh1bnNpZ25lZCBpbnQgbWF4X2NwdXMpCit7CisJLyogRklYTUU6IGlnbm9yZSBtYXhfY3B1cyBmb3Igbm93ICovCisJc21wX2Jvb3RfY3B1cygpOworfQorCit2b2lkIF9fZGV2aW5pdCBzbXBfcHJlcGFyZV9ib290X2NwdSh2b2lkKQoreworCWNwdV9zZXQoc21wX3Byb2Nlc3Nvcl9pZCgpLCBjcHVfb25saW5lX21hcCk7CisJY3B1X3NldChzbXBfcHJvY2Vzc29yX2lkKCksIGNwdV9jYWxsb3V0X21hcCk7Cit9CisKK2ludCBfX2RldmluaXQKK19fY3B1X3VwKHVuc2lnbmVkIGludCBjcHUpCit7CisJLyogVGhpcyBvbmx5IHdvcmtzIGF0IGJvb3QgZm9yIHg4Ni4gIFNlZSAicmV3cml0ZSIgYWJvdmUuICovCisJaWYgKGNwdV9pc3NldChjcHUsIHNtcF9jb21tZW5jZWRfbWFzaykpCisJCXJldHVybiAtRU5PU1lTOworCisJLyogSW4gY2FzZSBvbmUgZGlkbid0IGNvbWUgdXAgKi8KKwlpZiAoIWNwdV9pc3NldChjcHUsIGNwdV9jYWxsaW5fbWFwKSkKKwkJcmV0dXJuIC1FSU87CisJLyogVW5sZWFzaCB0aGUgQ1BVISAqLworCWNwdV9zZXQoY3B1LCBzbXBfY29tbWVuY2VkX21hc2spOworCXdoaWxlICghY3B1X2lzc2V0KGNwdSwgY3B1X29ubGluZV9tYXApKQorCQltYigpOworCXJldHVybiAwOworfQorCit2b2lkIF9faW5pdCAKK3NtcF9jcHVzX2RvbmUodW5zaWduZWQgaW50IG1heF9jcHVzKQoreworCXphcF9sb3dfbWFwcGluZ3MoKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYWNoLXZveWFnZXIvdm95YWdlcl90aHJlYWQuYyBiL2FyY2gvaTM4Ni9tYWNoLXZveWFnZXIvdm95YWdlcl90aHJlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTgwZWVmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hY2gtdm95YWdlci92b3lhZ2VyX3RocmVhZC5jCkBAIC0wLDAgKzEsMTY3IEBACisvKiAtKi0gbW9kZTogYzsgYy1iYXNpYy1vZmZzZXQ6IDggLSotICovCisKKy8qIENvcHlyaWdodCAoQykgMjAwMQorICoKKyAqIEF1dGhvcjogSi5FLkouQm90dG9tbGV5QEhhbnNlblBhcnRuZXJzaGlwLmNvbQorICoKKyAqIGxpbnV4L2FyY2gvaTM4Ni9rZXJuZWwvdm95YWdlcl90aHJlYWQuYworICoKKyAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHRoZSBtYWNoaW5lIHN0YXR1cyBtb25pdG9yIHRocmVhZCBmb3IgdGhlCisgKiB2b3lhZ2VyIGFyY2hpdGVjdHVyZS4gIFRoaXMgYWxsb3dzIHVzIHRvIG1vbml0b3IgdGhlIG1hY2hpbmUKKyAqIGVudmlyb25tZW50ICh0ZW1wLCB2b2x0YWdlLCBmYW4gZnVuY3Rpb24pIGFuZCB0aGUgZnJvbnQgcGFuZWwgYW5kCisgKiBpbnRlcm5hbCBVUFMuICBJZiBhIGZhdWx0IGlzIGRldGVjdGVkLCB0aGlzIHRocmVhZCB0YWtlcyBjb3JyZWN0aXZlCisgKiBhY3Rpb24gKHVzdWFsbHkganVzdCBpbmZvcm1pbmcgaW5pdCkKKyAqICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KKyNpbmNsdWRlIDxhc20vdm95YWdlci5oPgorI2luY2x1ZGUgPGFzbS92aWMuaD4KKyNpbmNsdWRlIDxhc20vbXRyci5oPgorI2luY2x1ZGUgPGFzbS9tc3IuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorCisjZGVmaW5lIFRIUkVBRF9OQU1FICJrdm95YWdlcmQiCisKKy8qIGV4dGVybmFsIHZhcmlhYmxlcyAqLworaW50IGt2b3lhZ2VyZF9ydW5uaW5nID0gMDsKK0RFQ0xBUkVfTVVURVhfTE9DS0VEKGt2b3lhZ2VyZF9zZW0pOworCitzdGF0aWMgaW50IHRocmVhZCh2b2lkICopOworCitzdGF0aWMgX191OCBzZXRfdGltZW91dCA9IDA7CisKKy8qIFN0YXJ0IHRoZSBtYWNoaW5lIG1vbml0b3IgdGhyZWFkLiAgUmV0dXJuIDEgaWYgT0ssIDAgaWYgZmFpbCAqLworc3RhdGljIGludCBfX2luaXQKK3ZveWFnZXJfdGhyZWFkX3N0YXJ0KHZvaWQpCit7CisJaWYoa2VybmVsX3RocmVhZCh0aHJlYWQsIE5VTEwsIENMT05FX0tFUk5FTCkgPCAwKSB7CisJCS8qIFRoaXMgaXMgc2VyaW91cywgYnV0IG5vdCBmYXRhbCAqLworCQlwcmludGsoS0VSTl9FUlIgIlZveWFnZXI6IEZhaWxlZCB0byBjcmVhdGUgc3lzdGVtIG1vbml0b3IgdGhyZWFkISEhXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitleGVjdXRlKGNvbnN0IGNoYXIgKnN0cmluZykKK3sKKwlpbnQgcmV0OworCisJY2hhciAqZW52cFtdID0geworCQkiSE9NRT0vIiwKKwkJIlRFUk09bGludXgiLAorCQkiUEFUSD0vc2JpbjovdXNyL3NiaW46L2JpbjovdXNyL2JpbiIsCisJCU5VTEwsCisJfTsKKwljaGFyICphcmd2W10gPSB7CisJCSIvYmluL2Jhc2giLAorCQkiLWMiLAorCQkoY2hhciAqKXN0cmluZywKKwkJTlVMTCwKKwl9OworCisJaWYgKChyZXQgPSBjYWxsX3VzZXJtb2RlaGVscGVyKGFyZ3ZbMF0sIGFyZ3YsIGVudnAsIDEpKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVm95YWdlciBmYWlsZWQgdG8gcnVuIFwiJXNcIjogJWlcbiIsCisJCSAgICAgICBzdHJpbmcsIHJldCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19mcm9tX2tlcm5lbCh2b2lkKQoreworCWlmKHZveWFnZXJfc3RhdHVzLnN3aXRjaF9vZmYpIHsKKwkJCisJCS8qIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBjb25maWd1cmVhYmxlIHZpYSBwcm9jICovCisJCWV4ZWN1dGUoInVtYXNrIDYwMDsgZWNobyAwID4gL2V0Yy9pbml0cnVubHZsOyBraWxsIC1IVVAgMSIpOworCX0gZWxzZSBpZih2b3lhZ2VyX3N0YXR1cy5wb3dlcl9mYWlsKSB7CisJCVZERUJVRygoIlZveWFnZXIgZGFlbW9uIGRldGVjdGVkIEFDIHBvd2VyIGZhaWx1cmVcbiIpKTsKKwkJCisJCS8qIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBjb25maWd1cmVhYmxlIHZpYSBwcm9jICovCisJCWV4ZWN1dGUoInVtYXNrIDYwMDsgZWNobyBGID4gL2V0Yy9wb3dlcnN0YXR1czsga2lsbCAtUFdSIDEiKTsKKwkJc2V0X3RpbWVvdXQgPSAxOworCX0KK30KKworc3RhdGljIHZvaWQKK2NoZWNrX2NvbnRpbnVpbmdfY29uZGl0aW9uKHZvaWQpCit7CisJaWYodm95YWdlcl9zdGF0dXMucG93ZXJfZmFpbCkgeworCQlfX3U4IGRhdGE7CisJCXZveWFnZXJfY2F0X3BzaShWT1lBR0VSX1BTSV9TVUJSRUFELCAKKwkJCQlWT1lBR0VSX1BTSV9BQ19GQUlMX1JFRywgJmRhdGEpOworCQlpZigoZGF0YSAmIDB4MWYpID09IDApIHsKKwkJCS8qIGFsbCBwb3dlciByZXN0b3JlZCAqLworCQkJcHJpbnRrKEtFUk5fTk9USUNFICJWT1lBR0VSIEFDIHBvd2VyIHJlc3RvcmVkLCBjYW5jZWxsaW5nIHNodXRkb3duXG4iKTsKKwkJCS8qIEZJWE1FOiBzaG91bGQgYmUgdXNlciBjb25maWd1cmVhYmxlICovCisJCQlleGVjdXRlKCJ1bWFzayA2MDA7IGVjaG8gTyA+IC9ldGMvcG93ZXJzdGF0dXM7IGtpbGwgLVBXUiAxIik7CisJCQlzZXRfdGltZW91dCA9IDA7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCit3YWtldXAodW5zaWduZWQgbG9uZyB1bnVzZWQpCit7CisJdXAoJmt2b3lhZ2VyZF9zZW0pOworfQorCitzdGF0aWMgaW50Cit0aHJlYWQodm9pZCAqdW51c2VkKQoreworCXN0cnVjdCB0aW1lcl9saXN0IHdha2V1cF90aW1lcjsKKworCWt2b3lhZ2VyZF9ydW5uaW5nID0gMTsKKworCXJlcGFyZW50X3RvX2luaXQoKTsKKwlkYWVtb25pemUoVEhSRUFEX05BTUUpOworCisJc2V0X3RpbWVvdXQgPSAwOworCisJaW5pdF90aW1lcigmd2FrZXVwX3RpbWVyKTsKKworCXNpZ2ZpbGxzZXQoJmN1cnJlbnQtPmJsb2NrZWQpOworCWN1cnJlbnQtPnNpZ25hbC0+dHR5ID0gTlVMTDsKKworCXByaW50ayhLRVJOX05PVElDRSAiVm95YWdlciBzdGFydGluZyBtb25pdG9yIHRocmVhZFxuIik7CisKKwlmb3IoOzspIHsKKwkJZG93bl9pbnRlcnJ1cHRpYmxlKCZrdm95YWdlcmRfc2VtKTsKKwkJVkRFQlVHKCgiVm95YWdlciBEYWVtb24gYXdva2VuXG4iKSk7CisJCWlmKHZveWFnZXJfc3RhdHVzLnJlcXVlc3RfZnJvbV9rZXJuZWwgPT0gMCkgeworCQkJLyogcHJvYmFibHkgYXdva2VuIGZyb20gdGltZW91dCAqLworCQkJY2hlY2tfY29udGludWluZ19jb25kaXRpb24oKTsKKwkJfSBlbHNlIHsKKwkJCWNoZWNrX2Zyb21fa2VybmVsKCk7CisJCQl2b3lhZ2VyX3N0YXR1cy5yZXF1ZXN0X2Zyb21fa2VybmVsID0gMDsKKwkJfQorCQlpZihzZXRfdGltZW91dCkgeworCQkJZGVsX3RpbWVyKCZ3YWtldXBfdGltZXIpOworCQkJd2FrZXVwX3RpbWVyLmV4cGlyZXMgPSBIWiArIGppZmZpZXM7CisJCQl3YWtldXBfdGltZXIuZnVuY3Rpb24gPSB3YWtldXA7CisJCQlhZGRfdGltZXIoJndha2V1cF90aW1lcik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAordm95YWdlcl90aHJlYWRfc3RvcCh2b2lkKQoreworCS8qIEZJWE1FOiBkbyBub3RoaW5nIGF0IHRoZSBtb21lbnQgKi8KK30KKworbW9kdWxlX2luaXQodm95YWdlcl90aHJlYWRfc3RhcnQpOworLy9tb2R1bGVfZXhpdCh2b3lhZ2VyX3RocmVhZF9zdG9wKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYXRoLWVtdS9NYWtlZmlsZSBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yzk0M2ZhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L01ha2VmaWxlCkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgICAgICAgICAgICAgICBNYWtlZmlsZSBmb3Igd20tRlBVLWVtdQorIworCisjREVCVUcJPSAtRERFQlVHR0lORworREVCVUcJPQorUEFSQU5PSUQgPSAtRFBBUkFOT0lECitDRkxBR1MJOj0gJChDRkxBR1MpICQoUEFSQU5PSUQpICQoREVCVUcpIC1mbm8tYnVpbHRpbiAkKE1BVEhfRU1VTEFUSU9OKQorCitFWFRSQV9BRkxBR1MJOj0gJChQQVJBTk9JRCkKKworIyBGcm9tICdDJyBsYW5ndWFnZSBzb3VyY2VzOgorQ19PQkpTID1mcHVfZW50cnkubyBlcnJvcnMubyBcCisJZnB1X2FyaXRoLm8gZnB1X2F1eC5vIGZwdV9ldGMubyBmcHVfdGFncy5vIGZwdV90cmlnLm8gXAorCWxvYWRfc3RvcmUubyBnZXRfYWRkcmVzcy5vIFwKKwlwb2x5X2F0YW4ubyBwb2x5X2wyLm8gcG9seV8yeG0xLm8gcG9seV9zaW4ubyBwb2x5X3Rhbi5vIFwKKwlyZWdfYWRkX3N1Yi5vIHJlZ19jb21wYXJlLm8gcmVnX2NvbnN0YW50Lm8gcmVnX2NvbnZlcnQubyBcCisJcmVnX2xkX3N0ci5vIHJlZ19kaXZpZGUubyByZWdfbXVsLm8KKworIyBGcm9tIDgweDg2IGFzc2VtYmxlciBzb3VyY2VzOgorQV9PQkpTID1yZWdfdV9hZGQubyByZWdfdV9kaXYubyByZWdfdV9tdWwubyByZWdfdV9zdWIubyBcCisJZGl2X3NtYWxsLm8gcmVnX25vcm0ubyByZWdfcm91bmQubyBcCisJd21fc2hyeC5vIHdtX3NxcnQubyBcCisJZGl2X1hzaWcubyBwb2x5bm9tX1hzaWcubyByb3VuZF9Yc2lnLm8gXAorCXNocl9Yc2lnLm8gbXVsX1hzaWcubworCitvYmoteSA9JChDX09CSlMpICQoQV9PQkpTKQorCitwcm90bzoKKwljcHJvdG8gLWUgLURNQUtJTkdfUFJPVE8gKi5jID5mcHVfcHJvdG8uaApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hdGgtZW11L1JFQURNRSBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYyMzU0OTFkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L1JFQURNRQpAQCAtMCwwICsxLDQyNyBAQAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgd20tRlBVLWVtdSAgIGFuIEZQVSBlbXVsYXRvciBmb3IgODAzODYgYW5kIDgwNDg2U1ggbWljcm9wcm9jZXNzb3JzLiAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTMsMTk5NCwxOTk1LDE5OTYsMTk5NywxOTk5ICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgVy4gTWV0emVudGhlbiwgMjIgUGFya2VyIFN0LCBPcm1vbmQsIFZpYyAzMTYzLCAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICBBdXN0cmFsaWEuICBFLW1haWwgYmlsbG1AbWVsYnBjLm9yZy5hdSAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgIHwKKyB8ICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzICAgICAgfAorIHwgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgfAorIHwgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICB8CisgfCAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgIHwKKyB8ICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgIHwKKyB8ICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlICAgICAgICAgICAgfAorIHwgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCisKKword20tRlBVLWVtdSBpcyBhbiBGUFUgZW11bGF0b3IgZm9yIExpbnV4LiBJdCBpcyBkZXJpdmVkIGZyb20gd20tZW11Mzg3Cit3aGljaCB3YXMgbXkgODAzODcgZW11bGF0b3IgZm9yIGVhcmx5IHZlcnNpb25zIG9mIGRqZ3BwIChnY2MgdW5kZXIKK21zZG9zKTsgd20tZW11Mzg3IHdhcyBpbiB0dXJuIGJhc2VkIHVwb24gZW11Mzg3IHdoaWNoIHdhcyB3cml0dGVuIGJ5CitESiBEZWxvcmllIGZvciBkamdwcC4gIFRoZSBpbnRlcmZhY2UgdG8gdGhlIExpbnV4IGtlcm5lbCBpcyBiYXNlZCB1cG9uCit0aGUgb3JpZ2luYWwgTGludXggbWF0aCBlbXVsYXRvciBieSBMaW51cyBUb3J2YWxkcy4KKworTXkgdGFyZ2V0IEZQVSBmb3Igd20tRlBVLWVtdSBpcyB0aGF0IGRlc2NyaWJlZCBpbiB0aGUgSW50ZWw0ODYKK1Byb2dyYW1tZXIncyBSZWZlcmVuY2UgTWFudWFsICgxOTkyIGVkaXRpb24pLiBVbmZvcnR1bmF0ZWx5LCBudW1lcm91cworZmFjZXRzIG9mIHRoZSBmdW5jdGlvbmluZyBvZiB0aGUgRlBVIGFyZSBub3Qgd2VsbCBjb3ZlcmVkIGluIHRoZQorUmVmZXJlbmNlIE1hbnVhbC4gVGhlIGluZm9ybWF0aW9uIGluIHRoZSBtYW51YWwgaGFzIGJlZW4gc3VwcGxlbWVudGVkCit3aXRoIG1lYXN1cmVtZW50cyBvbiByZWFsIDgwNDg2J3MuIFVuZm9ydHVuYXRlbHksIGl0IGlzIHNpbXBseSBub3QKK3Bvc3NpYmxlIHRvIGJlIHN1cmUgdGhhdCBhbGwgb2YgdGhlIHBlY3VsaWFyaXRpZXMgb2YgdGhlIDgwNDg2IGhhdmUKK2JlZW4gZGlzY292ZXJlZCwgc28gdGhlcmUgaXMgYWx3YXlzIGxpa2VseSB0byBiZSBvYnNjdXJlIGRpZmZlcmVuY2VzCitpbiB0aGUgZGV0YWlsZWQgYmVoYXZpb3VyIG9mIHRoZSBlbXVsYXRvciBhbmQgYSByZWFsIDgwNDg2LgorCit3bS1GUFUtZW11IGRvZXMgbm90IGltcGxlbWVudCBhbGwgb2YgdGhlIGJlaGF2aW91ciBvZiB0aGUgODA0ODYgRlBVLAorYnV0IGlzIHZlcnkgY2xvc2UuICBTZWUgIkxpbWl0YXRpb25zIiBsYXRlciBpbiB0aGlzIGZpbGUgZm9yIGEgbGlzdCBvZgorc29tZSBkaWZmZXJlbmNlcy4KKworUGxlYXNlIHJlcG9ydCBidWdzLCBldGMgdG8gbWUgYXQ6CisgICAgICAgYmlsbG1AbWVsYnBjLm9yZy5hdQorb3IgICAgIGIubWV0emVudGhlbkBtZWRvdG8udW5pbWVsYi5lZHUuYXUKKworRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIGVtdWxhdG9yIGFuZCBvbiBmbG9hdGluZyBwb2ludCB0b3BpY3MsIHNlZQorbXkgd2ViIHBhZ2VzLCBjdXJyZW50bHkgYXQgIGh0dHA6Ly93d3cuc3VidXJiaWEubmV0L35iaWxsbS8KKworCistLUJpbGwgTWV0emVudGhlbgorICBEZWNlbWJlciAxOTk5CisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW50ZXJuYWxzIG9mIHdtLUZQVS1lbXUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTnVtZXJpYyBhbGdvcml0aG1zOgorKDEpIEFkZCwgc3VidHJhY3QsIGFuZCBtdWx0aXBseS4gTm90aGluZyByZW1hcmthYmxlIGluIHRoZXNlLgorKDIpIERpdmlkZSBoYXMgYmVlbiB0dW5lZCB0byBnZXQgcmVhc29uYWJsZSBwZXJmb3JtYW5jZS4gVGhlIGFsZ29yaXRobQorICAgIGlzIG5vdCB0aGUgb2J2aW91cyBvbmUgd2hpY2ggbW9zdCBwZW9wbGUgc2VlbSB0byB1c2UsIGJ1dCBpcyBkZXNpZ25lZAorICAgIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIDgwMzg2LiBJIGV4cGVjdCB0aGF0CisgICAgaXQgaGFzIGJlZW4gaW52ZW50ZWQgbWFueSB0aW1lcyBiZWZvcmUgSSBkaXNjb3ZlcmVkIGl0LCBidXQgSSBoYXZlIG5vdAorICAgIHNlZW4gaXQuIEl0IGlzIGJhc2VkIHVwb24gb25lIG9mIHRob3NlIGlkZWFzIHdoaWNoIG9uZSBjYXJyaWVzIGFyb3VuZAorICAgIGZvciB5ZWFycyB3aXRob3V0IGV2ZXIgYm90aGVyaW5nIHRvIGNoZWNrIGl0IG91dC4KKygzKSBUaGUgc3FydCBmdW5jdGlvbiBoYXMgYmVlbiB0dW5lZCB0byBnZXQgZ29vZCBwZXJmb3JtYW5jZS4gSXQgaXMgYmFzZWQKKyAgICB1cG9uIE5ld3RvbidzIGNsYXNzaWMgbWV0aG9kLiBQZXJmb3JtYW5jZSB3YXMgaW1wcm92ZWQgYnkgY2FwaXRhbGl6aW5nCisgICAgdXBvbiB0aGUgcHJvcGVydGllcyBvZiBOZXd0b24ncyBtZXRob2QsIGFuZCB0aGUgY29kZSBpcyBvbmNlIGFnYWluCisgICAgc3RydWN0dXJlZCB0YWtpbmcgYWNjb3VudCBvZiB0aGUgODAzODYgY2hhcmFjdGVyaXN0aWNzLgorKDQpIFRoZSB0cmlnLCBsb2csIGFuZCBleHAgZnVuY3Rpb25zIGFyZSBiYXNlZCBpbiBlYWNoIGNhc2UgdXBvbiBxdWFzaS0KKyAgICAib3B0aW1hbCIgcG9seW5vbWlhbCBhcHByb3hpbWF0aW9ucy4gTXkgZGVmaW5pdGlvbiBvZiAib3B0aW1hbCIgd2FzCisgICAgYmFzZWQgdXBvbiBnZXR0aW5nIGdvb2QgYWNjdXJhY3kgd2l0aCByZWFzb25hYmxlIHNwZWVkLgorKDUpIFRoZSBhcmd1bWVudCByZWR1Y2luZyBjb2RlIGZvciB0aGUgdHJpZyBmdW5jdGlvbiBlZmZlY3RpdmVseSB1c2VzCisgICAgYSB2YWx1ZSBvZiBwaSB3aGljaCBpcyBhY2N1cmF0ZSB0byBtb3JlIHRoYW4gMTI4IGJpdHMuIEFzIGEgY29uc2VxdWVuY2UsCisgICAgdGhlIHJlZHVjZWQgYXJndW1lbnQgaXMgYWNjdXJhdGUgdG8gbW9yZSB0aGFuIDY0IGJpdHMgZm9yIGFyZ3VtZW50cyB1cAorICAgIHRvIGEgZmV3IHBpLCBhbmQgYWNjdXJhdGUgdG8gbW9yZSB0aGFuIDY0IGJpdHMgZm9yIG1vc3QgYXJndW1lbnRzLAorICAgIGV2ZW4gZm9yIGFyZ3VtZW50cyBhcHByb2FjaGluZyAyXjYzLiBUaGlzIGlzIGZhciBzdXBlcmlvciB0byBhbgorICAgIDgwNDg2LCB3aGljaCB1c2VzIGEgdmFsdWUgb2YgcGkgd2hpY2ggaXMgYWNjdXJhdGUgdG8gNjYgYml0cy4KKworVGhlIGNvZGUgb2YgdGhlIGVtdWxhdG9yIGlzIGNvbXBsaWNhdGVkIHNsaWdodGx5IGJ5IHRoZSBuZWVkIHRvCithY2NvdW50IGZvciBhIGxpbWl0ZWQgZm9ybSBvZiByZS1lbnRyYW5jeS4gTm9ybWFsbHksIHRoZSBlbXVsYXRvciB3aWxsCitlbXVsYXRlIGVhY2ggRlBVIGluc3RydWN0aW9uIHRvIGNvbXBsZXRpb24gd2l0aG91dCBpbnRlcnJ1cHRpb24uCitIb3dldmVyLCBpdCBtYXkgaGFwcGVuIHRoYXQgd2hlbiB0aGUgZW11bGF0b3IgaXMgYWNjZXNzaW5nIHRoZSB1c2VyCittZW1vcnkgc3BhY2UsIHN3YXBwaW5nIG1heSBiZSBuZWVkZWQuIEluIHRoaXMgY2FzZSB0aGUgZW11bGF0b3IgbWF5IGJlCit0ZW1wb3JhcmlseSBzdXNwZW5kZWQgd2hpbGUgZGlzayBpL28gdGFrZXMgcGxhY2UuIER1cmluZyB0aGlzIHRpbWUKK2Fub3RoZXIgcHJvY2VzcyBtYXkgdXNlIHRoZSBlbXVsYXRvciwgdGhlcmVieSBwZXJoYXBzIGNoYW5naW5nIHN0YXRpYwordmFyaWFibGVzLiBUaGUgY29kZSB3aGljaCBhY2Nlc3NlcyB1c2VyIG1lbW9yeSBpcyBjb25maW5lZCB0byBmaXZlCitmaWxlczoKKyAgICBmcHVfZW50cnkuYworICAgIHJlZ19sZF9zdHIuYworICAgIGxvYWRfc3RvcmUuYworICAgIGdldF9hZGRyZXNzLmMKKyAgICBlcnJvcnMuYworQXMgZnJvbSB2ZXJzaW9uIDEuMTIgb2YgdGhlIGVtdWxhdG9yLCBubyBzdGF0aWMgdmFyaWFibGVzIGFyZSB1c2VkCisoYXBhcnQgZnJvbSB0aG9zZSBpbiB0aGUga2VybmVsJ3MgcGVyLXByb2Nlc3MgdGFibGVzKS4gVGhlIGVtdWxhdG9yIGlzCit0aGVyZWZvcmUgbm93IGZ1bGx5IHJlLWVudHJhbnQsIHJhdGhlciB0aGFuIGhhdmluZyBqdXN0IHRoZSByZXN0cmljdGVkCitmb3JtIG9mIHJlLWVudHJhbmN5IHdoaWNoIGlzIHJlcXVpcmVkIGJ5IHRoZSBMaW51eCBrZXJuZWwuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExpbWl0YXRpb25zIG9mIHdtLUZQVS1lbXUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlcmUgYXJlIGEgbnVtYmVyIG9mIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIGN1cnJlbnQgd20tRlBVLWVtdQorKHZlcnNpb24gMi4wMSkgYW5kIHRoZSA4MDQ4NiBGUFUgKGFwYXJ0IGZyb20gYnVncykuICBUaGUgZGlmZmVyZW5jZXMKK2FyZSBmZXdlciB0aGFuIHRob3NlIHdoaWNoIGFwcGxpZWQgdG8gdGhlIDEueHggc2VyaWVzIG9mIHRoZSBlbXVsYXRvci4KK1NvbWUgb2YgdGhlIG1vcmUgaW1wb3J0YW50IGRpZmZlcmVuY2VzIGFyZSBsaXN0ZWQgYmVsb3c6CisKK1RoZSBSb3VuZHVwIGZsYWcgZG9lcyBub3QgaGF2ZSBtdWNoIG1lYW5pbmcgZm9yIHRoZSB0cmFuc2NlbmRlbnRhbAorZnVuY3Rpb25zIGFuZCBpdHMgODA0ODYgdmFsdWUgd2l0aCB0aGVzZSBmdW5jdGlvbnMgaXMgbGlrZWx5IHRvIGRpZmZlcgorZnJvbSBpdHMgZW11bGF0b3IgdmFsdWUuCisKK0luIGEgZmV3IHJhcmUgY2FzZXMgdGhlIFVuZGVyZmxvdyBmbGFnIG9idGFpbmVkIHdpdGggdGhlIGVtdWxhdG9yIHdpbGwKK2JlIGRpZmZlcmVudCBmcm9tIHRoYXQgb2J0YWluZWQgd2l0aCBhbiA4MDQ4Ni4gVGhpcyBvY2N1cnMgd2hlbiB0aGUKK2ZvbGxvd2luZyBjb25kaXRpb25zIGFwcGx5IHNpbXVsdGFuZW91c2x5OgorKGEpIHRoZSBvcGVyYW5kcyBoYXZlIGEgaGlnaGVyIHByZWNpc2lvbiB0aGFuIHRoZSBjdXJyZW50IHNldHRpbmcgb2YgdGhlCisgICAgcHJlY2lzaW9uIGNvbnRyb2wgKFBDKSBmbGFncy4KKyhiKSB0aGUgdW5kZXJmbG93IGV4Y2VwdGlvbiBpcyBtYXNrZWQuCisoYykgdGhlIG1hZ25pdHVkZSBvZiB0aGUgZXhhY3QgcmVzdWx0IChiZWZvcmUgcm91bmRpbmcpIGlzIGxlc3MgdGhhbiAyXi0xNjM4Mi4KKyhkKSB0aGUgbWFnbml0dWRlIG9mIHRoZSBmaW5hbCByZXN1bHQgKGFmdGVyIHJvdW5kaW5nKSBpcyBleGFjdGx5IDJeLTE2MzgyLgorKGUpIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGV4YWN0IHJlc3VsdCB3b3VsZCBiZSBleGFjdGx5IDJeLTE2MzgyIGlmIHRoZQorICAgIG9wZXJhbmRzIHdlcmUgcm91bmRlZCB0byB0aGUgY3VycmVudCBwcmVjaXNpb24gYmVmb3JlIHRoZSBhcml0aG1ldGljCisgICAgb3BlcmF0aW9uIHdhcyBwZXJmb3JtZWQuCitJZiBhbGwgb2YgdGhlc2UgYXBwbHksIHRoZSBlbXVsYXRvciB3aWxsIHNldCB0aGUgVW5kZXJmbG93IGZsYWcgYnV0IGEgcmVhbAorODA0ODYgd2lsbCBub3QuCisKK05PVEU6IENlcnRhaW4gZm9ybWF0cyBvZiBFeHRlbmRlZCBSZWFsIGFyZSBVTlNVUFBPUlRFRC4gVGhleSBhcmUKK3Vuc3VwcG9ydGVkIGJ5IHRoZSA4MDQ4Ni4gVGhleSBhcmUgdGhlIFBzZXVkby1OYU5zLCBQc2V1ZG9pbmZpbml0aWVzLAorYW5kIFVubm9ybWFscy4gTm9uZSBvZiB0aGVzZSB3aWxsIGJlIGdlbmVyYXRlZCBieSBhbiA4MDQ4NiBvciBieSB0aGUKK2VtdWxhdG9yLiBEbyBub3QgdXNlIHRoZW0uIFRoZSBlbXVsYXRvciB0cmVhdHMgdGhlbSBkaWZmZXJlbnRseSBpbgorZGV0YWlsIGZyb20gdGhlIHdheSBhbiA4MDQ4NiBkb2VzLgorCitTZWxmIG1vZGlmeWluZyBjb2RlIGNhbiBjYXVzZSB0aGUgZW11bGF0b3IgdG8gZmFpbC4gQW4gZXhhbXBsZSBvZiBzdWNoCitjb2RlIGlzOgorICAgICAgICAgIG1vdmwgJWVzcCxbJWVieF0KKwkgIGZsZDEKK1RoZSBGUFUgaW5zdHJ1Y3Rpb24gbWF5IGJlICh1c3VhbGx5IHdpbGwgYmUpIGxvYWRlZCBpbnRvIHRoZSBwcmUtZmV0Y2gKK3F1ZXVlIG9mIHRoZSBDUFUgYmVmb3JlIHRoZSBtb3YgaW5zdHJ1Y3Rpb24gaXMgZXhlY3V0ZWQuIElmIHRoZQorZGVzdGluYXRpb24gb2YgdGhlICdtb3ZsJyBvdmVybGFwcyB0aGUgRlBVIGluc3RydWN0aW9uIHRoZW4gdGhlIGJ5dGVzCitpbiB0aGUgcHJlZmV0Y2ggcXVldWUgYW5kIG1lbW9yeSB3aWxsIGJlIGluY29uc2lzdGVudCB3aGVuIHRoZSBGUFUKK2luc3RydWN0aW9uIGlzIGV4ZWN1dGVkLiBUaGUgZW11bGF0b3Igd2lsbCBiZSBpbnZva2VkIGJ1dCB3aWxsIG5vdCBiZQorYWJsZSB0byBmaW5kIHRoZSBpbnN0cnVjdGlvbiB3aGljaCBjYXVzZWQgdGhlIGRldmljZS1ub3QtcHJlc2VudAorZXhjZXB0aW9uLiBGb3IgdGhpcyBjYXNlLCB0aGUgZW11bGF0b3IgY2Fubm90IGVtdWxhdGUgdGhlIGJlaGF2aW91ciBvZgorYW4gODA0ODZEWC4KKworSGFuZGxpbmcgb2YgdGhlIGFkZHJlc3Mgc2l6ZSBvdmVycmlkZSBwcmVmaXggYnl0ZSAoMHg2NykgaGFzIG5vdCBiZWVuCitleHRlbnNpdmVseSB0ZXN0ZWQgeWV0LiBBIG1ham9yIHByb2JsZW0gZXhpc3RzIGJlY2F1c2UgdXNpbmcgaXQgaW4KK3ZtODYgbW9kZSBjYW4gY2F1c2UgYSBnZW5lcmFsIHByb3RlY3Rpb24gZmF1bHQuIEFkZHJlc3Mgb2Zmc2V0cworZ3JlYXRlciB0aGFuIDB4ZmZmZiBhcHBlYXIgdG8gYmUgaWxsZWdhbCBpbiB2bTg2IG1vZGUgYnV0IGFyZSBxdWl0ZQorYWNjZXB0YWJsZSAoYW5kIHdvcmspIGluIHJlYWwgbW9kZS4gQSBzbWFsbCB0ZXN0IHByb2dyYW0gZGV2ZWxvcGVkIHRvCitjaGVjayB0aGUgYWRkcmVzc2luZywgYW5kIHdoaWNoIHJ1bnMgc3VjY2Vzc2Z1bGx5IGluIHJlYWwgbW9kZSwKK2NyYXNoZXMgZG9zZW11IHVuZGVyIExpbnV4IGFuZCBhbHNvIGJyaW5ncyBXaW5kb3dzIGRvd24gd2l0aCBhIGdlbmVyYWwKK3Byb3RlY3Rpb24gZmF1bHQgbWVzc2FnZSB3aGVuIHJ1biB1bmRlciB0aGUgTVMtRE9TIHByb21wdCBvZiBXaW5kb3dzCiszLjEuIChUaGUgcHJvZ3JhbSBzaW1wbHkgcmVhZHMgZGF0YSBmcm9tIGEgdmFsaWQgYWRkcmVzcykuCisKK1RoZSBlbXVsYXRvciBzdXBwb3J0cyAxNi1iaXQgcHJvdGVjdGVkIG1vZGUsIHdpdGggb25lIGRpZmZlcmVuY2UgZnJvbQorYW4gODA0ODZEWC4gIEEgODA0ODZEWCB3aWxsIGFsbG93IHNvbWUgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zIHRvCit3cml0ZSBhIGZldyBieXRlcyBiZWxvdyB0aGUgbG93ZXN0IGFkZHJlc3Mgb2YgdGhlIHN0YWNrLiAgVGhlIGVtdWxhdG9yCit3aWxsIG5vdCBhbGxvdyB0aGlzIGluIDE2LWJpdCBwcm90ZWN0ZWQgbW9kZTogbm8gaW5zdHJ1Y3Rpb25zIGFyZQorYWxsb3dlZCB0byB3cml0ZSBvdXRzaWRlIHRoZSBib3VuZHMgc2V0IGJ5IHRoZSBwcm90ZWN0aW9uLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQZXJmb3JtYW5jZSBvZiB3bS1GUFUtZW11IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NwZWVkLgorLS0tLS0KKworVGhlIHNwZWVkIG9mIGZsb2F0aW5nIHBvaW50IGNvbXB1dGF0aW9uIHdpdGggdGhlIGVtdWxhdG9yIHdpbGwgZGVwZW5kCit1cG9uIGluc3RydWN0aW9uIG1peC4gUmVsYXRpdmUgcGVyZm9ybWFuY2UgaXMgYmVzdCBmb3IgdGhlIGluc3RydWN0aW9ucword2hpY2ggcmVxdWlyZSBtb3N0IGNvbXB1dGF0aW9uLiBUaGUgc2ltcGxlIGluc3RydWN0aW9ucyBhcmUgYWR2ZXJzZWx5CithZmZlY3RlZCBieSB0aGUgRlBVIGluc3RydWN0aW9uIHRyYXAgb3ZlcmhlYWQuCisKKworVGltaW5nOiBTb21lIHNpbXBsZSB0aW1pbmcgdGVzdHMgaGF2ZSBiZWVuIG1hZGUgb24gdGhlIGVtdWxhdG9yIGZ1bmN0aW9ucy4KK1RoZSB0aW1lcyBpbmNsdWRlIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb25zLiBBbGwgdGltZXMgYXJlIGluIG1pY3Jvc2Vjb25kcworbWVhc3VyZWQgb24gYSAzM01IeiAzODYgd2l0aCA2NGsgY2FjaGUuIFRoZSBUdXJibyBDIHRlc3RzIHdlcmUgdW5kZXIKK21zLWRvcywgdGhlIG5leHQgdHdvIGNvbHVtbnMgYXJlIGZvciBlbXVsYXRvcnMgcnVubmluZyB3aXRoIHRoZSBkamdwcAorbXMtZG9zIGV4dGVuZGVyLiBUaGUgZmluYWwgY29sdW1uIGlzIGZvciB3bS1GUFUtZW11IGluIExpbnV4IDAuOTcsCit1c2luZyBsaWJtNC4wIChoYXJkKS4KKworZnVuY3Rpb24gICAgICBUdXJibyBDICAgICAgICBkamdwcCAxLjA2ICAgICAgICBXTS1lbXUzODcgICAgIHdtLUZQVS1lbXUKKworICAgKyAgICAgICAgICA2MC41ICAgICAgICAgICAxNTQuOCAgICAgICAgICAgICAgNzYuNSAgICAgICAgICAxMzkuNAorICAgLSAgICAgICAgICA2MS4xLTY1LjUgICAgICAxNTcuMy0xNjAuOCAgICAgICAgNzYuMi03OS41ICAgICAxNDIuOS0xNDQuNworICAgKiAgICAgICAgICA3MS4wICAgICAgICAgICAxOTAuOCAgICAgICAgICAgICAgNzkuNiAgICAgICAgICAxNDYuNgorICAgLyAgICAgICAgICA2MS4yLTc1LjAgICAgICAyNjEuNC0yNjYuOSAgICAgICAgNzUuMy05MS42ICAgICAxNDIuMi0xNTguMQorCisgc2luKCkgICAgICAgIDMxMC44ICAgICAgICAgIDQ2OTIuMCAgICAgICAgICAgIDMxOS4wICAgICAgICAgIDM5OC41CisgY29zKCkgICAgICAgIDI4NC40ICAgICAgICAgIDQ4NTUuMiAgICAgICAgICAgIDMwOC4wICAgICAgICAgIDM4OC43CisgdGFuKCkgICAgICAgIDQ5NS4wICAgICAgICAgIDg4MDcuMSAgICAgICAgICAgIDM5NC45ICAgICAgICAgIDUwNC43CisgYXRhbigpICAgICAgIDMyOC45ICAgICAgICAgIDQ4NjYuNCAgICAgICAgICAgIDYwMS4xICAgICAgICAgIDQxOS41LTQ5MS45CisKKyBzcXJ0KCkgICAgICAgMTI4LjcgICAgICAgICAgY3Jhc2hlZCAgICAgICAgICAgMTQ1LjIgICAgICAgICAgMjI3LjAKKyBsb2coKSAgICAgICAgNDEzLjEtNDE5LjEgICAgNTEwMy40LTUzNTQuMjEgICAgMjU0LjctMjgyLjIgICAgNDA5LjQtNDM3LjEKKyBleHAoKSAgICAgICAgNDc5LjEgICAgICAgICAgNjYxOS4yICAgICAgICAgICAgNDY5LjEgICAgICAgICAgODUwLjgKKworCitUaGUgcGVyZm9ybWFuY2UgdW5kZXIgTGludXggaXMgaW1wcm92ZWQgYnkgdGhlIHVzZSBvZiBsb29rLWFoZWFkIGNvZGUuCitUaGUgZm9sbG93aW5nIHJlc3VsdHMgc2hvdyB0aGUgaW1wcm92ZW1lbnQgd2hpY2ggaXMgb2J0YWluZWQgdW5kZXIKK0xpbnV4IGR1ZSB0byB0aGUgbG9vay1haGVhZCBjb2RlLiBBbHNvIGdpdmVuIGFyZSB0aGUgdGltZXMgZm9yIHRoZQorb3JpZ2luYWwgTGludXggZW11bGF0b3Igd2l0aCB0aGUgNC4xICdzb2Z0JyBsaWIuCisKKyBbIExpbnVzJyBub3RlOiBJIGNoYW5nZWQgbG9vay1haGVhZCB0byBiZSB0aGUgZGVmYXVsdCB1bmRlciBsaW51eCwgYXMKKyAgIHRoZXJlIHdhcyBubyByZWFzb24gbm90IHRvIHVzZSBpdCBhZnRlciBJIGhhZCBlZGl0ZWQgaXQgdG8gYmUKKyAgIGRpc2FibGVkIGR1cmluZyB0cmFjaW5nIF0KKworICAgICAgICAgICAgd20tRlBVLWVtdSB3ICAgICBvcmlnaW5hbCB3CisgICAgICAgICAgICBsb29rLWFoZWFkICAgICAgICdzb2Z0JyBsaWIKKyAgICsgICAgICAgICAxMDYuNCAgICAgICAgICAgICAxOTAuMgorICAgLSAgICAgICAgIDEwOC42LTExMS42ICAgICAgMTkyLjQtMjE2LjIKKyAgICogICAgICAgICAxMTMuNCAgICAgICAgICAgICAxOTMuMQorICAgLyAgICAgICAgIDEwOC44LTEyNC40ICAgICAgNzAwLjEtNzA2LjIKKworIHNpbigpICAgICAgIDM5MC41ICAgICAgICAgICAgMjY0Mi4wCisgY29zKCkgICAgICAgMzgxLjUgICAgICAgICAgICAyNzY3LjQKKyB0YW4oKSAgICAgICA0OTYuNSAgICAgICAgICAgIDMxNTMuMworIGF0YW4oKSAgICAgIDM2Ny4yLTQzNS41ICAgICAyNDM5LjQtMzM5Ni44CisKKyBzcXJ0KCkgICAgICAxOTUuMSAgICAgICAgICAgIDQ3MzIuNQorIGxvZygpICAgICAgIDM1OC4wLTM4Ny41ICAgICAzMzU5LjItMzM5MC4zCisgZXhwKCkgICAgICAgNjE5LjMgICAgICAgICAgICA0MDQ2LjQKKworCitUaGVzZSBmaWd1cmVzIGFyZSBub3cgc29tZXdoYXQgb3V0LW9mLWRhdGUuIFRoZSBlbXVsYXRvciBoYXMgYmVjb21lCitwcm9ncmVzc2l2ZWx5IHNsb3dlciBmb3IgbW9zdCBmdW5jdGlvbnMgYXMgbW9yZSBvZiB0aGUgODA0ODYgZmVhdHVyZXMKK2hhdmUgYmVlbiBpbXBsZW1lbnRlZC4KKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBY2N1cmFjeSBvZiB3bS1GUFUtZW11IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworVGhlIGFjY3VyYWN5IG9mIHRoZSBlbXVsYXRvciBpcyBpbiBhbG1vc3QgYWxsIGNhc2VzIGVxdWFsIHRvIG9yIGJldHRlcgordGhhbiB0aGF0IG9mIGFuIEludGVsIDgwNDg2IEZQVS4KKworVGhlIHJlc3VsdHMgb2YgdGhlIGJhc2ljIGFyaXRobWV0aWMgZnVuY3Rpb25zICgrLC0sKiwvKSwgYW5kIGZzcXJ0CittYXRjaCB0aG9zZSBvZiBhbiA4MDQ4NiBGUFUuIFRoZXkgYXJlIHRoZSBiZXN0IHBvc3NpYmxlOyB0aGUgZXJyb3IgZm9yCit0aGVzZSBuZXZlciBleGNlZWRzIDEvMiBhbiBsc2IuIFRoZSBmcHJlbSBhbmQgZnByZW0xIGluc3RydWN0aW9ucworcmV0dXJuIGV4YWN0IHJlc3VsdHM7IHRoZXkgaGF2ZSBubyBlcnJvci4KKworCitUaGUgZm9sbG93aW5nIHRhYmxlIGNvbXBhcmVzIHRoZSBlbXVsYXRvciBhY2N1cmFjeSBmb3IgdGhlIHNxcnQoKSwKK3RyaWcgYW5kIGxvZyBmdW5jdGlvbnMgYWdhaW5zdCB0aGUgVHVyYm8gQyAiZW11bGF0b3IiLiBGb3IgdGhpcyB0YWJsZSwKK2VhY2ggZnVuY3Rpb24gd2FzIHRlc3RlZCBhdCBhYm91dCA0MDAgcG9pbnRzLiBJZGVhbCB3b3JzdC1jYXNlIHJlc3VsdHMKK3dvdWxkIGJlIDY0IGJpdHMuIFRoZSByZWR1Y2VkIFR1cmJvIEMgYWNjdXJhY3kgb2YgY29zKCkgYW5kIHRhbigpIGZvcgorYXJndW1lbnRzIGdyZWF0ZXIgdGhhbiBwaS80IGNhbiBiZSB0aG91Z2h0IG9mIGFzIGJlaW5nIHJlbGF0ZWQgdG8gdGhlCitwcmVjaXNpb24gb2YgdGhlIGFyZ3VtZW50IHg7IGUuZy4gYW4gYXJndW1lbnQgb2YgcGkvMi0oMWUtMTApIHdoaWNoIGlzCithY2N1cmF0ZSB0byA2NCBiaXRzIGNhbiByZXN1bHQgaW4gYSByZWxhdGl2ZSBhY2N1cmFjeSBpbiBjb3MoKSBvZgorYWJvdXQgNjQgKyBsb2cyKGNvcyh4KSkgPSAzMSBiaXRzLgorCisKK0Z1bmN0aW9uICAgICAgVGVzdGVkIHggcmFuZ2UgICAgICAgICAgICBXb3JzdCByZXN1bHQgICAgICAgICAgICAgICAgVHVyYm8gQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWxhdGl2ZSBiaXRzKQorCitzcXJ0KHgpICAgICAgIDEgLi4gMiAgICAgICAgICAgICAgICAgICAgNjQuMSAgICAgICAgICAgICAgICAgICAgICAgICA2My4yCithdGFuKHgpICAgICAgIDFlLTEwIC4uIDIwMCAgICAgICAgICAgICAgNjQuMiAgICAgICAgICAgICAgICAgICAgICAgICA2Mi44Citjb3MoeCkgICAgICAgIDAgLi4gcGkvMi0oMWUtMTApICAgICAgICAgNjQuNCAoeCA8PSBwaS80KSAgICAgICAgICAgICA2Mi40CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQuMSAoeCA9IHBpLzItKDFlLTEwKSkgICAgICAzMS45CitzaW4oeCkgICAgICAgIDFlLTEwIC4uIHBpLzIgICAgICAgICAgICAgNjQuMCAgICAgICAgICAgICAgICAgICAgICAgICA2Mi44Cit0YW4oeCkgICAgICAgIDFlLTEwIC4uIHBpLzItKDFlLTEwKSAgICAgNjQuMCAoeCA8PSBwaS80KSAgICAgICAgICAgICA2Mi4xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQuMSAoeCA9IHBpLzItKDFlLTEwKSkgICAgICAzMS45CitleHAoeCkgICAgICAgIDAgLi4gMSAgICAgICAgICAgICAgICAgICAgNjMuMSAqKiAgICAgICAgICAgICAgICAgICAgICA2Mi45Citsb2coeCkgICAgICAgIDErMWUtNiAuLiAyICAgICAgICAgICAgICAgNjMuOCAqKiAgICAgICAgICAgICAgICAgICAgICA2Mi4xCisKKyoqIFRoZSBhY2N1cmFjeSBmb3IgZXhwKCkgYW5kIGxvZygpIGlzIGxvdyBiZWNhdXNlIHRoZSBGUFUgKGVtdWxhdG9yKQorZG9lcyBub3QgY29tcHV0ZSB0aGVtIGRpcmVjdGx5OyB0d28gb3BlcmF0aW9ucyBhcmUgcmVxdWlyZWQuCisKKworVGhlIGVtdWxhdG9yIHBhc3NlcyB0aGUgInBhcmFub2lhIiB0ZXN0cyAoY29tcGlsZWQgd2l0aCBnY2MgMi4zLjMgb3IKK2xhdGVyKSBmb3IgJ2Zsb2F0JyB2YXJpYWJsZXMgKDI0IGJpdCBwcmVjaXNpb24gbnVtYmVycykgd2hlbiBwcmVjaXNpb24KK2NvbnRyb2wgaXMgc2V0IHRvIDI0LCA1MyBvciA2NCBiaXRzLCBhbmQgZm9yICdkb3VibGUnIHZhcmlhYmxlcyAoNTMKK2JpdCBwcmVjaXNpb24gbnVtYmVycykgd2hlbiBwcmVjaXNpb24gY29udHJvbCBpcyBzZXQgdG8gNTMgYml0cyAoYQorcHJvcGVybHkgcGVyZm9ybWluZyBGUFUgY2Fubm90IHBhc3MgdGhlICdwYXJhbm9pYScgdGVzdHMgZm9yICdkb3VibGUnCit2YXJpYWJsZXMgd2hlbiBwcmVjaXNpb24gY29udHJvbCBpcyBzZXQgdG8gNjQgYml0cykuCisKK1RoZSBjb2RlIGZvciByZWR1Y2luZyB0aGUgYXJndW1lbnQgZm9yIHRoZSB0cmlnIGZ1bmN0aW9ucyAoZnNpbiwgZmNvcywKK2ZwdGFuIGFuZCBmc2luY29zKSBoYXMgYmVlbiBpbXByb3ZlZCBhbmQgbm93IGVmZmVjdGl2ZWx5IHVzZXMgYSB2YWx1ZQorZm9yIHBpIHdoaWNoIGlzIGFjY3VyYXRlIHRvIG1vcmUgdGhhbiAxMjggYml0cyBwcmVjaXNpb24uIEFzIGEKK2NvbnNlcXVlbmNlLCB0aGUgYWNjdXJhY3kgb2YgdGhlc2UgZnVuY3Rpb25zIGZvciBsYXJnZSBhcmd1bWVudHMgaGFzCitiZWVuIGRyYW1hdGljYWxseSBpbXByb3ZlZCAoYW5kIGlzIG5vdyB2ZXJ5IG11Y2ggYmV0dGVyIHRoYW4gYW4gODA0ODYKK0ZQVSkuIFRoZXJlIGlzIGFsc28gbm93IG5vIGRlZ3JhZGF0aW9uIG9mIGFjY3VyYWN5IGZvciBmY29zIGFuZCBmcHRhbgorZm9yIG9wZXJhbmRzIGNsb3NlIHRvIHBpLzIuIE1lYXN1cmVkIHJlc3VsdHMgYXJlIChub3RlIHRoYXQgdGhlCitkZWZpbml0aW9uIG9mIGFjY3VyYWN5IGhhcyBjaGFuZ2VkIHNsaWdodGx5IGZyb20gdGhhdCB1c2VkIGZvciB0aGUKK2Fib3ZlIHRhYmxlKToKKworRnVuY3Rpb24gICAgICBUZXN0ZWQgeCByYW5nZSAgICAgICAgICBXb3JzdCByZXN1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWJzb2x1dGUgYml0cykKKworY29zKHgpICAgICAgICAwIC4uIDkuMjJlKzE4ICAgICAgICAgICAgICA2Mi4wCitzaW4oeCkgICAgICAgIDFlLTE2IC4uIDkuMjJlKzE4ICAgICAgICAgIDYyLjEKK3Rhbih4KSAgICAgICAgMWUtMTYgLi4gOS4yMmUrMTggICAgICAgICAgNjEuOAorCitJdCBpcyBwb3NzaWJsZSB3aXRoIHNvbWUgZWZmb3J0IHRvIGZpbmQgdmVyeSBsYXJnZSBhcmd1bWVudHMgd2hpY2gKK2dpdmUgbXVjaCBkZWdyYWRlZCBwcmVjaXNpb24uIEZvciBleGFtcGxlLCB0aGUgaW50ZWdlciBudW1iZXIKKyAgICAgICAgICAgODIyNzc0MDA1ODQxMTE2MjYxNi4wCitpcyB3aXRoaW4gYWJvdXQgMTBlLTcgb2YgYSBtdWx0aXBsZSBvZiBwaS4gVG8gZmluZCB0aGUgdGFuIChmb3IKK2V4YW1wbGUpIG9mIHRoaXMgbnVtYmVyIHRvIDY0IGJpdHMgcHJlY2lzaW9uIGl0IHdvdWxkIGJlIG5lY2Vzc2FyeSB0bworaGF2ZSBhIHZhbHVlIG9mIHBpIHdoaWNoIGhhZCBhYm91dCAxNTAgYml0cyBwcmVjaXNpb24uIFRoZSBGUFUKK2VtdWxhdG9yIGNvbXB1dGVzIHRoZSByZXN1bHQgdG8gYWJvdXQgNDIuNiBiaXRzIHByZWNpc2lvbiAodGhlIGNvcnJlY3QKK3Jlc3VsdCBpcyBhYm91dCAtOS43Mzk3MTVlLTgpLiBPbiB0aGUgb3RoZXIgaGFuZCwgYW4gODA0ODYgRlBVIHJldHVybnMKKzAuMDEwNTksIHdoaWNoIGluIHJlbGF0aXZlIHRlcm1zIGlzIGhvcGVsZXNzbHkgaW5hY2N1cmF0ZS4KKworRm9yIGFyZ3VtZW50cyBjbG9zZSB0byBjcml0aWNhbCBhbmdsZXMgKHdoaWNoIG9jY3VyIGF0IG11bHRpcGxlcyBvZgorcGkvMikgdGhlIGVtdWxhdG9yIGlzIG1vcmUgYWNjdXJhdGUgdGhhbiBhbiA4MDQ4NiBGUFUuIEZvciB2ZXJ5IGxhcmdlCithcmd1bWVudHMsIHRoZSBlbXVsYXRvciBpcyBmYXIgbW9yZSBhY2N1cmF0ZS4KKworCitQcmlvciB0byB2ZXJzaW9uIDEuMjAgb2YgdGhlIGVtdWxhdG9yLCB0aGUgYWNjdXJhY3kgb2YgdGhlIHJlc3VsdHMgZm9yCit0aGUgdHJhbnNjZW5kZW50YWwgZnVuY3Rpb25zIChpbiB0aGVpciBwcmluY2lwYWwgcmFuZ2UpIHdhcyBub3QgYXMKK2dvb2QgYXMgdGhlIHJlc3VsdHMgZnJvbSBhbiA4MDQ4NiBGUFUuIEZyb20gdmVyc2lvbiAxLjIwLCB0aGUgYWNjdXJhY3kKK2hhcyBiZWVuIGNvbnNpZGVyYWJseSBpbXByb3ZlZCBhbmQgdGhlc2UgZnVuY3Rpb25zIG5vdyBnaXZlIG1lYXN1cmVkCit3b3JzdC1jYXNlIHJlc3VsdHMgd2hpY2ggYXJlIGJldHRlciB0aGFuIHRoZSB3b3JzdC1jYXNlIHJlc3VsdHMgZ2l2ZW4KK2J5IGFuIDgwNDg2IEZQVS4KKworVGhlIGZvbGxvd2luZyB0YWJsZSBnaXZlcyB0aGUgbWVhc3VyZWQgcmVzdWx0cyBmb3IgdGhlIGVtdWxhdG9yLiBUaGUKK251bWJlciBvZiByYW5kb21seSBzZWxlY3RlZCBhcmd1bWVudHMgaW4gZWFjaCBjYXNlIGlzIGFib3V0IGhhbGYgYQorbWlsbGlvbi4gIFRoZSBncm91cCBvZiB0aHJlZSBjb2x1bW5zIGdpdmVzIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGdpdmVuCithY2N1cmFjeSBpbiBudW1iZXIgb2YgdGltZXMgcGVyIG1pbGxpb24sIHRodXMgdGhlIHNlY29uZCBvZiB0aGVzZQorY29sdW1ucyBzaG93cyB0aGF0IGFuIGFjY3VyYWN5IG9mIGJldHdlZW4gNjMuODAgYW5kIDYzLjg5IGJpdHMgd2FzCitmb3VuZCBhdCBhIHJhdGUgb2YgMTMzIHRpbWVzIHBlciBvbmUgbWlsbGlvbiBtZWFzdXJlbWVudHMgZm9yIGZzaW4uCitUaGUgcmVzdWx0cyBzaG93IHRoYXQgdGhlIGZzaW4sIGZjb3MgYW5kIGZwdGFuIGluc3RydWN0aW9ucyByZXR1cm4KK3Jlc3VsdHMgd2hpY2ggYXJlIGluIGVycm9yIChpLmUuIGxlc3MgYWNjdXJhdGUgdGhhbiB0aGUgYmVzdCBwb3NzaWJsZQorcmVzdWx0ICh3aGljaCBpcyA2NCBiaXRzKSkgZm9yIGFib3V0IG9uZSBwZXIgY2VudCBvZiBhbGwgYXJndW1lbnRzCitiZXR3ZWVuIC1waS8yIGFuZCArcGkvMi4gIFRoZSBvdGhlciBpbnN0cnVjdGlvbnMgaGF2ZSBhIGxvd2VyCitmcmVxdWVuY3kgb2YgcmVzdWx0cyB3aGljaCBhcmUgaW4gZXJyb3IuICBUaGUgbGFzdCB0d28gY29sdW1ucyBnaXZlCit0aGUgd29yc3QgYWNjdXJhY3kgd2hpY2ggd2FzIGZvdW5kIChpbiBiaXRzKSBhbmQgdGhlIGFwcHJveGltYXRlIHZhbHVlCitvZiB0aGUgYXJndW1lbnQgd2hpY2ggcHJvZHVjZWQgaXQuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmN5IChwZXIgTSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tICAgLS0tLS0tLS0tLS0tLS0tCitpbnN0ciAgIGFyZyByYW5nZSAgICAjIHRlc3RzICAgNjMuNyAgIDYzLjggICAgNjMuOSAgIHdvcnN0ICAgYXQgYXJnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cyAgIGJpdHMgICAgYml0cyAgICBiaXRzCistLS0tLSAgLS0tLS0tLS0tLS0tICAtLS0tLS0tICAgLS0tLSAgIC0tLS0gICAtLS0tLSAgIC0tLS0tICAtLS0tLS0tLQorZnNpbiAgICAgKDAscGkvMikgICAgIDU0Nzc1NiAgICAgIDAgICAgMTMzICAgMTA2NzMgICA2My44OSAgMC40NTEzMTcKK2Zjb3MgICAgICgwLHBpLzIpICAgICA1NDc1NjMgICAgICAwICAgIDEyNiAgIDEwNTMyICAgNjMuODUgIDAuNzAwODAxCitmcHRhbiAgICAoMCxwaS8yKSAgICAgNTM2Mjc0ICAgICAxMSAgICAyNjcgICAxMDA1OSAgIDYzLjc0ICAwLjc4NDg3NgorZnBhdGFuICA0IHF1YWRyYW50cyAgIDUxNzA4NyAgICAgIDAgICAgICA4ICAgIDE4NTUgICA2My44OCAgMC40MzUxMjEgKDRxKQorZnlsMnggICAgICgwLDIwKSAgICAgIDU0MTg2MSAgICAgIDAgICAgICAwICAgIDEzMjMgICA2My45NCAgMS40MDkyMyAgKHgpCitmeWwyeHAxICgtLjI5MywuNDE0KSAgNTIwMjU2ICAgICAgMCAgICAgIDAgICAgNTY3OCAgIDYzLjkzICAwLjQwODU0MiAoeCkKK2YyeG0xICAgICAoLTEsMSkgICAgICA1Mzg4NDcgICAgICA0ICAgIDQ4MSAgICA2NDg4ICAgNjMuNzkgIDAuMTY3NzA5CisKKworVGVzdHMgcGVyZm9ybWVkIG9uIGFuIDgwNDg2IEZQVSBzaG93ZWQgcmVzdWx0cyBvZiBsb3dlciBhY2N1cmFjeS4gVGhlCitmb2xsb3dpbmcgdGFibGUgZ2l2ZXMgdGhlIHJlc3VsdHMgd2hpY2ggd2VyZSBvYnRhaW5lZCB3aXRoIGFuIEFNRAorNDg2RFgyLzY2IChvdGhlciB0ZXN0cyBpbmRpY2F0ZSB0aGF0IGFuIEludGVsIDQ4NkRYIHByb2R1Y2VzCitpZGVudGljYWwgcmVzdWx0cykuICBUaGUgdGVzdHMgd2VyZSBiYXNpY2FsbHkgdGhlIHNhbWUgYXMgdGhvc2UgdXNlZAordG8gbWVhc3VyZSB0aGUgZW11bGF0b3IgKHRoZSB2YWx1ZXMsIGJlaW5nIHJhbmRvbSwgd2VyZSBpbiBnZW5lcmFsIG5vdAordGhlIHNhbWUpLiAgVGhlIHRvdGFsIG51bWJlciBvZiB0ZXN0cyBmb3IgZWFjaCBpbnN0cnVjdGlvbiBhcmUgZ2l2ZW4KK2F0IHRoZSBlbmQgb2YgdGhlIHRhYmxlLCBpbiBjYXNlIGVhY2ggYWJvdXQgMTAwayB0ZXN0cyB3ZXJlIHBlcmZvcm1lZC4KK0Fub3RoZXIgbGluZSBvZiBmaWd1cmVzIGF0IHRoZSBlbmQgb2YgdGhlIHRhYmxlIHNob3dzIHRoYXQgbW9zdCBvZiB0aGUKK2luc3RydWN0aW9ucyByZXR1cm4gcmVzdWx0cyB3aGljaCBhcmUgaW4gZXJyb3IgZm9yIG1vcmUgdGhhbiAxMAorcGVyY2VudCBvZiB0aGUgYXJndW1lbnRzIHRlc3RlZC4KKworVGhlIG51bWJlcnMgaW4gdGhlIGJvZHkgb2YgdGhlIHRhYmxlIGdpdmUgdGhlIGFwcHJveCBudW1iZXIgb2YgdGltZXMgYQorcmVzdWx0IG9mIHRoZSBnaXZlbiBhY2N1cmFjeSBpbiBiaXRzIChnaXZlbiBpbiB0aGUgbGVmdC1tb3N0IGNvbHVtbikKK3dhcyBvYnRhaW5lZCBwZXIgb25lIG1pbGxpb24gYXJndW1lbnRzLiBGb3IgdGhyZWUgb2YgdGhlIGluc3RydWN0aW9ucywKK3R3byBjb2x1bW5zIG9mIHJlc3VsdHMgYXJlIGdpdmVuOiAqIFRoZSBzZWNvbmQgY29sdW1uIGZvciBmMnhtMSBnaXZlcwordGhlIG51bWJlciBjYXNlcyB3aGVyZSB0aGUgcmVzdWx0cyBvZiB0aGUgZmlyc3QgY29sdW1uIHdlcmUgZm9yIGEKK3Bvc2l0aXZlIGFyZ3VtZW50LCB0aGlzIHNob3dzIHRoYXQgdGhpcyBpbnN0cnVjdGlvbiBnaXZlcyBiZXR0ZXIKK3Jlc3VsdHMgZm9yIHBvc2l0aXZlIGFyZ3VtZW50cyB0aGFuIGl0IGRvZXMgZm9yIG5lZ2F0aXZlLiAgKiBJbiB0aGUKK2Nhc2VzIG9mIGZjb3MgYW5kIGZwdGFuLCB0aGUgZmlyc3QgY29sdW1uIGdpdmVzIHRoZSByZXN1bHRzIHdoZW4gYWxsCitjYXNlcyB3aGVyZSBhcmd1bWVudHMgZ3JlYXRlciB0aGFuIDEuNSB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgcmVzdWx0cworZ2l2ZW4gaW4gdGhlIHNlY29uZCBjb2x1bW4uIFVubGlrZSB0aGUgZW11bGF0b3IsIGFuIDgwNDg2IEZQVSByZXR1cm5zCityZXN1bHRzIG9mIHJlbGF0aXZlbHkgcG9vciBhY2N1cmFjeSBmb3IgdGhlc2UgaW5zdHJ1Y3Rpb25zIHdoZW4gdGhlCithcmd1bWVudCBhcHByb2FjaGVzIHBpLzIuIFRoZSB0YWJsZSBkb2VzIG5vdCBzaG93IHRob3NlIGNhc2VzIHdoZW4gdGhlCithY2N1cmFjeSBvZiB0aGUgcmVzdWx0cyB3ZXJlIGxlc3MgdGhhbiA2MiBiaXRzLCB3aGljaCBvY2N1cnMgcXVpdGUKK29mdGVuIGZvciBmc2luIGFuZCBmcHRhbiB3aGVuIHRoZSBhcmd1bWVudCBhcHByb2FjaGVzIHBpLzIuIFRoaXMgcG9vcgorYWNjdXJhY3kgaXMgZGlzY3Vzc2VkIGFib3ZlIGluIHJlbGF0aW9uIHRvIHRoZSBUdXJibyBDICJlbXVsYXRvciIsIGFuZAordGhlIGFjY3VyYWN5IG9mIHRoZSB2YWx1ZSBvZiBwaS4KKworCitiaXRzICAgZjJ4bTEgIGYyeG0xIGZwYXRhbiAgIGZjb3MgICBmY29zICBmeWwyeCBmeWwyeHAxICBmc2luICBmcHRhbiAgZnB0YW4KKzYyLjAgICAgICAgMCAgICAgIDAgICAgICAwICAgICAgMCAgICA0MzcgICAgICAwICAgICAgMCAgICAgIDAgICAgICAwICAgIDkyNQorNjIuMSAgICAgICAwICAgICAgMCAgICAgMTAgICAgICAwICAgIDg5NCAgICAgIDAgICAgICAwICAgICAgMCAgICAgIDAgICAxMDIzCis2Mi4yICAgICAgMTQgICAgICAwICAgICAgMCAgICAgIDAgICAxMDMzICAgICAgMCAgICAgIDAgICAgICAwICAgICAgMCAgICA5NDUKKzYyLjMgICAgICA1NyAgICAgIDAgICAgICAwICAgICAgMCAgIDEyMDIgICAgICAwICAgICAgMCAgICAgIDAgICAgICAwICAgMTAyMworNjIuNCAgICAgMzg1ICAgICAgMCAgICAgIDAgICAgIDEwICAgMTI5MiAgICAgIDAgICAgIDIzICAgICAgMCAgICAgIDAgICAxMTc4Cis2Mi41ICAgIDExNDAgICAgICAwICAgICAgMCAgICAxMTkgICAxNjQ5ICAgICAgMCAgICAgMzkgICAgICAwICAgICAgMCAgIDExNDkKKzYyLjYgICAgMjAzNyAgICAgIDAgICAgICAwICAgIDE4OSAgIDE2MjAgICAgICAwICAgICAxNiAgICAgIDAgICAgICAwICAgMTE2OQorNjIuNyAgICA1MDg2ICAgICAxNCAgICAgIDAgICAgNjQ2ICAgMjMxNSAgICAgMTAgICAgMTAxICAgICAzNSAgICAgMzkgICAxNDAyCis2Mi44ICAgIDg4MTggICAgIDg2ICAgICAgMCAgICA5ODQgICAzMDUwICAgICA1OSAgICAyODcgICAgMTMxICAgIDIyNCAgIDIwMzYKKzYyLjkgICAxMTM0MCAgIDEzNTUgICAgICAwICAgMjEyNiAgIDQxNTMgICAgIDc5ICAgIDYwNSAgICAzNTcgICAgMzIxICAgMTk0OAorNjMuMCAgIDE1NTU3ICAgNDc1MCAgICAgIDAgICAzMzE5ICAgNTM3NiAgICAyNDYgICAxMjgxICAgIDg2MiAgICA4MDggICAyNjg4Cis2My4xICAgMjAwMTYgICA4Mjg4ICAgICAgMCAgIDQ2MjAgICA2NjI4ICAgIDUxMSAgIDI1NjkgICAxNzIzICAgMTUxMCAgIDMzMDIKKzYzLjIgICAyNDk0NSAgMTExMjcgICAgIDEwICAgNjU4OCAgIDgwOTggICAxMTIwICAgNDQ3MCAgIDI5NjggICAyOTkwICAgNDcyNAorNjMuMyAgIDI1Njg2ICAxMjM4MiAgICAgNjkgICA4Nzc0ICAxMDY4MiAgIDE5MDYgICA2Nzc1ICAgNDQ4MiAgIDU0NzQgICA3MjM2Cis2My40ICAgMjkyMTkgIDE0NzIyICAgICA3OSAgMTExMDkgIDEyMzExICAgMzA5NCAgIDk0MTQgICA3MjU5ICAgODkxMiAgMTA1ODcKKzYzLjUgICAzMDQ1OCAgMTQ5MzYgICAgMzkzICAxMzgwMiAgMTUwMTQgICA1ODc0ICAxMjY2NiAgIDk2MDkgIDEzNzYyICAxNTI2MgorNjMuNiAgIDMyNDM5ICAxNjQ0OCAgIDEyNzcgIDE3OTQ1ICAxOTAyOCAgMTAyMjYgIDE1NTM3ICAxNDY1NyAgMTkxNTggIDIwMzQ2Cis2My43ICAgMzUwMzEgIDE2ODA1ICAgNDA2NyAgMjMwMDMgIDIzOTQ3ICAxODkxMCAgMjAxMTYgIDIxMzMzICAyNTAwMSAgMjYyMDkKKzYzLjggICAzMzI1MSAgMTU4MjAgICA3NjczICAyNDc4MSAgMjU2NzUgIDI0NjE3ICAyNTM1NCAgMjQ0NDAgIDI5NDMzICAzMDMyOQorNjMuOSAgIDMzMjkzICAxNjgzMyAgMTg1MjkgIDI4MzE4ICAyOTIzMyAgMzEyNjcgIDMxNDcwICAyNzc0OCAgMjk2NzYgIDMwNjAxCisKK1BlciBjZW50IHdpdGggZXJyb3I6CisgICAgICAgIDMwLjkgICAgICAgICAgIDMuMiAgICAgICAgICAxOC41ICAgIDkuOCAgIDEzLjEgICAxMS42ICAgICAgICAgIDE3LjQKK1RvdGFsIGFyZ3VtZW50cyB0ZXN0ZWQ6CisgICAgICAgNzAxOTQgIDcwMDk5IDEwMTc4NCAxMDA2NDEgMTAwNjQxIDEwMTc5OSAxMjg4NTMgMTE0ODkzIDEwMjY3NSAxMDI2NzUKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnRyaWJ1dG9ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0EgbnVtYmVyIG9mIHBlb3BsZSBoYXZlIGNvbnRyaWJ1dGVkIHRvIHRoZSBkZXZlbG9wbWVudCBvZiB0aGUKK2VtdWxhdG9yLCBvZnRlbiBieSBqdXN0IHJlcG9ydGluZyBidWdzLCBzb21ldGltZXMgd2l0aCBzdWdnZXN0ZWQKK2ZpeGVzLCBhbmQgYSBmZXcga2luZCBwZW9wbGUgaGF2ZSBwcm92aWRlZCBtZSB3aXRoIGFjY2VzcyBpbiBvbmUgd2F5CitvciBhbm90aGVyIHRvIGFuIDgwNDg2IG1hY2hpbmUuIENvbnRyaWJ1dG9ycyBpbmNsdWRlICh0byB0aG9zZSBwZW9wbGUKK3dobyBJIG1heSBoYXZlIGZvcmdvdHRlbiwgcGxlYXNlIGZvcmdpdmUgbWUpOgorCitMaW51cyBUb3J2YWxkcworVG9tbXkuVGhvcm5AZGFpbWkuYWF1LmRrCitBbmRyZXcuVHJpZGdlbGxAYW51LmVkdS5hdQorTmljayBIb2xsb3dheSwgYWxmaWVAZGNzLndhcndpY2suYWMudWsKK0hlcm1hbm8gTW91cmEsIG1vdXJhQGRjcy5nbGEuYWMudWsKK0pvbiBKYWdnZXIsIEouSmFnZ2VyQHNjcC5hYy51aworTGVubmFydCBCZW5zY2hvcAorQnJpYW4gR2FsbGV3LCBnZWVrK0BDTVUuRURVCitUaG9tYXMgU3RhbmlzemV3c2tpLCB0czN2K0BhbmRyZXcuY211LmVkdQorTWFydGluIEhvd2VsbCwgbXBoQHBsYXNtYS5hcGFuYS5vcmcuYXUKK00gU2FnZ2FmLCBhbHNhZ2dhZkBhdGhlbmEubWl0LmVkdQorUGV0ZXIgQmFya2VyLCBQRVRFUkBzb2Nwc3kuc2NpLmZhdS5lZHUKK3RvbUB2bHNpdmllLnR1d2llbi5hYy5hdAorRGFuIFJ1c3NlbCwgcnVzc2VkQHJwaS5lZHUKK0RhbmllbCBDYXJvc29uZSwgZGFuaWVsY2VAZWUubXUub3ouYXUKK2NhZUBqcG1vcmdhbi5jb20KK0hhbWlzaCBDb2xlbWFuLCB0OTMzMDkzQG1pbnlvcy54eC5ybWl0Lm96LmF1CitCcnVjZSBFdmFucywgYmRlQGtyYWxpemVjLnpldGEub3JnLmF1CitUaW1vIEtvcnZvbGEsIFRpbW8uS29ydm9sYUBodXQuZmkKK1JpY2sgTHlvbnMsIHJpY2tAcmF6b3JiYWNrLmJyaXNuZXQub3JnLmF1CitSaWNrLCBqcnNAd29ybGQuc3RkLmNvbQorIAorLi4uYW5kIG51bWVyb3VzIG90aGVycyB3aG8gcmVzcG9uZGVkIHRvIG15IHJlcXVlc3QgZm9yIGhlbHAgd2l0aAorYSByZWFsIDgwNDg2LgorCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWF0aC1lbXUvY29udHJvbF93LmggYi9hcmNoL2kzODYvbWF0aC1lbXUvY29udHJvbF93LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUyMjc0ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9jb250cm9sX3cuaApAQCAtMCwwICsxLDQ1IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICBjb250cm9sX3cuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDb3B5cmlnaHQgKEMpIDE5OTIsMTk5MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICBXLiBNZXR6ZW50aGVuLCAyMiBQYXJrZXIgU3QsIE9ybW9uZCwgVmljIDMxNjMsICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgIEF1c3RyYWxpYS4gIEUtbWFpbCAgIGJpbGxtQHZheGMuY2MubW9uYXNoLmVkdS5hdSAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBfQ09OVFJPTFdfSF8KKyNkZWZpbmUgX0NPTlRST0xXX0hfCisKKyNpZmRlZiBfX0FTU0VNQkxZX18KKyNkZWZpbmUJX0NvbnN0Xyh4KQkkIyN4CisjZWxzZQorI2RlZmluZQlfQ29uc3RfKHgpCXgKKyNlbmRpZgorCisjZGVmaW5lIENXX1JDCQlfQ29uc3RfKDB4MEMwMCkJLyogcm91bmRpbmcgY29udHJvbCAqLworI2RlZmluZSBDV19QQwkJX0NvbnN0XygweDAzMDApCS8qIHByZWNpc2lvbiBjb250cm9sICovCisKKyNkZWZpbmUgQ1dfUHJlY2lzaW9uCUNvbnN0XygweDAwMjApCS8qIGxvc3Mgb2YgcHJlY2lzaW9uIG1hc2sgKi8KKyNkZWZpbmUgQ1dfVW5kZXJmbG93CUNvbnN0XygweDAwMTApCS8qIHVuZGVyZmxvdyBtYXNrICovCisjZGVmaW5lIENXX092ZXJmbG93CUNvbnN0XygweDAwMDgpCS8qIG92ZXJmbG93IG1hc2sgKi8KKyNkZWZpbmUgQ1dfWmVyb0RpdglDb25zdF8oMHgwMDA0KQkvKiBkaXZpZGUgYnkgemVybyBtYXNrICovCisjZGVmaW5lIENXX0Rlbm9ybWFsCUNvbnN0XygweDAwMDIpCS8qIGRlbm9ybWFsaXplZCBvcGVyYW5kIG1hc2sgKi8KKyNkZWZpbmUgQ1dfSW52YWxpZAlDb25zdF8oMHgwMDAxKQkvKiBpbnZhbGlkIG9wZXJhdGlvbiBtYXNrICovCisKKyNkZWZpbmUgQ1dfRXhjZXB0aW9ucyAgCV9Db25zdF8oMHgwMDNmKQkvKiBhbGwgbWFza3MgKi8KKworI2RlZmluZSBSQ19STkQJCV9Db25zdF8oMHgwMDAwKQorI2RlZmluZSBSQ19ET1dOCQlfQ29uc3RfKDB4MDQwMCkKKyNkZWZpbmUgUkNfVVAJCV9Db25zdF8oMHgwODAwKQorI2RlZmluZSBSQ19DSE9QCQlfQ29uc3RfKDB4MEMwMCkKKworLyogcCAxNS01OiBQcmVjaXNpb24gY29udHJvbCBiaXRzIGFmZmVjdCBvbmx5IHRoZSBmb2xsb3dpbmc6CisgICBBREQsIFNVQihSKSwgTVVMLCBESVYoUiksIGFuZCBTUVJUICovCisjZGVmaW5lIFBSXzI0X0JJVFMgICAgICAgIF9Db25zdF8oMHgwMDApCisjZGVmaW5lIFBSXzUzX0JJVFMgICAgICAgIF9Db25zdF8oMHgyMDApCisjZGVmaW5lIFBSXzY0X0JJVFMgICAgICAgIF9Db25zdF8oMHgzMDApCisjZGVmaW5lIFBSX1JFU0VSVkVEX0JJVFMgIF9Db25zdF8oMHgxMDApCisvKiBGVUxMX1BSRUNJU0lPTiBzaW11bGF0ZXMgYWxsIGV4Y2VwdGlvbnMgbWFza2VkICovCisjZGVmaW5lIEZVTExfUFJFQ0lTSU9OICAoUFJfNjRfQklUUyB8IFJDX1JORCB8IDB4M2YpCisKKyNlbmRpZiAvKiBfQ09OVFJPTFdfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYXRoLWVtdS9kaXZfWHNpZy5TIGIvYXJjaC9pMzg2L21hdGgtZW11L2Rpdl9Yc2lnLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc3YmEzMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9kaXZfWHNpZy5TCkBAIC0wLDAgKzEsMzY1IEBACisJLmZpbGUJImRpdl9Yc2lnLlMiCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICBkaXZfWHNpZy5TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBEaXZpc2lvbiBzdWJyb3V0aW5lIGZvciA5NiBiaXQgcXVhbnRpdGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29weXJpZ2h0IChDKSAxOTk0LDE5OTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgVy4gTWV0emVudGhlbiwgMjIgUGFya2VyIFN0LCBPcm1vbmQsIFZpYyAzMTYzLCAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICBBdXN0cmFsaWEuICBFLW1haWwgYmlsbG1AamFjb2JpLm1hdGhzLm1vbmFzaC5lZHUuYXUgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCBEaXZpZGUgdGhlIDk2IGJpdCBxdWFudGl0eSBwb2ludGVkIHRvIGJ5IGEsIGJ5IHRoYXQgcG9pbnRlZCB0byBieSBiLCBhbmQgIHwKKyB8IHB1dCB0aGUgOTYgYml0IHJlc3VsdCBhdCB0aGUgbG9jYXRpb24gZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBUaGUgcmVzdWx0IG1heSBub3QgYmUgYWNjdXJhdGUgdG8gOTYgYml0cy4gSXQgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aGVyZSAgIHwKKyB8IGEgcmVzdWx0IGJldHRlciB0aGFuIDY0IGJpdHMgaXMgcmVxdWlyZWQuIFRoZSByZXN1bHQgc2hvdWxkIHVzdWFsbHkgYmUgICAgfAorIHwgZ29vZCB0byBhdCBsZWFzdCA5NCBiaXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBUaGUgcmV0dXJuZWQgcmVzdWx0IGlzIGFjdHVhbGx5IGRpdmlkZWQgYnkgb25lIGhhbGYuIFRoaXMgaXMgZG9uZSB0byAgICAgIHwKKyB8IHByZXZlbnQgb3ZlcmZsb3cuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgLmFhYWFhYWFhYWFhYWFhIC8gLmJiYmJiYmJiYmJiYmIgIC0+ICAuZGRkZGRkZGRkZGRkICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgIHZvaWQgZGl2X1hzaWcoWHNpZyAqYSwgWHNpZyAqYiwgWHNpZyAqZGVzdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImV4Y2VwdGlvbi5oIgorI2luY2x1ZGUgImZwdV9lbXUuaCIKKworCisjZGVmaW5lCVhzaWdMTCh4KQkoeCkKKyNkZWZpbmUJWHNpZ0woeCkJNCh4KQorI2RlZmluZQlYc2lnSCh4KQk4KHgpCisKKworI2lmbmRlZiBOT05fUkVFTlRSQU5UX0ZQVQorLyoKKwlMb2NhbCBzdG9yYWdlIG9uIHRoZSBzdGFjazoKKwlBY2N1bXVsYXRvcjoJRlBVX2FjY3VtXzM6RlBVX2FjY3VtXzI6RlBVX2FjY3VtXzE6RlBVX2FjY3VtXzAKKyAqLworI2RlZmluZSBGUFVfYWNjdW1fMwktNCglZWJwKQorI2RlZmluZSBGUFVfYWNjdW1fMgktOCglZWJwKQorI2RlZmluZSBGUFVfYWNjdW1fMQktMTIoJWVicCkKKyNkZWZpbmUgRlBVX2FjY3VtXzAJLTE2KCVlYnApCisjZGVmaW5lIEZQVV9yZXN1bHRfMwktMjAoJWVicCkKKyNkZWZpbmUgRlBVX3Jlc3VsdF8yCS0yNCglZWJwKQorI2RlZmluZSBGUFVfcmVzdWx0XzEJLTI4KCVlYnApCisKKyNlbHNlCisuZGF0YQorLyoKKwlMb2NhbCBzdG9yYWdlIGluIGEgc3RhdGljIGFyZWE6CisJQWNjdW11bGF0b3I6CUZQVV9hY2N1bV8zOkZQVV9hY2N1bV8yOkZQVV9hY2N1bV8xOkZQVV9hY2N1bV8wCisgKi8KKwkuYWxpZ24gNCwwCitGUFVfYWNjdW1fMzoKKwkubG9uZwkwCitGUFVfYWNjdW1fMjoKKwkubG9uZwkwCitGUFVfYWNjdW1fMToKKwkubG9uZwkwCitGUFVfYWNjdW1fMDoKKwkubG9uZwkwCitGUFVfcmVzdWx0XzM6CisJLmxvbmcJMAorRlBVX3Jlc3VsdF8yOgorCS5sb25nCTAKK0ZQVV9yZXN1bHRfMToKKwkubG9uZwkwCisjZW5kaWYgLyogTk9OX1JFRU5UUkFOVF9GUFUgKi8KKworCisudGV4dAorRU5UUlkoZGl2X1hzaWcpCisJcHVzaGwJJWVicAorCW1vdmwJJWVzcCwlZWJwCisjaWZuZGVmIE5PTl9SRUVOVFJBTlRfRlBVCisJc3VibAkkMjgsJWVzcAorI2VuZGlmIC8qIE5PTl9SRUVOVFJBTlRfRlBVICovIAorCisJcHVzaGwJJWVzaQorCXB1c2hsCSVlZGkKKwlwdXNobAklZWJ4CisKKwltb3ZsCVBBUkFNMSwlZXNpCS8qIHBvaW50ZXIgdG8gbnVtICovCisJbW92bAlQQVJBTTIsJWVieAkvKiBwb2ludGVyIHRvIGRlbm9tICovCisKKyNpZmRlZiBQQVJBTk9JRAorCXRlc3RsCSQweDgwMDAwMDAwLCBYc2lnSCglZWJ4KQkvKiBEaXZpc29yICovCisJamUJTF9idWdnZWQKKyNlbmRpZiAvKiBQQVJBTk9JRCAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgIERpdmlkZTogICBSZXR1cm4gIGFyZzEvYXJnMiB0byBhcmczLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICBUaGUgbWF4aW11bSByZXR1cm5lZCB2YWx1ZSBpcyAoaWdub3JpbmcgZXhwb25lbnRzKSAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAuZmZmZmZmZmYgZmZmZmZmZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLSAgPSAgMS5mZmZmZmZmZiBmZmZmZmZmZSAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgLjgwMDAwMDAwIDAwMDAwMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgYW5kIHRoZSBtaW5pbXVtIGlzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgIC44MDAwMDAwMCAwMDAwMDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tICA9ICAuODAwMDAwMDAgMDAwMDAwMDEgICAocm91bmRlZCkgICAgICAgfAorIHwgICAgICAgICAgICAgICAuZmZmZmZmZmYgZmZmZmZmZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCS8qIFNhdmUgZXh0ZW5kZWQgZGl2aWRlbmQgaW4gbG9jYWwgcmVnaXN0ZXIgKi8KKworCS8qIERpdmlkZSBieSAyIHRvIHByZXZlbnQgb3ZlcmZsb3cgKi8KKwljbGMKKwltb3ZsCVhzaWdIKCVlc2kpLCVlYXgKKwlyY3JsCSVlYXgKKwltb3ZsCSVlYXgsRlBVX2FjY3VtXzMKKwltb3ZsCVhzaWdMKCVlc2kpLCVlYXgKKwlyY3JsCSVlYXgKKwltb3ZsCSVlYXgsRlBVX2FjY3VtXzIKKwltb3ZsCVhzaWdMTCglZXNpKSwlZWF4CisJcmNybAklZWF4CisJbW92bAklZWF4LEZQVV9hY2N1bV8xCisJbW92bAkkMCwlZWF4CisJcmNybAklZWF4CisJbW92bAklZWF4LEZQVV9hY2N1bV8wCisKKwltb3ZsCUZQVV9hY2N1bV8yLCVlYXgJLyogR2V0IHRoZSBjdXJyZW50IG51bSAqLworCW1vdmwJRlBVX2FjY3VtXzMsJWVkeAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogSW5pdGlhbGl6YXRpb24gZG9uZS4KKyAgIERvIHRoZSBmaXJzdCAzMiBiaXRzLiAqLworCisJLyogV2Ugd2lsbCBkaXZpZGUgYnkgYSBudW1iZXIgd2hpY2ggaXMgdG9vIGxhcmdlICovCisJbW92bAlYc2lnSCglZWJ4KSwlZWN4CisJYWRkbAkkMSwlZWN4CisJam5jCUxGaXJzdF9kaXZfbm90XzEKKworCS8qIGhlcmUgd2UgbmVlZCB0byBkaXZpZGUgYnkgMTAwMDAwMDAwaCwKKwkgICBpLmUuLCBubyBkaXZpc2lvbiBhdCBhbGwuLiAqLworCW1vdgklZWR4LCVlYXgKKwlqbXAJTEZpcnN0X2Rpdl9kb25lCisKK0xGaXJzdF9kaXZfbm90XzE6CisJZGl2bAklZWN4CQkvKiBEaXZpZGUgdGhlIG51bWVyYXRvciBieSB0aGUgYXVnbWVudGVkCisJCQkJICAgZGVub20gbXMgZHcgKi8KKworTEZpcnN0X2Rpdl9kb25lOgorCW1vdmwJJWVheCxGUFVfcmVzdWx0XzMJLyogUHV0IHRoZSByZXN1bHQgaW4gdGhlIGFuc3dlciAqLworCisJbXVsbAlYc2lnSCglZWJ4KQkvKiBtdWwgYnkgdGhlIG1zIGR3IG9mIHRoZSBkZW5vbSAqLworCisJc3VibAklZWF4LEZQVV9hY2N1bV8yCS8qIFN1YnRyYWN0IGZyb20gdGhlIG51bSBsb2NhbCByZWcgKi8KKwlzYmJsCSVlZHgsRlBVX2FjY3VtXzMKKworCW1vdmwJRlBVX3Jlc3VsdF8zLCVlYXgJLyogR2V0IHRoZSByZXN1bHQgYmFjayAqLworCW11bGwJWHNpZ0woJWVieCkJLyogbm93IG11bCB0aGUgbHMgZHcgb2YgdGhlIGRlbm9tICovCisKKwlzdWJsCSVlYXgsRlBVX2FjY3VtXzEJLyogU3VidHJhY3QgZnJvbSB0aGUgbnVtIGxvY2FsIHJlZyAqLworCXNiYmwJJWVkeCxGUFVfYWNjdW1fMgorCXNiYmwJJDAsRlBVX2FjY3VtXzMKKwlqZQlMRG9fMm5kXzMyX2JpdHMJCS8qIE11c3QgY2hlY2sgZm9yIG5vbi16ZXJvIHJlc3VsdCBoZXJlICovCisKKyNpZmRlZiBQQVJBTk9JRAorCWpiCUxfYnVnZ2VkXzEKKyNlbmRpZiAvKiBQQVJBTk9JRCAqLyAKKworCS8qIG5lZWQgdG8gc3VidHJhY3QgYW5vdGhlciBvbmNlIG9mIHRoZSBkZW5vbSAqLworCWluY2wJRlBVX3Jlc3VsdF8zCS8qIENvcnJlY3QgdGhlIGFuc3dlciAqLworCisJbW92bAlYc2lnTCglZWJ4KSwlZWF4CisJbW92bAlYc2lnSCglZWJ4KSwlZWR4CisJc3VibAklZWF4LEZQVV9hY2N1bV8xCS8qIFN1YnRyYWN0IGZyb20gdGhlIG51bSBsb2NhbCByZWcgKi8KKwlzYmJsCSVlZHgsRlBVX2FjY3VtXzIKKworI2lmZGVmIFBBUkFOT0lECisJc2JibAkkMCxGUFVfYWNjdW1fMworCWpuZQlMX2J1Z2dlZF8xCS8qIE11c3QgY2hlY2sgZm9yIG5vbi16ZXJvIHJlc3VsdCBoZXJlICovCisjZW5kaWYgLyogUEFSQU5PSUQgKi8gCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBIYWxmIG9mIHRoZSBtYWluIHByb2JsZW0gaXMgZG9uZSwgdGhlcmUgaXMganVzdCBhIHJlZHVjZWQgbnVtZXJhdG9yCisgICB0byBoYW5kbGUgbm93LgorICAgV29yayB3aXRoIHRoZSBzZWNvbmQgMzIgYml0cywgRlBVX2FjY3VtXzAgbm90IHVzZWQgZnJvbSBub3cgb24gKi8KK0xEb18ybmRfMzJfYml0czoKKwltb3ZsCUZQVV9hY2N1bV8yLCVlZHgJLyogZ2V0IHRoZSByZWR1Y2VkIG51bSAqLworCW1vdmwJRlBVX2FjY3VtXzEsJWVheAorCisJLyogbmVlZCB0byBjaGVjayBmb3IgcG9zc2libGUgc3Vic2VxdWVudCBvdmVyZmxvdyAqLworCWNtcGwJWHNpZ0goJWVieCksJWVkeAorCWpiCUxEb18ybmRfZGl2CisJamEJTFByZXZlbnRfMm5kX292ZXJmbG93CisKKwljbXBsCVhzaWdMKCVlYngpLCVlYXgKKwlqYglMRG9fMm5kX2RpdgorCitMUHJldmVudF8ybmRfb3ZlcmZsb3c6CisvKiBUaGUgbnVtZXJhdG9yIGlzIGdyZWF0ZXIgb3IgZXF1YWwsIHdvdWxkIGNhdXNlIG92ZXJmbG93ICovCisJLyogcHJldmVudCBvdmVyZmxvdyAqLworCXN1YmwJWHNpZ0woJWVieCksJWVheAorCXNiYmwJWHNpZ0goJWVieCksJWVkeAorCW1vdmwJJWVkeCxGUFVfYWNjdW1fMgorCW1vdmwJJWVheCxGUFVfYWNjdW1fMQorCisJaW5jbAlGUFVfcmVzdWx0XzMJLyogUmVmbGVjdCB0aGUgc3VidHJhY3Rpb24gaW4gdGhlIGFuc3dlciAqLworCisjaWZkZWYgUEFSQU5PSUQKKwlqZQlMX2J1Z2dlZF8yCS8qIENhbid0IGJ1bXAgdGhlIHJlc3VsdCB0byAxLjAgKi8KKyNlbmRpZiAvKiBQQVJBTk9JRCAqLyAKKworTERvXzJuZF9kaXY6CisJY21wbAkkMCwlZWN4CQkvKiBhdWdtZW50ZWQgZGVub20gbXN3ICovCisJam56CUxTZWNvbmRfZGl2X25vdF8xCisKKwkvKiAlZWN4ID09IDAsIHdlIGFyZSBkaXZpZGluZyBieSAxLjAgKi8KKwltb3YJJWVkeCwlZWF4CisJam1wCUxTZWNvbmRfZGl2X2RvbmUKKworTFNlY29uZF9kaXZfbm90XzE6CisJZGl2bAklZWN4CQkvKiBEaXZpZGUgdGhlIG51bWVyYXRvciBieSB0aGUgZGVub20gbXMgZHcgKi8KKworTFNlY29uZF9kaXZfZG9uZToKKwltb3ZsCSVlYXgsRlBVX3Jlc3VsdF8yCS8qIFB1dCB0aGUgcmVzdWx0IGluIHRoZSBhbnN3ZXIgKi8KKworCW11bGwJWHNpZ0goJWVieCkJLyogbXVsIGJ5IHRoZSBtcyBkdyBvZiB0aGUgZGVub20gKi8KKworCXN1YmwJJWVheCxGUFVfYWNjdW1fMQkvKiBTdWJ0cmFjdCBmcm9tIHRoZSBudW0gbG9jYWwgcmVnICovCisJc2JibAklZWR4LEZQVV9hY2N1bV8yCisKKyNpZmRlZiBQQVJBTk9JRAorCWpjCUxfYnVnZ2VkXzIKKyNlbmRpZiAvKiBQQVJBTk9JRCAqLworCisJbW92bAlGUFVfcmVzdWx0XzIsJWVheAkvKiBHZXQgdGhlIHJlc3VsdCBiYWNrICovCisJbXVsbAlYc2lnTCglZWJ4KQkvKiBub3cgbXVsIHRoZSBscyBkdyBvZiB0aGUgZGVub20gKi8KKworCXN1YmwJJWVheCxGUFVfYWNjdW1fMAkvKiBTdWJ0cmFjdCBmcm9tIHRoZSBudW0gbG9jYWwgcmVnICovCisJc2JibAklZWR4LEZQVV9hY2N1bV8xCS8qIFN1YnRyYWN0IGZyb20gdGhlIG51bSBsb2NhbCByZWcgKi8KKwlzYmJsCSQwLEZQVV9hY2N1bV8yCisKKyNpZmRlZiBQQVJBTk9JRAorCWpjCUxfYnVnZ2VkXzIKKyNlbmRpZiAvKiBQQVJBTk9JRCAqLworCisJanoJTERvXzNyZF8zMl9iaXRzCisKKyNpZmRlZiBQQVJBTk9JRAorCWNtcGwJJDEsRlBVX2FjY3VtXzIKKwlqbmUJTF9idWdnZWRfMgorI2VuZGlmIC8qIFBBUkFOT0lEICovIAorCisJLyogbmVlZCB0byBzdWJ0cmFjdCBhbm90aGVyIG9uY2Ugb2YgdGhlIGRlbm9tICovCisJbW92bAlYc2lnTCglZWJ4KSwlZWF4CisJbW92bAlYc2lnSCglZWJ4KSwlZWR4CisJc3VibAklZWF4LEZQVV9hY2N1bV8wCS8qIFN1YnRyYWN0IGZyb20gdGhlIG51bSBsb2NhbCByZWcgKi8KKwlzYmJsCSVlZHgsRlBVX2FjY3VtXzEKKwlzYmJsCSQwLEZQVV9hY2N1bV8yCisKKyNpZmRlZiBQQVJBTk9JRAorCWpjCUxfYnVnZ2VkXzIKKwlqbmUJTF9idWdnZWRfMgorI2VuZGlmIC8qIFBBUkFOT0lEICovIAorCisJYWRkbAkkMSxGUFVfcmVzdWx0XzIJLyogQ29ycmVjdCB0aGUgYW5zd2VyICovCisJYWRjbAkkMCxGUFVfcmVzdWx0XzMKKworI2lmZGVmIFBBUkFOT0lECisJamMJTF9idWdnZWRfMgkvKiBNdXN0IGNoZWNrIGZvciBub24temVybyByZXN1bHQgaGVyZSAqLworI2VuZGlmIC8qIFBBUkFOT0lEICovIAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogVGhlIGRpdmlzaW9uIGlzIGVzc2VudGlhbGx5IGZpbmlzaGVkIGhlcmUsIHdlIGp1c3QgbmVlZCB0byBwZXJmb3JtCisgICB0aWR5aW5nIG9wZXJhdGlvbnMuCisgICBEZWFsIHdpdGggdGhlIDNyZCAzMiBiaXRzICovCitMRG9fM3JkXzMyX2JpdHM6CisJLyogV2UgdXNlIGFuIGFwcHJveGltYXRpb24gZm9yIHRoZSB0aGlyZCAzMiBiaXRzLgorCVRvIHRha2UgYWNjb3VudCBvZiB0aGUgM3JkIDMyIGJpdHMgb2YgdGhlIGRpdmlzb3IKKwkoY2FsbCB0aGVtIGRlbCksIHdlIHN1YnRyYWN0ICBkZWwgKiAoYS9iKSAqLworCisJbW92bAlGUFVfcmVzdWx0XzMsJWVheAkvKiBhL2IgKi8KKwltdWxsCVhzaWdMTCglZWJ4KQkJLyogZGVsICovCisKKwlzdWJsCSVlZHgsRlBVX2FjY3VtXzEKKworCS8qIEEgYm9ycm93IGluZGljYXRlcyB0aGF0IHRoZSByZXN1bHQgaXMgbmVnYXRpdmUgKi8KKwlqbmIJTFRlc3Rfb3ZlcgorCisJbW92bAlYc2lnSCglZWJ4KSwlZWR4CisJYWRkbAklZWR4LEZQVV9hY2N1bV8xCisKKwlzdWJsCSQxLEZQVV9yZXN1bHRfMgkJLyogQWRqdXN0IHRoZSBhbnN3ZXIgKi8KKwlzYmJsCSQwLEZQVV9yZXN1bHRfMworCisJLyogVGhlIGFib3ZlIGFkZGl0aW9uIG1pZ2h0IG5vdCBoYXZlIGJlZW4gZW5vdWdoLCBjaGVjayBhZ2Fpbi4gKi8KKwltb3ZsCUZQVV9hY2N1bV8xLCVlZHgJLyogZ2V0IHRoZSByZWR1Y2VkIG51bSAqLworCWNtcGwJWHNpZ0goJWVieCksJWVkeAkvKiBkZW5vbSAqLworCWpiCUxEb18zcmRfZGl2CisKKwltb3ZsCVhzaWdIKCVlYngpLCVlZHgKKwlhZGRsCSVlZHgsRlBVX2FjY3VtXzEKKworCXN1YmwJJDEsRlBVX3Jlc3VsdF8yCQkvKiBBZGp1c3QgdGhlIGFuc3dlciAqLworCXNiYmwJJDAsRlBVX3Jlc3VsdF8zCisJam1wCUxEb18zcmRfZGl2CisKK0xUZXN0X292ZXI6CisJbW92bAlGUFVfYWNjdW1fMSwlZWR4CS8qIGdldCB0aGUgcmVkdWNlZCBudW0gKi8KKworCS8qIG5lZWQgdG8gY2hlY2sgZm9yIHBvc3NpYmxlIHN1YnNlcXVlbnQgb3ZlcmZsb3cgKi8KKwljbXBsCVhzaWdIKCVlYngpLCVlZHgJLyogZGVub20gKi8KKwlqYglMRG9fM3JkX2RpdgorCisJLyogcHJldmVudCBvdmVyZmxvdyAqLworCXN1YmwJWHNpZ0goJWVieCksJWVkeAorCW1vdmwJJWVkeCxGUFVfYWNjdW1fMQorCisJYWRkbAkkMSxGUFVfcmVzdWx0XzIJLyogUmVmbGVjdCB0aGUgc3VidHJhY3Rpb24gaW4gdGhlIGFuc3dlciAqLworCWFkY2wJJDAsRlBVX3Jlc3VsdF8zCisKK0xEb18zcmRfZGl2OgorCW1vdmwJRlBVX2FjY3VtXzAsJWVheAorCW1vdmwJRlBVX2FjY3VtXzEsJWVkeAorCWRpdmwJWHNpZ0goJWVieCkKKworCW1vdmwgICAgJWVheCxGUFVfcmVzdWx0XzEgICAgICAgLyogUm91Z2ggZXN0aW1hdGUgb2YgdGhpcmQgd29yZCAqLworCisJbW92bAlQQVJBTTMsJWVzaQkJLyogcG9pbnRlciB0byBhbnN3ZXIgKi8KKworCW1vdmwJRlBVX3Jlc3VsdF8xLCVlYXgKKwltb3ZsCSVlYXgsWHNpZ0xMKCVlc2kpCisJbW92bAlGUFVfcmVzdWx0XzIsJWVheAorCW1vdmwJJWVheCxYc2lnTCglZXNpKQorCW1vdmwJRlBVX3Jlc3VsdF8zLCVlYXgKKwltb3ZsCSVlYXgsWHNpZ0goJWVzaSkKKworTF9leGl0OgorCXBvcGwJJWVieAorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCisJbGVhdmUKKwlyZXQKKworCisjaWZkZWYgUEFSQU5PSUQKKy8qIFRoZSBsb2dpYyBpcyB3cm9uZyBpZiB3ZSBnb3QgaGVyZSAqLworTF9idWdnZWQ6CisJcHVzaGwJRVhfSU5URVJOQUx8MHgyNDAKKwljYWxsCUVYQ0VQVElPTgorCXBvcAklZWJ4CisJam1wCUxfZXhpdAorCitMX2J1Z2dlZF8xOgorCXB1c2hsCUVYX0lOVEVSTkFMfDB4MjQxCisJY2FsbAlFWENFUFRJT04KKwlwb3AJJWVieAorCWptcAlMX2V4aXQKKworTF9idWdnZWRfMjoKKwlwdXNobAlFWF9JTlRFUk5BTHwweDI0MgorCWNhbGwJRVhDRVBUSU9OCisJcG9wCSVlYngKKwlqbXAJTF9leGl0CisjZW5kaWYgLyogUEFSQU5PSUQgKi8gCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWF0aC1lbXUvZGl2X3NtYWxsLlMgYi9hcmNoL2kzODYvbWF0aC1lbXUvZGl2X3NtYWxsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcwOTk2MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9kaXZfc21hbGwuUwpAQCAtMCwwICsxLDQ3IEBACisJLmZpbGUJImRpdl9zbWFsbC5TIgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgZGl2X3NtYWxsLlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgRGl2aWRlIGEgNjQgYml0IGludGVnZXIgYnkgYSAzMiBiaXQgaW50ZWdlciAmIHJldHVybiByZW1haW5kZXIuICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENvcHlyaWdodCAoQykgMTk5MiwxOTk1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgQXVzdHJhbGlhLiAgRS1tYWlsIGJpbGxtQGphY29iaS5tYXRocy5tb25hc2guZWR1LmF1IHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgICAgdW5zaWduZWQgbG9uZyBGUFVfZGl2X3NtYWxsKHVuc2lnbmVkIGxvbmcgbG9uZyAqeCwgdW5zaWduZWQgbG9uZyB5KSAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJmcHVfZW11LmgiCisKKy50ZXh0CitFTlRSWShGUFVfZGl2X3NtYWxsKQorCXB1c2hsCSVlYnAKKwltb3ZsCSVlc3AsJWVicAorCisJcHVzaGwJJWVzaQorCisJbW92bAlQQVJBTTEsJWVzaQkvKiBwb2ludGVyIHRvIG51bSAqLworCW1vdmwJUEFSQU0yLCVlY3gJLyogVGhlIGRlbm9taW5hdG9yICovCisKKwltb3ZsCTQoJWVzaSksJWVheAkvKiBHZXQgdGhlIGN1cnJlbnQgbnVtIG1zdyAqLworCXhvcmwJJWVkeCwlZWR4CisJZGl2bAklZWN4CisKKwltb3ZsCSVlYXgsNCglZXNpKQorCisJbW92bAkoJWVzaSksJWVheAkvKiBHZXQgdGhlIG51bSBsc3cgKi8KKwlkaXZsCSVlY3gKKworCW1vdmwJJWVheCwoJWVzaSkKKworCW1vdmwJJWVkeCwlZWF4CS8qIFJldHVybiB0aGUgcmVtYWluZGVyIGluIGVheCAqLworCisJcG9wbAklZXNpCisKKwlsZWF2ZQorCXJldAorCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWF0aC1lbXUvZXJyb3JzLmMgYi9hcmNoL2kzODYvbWF0aC1lbXUvZXJyb3JzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFiMGQyMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9lcnJvcnMuYwpAQCAtMCwwICsxLDczOSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgZXJyb3JzLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgIFRoZSBlcnJvciBoYW5kbGluZyBmdW5jdGlvbnMgZm9yIHdtLUZQVS1lbXUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENvcHlyaWdodCAoQykgMTk5MiwxOTkzLDE5OTQsMTk5NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICBXLiBNZXR6ZW50aGVuLCAyMiBQYXJrZXIgU3QsIE9ybW9uZCwgVmljIDMxNjMsIEF1c3RyYWxpYSB8CisgfCAgICAgICAgICAgICAgICAgIEUtbWFpbCAgIGJpbGxtQGphY29iaS5tYXRocy5tb25hc2guZWR1LmF1ICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgTm90ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICBUaGUgZmlsZSBjb250YWlucyBjb2RlIHdoaWNoIGFjY2Vzc2VzIHVzZXIgbWVtb3J5LiAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgIEVtdWxhdG9yIHN0YXRpYyBkYXRhIG1heSBjaGFuZ2Ugd2hlbiB1c2VyIG1lbW9yeSBpcyBhY2Nlc3NlZCwgZHVlIHRvICAgfAorIHwgICAgb3RoZXIgcHJvY2Vzc2VzIHVzaW5nIHRoZSBlbXVsYXRvciB3aGlsZSBzd2FwcGluZyBpcyBpbiBwcm9ncmVzcy4gICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJmcHVfZW11LmgiCisjaW5jbHVkZSAiZnB1X3N5c3RlbS5oIgorI2luY2x1ZGUgImV4Y2VwdGlvbi5oIgorI2luY2x1ZGUgInN0YXR1c193LmgiCisjaW5jbHVkZSAiY29udHJvbF93LmgiCisjaW5jbHVkZSAicmVnX2NvbnN0YW50LmgiCisjaW5jbHVkZSAidmVyc2lvbi5oIgorCisvKiAqLworI3VuZGVmIFBSSU5UX01FU1NBR0VTCisvKiAqLworCisKKyNpZiAwCit2b2lkIFVuX2ltcGwodm9pZCkKK3sKKyAgdV9jaGFyIGJ5dGUxLCBGUFVfbW9kcm07CisgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9IEZQVV9PUklHX0VJUDsKKworICBSRV9FTlRSQU5UX0NIRUNLX09GRjsKKyAgLyogTm8gbmVlZCB0byBjaGVjayBhY2Nlc3Nfb2soKSwgd2UgaGF2ZSBwcmV2aW91c2x5IGZldGNoZWQgdGhlc2UgYnl0ZXMuICovCisgIHByaW50aygiVW5pbXBsZW1lbnRlZCBGUFUgT3Bjb2RlIGF0IGVpcD0lcCA6ICIsICh2b2lkIF9fdXNlciAqKSBhZGRyZXNzKTsKKyAgaWYgKCBGUFVfQ1MgPT0gX19VU0VSX0NTICkKKyAgICB7CisgICAgICB3aGlsZSAoIDEgKQorCXsKKwkgIEZQVV9nZXRfdXNlcihieXRlMSwgKHVfY2hhciBfX3VzZXIgKikgYWRkcmVzcyk7CisJICBpZiAoIChieXRlMSAmIDB4ZjgpID09IDB4ZDggKSBicmVhazsKKwkgIHByaW50aygiWyUwMnhdIiwgYnl0ZTEpOworCSAgYWRkcmVzcysrOworCX0KKyAgICAgIHByaW50aygiJTAyeCAiLCBieXRlMSk7CisgICAgICBGUFVfZ2V0X3VzZXIoRlBVX21vZHJtLCAxICsgKHVfY2hhciBfX3VzZXIgKikgYWRkcmVzcyk7CisgICAgICAKKyAgICAgIGlmIChGUFVfbW9kcm0gPj0gMDMwMCkKKwlwcmludGsoIiUwMnggKCUwMngrJWQpXG4iLCBGUFVfbW9kcm0sIEZQVV9tb2RybSAmIDB4ZjgsIEZQVV9tb2RybSAmIDcpOworICAgICAgZWxzZQorCXByaW50aygiLyVkXG4iLCAoRlBVX21vZHJtID4+IDMpICYgNyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcHJpbnRrKCJjcyBzZWxlY3RvciA9ICUwNHhcbiIsIEZQVV9DUyk7CisgICAgfQorCisgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CisKKyAgRVhDRVBUSU9OKEVYX0ludmFsaWQpOworCit9CisjZW5kaWYgIC8qICAwICAqLworCisKKy8qCisgICBDYWxsZWQgZm9yIG9wY29kZXMgd2hpY2ggYXJlIGlsbGVnYWwgYW5kIHdoaWNoIGFyZSBrbm93biB0byByZXN1bHQgaW4gYQorICAgU0lHSUxMIHdpdGggYSByZWFsIDgwNDg2LgorICAgKi8KK3ZvaWQgRlBVX2lsbGVnYWwodm9pZCkKK3sKKyAgbWF0aF9hYm9ydChGUFVfaW5mbyxTSUdJTEwpOworfQorCisKKwordm9pZCBGUFVfcHJpbnRhbGwodm9pZCkKK3sKKyAgaW50IGk7CisgIHN0YXRpYyBjb25zdCBjaGFyICp0YWdfZGVzY1tdID0geyAiVmFsaWQiLCAiWmVybyIsICJFUlJPUiIsICJFbXB0eSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGVOb3JtIiwgIkluZiIsICJOYU4iIH07CisgIHVfY2hhciBieXRlMSwgRlBVX21vZHJtOworICB1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSBGUFVfT1JJR19FSVA7CisKKyAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisgIC8qIE5vIG5lZWQgdG8gY2hlY2sgYWNjZXNzX29rKCksIHdlIGhhdmUgcHJldmlvdXNseSBmZXRjaGVkIHRoZXNlIGJ5dGVzLiAqLworICBwcmludGsoIkF0ICVwOiIsICh2b2lkICopIGFkZHJlc3MpOworICBpZiAoIEZQVV9DUyA9PSBfX1VTRVJfQ1MgKQorICAgIHsKKyNkZWZpbmUgTUFYX1BSSU5URURfQllURVMgMjAKKyAgICAgIGZvciAoIGkgPSAwOyBpIDwgTUFYX1BSSU5URURfQllURVM7IGkrKyApCisJeworCSAgRlBVX2dldF91c2VyKGJ5dGUxLCAodV9jaGFyIF9fdXNlciAqKSBhZGRyZXNzKTsKKwkgIGlmICggKGJ5dGUxICYgMHhmOCkgPT0gMHhkOCApCisJICAgIHsKKwkgICAgICBwcmludGsoIiAlMDJ4IiwgYnl0ZTEpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBwcmludGsoIiBbJTAyeF0iLCBieXRlMSk7CisJICBhZGRyZXNzKys7CisJfQorICAgICAgaWYgKCBpID09IE1BWF9QUklOVEVEX0JZVEVTICkKKwlwcmludGsoIiBbbW9yZS4uXVxuIik7CisgICAgICBlbHNlCisJeworCSAgRlBVX2dldF91c2VyKEZQVV9tb2RybSwgMSArICh1X2NoYXIgX191c2VyICopIGFkZHJlc3MpOworCSAgCisJICBpZiAoRlBVX21vZHJtID49IDAzMDApCisJICAgIHByaW50aygiICUwMnggKCUwMngrJWQpXG4iLCBGUFVfbW9kcm0sIEZQVV9tb2RybSAmIDB4ZjgsIEZQVV9tb2RybSAmIDcpOworCSAgZWxzZQorCSAgICBwcmludGsoIiAvJWQsIG1vZD0lZCBybT0lZFxuIiwKKwkJICAgKEZQVV9tb2RybSA+PiAzKSAmIDcsIChGUFVfbW9kcm0gPj4gNikgJiAzLCBGUFVfbW9kcm0gJiA3KTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcHJpbnRrKCIlMDR4XG4iLCBGUFVfQ1MpOworICAgIH0KKworICBwYXJ0aWFsX3N0YXR1cyA9IHN0YXR1c193b3JkKCk7CisKKyNpZmRlZiBERUJVR0dJTkcKK2lmICggcGFydGlhbF9zdGF0dXMgJiBTV19CYWNrd2FyZCApICAgIHByaW50aygiU1c6IGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiIpOworaWYgKCBwYXJ0aWFsX3N0YXR1cyAmIFNXX0MzICkgICAgICAgICAgcHJpbnRrKCJTVzogY29uZGl0aW9uIGJpdCAzXG4iKTsKK2lmICggcGFydGlhbF9zdGF0dXMgJiBTV19DMiApICAgICAgICAgIHByaW50aygiU1c6IGNvbmRpdGlvbiBiaXQgMlxuIik7CitpZiAoIHBhcnRpYWxfc3RhdHVzICYgU1dfQzEgKSAgICAgICAgICBwcmludGsoIlNXOiBjb25kaXRpb24gYml0IDFcbiIpOworaWYgKCBwYXJ0aWFsX3N0YXR1cyAmIFNXX0MwICkgICAgICAgICAgcHJpbnRrKCJTVzogY29uZGl0aW9uIGJpdCAwXG4iKTsKK2lmICggcGFydGlhbF9zdGF0dXMgJiBTV19TdW1tYXJ5ICkgICAgIHByaW50aygiU1c6IGV4Y2VwdGlvbiBzdW1tYXJ5XG4iKTsKK2lmICggcGFydGlhbF9zdGF0dXMgJiBTV19TdGFja19GYXVsdCApIHByaW50aygiU1c6IHN0YWNrIGZhdWx0XG4iKTsKK2lmICggcGFydGlhbF9zdGF0dXMgJiBTV19QcmVjaXNpb24gKSAgIHByaW50aygiU1c6IGxvc3Mgb2YgcHJlY2lzaW9uXG4iKTsKK2lmICggcGFydGlhbF9zdGF0dXMgJiBTV19VbmRlcmZsb3cgKSAgIHByaW50aygiU1c6IHVuZGVyZmxvd1xuIik7CitpZiAoIHBhcnRpYWxfc3RhdHVzICYgU1dfT3ZlcmZsb3cgKSAgICBwcmludGsoIlNXOiBvdmVyZmxvd1xuIik7CitpZiAoIHBhcnRpYWxfc3RhdHVzICYgU1dfWmVyb19EaXYgKSAgICBwcmludGsoIlNXOiBkaXZpZGUgYnkgemVyb1xuIik7CitpZiAoIHBhcnRpYWxfc3RhdHVzICYgU1dfRGVub3JtX09wICkgICBwcmludGsoIlNXOiBkZW5vcm1hbGl6ZWQgb3BlcmFuZFxuIik7CitpZiAoIHBhcnRpYWxfc3RhdHVzICYgU1dfSW52YWxpZCApICAgICBwcmludGsoIlNXOiBpbnZhbGlkIG9wZXJhdGlvblxuIik7CisjZW5kaWYgLyogREVCVUdHSU5HICovCisKKyAgcHJpbnRrKCIgU1c6IGI9JWQgc3Q9JWxkIGVzPSVkIHNmPSVkIGNjPSVkJWQlZCVkIGVmPSVkJWQlZCVkJWQlZFxuIiwKKwkgcGFydGlhbF9zdGF0dXMgJiAweDgwMDAgPyAxIDogMCwgICAvKiBidXN5ICovCisJIChwYXJ0aWFsX3N0YXR1cyAmIDB4MzgwMCkgPj4gMTEsICAgLyogc3RhY2sgdG9wIHBvaW50ZXIgKi8KKwkgcGFydGlhbF9zdGF0dXMgJiAweDgwID8gMSA6IDAsICAgICAvKiBFcnJvciBzdW1tYXJ5IHN0YXR1cyAqLworCSBwYXJ0aWFsX3N0YXR1cyAmIDB4NDAgPyAxIDogMCwgICAgIC8qIFN0YWNrIGZsYWcgKi8KKwkgcGFydGlhbF9zdGF0dXMgJiBTV19DMz8xOjAsIHBhcnRpYWxfc3RhdHVzICYgU1dfQzI/MTowLCAvKiBjYyAqLworCSBwYXJ0aWFsX3N0YXR1cyAmIFNXX0MxPzE6MCwgcGFydGlhbF9zdGF0dXMgJiBTV19DMD8xOjAsIC8qIGNjICovCisJIHBhcnRpYWxfc3RhdHVzICYgU1dfUHJlY2lzaW9uPzE6MCwgcGFydGlhbF9zdGF0dXMgJiBTV19VbmRlcmZsb3c/MTowLAorCSBwYXJ0aWFsX3N0YXR1cyAmIFNXX092ZXJmbG93PzE6MCwgcGFydGlhbF9zdGF0dXMgJiBTV19aZXJvX0Rpdj8xOjAsCisJIHBhcnRpYWxfc3RhdHVzICYgU1dfRGVub3JtX09wPzE6MCwgcGFydGlhbF9zdGF0dXMgJiBTV19JbnZhbGlkPzE6MCk7CisgIAorcHJpbnRrKCIgQ1c6IGljPSVkIHJjPSVsZCVsZCBwYz0lbGQlbGQgaWVtPSVkICAgICBlZj0lZCVkJWQlZCVkJWRcbiIsCisJIGNvbnRyb2xfd29yZCAmIDB4MTAwMCA/IDEgOiAwLAorCSAoY29udHJvbF93b3JkICYgMHg4MDApID4+IDExLCAoY29udHJvbF93b3JkICYgMHg0MDApID4+IDEwLAorCSAoY29udHJvbF93b3JkICYgMHgyMDApID4+IDksIChjb250cm9sX3dvcmQgJiAweDEwMCkgPj4gOCwKKwkgY29udHJvbF93b3JkICYgMHg4MCA/IDEgOiAwLAorCSBjb250cm9sX3dvcmQgJiBTV19QcmVjaXNpb24/MTowLCBjb250cm9sX3dvcmQgJiBTV19VbmRlcmZsb3c/MTowLAorCSBjb250cm9sX3dvcmQgJiBTV19PdmVyZmxvdz8xOjAsIGNvbnRyb2xfd29yZCAmIFNXX1plcm9fRGl2PzE6MCwKKwkgY29udHJvbF93b3JkICYgU1dfRGVub3JtX09wPzE6MCwgY29udHJvbF93b3JkICYgU1dfSW52YWxpZD8xOjApOworCisgIGZvciAoIGkgPSAwOyBpIDwgODsgaSsrICkKKyAgICB7CisgICAgICBGUFVfUkVHICpyID0gJnN0KGkpOworICAgICAgdV9jaGFyIHRhZ2kgPSBGUFVfZ2V0dGFnaShpKTsKKyAgICAgIHN3aXRjaCAodGFnaSkKKwl7CisJY2FzZSBUQUdfRW1wdHk6CisJICBjb250aW51ZTsKKwkgIGJyZWFrOworCWNhc2UgVEFHX1plcm86CisJY2FzZSBUQUdfU3BlY2lhbDoKKwkgIHRhZ2kgPSBGUFVfU3BlY2lhbChyKTsKKwljYXNlIFRBR19WYWxpZDoKKwkgIHByaW50aygic3QoJWQpICAlYyAuJTA0bHggJTA0bHggJTA0bHggJTA0bHggZSUrLTZkICIsIGksCisJCSBnZXRzaWduKHIpID8gJy0nIDogJysnLAorCQkgKGxvbmcpKHItPnNpZ2ggPj4gMTYpLAorCQkgKGxvbmcpKHItPnNpZ2ggJiAweEZGRkYpLAorCQkgKGxvbmcpKHItPnNpZ2wgPj4gMTYpLAorCQkgKGxvbmcpKHItPnNpZ2wgJiAweEZGRkYpLAorCQkgZXhwb25lbnQocikgLSBFWFBfQklBUyArIDEpOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIHByaW50aygiV2hvb3BzISBFcnJvciBpbiBlcnJvcnMuYzogdGFnJWQgaXMgJWQgIiwgaSwgdGFnaSk7CisJICBjb250aW51ZTsKKwkgIGJyZWFrOworCX0KKyAgICAgIHByaW50aygiJXNcbiIsIHRhZ19kZXNjWyhpbnQpICh1bnNpZ25lZCkgdGFnaV0pOworICAgIH0KKworICBSRV9FTlRSQU5UX0NIRUNLX09OOworCit9CisKK3N0YXRpYyBzdHJ1Y3QgeworICBpbnQgdHlwZTsKKyAgY29uc3QgY2hhciAqbmFtZTsKK30gZXhjZXB0aW9uX25hbWVzW10gPSB7CisgIHsgRVhfU3RhY2tPdmVyLCAic3RhY2sgb3ZlcmZsb3ciIH0sCisgIHsgRVhfU3RhY2tVbmRlciwgInN0YWNrIHVuZGVyZmxvdyIgfSwKKyAgeyBFWF9QcmVjaXNpb24sICJsb3NzIG9mIHByZWNpc2lvbiIgfSwKKyAgeyBFWF9VbmRlcmZsb3csICJ1bmRlcmZsb3ciIH0sCisgIHsgRVhfT3ZlcmZsb3csICJvdmVyZmxvdyIgfSwKKyAgeyBFWF9aZXJvRGl2LCAiZGl2aWRlIGJ5IHplcm8iIH0sCisgIHsgRVhfRGVub3JtYWwsICJkZW5vcm1hbGl6ZWQgb3BlcmFuZCIgfSwKKyAgeyBFWF9JbnZhbGlkLCAiaW52YWxpZCBvcGVyYXRpb24iIH0sCisgIHsgRVhfSU5URVJOQUwsICJJTlRFUk5BTCBCVUcgaW4gIkZQVV9WRVJTSU9OIH0sCisgIHsgMCwgTlVMTCB9Cit9OworCisvKgorIEVYX0lOVEVSTkFMIGlzIGFsd2F5cyBnaXZlbiB3aXRoIGEgY29kZSB3aGljaCBpbmRpY2F0ZXMgd2hlcmUgdGhlCisgZXJyb3Igd2FzIGRldGVjdGVkLgorCisgSW50ZXJuYWwgZXJyb3IgdHlwZXM6CisgICAgICAgMHgxNCAgIGluIGZwdV9ldGMuYworICAgICAgIDB4MW5uICBpbiBhICouYyBmaWxlOgorICAgICAgICAgICAgICAweDEwMSAgaW4gcmVnX2FkZF9zdWIuYworICAgICAgICAgICAgICAweDEwMiAgaW4gcmVnX211bC5jCisgICAgICAgICAgICAgIDB4MTA0ICBpbiBwb2x5X2F0YW4uYworICAgICAgICAgICAgICAweDEwNSAgaW4gcmVnX211bC5jCisgICAgICAgICAgICAgIDB4MTA3ICBpbiBmcHVfdHJpZy5jCisJICAgICAgMHgxMDggIGluIHJlZ19jb21wYXJlLmMKKwkgICAgICAweDEwOSAgaW4gcmVnX2NvbXBhcmUuYworCSAgICAgIDB4MTEwICBpbiByZWdfYWRkX3N1Yi5jCisJICAgICAgMHgxMTEgIGluIGZwZV9lbnRyeS5jCisJICAgICAgMHgxMTIgIGluIGZwdV90cmlnLmMKKwkgICAgICAweDExMyAgaW4gZXJyb3JzLmMKKwkgICAgICAweDExNSAgaW4gZnB1X3RyaWcuYworCSAgICAgIDB4MTE2ICBpbiBmcHVfdHJpZy5jCisJICAgICAgMHgxMTcgIGluIGZwdV90cmlnLmMKKwkgICAgICAweDExOCAgaW4gZnB1X3RyaWcuYworCSAgICAgIDB4MTE5ICBpbiBmcHVfdHJpZy5jCisJICAgICAgMHgxMjAgIGluIHBvbHlfYXRhbi5jCisJICAgICAgMHgxMjEgIGluIHJlZ19jb21wYXJlLmMKKwkgICAgICAweDEyMiAgaW4gcmVnX2NvbXBhcmUuYworCSAgICAgIDB4MTIzICBpbiByZWdfY29tcGFyZS5jCisJICAgICAgMHgxMjUgIGluIGZwdV90cmlnLmMKKwkgICAgICAweDEyNiAgaW4gZnB1X2VudHJ5LmMKKwkgICAgICAweDEyNyAgaW4gcG9seV8yeG0xLmMKKwkgICAgICAweDEyOCAgaW4gZnB1X2VudHJ5LmMKKwkgICAgICAweDEyOSAgaW4gZnB1X2VudHJ5LmMKKwkgICAgICAweDEzMCAgaW4gZ2V0X2FkZHJlc3MuYworCSAgICAgIDB4MTMxICBpbiBnZXRfYWRkcmVzcy5jCisJICAgICAgMHgxMzIgIGluIGdldF9hZGRyZXNzLmMKKwkgICAgICAweDEzMyAgaW4gZ2V0X2FkZHJlc3MuYworCSAgICAgIDB4MTQwICBpbiBsb2FkX3N0b3JlLmMKKwkgICAgICAweDE0MSAgaW4gbG9hZF9zdG9yZS5jCisgICAgICAgICAgICAgIDB4MTUwICBpbiBwb2x5X3Npbi5jCisgICAgICAgICAgICAgIDB4MTUxICBpbiBwb2x5X3Npbi5jCisJICAgICAgMHgxNjAgIGluIHJlZ19sZF9zdHIuYworCSAgICAgIDB4MTYxICBpbiByZWdfbGRfc3RyLmMKKwkgICAgICAweDE2MiAgaW4gcmVnX2xkX3N0ci5jCisJICAgICAgMHgxNjMgIGluIHJlZ19sZF9zdHIuYworCSAgICAgIDB4MTY0ICBpbiByZWdfbGRfc3RyLmMKKwkgICAgICAweDE3MCAgaW4gZnB1X3RhZ3MuYworCSAgICAgIDB4MTcxICBpbiBmcHVfdGFncy5jCisJICAgICAgMHgxNzIgIGluIGZwdV90YWdzLmMKKwkgICAgICAweDE4MCAgaW4gcmVnX2NvbnZlcnQuYworICAgICAgIDB4Mm5uICBpbiBhbiAqLlMgZmlsZToKKyAgICAgICAgICAgICAgMHgyMDEgIGluIHJlZ191X2FkZC5TCisgICAgICAgICAgICAgIDB4MjAyICBpbiByZWdfdV9kaXYuUworICAgICAgICAgICAgICAweDIwMyAgaW4gcmVnX3VfZGl2LlMKKyAgICAgICAgICAgICAgMHgyMDQgIGluIHJlZ191X2Rpdi5TCisgICAgICAgICAgICAgIDB4MjA1ICBpbiByZWdfdV9tdWwuUworICAgICAgICAgICAgICAweDIwNiAgaW4gcmVnX3Vfc3ViLlMKKyAgICAgICAgICAgICAgMHgyMDcgIGluIHdtX3NxcnQuUworCSAgICAgIDB4MjA4ICBpbiByZWdfZGl2LlMKKyAgICAgICAgICAgICAgMHgyMDkgIGluIHJlZ191X3N1Yi5TCisgICAgICAgICAgICAgIDB4MjEwICBpbiByZWdfdV9zdWIuUworICAgICAgICAgICAgICAweDIxMSAgaW4gcmVnX3Vfc3ViLlMKKyAgICAgICAgICAgICAgMHgyMTIgIGluIHJlZ191X3N1Yi5TCisJICAgICAgMHgyMTMgIGluIHdtX3NxcnQuUworCSAgICAgIDB4MjE0ICBpbiB3bV9zcXJ0LlMKKwkgICAgICAweDIxNSAgaW4gd21fc3FydC5TCisJICAgICAgMHgyMjAgIGluIHJlZ19ub3JtLlMKKwkgICAgICAweDIyMSAgaW4gcmVnX25vcm0uUworCSAgICAgIDB4MjMwICBpbiByZWdfcm91bmQuUworCSAgICAgIDB4MjMxICBpbiByZWdfcm91bmQuUworCSAgICAgIDB4MjMyICBpbiByZWdfcm91bmQuUworCSAgICAgIDB4MjMzICBpbiByZWdfcm91bmQuUworCSAgICAgIDB4MjM0ICBpbiByZWdfcm91bmQuUworCSAgICAgIDB4MjM1ICBpbiByZWdfcm91bmQuUworCSAgICAgIDB4MjM2ICBpbiByZWdfcm91bmQuUworCSAgICAgIDB4MjQwICBpbiBkaXZfWHNpZy5TCisJICAgICAgMHgyNDEgIGluIGRpdl9Yc2lnLlMKKwkgICAgICAweDI0MiAgaW4gZGl2X1hzaWcuUworICovCisKK2FzbWxpbmthZ2Ugdm9pZCBGUFVfZXhjZXB0aW9uKGludCBuKQoreworICBpbnQgaSwgaW50X3R5cGU7CisKKyAgaW50X3R5cGUgPSAwOyAgICAgICAgIC8qIE5lZWRlZCBvbmx5IHRvIHN0b3AgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgaWYgKCBuICYgRVhfSU5URVJOQUwgKQorICAgIHsKKyAgICAgIGludF90eXBlID0gbiAtIEVYX0lOVEVSTkFMOworICAgICAgbiA9IEVYX0lOVEVSTkFMOworICAgICAgLyogU2V0IGxvdHMgb2YgZXhjZXB0aW9uIGJpdHMhICovCisgICAgICBwYXJ0aWFsX3N0YXR1cyB8PSAoU1dfRXhjX01hc2sgfCBTV19TdW1tYXJ5IHwgU1dfQmFja3dhcmQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEV4dHJhY3Qgb25seSB0aGUgYml0cyB3aGljaCB3ZSB1c2UgdG8gc2V0IHRoZSBzdGF0dXMgd29yZCAqLworICAgICAgbiAmPSAoU1dfRXhjX01hc2spOworICAgICAgLyogU2V0IHRoZSBjb3JyZXNwb25kaW5nIGV4Y2VwdGlvbiBiaXQgKi8KKyAgICAgIHBhcnRpYWxfc3RhdHVzIHw9IG47CisgICAgICAvKiBTZXQgc3VtbWFyeSBiaXRzIGlmZiBleGNlcHRpb24gaXNuJ3QgbWFza2VkICovCisgICAgICBpZiAoIHBhcnRpYWxfc3RhdHVzICYgfmNvbnRyb2xfd29yZCAmIENXX0V4Y2VwdGlvbnMgKQorCXBhcnRpYWxfc3RhdHVzIHw9IChTV19TdW1tYXJ5IHwgU1dfQmFja3dhcmQpOworICAgICAgaWYgKCBuICYgKFNXX1N0YWNrX0ZhdWx0IHwgRVhfUHJlY2lzaW9uKSApCisJeworCSAgaWYgKCAhKG4gJiBTV19DMSkgKQorCSAgICAvKiBUaGlzIGJpdCBkaXN0aW5ndWlzaGVzIG92ZXItIGZyb20gdW5kZXJmbG93IGZvciBhIHN0YWNrIGZhdWx0LAorCSAgICAgICBhbmQgcm91bmR1cCBmcm9tIHJvdW5kLWRvd24gZm9yIHByZWNpc2lvbiBsb3NzLiAqLworCSAgICBwYXJ0aWFsX3N0YXR1cyAmPSB+U1dfQzE7CisJfQorICAgIH0KKworICBSRV9FTlRSQU5UX0NIRUNLX09GRjsKKyAgaWYgKCAofmNvbnRyb2xfd29yZCAmIG4gJiBDV19FeGNlcHRpb25zKSB8fCAobiA9PSBFWF9JTlRFUk5BTCkgKQorICAgIHsKKyNpZmRlZiBQUklOVF9NRVNTQUdFUworICAgICAgLyogTXkgbWVzc2FnZSBmcm9tIHRoZSBzcG9uc29yICovCisgICAgICBwcmludGsoRlBVX1ZFUlNJT04iICJfX0RBVEVfXyIgKEMpIFcuIE1ldHplbnRoZW4uXG4iKTsKKyNlbmRpZiAvKiBQUklOVF9NRVNTQUdFUyAqLworICAgICAgCisgICAgICAvKiBHZXQgYSBuYW1lIHN0cmluZyBmb3IgZXJyb3IgcmVwb3J0aW5nICovCisgICAgICBmb3IgKGk9MDsgZXhjZXB0aW9uX25hbWVzW2ldLnR5cGU7IGkrKykKKwlpZiAoIChleGNlcHRpb25fbmFtZXNbaV0udHlwZSAmIG4pID09IGV4Y2VwdGlvbl9uYW1lc1tpXS50eXBlICkKKwkgIGJyZWFrOworICAgICAgCisgICAgICBpZiAoZXhjZXB0aW9uX25hbWVzW2ldLnR5cGUpCisJeworI2lmZGVmIFBSSU5UX01FU1NBR0VTCisJICBwcmludGsoIkZQIEV4Y2VwdGlvbjogJXMhXG4iLCBleGNlcHRpb25fbmFtZXNbaV0ubmFtZSk7CisjZW5kaWYgLyogUFJJTlRfTUVTU0FHRVMgKi8KKwl9CisgICAgICBlbHNlCisJcHJpbnRrKCJGUFUgZW11bGF0b3I6IFVua25vd24gRXhjZXB0aW9uOiAweCUwNHghXG4iLCBuKTsKKyAgICAgIAorICAgICAgaWYgKCBuID09IEVYX0lOVEVSTkFMICkKKwl7CisJICBwcmludGsoIkZQVSBlbXVsYXRvcjogSW50ZXJuYWwgZXJyb3IgdHlwZSAweCUwNHhcbiIsIGludF90eXBlKTsKKwkgIEZQVV9wcmludGFsbCgpOworCX0KKyNpZmRlZiBQUklOVF9NRVNTQUdFUworICAgICAgZWxzZQorCUZQVV9wcmludGFsbCgpOworI2VuZGlmIC8qIFBSSU5UX01FU1NBR0VTICovCisKKyAgICAgIC8qCisgICAgICAgKiBUaGUgODA0ODYgZ2VuZXJhdGVzIGFuIGludGVycnVwdCBvbiB0aGUgbmV4dCBub24tY29udHJvbCBGUFUKKyAgICAgICAqIGluc3RydWN0aW9uLiBTbyB3ZSBuZWVkIHNvbWUgbWVhbnMgb2YgZmxhZ2dpbmcgaXQuCisgICAgICAgKiBXZSB1c2UgdGhlIEVTIChFcnJvciBTdW1tYXJ5KSBiaXQgZm9yIHRoaXMuCisgICAgICAgKi8KKyAgICB9CisgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CisKKyNpZmRlZiBfX0RFQlVHX18KKyAgbWF0aF9hYm9ydChGUFVfaW5mbyxTSUdGUEUpOworI2VuZGlmIC8qIF9fREVCVUdfXyAqLworCit9CisKKworLyogUmVhbCBvcGVyYXRpb24gYXR0ZW1wdGVkIG9uIGEgTmFOLiAqLworLyogUmV0dXJucyA8IDAgaWYgdGhlIGV4Y2VwdGlvbiBpcyB1bm1hc2tlZCAqLworaW50IHJlYWxfMW9wX05hTihGUFVfUkVHICphKQoreworICBpbnQgc2lnbmFsbGluZywgaXNOYU47CisKKyAgaXNOYU4gPSAoZXhwb25lbnQoYSkgPT0gRVhQX09WRVIpICYmIChhLT5zaWdoICYgMHg4MDAwMDAwMCk7CisKKyAgLyogVGhlIGRlZmF1bHQgcmVzdWx0IGZvciB0aGUgY2FzZSBvZiB0d28gImVxdWFsIiBOYU5zIChzaWducyBtYXkKKyAgICAgZGlmZmVyKSBpcyBjaG9zZW4gdG8gcmVwcm9kdWNlIDgwNDg2IGJlaGF2aW91ciAqLworICBzaWduYWxsaW5nID0gaXNOYU4gJiYgIShhLT5zaWdoICYgMHg0MDAwMDAwMCk7CisKKyAgaWYgKCAhc2lnbmFsbGluZyApCisgICAgeworICAgICAgaWYgKCAhaXNOYU4gKSAgLyogcHNldWRvLU5hTiwgb3Igb3RoZXIgdW5zdXBwb3J0ZWQ/ICovCisJeworCSAgaWYgKCBjb250cm9sX3dvcmQgJiBDV19JbnZhbGlkICkKKwkgICAgeworCSAgICAgIC8qIE1hc2tlZCByZXNwb25zZSAqLworCSAgICAgIHJlZ19jb3B5KCZDT05TVF9RTmFOLCBhKTsKKwkgICAgfQorCSAgRVhDRVBUSU9OKEVYX0ludmFsaWQpOworCSAgcmV0dXJuICghKGNvbnRyb2xfd29yZCAmIENXX0ludmFsaWQpID8gRlBVX0V4Y2VwdGlvbiA6IDApIHwgVEFHX1NwZWNpYWw7CisJfQorICAgICAgcmV0dXJuIFRBR19TcGVjaWFsOworICAgIH0KKworICBpZiAoIGNvbnRyb2xfd29yZCAmIENXX0ludmFsaWQgKQorICAgIHsKKyAgICAgIC8qIFRoZSBtYXNrZWQgcmVzcG9uc2UgKi8KKyAgICAgIGlmICggIShhLT5zaWdoICYgMHg4MDAwMDAwMCkgKSAgLyogcHNldWRvLU5hTiA/ICovCisJeworCSAgcmVnX2NvcHkoJkNPTlNUX1FOYU4sIGEpOworCX0KKyAgICAgIC8qIGVuc3VyZSBhIFF1aWV0IE5hTiAqLworICAgICAgYS0+c2lnaCB8PSAweDQwMDAwMDAwOworICAgIH0KKworICBFWENFUFRJT04oRVhfSW52YWxpZCk7CisKKyAgcmV0dXJuICghKGNvbnRyb2xfd29yZCAmIENXX0ludmFsaWQpID8gRlBVX0V4Y2VwdGlvbiA6IDApIHwgVEFHX1NwZWNpYWw7Cit9CisKKworLyogUmVhbCBvcGVyYXRpb24gYXR0ZW1wdGVkIG9uIHR3byBvcGVyYW5kcywgb25lIGEgTmFOLiAqLworLyogUmV0dXJucyA8IDAgaWYgdGhlIGV4Y2VwdGlvbiBpcyB1bm1hc2tlZCAqLworaW50IHJlYWxfMm9wX05hTihGUFVfUkVHIGNvbnN0ICpiLCB1X2NoYXIgdGFnYiwKKwkJIGludCBkZXN0c3RuciwKKwkJIEZQVV9SRUcgY29uc3QgKmRlZmF1bHROYU4pCit7CisgIEZQVV9SRUcgKmRlc3QgPSAmc3QoZGVzdHN0bnIpOworICBGUFVfUkVHIGNvbnN0ICphID0gZGVzdDsKKyAgdV9jaGFyIHRhZ2EgPSBGUFVfZ2V0dGFnaShkZXN0c3Rucik7CisgIEZQVV9SRUcgY29uc3QgKng7CisgIGludCBzaWduYWxsaW5nLCB1bnN1cHBvcnRlZDsKKworICBpZiAoIHRhZ2EgPT0gVEFHX1NwZWNpYWwgKQorICAgIHRhZ2EgPSBGUFVfU3BlY2lhbChhKTsKKyAgaWYgKCB0YWdiID09IFRBR19TcGVjaWFsICkKKyAgICB0YWdiID0gRlBVX1NwZWNpYWwoYik7CisKKyAgLyogVFdfTmFOIGlzIGFsc28gdXNlZCBmb3IgdW5zdXBwb3J0ZWQgZGF0YSB0eXBlcy4gKi8KKyAgdW5zdXBwb3J0ZWQgPSAoKHRhZ2EgPT0gVFdfTmFOKQorCQkgJiYgISgoZXhwb25lbnQoYSkgPT0gRVhQX09WRVIpICYmIChhLT5zaWdoICYgMHg4MDAwMDAwMCkpKQorICAgIHx8ICgodGFnYiA9PSBUV19OYU4pCisJJiYgISgoZXhwb25lbnQoYikgPT0gRVhQX09WRVIpICYmIChiLT5zaWdoICYgMHg4MDAwMDAwMCkpKTsKKyAgaWYgKCB1bnN1cHBvcnRlZCApCisgICAgeworICAgICAgaWYgKCBjb250cm9sX3dvcmQgJiBDV19JbnZhbGlkICkKKwl7CisJICAvKiBNYXNrZWQgcmVzcG9uc2UgKi8KKwkgIEZQVV9jb3B5X3RvX3JlZ2koJkNPTlNUX1FOYU4sIFRBR19TcGVjaWFsLCBkZXN0c3Rucik7CisJfQorICAgICAgRVhDRVBUSU9OKEVYX0ludmFsaWQpOworICAgICAgcmV0dXJuICghKGNvbnRyb2xfd29yZCAmIENXX0ludmFsaWQpID8gRlBVX0V4Y2VwdGlvbiA6IDApIHwgVEFHX1NwZWNpYWw7CisgICAgfQorCisgIGlmICh0YWdhID09IFRXX05hTikKKyAgICB7CisgICAgICB4ID0gYTsKKyAgICAgIGlmICh0YWdiID09IFRXX05hTikKKwl7CisJICBzaWduYWxsaW5nID0gIShhLT5zaWdoICYgYi0+c2lnaCAmIDB4NDAwMDAwMDApOworCSAgaWYgKCBzaWduaWZpY2FuZChiKSA+IHNpZ25pZmljYW5kKGEpICkKKwkgICAgeCA9IGI7CisJICBlbHNlIGlmICggc2lnbmlmaWNhbmQoYikgPT0gc2lnbmlmaWNhbmQoYSkgKQorCSAgICB7CisJICAgICAgLyogVGhlIGRlZmF1bHQgcmVzdWx0IGZvciB0aGUgY2FzZSBvZiB0d28gImVxdWFsIiBOYU5zIChzaWducyBtYXkKKwkJIGRpZmZlcikgaXMgY2hvc2VuIHRvIHJlcHJvZHVjZSA4MDQ4NiBiZWhhdmlvdXIgKi8KKwkgICAgICB4ID0gZGVmYXVsdE5hTjsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiByZXR1cm4gdGhlIHF1aWV0IHZlcnNpb24gb2YgdGhlIE5hTiBpbiBhICovCisJICBzaWduYWxsaW5nID0gIShhLT5zaWdoICYgMHg0MDAwMDAwMCk7CisJfQorICAgIH0KKyAgZWxzZQorI2lmZGVmIFBBUkFOT0lECisgICAgaWYgKHRhZ2IgPT0gVFdfTmFOKQorI2VuZGlmIC8qIFBBUkFOT0lEICovCisgICAgeworICAgICAgc2lnbmFsbGluZyA9ICEoYi0+c2lnaCAmIDB4NDAwMDAwMDApOworICAgICAgeCA9IGI7CisgICAgfQorI2lmZGVmIFBBUkFOT0lECisgIGVsc2UKKyAgICB7CisgICAgICBzaWduYWxsaW5nID0gMDsKKyAgICAgIEVYQ0VQVElPTihFWF9JTlRFUk5BTHwweDExMyk7CisgICAgICB4ID0gJkNPTlNUX1FOYU47CisgICAgfQorI2VuZGlmIC8qIFBBUkFOT0lEICovCisKKyAgaWYgKCAoIXNpZ25hbGxpbmcpIHx8IChjb250cm9sX3dvcmQgJiBDV19JbnZhbGlkKSApCisgICAgeworICAgICAgaWYgKCAhIHggKQorCXggPSBiOworCisgICAgICBpZiAoICEoeC0+c2lnaCAmIDB4ODAwMDAwMDApICkgIC8qIHBzZXVkby1OYU4gPyAqLworCXggPSAmQ09OU1RfUU5hTjsKKworICAgICAgRlBVX2NvcHlfdG9fcmVnaSh4LCBUQUdfU3BlY2lhbCwgZGVzdHN0bnIpOworCisgICAgICBpZiAoICFzaWduYWxsaW5nICkKKwlyZXR1cm4gVEFHX1NwZWNpYWw7CisKKyAgICAgIC8qIGVuc3VyZSBhIFF1aWV0IE5hTiAqLworICAgICAgZGVzdC0+c2lnaCB8PSAweDQwMDAwMDAwOworICAgIH0KKworICBFWENFUFRJT04oRVhfSW52YWxpZCk7CisKKyAgcmV0dXJuICghKGNvbnRyb2xfd29yZCAmIENXX0ludmFsaWQpID8gRlBVX0V4Y2VwdGlvbiA6IDApIHwgVEFHX1NwZWNpYWw7Cit9CisKKworLyogSW52YWxpZCBhcml0aCBvcGVyYXRpb24gb24gVmFsaWQgcmVnaXN0ZXJzICovCisvKiBSZXR1cm5zIDwgMCBpZiB0aGUgZXhjZXB0aW9uIGlzIHVubWFza2VkICovCithc21saW5rYWdlIGludCBhcml0aF9pbnZhbGlkKGludCBkZXN0c3RucikKK3sKKworICBFWENFUFRJT04oRVhfSW52YWxpZCk7CisgIAorICBpZiAoIGNvbnRyb2xfd29yZCAmIENXX0ludmFsaWQgKQorICAgIHsKKyAgICAgIC8qIFRoZSBtYXNrZWQgcmVzcG9uc2UgKi8KKyAgICAgIEZQVV9jb3B5X3RvX3JlZ2koJkNPTlNUX1FOYU4sIFRBR19TcGVjaWFsLCBkZXN0c3Rucik7CisgICAgfQorICAKKyAgcmV0dXJuICghKGNvbnRyb2xfd29yZCAmIENXX0ludmFsaWQpID8gRlBVX0V4Y2VwdGlvbiA6IDApIHwgVEFHX1ZhbGlkOworCit9CisKKworLyogRGl2aWRlIGEgZmluaXRlIG51bWJlciBieSB6ZXJvICovCithc21saW5rYWdlIGludCBGUFVfZGl2aWRlX2J5X3plcm8oaW50IGRlc3RzdG5yLCB1X2NoYXIgc2lnbikKK3sKKyAgRlBVX1JFRyAqZGVzdCA9ICZzdChkZXN0c3Rucik7CisgIGludCB0YWcgPSBUQUdfVmFsaWQ7CisKKyAgaWYgKCBjb250cm9sX3dvcmQgJiBDV19aZXJvRGl2ICkKKyAgICB7CisgICAgICAvKiBUaGUgbWFza2VkIHJlc3BvbnNlICovCisgICAgICBGUFVfY29weV90b19yZWdpKCZDT05TVF9JTkYsIFRBR19TcGVjaWFsLCBkZXN0c3Rucik7CisgICAgICBzZXRzaWduKGRlc3QsIHNpZ24pOworICAgICAgdGFnID0gVEFHX1NwZWNpYWw7CisgICAgfQorIAorICBFWENFUFRJT04oRVhfWmVyb0Rpdik7CisKKyAgcmV0dXJuICghKGNvbnRyb2xfd29yZCAmIENXX1plcm9EaXYpID8gRlBVX0V4Y2VwdGlvbiA6IDApIHwgdGFnOworCit9CisKKworLyogVGhpcyBtYXkgYmUgY2FsbGVkIG9mdGVuLCBzbyBrZWVwIGl0IGxlYW4gKi8KK2ludCBzZXRfcHJlY2lzaW9uX2ZsYWcoaW50IGZsYWdzKQoreworICBpZiAoIGNvbnRyb2xfd29yZCAmIENXX1ByZWNpc2lvbiApCisgICAgeworICAgICAgcGFydGlhbF9zdGF0dXMgJj0gfihTV19DMSAmIGZsYWdzKTsKKyAgICAgIHBhcnRpYWxfc3RhdHVzIHw9IGZsYWdzOyAgIC8qIFRoZSBtYXNrZWQgcmVzcG9uc2UgKi8KKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIEVYQ0VQVElPTihmbGFncyk7CisgICAgICByZXR1cm4gMTsKKyAgICB9Cit9CisKKworLyogVGhpcyBtYXkgYmUgY2FsbGVkIG9mdGVuLCBzbyBrZWVwIGl0IGxlYW4gKi8KK2FzbWxpbmthZ2Ugdm9pZCBzZXRfcHJlY2lzaW9uX2ZsYWdfdXAodm9pZCkKK3sKKyAgaWYgKCBjb250cm9sX3dvcmQgJiBDV19QcmVjaXNpb24gKQorICAgIHBhcnRpYWxfc3RhdHVzIHw9IChTV19QcmVjaXNpb24gfCBTV19DMSk7ICAgLyogVGhlIG1hc2tlZCByZXNwb25zZSAqLworICBlbHNlCisgICAgRVhDRVBUSU9OKEVYX1ByZWNpc2lvbiB8IFNXX0MxKTsKK30KKworCisvKiBUaGlzIG1heSBiZSBjYWxsZWQgb2Z0ZW4sIHNvIGtlZXAgaXQgbGVhbiAqLworYXNtbGlua2FnZSB2b2lkIHNldF9wcmVjaXNpb25fZmxhZ19kb3duKHZvaWQpCit7CisgIGlmICggY29udHJvbF93b3JkICYgQ1dfUHJlY2lzaW9uICkKKyAgICB7ICAgLyogVGhlIG1hc2tlZCByZXNwb25zZSAqLworICAgICAgcGFydGlhbF9zdGF0dXMgJj0gflNXX0MxOworICAgICAgcGFydGlhbF9zdGF0dXMgfD0gU1dfUHJlY2lzaW9uOworICAgIH0KKyAgZWxzZQorICAgIEVYQ0VQVElPTihFWF9QcmVjaXNpb24pOworfQorCisKK2FzbWxpbmthZ2UgaW50IGRlbm9ybWFsX29wZXJhbmQodm9pZCkKK3sKKyAgaWYgKCBjb250cm9sX3dvcmQgJiBDV19EZW5vcm1hbCApCisgICAgeyAgIC8qIFRoZSBtYXNrZWQgcmVzcG9uc2UgKi8KKyAgICAgIHBhcnRpYWxfc3RhdHVzIHw9IFNXX0Rlbm9ybV9PcDsKKyAgICAgIHJldHVybiBUQUdfU3BlY2lhbDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBFWENFUFRJT04oRVhfRGVub3JtYWwpOworICAgICAgcmV0dXJuIFRBR19TcGVjaWFsIHwgRlBVX0V4Y2VwdGlvbjsKKyAgICB9Cit9CisKKworYXNtbGlua2FnZSBpbnQgYXJpdGhfb3ZlcmZsb3coRlBVX1JFRyAqZGVzdCkKK3sKKyAgaW50IHRhZyA9IFRBR19WYWxpZDsKKworICBpZiAoIGNvbnRyb2xfd29yZCAmIENXX092ZXJmbG93ICkKKyAgICB7CisgICAgICAvKiBUaGUgbWFza2VkIHJlc3BvbnNlICovCisvKiAjIyMjIyMgVGhlIHJlc3BvbnNlIGhlcmUgZGVwZW5kcyB1cG9uIHRoZSByb3VuZGluZyBtb2RlICovCisgICAgICByZWdfY29weSgmQ09OU1RfSU5GLCBkZXN0KTsKKyAgICAgIHRhZyA9IFRBR19TcGVjaWFsOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFN1YnRyYWN0IHRoZSBtYWdpYyBudW1iZXIgZnJvbSB0aGUgZXhwb25lbnQgKi8KKyAgICAgIGFkZGV4cG9uZW50KGRlc3QsICgtMyAqICgxIDw8IDEzKSkpOworICAgIH0KKworICBFWENFUFRJT04oRVhfT3ZlcmZsb3cpOworICBpZiAoIGNvbnRyb2xfd29yZCAmIENXX092ZXJmbG93ICkKKyAgICB7CisgICAgICAvKiBUaGUgb3ZlcmZsb3cgZXhjZXB0aW9uIGlzIG1hc2tlZC4gKi8KKyAgICAgIC8qIEJ5IGRlZmluaXRpb24sIHByZWNpc2lvbiBpcyBsb3N0LgorCSBUaGUgcm91bmR1cCBiaXQgKEMxKSBpcyBhbHNvIHNldCBiZWNhdXNlIHdlIGhhdmUKKwkgInJvdW5kZWQiIHVwd2FyZHMgdG8gSW5maW5pdHkuICovCisgICAgICBFWENFUFRJT04oRVhfUHJlY2lzaW9uIHwgU1dfQzEpOworICAgICAgcmV0dXJuIHRhZzsKKyAgICB9CisKKyAgcmV0dXJuIHRhZzsKKworfQorCisKK2FzbWxpbmthZ2UgaW50IGFyaXRoX3VuZGVyZmxvdyhGUFVfUkVHICpkZXN0KQoreworICBpbnQgdGFnID0gVEFHX1ZhbGlkOworCisgIGlmICggY29udHJvbF93b3JkICYgQ1dfVW5kZXJmbG93ICkKKyAgICB7CisgICAgICAvKiBUaGUgbWFza2VkIHJlc3BvbnNlICovCisgICAgICBpZiAoIGV4cG9uZW50MTYoZGVzdCkgPD0gRVhQX1VOREVSIC0gNjMgKQorCXsKKwkgIHJlZ19jb3B5KCZDT05TVF9aLCBkZXN0KTsKKwkgIHBhcnRpYWxfc3RhdHVzICY9IH5TV19DMTsgICAgICAgLyogUm91bmQgZG93bi4gKi8KKwkgIHRhZyA9IFRBR19aZXJvOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBzdGRleHAoZGVzdCk7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEFkZCB0aGUgbWFnaWMgbnVtYmVyIHRvIHRoZSBleHBvbmVudC4gKi8KKyAgICAgIGFkZGV4cG9uZW50KGRlc3QsICgzICogKDEgPDwgMTMpKSArIEVYVEVOREVEX0ViaWFzKTsKKyAgICB9CisKKyAgRVhDRVBUSU9OKEVYX1VuZGVyZmxvdyk7CisgIGlmICggY29udHJvbF93b3JkICYgQ1dfVW5kZXJmbG93ICkKKyAgICB7CisgICAgICAvKiBUaGUgdW5kZXJmbG93IGV4Y2VwdGlvbiBpcyBtYXNrZWQuICovCisgICAgICBFWENFUFRJT04oRVhfUHJlY2lzaW9uKTsKKyAgICAgIHJldHVybiB0YWc7CisgICAgfQorCisgIHJldHVybiB0YWc7CisKK30KKworCit2b2lkIEZQVV9zdGFja19vdmVyZmxvdyh2b2lkKQoreworCisgaWYgKCBjb250cm9sX3dvcmQgJiBDV19JbnZhbGlkICkKKyAgICB7CisgICAgICAvKiBUaGUgbWFza2VkIHJlc3BvbnNlICovCisgICAgICB0b3AtLTsKKyAgICAgIEZQVV9jb3B5X3RvX3JlZzAoJkNPTlNUX1FOYU4sIFRBR19TcGVjaWFsKTsKKyAgICB9CisKKyAgRVhDRVBUSU9OKEVYX1N0YWNrT3Zlcik7CisKKyAgcmV0dXJuOworCit9CisKKwordm9pZCBGUFVfc3RhY2tfdW5kZXJmbG93KHZvaWQpCit7CisKKyBpZiAoIGNvbnRyb2xfd29yZCAmIENXX0ludmFsaWQgKQorICAgIHsKKyAgICAgIC8qIFRoZSBtYXNrZWQgcmVzcG9uc2UgKi8KKyAgICAgIEZQVV9jb3B5X3RvX3JlZzAoJkNPTlNUX1FOYU4sIFRBR19TcGVjaWFsKTsKKyAgICB9CisKKyAgRVhDRVBUSU9OKEVYX1N0YWNrVW5kZXIpOworCisgIHJldHVybjsKKworfQorCisKK3ZvaWQgRlBVX3N0YWNrX3VuZGVyZmxvd19pKGludCBpKQoreworCisgaWYgKCBjb250cm9sX3dvcmQgJiBDV19JbnZhbGlkICkKKyAgICB7CisgICAgICAvKiBUaGUgbWFza2VkIHJlc3BvbnNlICovCisgICAgICBGUFVfY29weV90b19yZWdpKCZDT05TVF9RTmFOLCBUQUdfU3BlY2lhbCwgaSk7CisgICAgfQorCisgIEVYQ0VQVElPTihFWF9TdGFja1VuZGVyKTsKKworICByZXR1cm47CisKK30KKworCit2b2lkIEZQVV9zdGFja191bmRlcmZsb3dfcG9wKGludCBpKQoreworCisgaWYgKCBjb250cm9sX3dvcmQgJiBDV19JbnZhbGlkICkKKyAgICB7CisgICAgICAvKiBUaGUgbWFza2VkIHJlc3BvbnNlICovCisgICAgICBGUFVfY29weV90b19yZWdpKCZDT05TVF9RTmFOLCBUQUdfU3BlY2lhbCwgaSk7CisgICAgICBGUFVfcG9wKCk7CisgICAgfQorCisgIEVYQ0VQVElPTihFWF9TdGFja1VuZGVyKTsKKworICByZXR1cm47CisKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hdGgtZW11L2V4Y2VwdGlvbi5oIGIvYXJjaC9pMzg2L21hdGgtZW11L2V4Y2VwdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NjNmMjFhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L2V4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgIGV4Y2VwdGlvbi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENvcHlyaWdodCAoQykgMTk5MiAgICBXLiBNZXR6ZW50aGVuLCAyMiBQYXJrZXIgU3QsIE9ybW9uZCwgVmljIDMxNjMsICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgIEF1c3RyYWxpYS4gIEUtbWFpbCAgIGJpbGxtQHZheGMuY2MubW9uYXNoLmVkdS5hdSAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBfRVhDRVBUSU9OX0hfCisjZGVmaW5lIF9FWENFUFRJT05fSF8KKworCisjaWZkZWYgX19BU1NFTUJMWV9fCisjZGVmaW5lCUNvbnN0Xyh4KQkkIyN4CisjZWxzZQorI2RlZmluZQlDb25zdF8oeCkJeAorI2VuZGlmCisKKyNpZm5kZWYgU1dfQzEKKyNpbmNsdWRlICJmcHVfZW11LmgiCisjZW5kaWYgLyogU1dfQzEgKi8KKworI2RlZmluZSBGUFVfQlVTWSAgICAgICAgQ29uc3RfKDB4ODAwMCkgICAvKiBGUFUgYnVzeSBiaXQgKDgwODcgY29tcGF0aWJpbGl0eSkgKi8KKyNkZWZpbmUgRVhfRXJyb3JTdW1tYXJ5IENvbnN0XygweDAwODApICAgLyogRXJyb3Igc3VtbWFyeSBzdGF0dXMgKi8KKy8qIFNwZWNpYWwgZXhjZXB0aW9uczogKi8KKyNkZWZpbmUJRVhfSU5URVJOQUwJQ29uc3RfKDB4ODAwMCkJLyogSW50ZXJuYWwgZXJyb3IgaW4gd20tRlBVLWVtdSAqLworI2RlZmluZSBFWF9TdGFja092ZXIJQ29uc3RfKDB4MDA0MXxTV19DMSkJLyogc3RhY2sgb3ZlcmZsb3cgKi8KKyNkZWZpbmUgRVhfU3RhY2tVbmRlcglDb25zdF8oMHgwMDQxKQkvKiBzdGFjayB1bmRlcmZsb3cgKi8KKy8qIEV4Y2VwdGlvbiBmbGFnczogKi8KKyNkZWZpbmUgRVhfUHJlY2lzaW9uCUNvbnN0XygweDAwMjApCS8qIGxvc3Mgb2YgcHJlY2lzaW9uICovCisjZGVmaW5lIEVYX1VuZGVyZmxvdwlDb25zdF8oMHgwMDEwKQkvKiB1bmRlcmZsb3cgKi8KKyNkZWZpbmUgRVhfT3ZlcmZsb3cJQ29uc3RfKDB4MDAwOCkJLyogb3ZlcmZsb3cgKi8KKyNkZWZpbmUgRVhfWmVyb0RpdglDb25zdF8oMHgwMDA0KQkvKiBkaXZpZGUgYnkgemVybyAqLworI2RlZmluZSBFWF9EZW5vcm1hbAlDb25zdF8oMHgwMDAyKQkvKiBkZW5vcm1hbGl6ZWQgb3BlcmFuZCAqLworI2RlZmluZSBFWF9JbnZhbGlkCUNvbnN0XygweDAwMDEpCS8qIGludmFsaWQgb3BlcmF0aW9uICovCisKKworI2RlZmluZSBQUkVDSVNJT05fTE9TVF9VUCAgICBDb25zdF8oKEVYX1ByZWNpc2lvbiB8IFNXX0MxKSkKKyNkZWZpbmUgUFJFQ0lTSU9OX0xPU1RfRE9XTiAgQ29uc3RfKEVYX1ByZWNpc2lvbikKKworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisjaWZkZWYgREVCVUcKKyNkZWZpbmUJRVhDRVBUSU9OKHgpCXsgcHJpbnRrKCJleGNlcHRpb24gaW4gJXMgYXQgbGluZSAlZFxuIiwgXAorCV9fRklMRV9fLCBfX0xJTkVfXyk7IEZQVV9leGNlcHRpb24oeCk7IH0KKyNlbHNlCisjZGVmaW5lCUVYQ0VQVElPTih4KQlGUFVfZXhjZXB0aW9uKHgpCisjZW5kaWYKKworI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLyAKKworI2VuZGlmIC8qIF9FWENFUFRJT05fSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYXRoLWVtdS9mcHVfYXJpdGguYyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9mcHVfYXJpdGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTcyZGVjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L2ZwdV9hcml0aC5jCkBAIC0wLDAgKzEsMTc0IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICBmcHVfYXJpdGguYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDb2RlIHRvIGltcGxlbWVudCB0aGUgRlBVIHJlZ2lzdGVyL3JlZ2lzdGVyIGFyaXRobWV0aWMgaW5zdHJ1Y3Rpb25zICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTMsMTk5NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgQXVzdHJhbGlhIHwKKyB8ICAgICAgICAgICAgICAgICAgRS1tYWlsICAgYmlsbG1Ac3VidXJiaWEubmV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImZwdV9zeXN0ZW0uaCIKKyNpbmNsdWRlICJmcHVfZW11LmgiCisjaW5jbHVkZSAiY29udHJvbF93LmgiCisjaW5jbHVkZSAic3RhdHVzX3cuaCIKKworCit2b2lkIGZhZGRfXyh2b2lkKQoreworICAvKiBmYWRkIHN0LHN0KGkpICovCisgIGludCBpID0gRlBVX3JtOworICBjbGVhcl9DMSgpOworICBGUFVfYWRkKCZzdChpKSwgRlBVX2dldHRhZ2koaSksIDAsIGNvbnRyb2xfd29yZCk7Cit9CisKKwordm9pZCBmbXVsX18odm9pZCkKK3sKKyAgLyogZm11bCBzdCxzdChpKSAqLworICBpbnQgaSA9IEZQVV9ybTsKKyAgY2xlYXJfQzEoKTsKKyAgRlBVX211bCgmc3QoaSksIEZQVV9nZXR0YWdpKGkpLCAwLCBjb250cm9sX3dvcmQpOworfQorCisKKwordm9pZCBmc3ViX18odm9pZCkKK3sKKyAgLyogZnN1YiBzdCxzdChpKSAqLworICBjbGVhcl9DMSgpOworICBGUFVfc3ViKDAsIEZQVV9ybSwgY29udHJvbF93b3JkKTsKK30KKworCit2b2lkIGZzdWJyXyh2b2lkKQoreworICAvKiBmc3ViciBzdCxzdChpKSAqLworICBjbGVhcl9DMSgpOworICBGUFVfc3ViKFJFViwgRlBVX3JtLCBjb250cm9sX3dvcmQpOworfQorCisKK3ZvaWQgZmRpdl9fKHZvaWQpCit7CisgIC8qIGZkaXYgc3Qsc3QoaSkgKi8KKyAgY2xlYXJfQzEoKTsKKyAgRlBVX2RpdigwLCBGUFVfcm0sIGNvbnRyb2xfd29yZCk7Cit9CisKKwordm9pZCBmZGl2cl8odm9pZCkKK3sKKyAgLyogZmRpdnIgc3Qsc3QoaSkgKi8KKyAgY2xlYXJfQzEoKTsKKyAgRlBVX2RpdihSRVYsIEZQVV9ybSwgY29udHJvbF93b3JkKTsKK30KKworCisKK3ZvaWQgZmFkZF9pKHZvaWQpCit7CisgIC8qIGZhZGQgc3QoaSksc3QgKi8KKyAgaW50IGkgPSBGUFVfcm07CisgIGNsZWFyX0MxKCk7CisgIEZQVV9hZGQoJnN0KGkpLCBGUFVfZ2V0dGFnaShpKSwgaSwgY29udHJvbF93b3JkKTsKK30KKworCit2b2lkIGZtdWxfaSh2b2lkKQoreworICAvKiBmbXVsIHN0KGkpLHN0ICovCisgIGNsZWFyX0MxKCk7CisgIEZQVV9tdWwoJnN0KDApLCBGUFVfZ2V0dGFnMCgpLCBGUFVfcm0sIGNvbnRyb2xfd29yZCk7Cit9CisKKwordm9pZCBmc3Vicmkodm9pZCkKK3sKKyAgLyogZnN1YnIgc3QoaSksc3QgKi8KKyAgY2xlYXJfQzEoKTsKKyAgRlBVX3N1YihERVNUX1JNLCBGUFVfcm0sIGNvbnRyb2xfd29yZCk7Cit9CisKKwordm9pZCBmc3ViX2kodm9pZCkKK3sKKyAgLyogZnN1YiBzdChpKSxzdCAqLworICBjbGVhcl9DMSgpOworICBGUFVfc3ViKFJFVnxERVNUX1JNLCBGUFVfcm0sIGNvbnRyb2xfd29yZCk7Cit9CisKKwordm9pZCBmZGl2cmkodm9pZCkKK3sKKyAgLyogZmRpdnIgc3QoaSksc3QgKi8KKyAgY2xlYXJfQzEoKTsKKyAgRlBVX2RpdihERVNUX1JNLCBGUFVfcm0sIGNvbnRyb2xfd29yZCk7Cit9CisKKwordm9pZCBmZGl2X2kodm9pZCkKK3sKKyAgLyogZmRpdiBzdChpKSxzdCAqLworICBjbGVhcl9DMSgpOworICBGUFVfZGl2KFJFVnxERVNUX1JNLCBGUFVfcm0sIGNvbnRyb2xfd29yZCk7Cit9CisKKworCit2b2lkIGZhZGRwXyh2b2lkKQoreworICAvKiBmYWRkcCBzdChpKSxzdCAqLworICBpbnQgaSA9IEZQVV9ybTsKKyAgY2xlYXJfQzEoKTsKKyAgaWYgKCBGUFVfYWRkKCZzdChpKSwgRlBVX2dldHRhZ2koaSksIGksIGNvbnRyb2xfd29yZCkgPj0gMCApCisgICAgRlBVX3BvcCgpOworfQorCisKK3ZvaWQgZm11bHBfKHZvaWQpCit7CisgIC8qIGZtdWxwIHN0KGkpLHN0ICovCisgIGNsZWFyX0MxKCk7CisgIGlmICggRlBVX211bCgmc3QoMCksIEZQVV9nZXR0YWcwKCksIEZQVV9ybSwgY29udHJvbF93b3JkKSA+PSAwICkKKyAgICBGUFVfcG9wKCk7Cit9CisKKworCit2b2lkIGZzdWJycCh2b2lkKQoreworICAvKiBmc3VicnAgc3QoaSksc3QgKi8KKyAgY2xlYXJfQzEoKTsKKyAgaWYgKCBGUFVfc3ViKERFU1RfUk0sIEZQVV9ybSwgY29udHJvbF93b3JkKSA+PSAwICkKKyAgICBGUFVfcG9wKCk7Cit9CisKKwordm9pZCBmc3VicF8odm9pZCkKK3sKKyAgLyogZnN1YnAgc3QoaSksc3QgKi8KKyAgY2xlYXJfQzEoKTsKKyAgaWYgKCBGUFVfc3ViKFJFVnxERVNUX1JNLCBGUFVfcm0sIGNvbnRyb2xfd29yZCkgPj0gMCApCisgICAgRlBVX3BvcCgpOworfQorCisKK3ZvaWQgZmRpdnJwKHZvaWQpCit7CisgIC8qIGZkaXZycCBzdChpKSxzdCAqLworICBjbGVhcl9DMSgpOworICBpZiAoIEZQVV9kaXYoREVTVF9STSwgRlBVX3JtLCBjb250cm9sX3dvcmQpID49IDAgKQorICAgIEZQVV9wb3AoKTsKK30KKworCit2b2lkIGZkaXZwXyh2b2lkKQoreworICAvKiBmZGl2cCBzdChpKSxzdCAqLworICBjbGVhcl9DMSgpOworICBpZiAoIEZQVV9kaXYoUkVWfERFU1RfUk0sIEZQVV9ybSwgY29udHJvbF93b3JkKSA+PSAwICkKKyAgICBGUFVfcG9wKCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWF0aC1lbXUvZnB1X2FzbS5oIGIvYXJjaC9pMzg2L21hdGgtZW11L2ZwdV9hc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmExMjQxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L2ZwdV9hc20uaApAQCAtMCwwICsxLDMyIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICBmcHVfYXNtLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDb3B5cmlnaHQgKEMpIDE5OTIsMTk5NSwxOTk3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICBXLiBNZXR6ZW50aGVuLCAyMiBQYXJrZXIgU3QsIE9ybW9uZCwgVmljIDMxNjMsICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgIEF1c3RyYWxpYS4gIEUtbWFpbCBiaWxsbUBzdWJ1cmJpYS5uZXQgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBfRlBVX0FTTV9IXworI2RlZmluZSBfRlBVX0FTTV9IXworCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorCisjZGVmaW5lCUVYQ0VQVElPTglGUFVfZXhjZXB0aW9uCisKKworI2RlZmluZSBQQVJBTTEJOCglZWJwKQorI2RlZmluZQlQQVJBTTIJMTIoJWVicCkKKyNkZWZpbmUJUEFSQU0zCTE2KCVlYnApCisjZGVmaW5lCVBBUkFNNAkyMCglZWJwKQorI2RlZmluZQlQQVJBTTUJMjQoJWVicCkKKyNkZWZpbmUJUEFSQU02CTI4KCVlYnApCisjZGVmaW5lCVBBUkFNNwkzMiglZWJwKQorCisjZGVmaW5lIFNJR0xfT0ZGU0VUIDAKKyNkZWZpbmUJRVhQKHgpCTgoeCkKKyNkZWZpbmUgU0lHKHgpCVNJR0xfT0ZGU0VUIyMoeCkKKyNkZWZpbmUJU0lHTCh4KQlTSUdMX09GRlNFVCMjKHgpCisjZGVmaW5lCVNJR0goeCkJNCh4KQorCisjZW5kaWYgLyogX0ZQVV9BU01fSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYXRoLWVtdS9mcHVfYXV4LmMgYi9hcmNoL2kzODYvbWF0aC1lbXUvZnB1X2F1eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwODg2Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWF0aC1lbXUvZnB1X2F1eC5jCkBAIC0wLDAgKzEsMjA0IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICBmcHVfYXV4LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDb2RlIHRvIGltcGxlbWVudCBzb21lIG9mIHRoZSBGUFUgYXV4aWxpYXJ5IGluc3RydWN0aW9ucy4gICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTMsMTk5NCwxOTk3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgQXVzdHJhbGlhIHwKKyB8ICAgICAgICAgICAgICAgICAgRS1tYWlsICAgYmlsbG1Ac3VidXJiaWEubmV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImZwdV9zeXN0ZW0uaCIKKyNpbmNsdWRlICJleGNlcHRpb24uaCIKKyNpbmNsdWRlICJmcHVfZW11LmgiCisjaW5jbHVkZSAic3RhdHVzX3cuaCIKKyNpbmNsdWRlICJjb250cm9sX3cuaCIKKworCitzdGF0aWMgdm9pZCBmbm9wKHZvaWQpCit7Cit9CisKK3N0YXRpYyB2b2lkIGZjbGV4KHZvaWQpCit7CisgIHBhcnRpYWxfc3RhdHVzICY9IH4oU1dfQmFja3dhcmR8U1dfU3VtbWFyeXxTV19TdGFja19GYXVsdHxTV19QcmVjaXNpb258CisJCSAgIFNXX1VuZGVyZmxvd3xTV19PdmVyZmxvd3xTV19aZXJvX0RpdnxTV19EZW5vcm1fT3B8CisJCSAgIFNXX0ludmFsaWQpOworICBub19pcF91cGRhdGUgPSAxOworfQorCisvKiBOZWVkcyB0byBiZSBleHRlcm5hbGx5IHZpc2libGUgKi8KK3ZvaWQgZmluaXQodm9pZCkKK3sKKyAgY29udHJvbF93b3JkID0gMHgwMzdmOworICBwYXJ0aWFsX3N0YXR1cyA9IDA7CisgIHRvcCA9IDA7ICAgICAgICAgICAgLyogV2UgZG9uJ3Qga2VlcCB0b3AgaW4gdGhlIHN0YXR1cyB3b3JkIGludGVybmFsbHkuICovCisgIGZwdV90YWdfd29yZCA9IDB4ZmZmZjsKKyAgLyogVGhlIGJlaGF2aW91ciBpcyBkaWZmZXJlbnQgZnJvbSB0aGF0IGRldGFpbGVkIGluCisgICAgIFNlY3Rpb24gMTUuMS42IG9mIHRoZSBJbnRlbCBtYW51YWwgKi8KKyAgb3BlcmFuZF9hZGRyZXNzLm9mZnNldCA9IDA7CisgIG9wZXJhbmRfYWRkcmVzcy5zZWxlY3RvciA9IDA7CisgIGluc3RydWN0aW9uX2FkZHJlc3Mub2Zmc2V0ID0gMDsKKyAgaW5zdHJ1Y3Rpb25fYWRkcmVzcy5zZWxlY3RvciA9IDA7CisgIGluc3RydWN0aW9uX2FkZHJlc3Mub3Bjb2RlID0gMDsKKyAgbm9faXBfdXBkYXRlID0gMTsKK30KKworLyoKKyAqIFRoZXNlIGFyZSBub3BzIG9uIHRoZSBpMzg3Li4KKyAqLworI2RlZmluZSBmZW5pIGZub3AKKyNkZWZpbmUgZmRpc2kgZm5vcAorI2RlZmluZSBmc2V0cG0gZm5vcAorCitzdGF0aWMgRlVOQyBjb25zdCBmaW5pdF90YWJsZVtdID0geworICBmZW5pLCBmZGlzaSwgZmNsZXgsIGZpbml0LAorICBmc2V0cG0sIEZQVV9pbGxlZ2FsLCBGUFVfaWxsZWdhbCwgRlBVX2lsbGVnYWwKK307CisKK3ZvaWQgZmluaXRfKHZvaWQpCit7CisgIChmaW5pdF90YWJsZVtGUFVfcm1dKSgpOworfQorCisKK3N0YXRpYyB2b2lkIGZzdHN3X2F4KHZvaWQpCit7CisgICooc2hvcnQgKikgJkZQVV9FQVggPSBzdGF0dXNfd29yZCgpOworICBub19pcF91cGRhdGUgPSAxOworfQorCitzdGF0aWMgRlVOQyBjb25zdCBmc3Rzd190YWJsZVtdID0geworICBmc3Rzd19heCwgRlBVX2lsbGVnYWwsIEZQVV9pbGxlZ2FsLCBGUFVfaWxsZWdhbCwKKyAgRlBVX2lsbGVnYWwsIEZQVV9pbGxlZ2FsLCBGUFVfaWxsZWdhbCwgRlBVX2lsbGVnYWwKK307CisKK3ZvaWQgZnN0c3dfKHZvaWQpCit7CisgIChmc3Rzd190YWJsZVtGUFVfcm1dKSgpOworfQorCisKK3N0YXRpYyBGVU5DIGNvbnN0IGZwX25vcF90YWJsZVtdID0geworICBmbm9wLCBGUFVfaWxsZWdhbCwgRlBVX2lsbGVnYWwsIEZQVV9pbGxlZ2FsLAorICBGUFVfaWxsZWdhbCwgRlBVX2lsbGVnYWwsIEZQVV9pbGxlZ2FsLCBGUFVfaWxsZWdhbAorfTsKKwordm9pZCBmcF9ub3Aodm9pZCkKK3sKKyAgKGZwX25vcF90YWJsZVtGUFVfcm1dKSgpOworfQorCisKK3ZvaWQgZmxkX2lfKHZvaWQpCit7CisgIEZQVV9SRUcgKnN0X25ld19wdHI7CisgIGludCBpOworICB1X2NoYXIgdGFnOworCisgIGlmICggU1RBQ0tfT1ZFUkZMT1cgKQorICAgIHsgRlBVX3N0YWNrX292ZXJmbG93KCk7IHJldHVybjsgfQorCisgIC8qIGZsZCBzdChpKSAqLworICBpID0gRlBVX3JtOworICBpZiAoIE5PVF9FTVBUWShpKSApCisgICAgeworICAgICAgcmVnX2NvcHkoJnN0KGkpLCBzdF9uZXdfcHRyKTsKKyAgICAgIHRhZyA9IEZQVV9nZXR0YWdpKGkpOworICAgICAgcHVzaCgpOworICAgICAgRlBVX3NldHRhZzAodGFnKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIGNvbnRyb2xfd29yZCAmIENXX0ludmFsaWQgKQorCXsKKwkgIC8qIFRoZSBtYXNrZWQgcmVzcG9uc2UgKi8KKwkgIEZQVV9zdGFja191bmRlcmZsb3coKTsKKwl9CisgICAgICBlbHNlCisJRVhDRVBUSU9OKEVYX1N0YWNrVW5kZXIpOworICAgIH0KKworfQorCisKK3ZvaWQgZnhjaF9pKHZvaWQpCit7CisgIC8qIGZ4Y2ggc3QoaSkgKi8KKyAgRlBVX1JFRyB0OworICBpbnQgaSA9IEZQVV9ybTsKKyAgRlBVX1JFRyAqc3QwX3B0ciA9ICZzdCgwKSwgKnN0aV9wdHIgPSAmc3QoaSk7CisgIGxvbmcgdGFnX3dvcmQgPSBmcHVfdGFnX3dvcmQ7CisgIGludCByZWduciA9IHRvcCAmIDcsIHJlZ25yaSA9ICgocmVnbnIgKyBpKSAmIDcpOworICB1X2NoYXIgc3QwX3RhZyA9ICh0YWdfd29yZCA+PiAocmVnbnIqMikpICYgMzsKKyAgdV9jaGFyIHN0aV90YWcgPSAodGFnX3dvcmQgPj4gKHJlZ25yaSoyKSkgJiAzOworCisgIGlmICggc3QwX3RhZyA9PSBUQUdfRW1wdHkgKQorICAgIHsKKyAgICAgIGlmICggc3RpX3RhZyA9PSBUQUdfRW1wdHkgKQorCXsKKwkgIEZQVV9zdGFja191bmRlcmZsb3coKTsKKwkgIEZQVV9zdGFja191bmRlcmZsb3dfaShpKTsKKwkgIHJldHVybjsKKwl9CisgICAgICBpZiAoIGNvbnRyb2xfd29yZCAmIENXX0ludmFsaWQgKQorCXsKKwkgIC8qIE1hc2tlZCByZXNwb25zZSAqLworCSAgRlBVX2NvcHlfdG9fcmVnMChzdGlfcHRyLCBzdGlfdGFnKTsKKwl9CisgICAgICBGUFVfc3RhY2tfdW5kZXJmbG93X2koaSk7CisgICAgICByZXR1cm47CisgICAgfQorICBpZiAoIHN0aV90YWcgPT0gVEFHX0VtcHR5ICkKKyAgICB7CisgICAgICBpZiAoIGNvbnRyb2xfd29yZCAmIENXX0ludmFsaWQgKQorCXsKKwkgIC8qIE1hc2tlZCByZXNwb25zZSAqLworCSAgRlBVX2NvcHlfdG9fcmVnaShzdDBfcHRyLCBzdDBfdGFnLCBpKTsKKwl9CisgICAgICBGUFVfc3RhY2tfdW5kZXJmbG93KCk7CisgICAgICByZXR1cm47CisgICAgfQorICBjbGVhcl9DMSgpOworCisgIHJlZ19jb3B5KHN0MF9wdHIsICZ0KTsKKyAgcmVnX2NvcHkoc3RpX3B0ciwgc3QwX3B0cik7CisgIHJlZ19jb3B5KCZ0LCBzdGlfcHRyKTsKKworICB0YWdfd29yZCAmPSB+KDMgPDwgKHJlZ25yKjIpKSAmIH4oMyA8PCAocmVnbnJpKjIpKTsKKyAgdGFnX3dvcmQgfD0gKHN0aV90YWcgPDwgKHJlZ25yKjIpKSB8IChzdDBfdGFnIDw8IChyZWducmkqMikpOworICBmcHVfdGFnX3dvcmQgPSB0YWdfd29yZDsKK30KKworCit2b2lkIGZmcmVlXyh2b2lkKQoreworICAvKiBmZnJlZSBzdChpKSAqLworICBGUFVfc2V0dGFnaShGUFVfcm0sIFRBR19FbXB0eSk7Cit9CisKKwordm9pZCBmZnJlZXAodm9pZCkKK3sKKyAgLyogZmZyZWUgc3QoaSkgKyBwb3AgLSB1bm9mZmljaWFsIGNvZGUgKi8KKyAgRlBVX3NldHRhZ2koRlBVX3JtLCBUQUdfRW1wdHkpOworICBGUFVfcG9wKCk7Cit9CisKKwordm9pZCBmc3RfaV8odm9pZCkKK3sKKyAgLyogZnN0IHN0KGkpICovCisgIEZQVV9jb3B5X3RvX3JlZ2koJnN0KDApLCBGUFVfZ2V0dGFnMCgpLCBGUFVfcm0pOworfQorCisKK3ZvaWQgZnN0cF9pKHZvaWQpCit7CisgIC8qIGZzdHAgc3QoaSkgKi8KKyAgRlBVX2NvcHlfdG9fcmVnaSgmc3QoMCksIEZQVV9nZXR0YWcwKCksIEZQVV9ybSk7CisgIEZQVV9wb3AoKTsKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hdGgtZW11L2ZwdV9lbXUuaCBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9mcHVfZW11LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYyYjIwYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9mcHVfZW11LmgKQEAgLTAsMCArMSwyMTcgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgIGZwdV9lbXUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENvcHlyaWdodCAoQykgMTk5MiwxOTkzLDE5OTQsMTk5NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgQXVzdHJhbGlhLiAgRS1tYWlsICAgYmlsbG1Ac3VidXJiaWEubmV0ICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyNpZm5kZWYgX0ZQVV9FTVVfSF8KKyNkZWZpbmUgX0ZQVV9FTVVfSF8KKworLyoKKyAqIERlZmluZSBQRUNVTElBUl80ODYgdG8gZ2V0IGEgY2xvc2VyIGFwcHJveGltYXRpb24gdG8gODA0ODYgYmVoYXZpb3VyLAorICogcmF0aGVyIHRoYW4gYmVoYXZpb3VyIHdoaWNoIGFwcGVhcnMgdG8gYmUgY2xlYW5lci4KKyAqIFRoaXMgaXMgYSBtYXR0ZXIgb2Ygb3BpbmlvbjogZm9yIGFsbCBJIGtub3csIHRoZSA4MDQ4NiBtYXkgc2ltcGx5CisgKiBiZSBjb21wbHlpbmcgd2l0aCB0aGUgSUVFRSBzcGVjLiBNYXliZSBvbmUgZGF5IEknbGwgZ2V0IHRvIHNlZSB0aGUKKyAqIHNwZWMuLi4KKyAqLworI2RlZmluZSBQRUNVTElBUl80ODYKKworI2lmZGVmIF9fQVNTRU1CTFlfXworI2luY2x1ZGUgImZwdV9hc20uaCIKKyNkZWZpbmUJQ29uc3QoeCkJJCMjeAorI2Vsc2UKKyNkZWZpbmUJQ29uc3QoeCkJeAorI2VuZGlmCisKKyNkZWZpbmUgRVhQX0JJQVMJQ29uc3QoMCkKKyNkZWZpbmUgRVhQX09WRVIJQ29uc3QoMHg0MDAwKSAgICAvKiBzbWFsbGVzdCBpbnZhbGlkIGxhcmdlIGV4cG9uZW50ICovCisjZGVmaW5lCUVYUF9VTkRFUglDb25zdCgtMHgzZmZmKSAgIC8qIGxhcmdlc3QgaW52YWxpZCBzbWFsbCBleHBvbmVudCAqLworI2RlZmluZSBFWFBfV0FZX1VOREVSICAgQ29uc3QoLTB4NjAwMCkgICAvKiBCZWxvdyB0aGUgc21hbGxlc3QgZGVub3JtYWwsIGJ1dAorCQkJCQkgICAgc3RpbGwgYSAxNiBiaXQgbnIuICovCisjZGVmaW5lIEVYUF9JbmZpbml0eSAgICBFWFBfT1ZFUgorI2RlZmluZSBFWFBfTmFOICAgICAgICAgRVhQX09WRVIKKworI2RlZmluZSBFWFRFTkRFRF9FYmlhcyBDb25zdCgweDNmZmYpCisjZGVmaW5lIEVYVEVOREVEX0VtaW4gKC0weDNmZmUpICAvKiBzbWFsbGVzdCB2YWxpZCBleHBvbmVudCAqLworCisjZGVmaW5lIFNJR05fUE9TCUNvbnN0KDApCisjZGVmaW5lIFNJR05fTkVHCUNvbnN0KDB4ODApCisKKyNkZWZpbmUgU0lHTl9Qb3NpdGl2ZQlDb25zdCgwKQorI2RlZmluZSBTSUdOX05lZ2F0aXZlCUNvbnN0KDB4ODAwMCkKKworCisvKiBLZWVwIHRoZSBvcmRlciBUQUdfVmFsaWQsIFRBR19aZXJvLCBUV19EZW5vcm1hbCAqLworLyogVGhlIGZvbGxvd2luZyBmb2xkIHRvIDIgKFNwZWNpYWwpIGluIHRoZSBUYWcgV29yZCAqLworI2RlZmluZSBUV19EZW5vcm1hbCAgICAgQ29uc3QoNCkgICAgICAgIC8qIERlLW5vcm1hbCAqLworI2RlZmluZSBUV19JbmZpbml0eQlDb25zdCg1KQkvKiArIG9yIC0gaW5maW5pdHkgKi8KKyNkZWZpbmUJVFdfTmFOCQlDb25zdCg2KQkvKiBOb3QgYSBOdW1iZXIgKi8KKyNkZWZpbmUJVFdfVW5zdXBwb3J0ZWQJQ29uc3QoNykJLyogTm90IHN1cHBvcnRlZCBieSBhbiA4MDQ4NiAqLworCisjZGVmaW5lIFRBR19WYWxpZAlDb25zdCgwKQkvKiB2YWxpZCAqLworI2RlZmluZSBUQUdfWmVybwlDb25zdCgxKQkvKiB6ZXJvICovCisjZGVmaW5lIFRBR19TcGVjaWFsCUNvbnN0KDIpCS8qIERlLW5vcm1hbCwgKyBvciAtIGluZmluaXR5LAorCQkJCQkgICBvciBOb3QgYSBOdW1iZXIgKi8KKyNkZWZpbmUgVEFHX0VtcHR5CUNvbnN0KDMpCS8qIGVtcHR5ICovCisKKyNkZWZpbmUgTE9BREVEX0RBVEEJQ29uc3QoMTAxMDEpCS8qIFNwZWNpYWwgc3QoKSBudW1iZXIgdG8gaWRlbnRpZnkKKwkJCQkJICAgbG9hZGVkIGRhdGEgKG5vdCBvbiBzdGFjaykuICovCisKKy8qIEEgZmV3IGZsYWdzIChtdXN0IGJlID49IDB4MTApLiAqLworI2RlZmluZSBSRVYgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBERVNUX1JNICAgICAgICAgMHgyMAorI2RlZmluZSBMT0FERUQgICAgICAgICAgMHg0MAorCisjZGVmaW5lIEZQVV9FeGNlcHRpb24gICBDb25zdCgweDgwMDAwMDAwKSAgIC8qIEFkZGVkIHRvIHRhZyByZXR1cm5zLiAqLworCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKyNpbmNsdWRlICJmcHVfc3lzdGVtLmgiCisKKyNpbmNsdWRlIDxhc20vc2lnY29udGV4dC5oPiAgIC8qIGZvciBzdHJ1Y3QgX2Zwc3RhdGUgKi8KKyNpbmNsdWRlIDxhc20vbWF0aF9lbXUuaD4KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisKKy8qCisjZGVmaW5lIFJFX0VOVFJBTlRfQ0hFQ0tJTkcKKyAqLworCisjaWZkZWYgUkVfRU5UUkFOVF9DSEVDS0lORworZXh0ZXJuIHVfY2hhciBlbXVsYXRpbmc7CisjICBkZWZpbmUgUkVfRU5UUkFOVF9DSEVDS19PRkYgZW11bGF0aW5nID0gMAorIyAgZGVmaW5lIFJFX0VOVFJBTlRfQ0hFQ0tfT04gZW11bGF0aW5nID0gMQorI2Vsc2UKKyMgIGRlZmluZSBSRV9FTlRSQU5UX0NIRUNLX09GRgorIyAgZGVmaW5lIFJFX0VOVFJBTlRfQ0hFQ0tfT04KKyNlbmRpZiAvKiBSRV9FTlRSQU5UX0NIRUNLSU5HICovCisKKyNkZWZpbmUgRldBSVRfT1BDT0RFIDB4OWIKKyNkZWZpbmUgT1BfU0laRV9QUkVGSVggMHg2NgorI2RlZmluZSBBRERSX1NJWkVfUFJFRklYIDB4NjcKKyNkZWZpbmUgUFJFRklYX0NTIDB4MmUKKyNkZWZpbmUgUFJFRklYX0RTIDB4M2UKKyNkZWZpbmUgUFJFRklYX0VTIDB4MjYKKyNkZWZpbmUgUFJFRklYX1NTIDB4MzYKKyNkZWZpbmUgUFJFRklYX0ZTIDB4NjQKKyNkZWZpbmUgUFJFRklYX0dTIDB4NjUKKyNkZWZpbmUgUFJFRklYX1JFUEUgMHhmMworI2RlZmluZSBQUkVGSVhfUkVQTkUgMHhmMgorI2RlZmluZSBQUkVGSVhfTE9DSyAweGYwCisjZGVmaW5lIFBSRUZJWF9DU18gMQorI2RlZmluZSBQUkVGSVhfRFNfIDIKKyNkZWZpbmUgUFJFRklYX0VTXyAzCisjZGVmaW5lIFBSRUZJWF9GU18gNAorI2RlZmluZSBQUkVGSVhfR1NfIDUKKyNkZWZpbmUgUFJFRklYX1NTXyA2CisjZGVmaW5lIFBSRUZJWF9ERUZBVUxUIDcKKworc3RydWN0IGFkZHJlc3MgeworICB1bnNpZ25lZCBpbnQgb2Zmc2V0OworICB1bnNpZ25lZCBpbnQgc2VsZWN0b3I6MTY7CisgIHVuc2lnbmVkIGludCBvcGNvZGU6MTE7CisgIHVuc2lnbmVkIGludCBlbXB0eTo1OworfTsKK3N0cnVjdCBmcHVfX3JlZyB7CisgIHVuc2lnbmVkIHNpZ2w7CisgIHVuc2lnbmVkIHNpZ2g7CisgIHNob3J0IGV4cDsKK307CisKK3R5cGVkZWYgdm9pZCAoKkZVTkMpKHZvaWQpOwordHlwZWRlZiBzdHJ1Y3QgZnB1X19yZWcgRlBVX1JFRzsKK3R5cGVkZWYgdm9pZCAoKkZVTkNfU1QwKShGUFVfUkVHICpzdDBfcHRyLCB1X2NoYXIgc3QwX3RhZyk7Cit0eXBlZGVmIHN0cnVjdCB7IHVfY2hhciBhZGRyZXNzX3NpemUsIG9wZXJhbmRfc2l6ZSwgc2VnbWVudDsgfQorICAgICAgICBvdmVycmlkZXM7CisvKiBUaGlzIHN0cnVjdHVyZSBpcyAzMiBiaXRzOiAqLwordHlwZWRlZiBzdHJ1Y3QgeyBvdmVycmlkZXMgb3ZlcnJpZGU7CisJCSB1X2NoYXIgZGVmYXVsdF9tb2RlOyB9IGZwdV9hZGRyX21vZGVzOworLyogUFJPVEVDVEVEIGhhcyBhIHJlc3RyaWN0ZWQgbWVhbmluZyBpbiB0aGUgZW11bGF0b3I7IGl0IGlzIHVzZWQKKyAgIHRvIHNpZ25hbCB0aGF0IHRoZSBlbXVsYXRvciBuZWVkcyB0byBkbyBzcGVjaWFsIHRoaW5ncyB0byBlbnN1cmUKKyAgIHRoYXQgcHJvdGVjdGlvbiBpcyByZXNwZWN0ZWQgaW4gYSBzZWdtZW50ZWQgbW9kZWwuICovCisjZGVmaW5lIFBST1RFQ1RFRCA0CisjZGVmaW5lIFNJWFRFRU4gICAxICAgICAgICAgLyogV2UgcmVseSB1cG9uIHRoaXMgYmVpbmcgMSAodHJ1ZSkgKi8KKyNkZWZpbmUgVk04NiAgICAgIFNJWFRFRU4KKyNkZWZpbmUgUE0xNiAgICAgIChTSVhURUVOIHwgUFJPVEVDVEVEKQorI2RlZmluZSBTRUczMiAgICAgUFJPVEVDVEVECitleHRlcm4gdV9jaGFyIGNvbnN0IGRhdGFfc2l6ZXNfMTZbMzJdOworCisjZGVmaW5lIHJlZ2lzdGVyX2Jhc2UgKCh1X2NoYXIgKikgcmVnaXN0ZXJzICkKKyNkZWZpbmUgZnB1X3JlZ2lzdGVyKHgpICAoICogKChGUFVfUkVHICopKCByZWdpc3Rlcl9iYXNlICsgMTAgKiAoeCAmIDcpICkpICkKKyNkZWZpbmUJc3QoeCkgICAgICAoICogKChGUFVfUkVHICopKCByZWdpc3Rlcl9iYXNlICsgMTAgKiAoKHRvcCt4KSAmIDcpICkpICkKKworI2RlZmluZQlTVEFDS19PVkVSRkxPVwkoRlBVX3N0YWNrb3ZlcmZsb3coJnN0X25ld19wdHIpKQorI2RlZmluZQlOT1RfRU1QVFkoaSkJKCFGUFVfZW1wdHlfaShpKSkKKworI2RlZmluZQlOT1RfRU1QVFlfU1QwCShzdDBfdGFnIF4gVEFHX0VtcHR5KQorCisjZGVmaW5lIHBvcHBvcCgpIHsgRlBVX3BvcCgpOyBGUFVfcG9wKCk7IH0KKworLyogcHVzaCgpIGRvZXMgbm90IGFmZmVjdCB0aGUgdGFncyAqLworI2RlZmluZSBwdXNoKCkJeyB0b3AtLTsgfQorCisjZGVmaW5lIHNpZ25ieXRlKGEpICgoKHVfY2hhciAqKShhKSlbOV0pCisjZGVmaW5lIGdldHNpZ24oYSkgKHNpZ25ieXRlKGEpICYgMHg4MCkKKyNkZWZpbmUgc2V0c2lnbihhLGIpIHsgaWYgKGIpIHNpZ25ieXRlKGEpIHw9IDB4ODA7IGVsc2Ugc2lnbmJ5dGUoYSkgJj0gMHg3ZjsgfQorI2RlZmluZSBjb3B5c2lnbihhLGIpIHsgaWYgKGdldHNpZ24oYSkpIHNpZ25ieXRlKGIpIHw9IDB4ODA7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugc2lnbmJ5dGUoYikgJj0gMHg3ZjsgfQorI2RlZmluZSBjaGFuZ2VzaWduKGEpIHsgc2lnbmJ5dGUoYSkgXj0gMHg4MDsgfQorI2RlZmluZSBzZXRwb3NpdGl2ZShhKSB7IHNpZ25ieXRlKGEpICY9IDB4N2Y7IH0KKyNkZWZpbmUgc2V0bmVnYXRpdmUoYSkgeyBzaWduYnl0ZShhKSB8PSAweDgwOyB9CisjZGVmaW5lIHNpZ25wb3NpdGl2ZShhKSAoIChzaWduYnl0ZShhKSAmIDB4ODApID09IDAgKQorI2RlZmluZSBzaWdubmVnYXRpdmUoYSkgKHNpZ25ieXRlKGEpICYgMHg4MCkKKworc3RhdGljIGlubGluZSB2b2lkIHJlZ19jb3B5KEZQVV9SRUcgY29uc3QgKngsIEZQVV9SRUcgKnkpCit7CisgICooc2hvcnQgKikmKHktPmV4cCkgPSAqKGNvbnN0IHNob3J0ICopJih4LT5leHApOyAKKyAgKihsb25nIGxvbmcgKikmKHktPnNpZ2wpID0gKihjb25zdCBsb25nIGxvbmcgKikmKHgtPnNpZ2wpOworfQorCisjZGVmaW5lIGV4cG9uZW50KHgpICAoKCgqKHNob3J0ICopJigoeCktPmV4cCkpICYgMHg3ZmZmKSAtIEVYVEVOREVEX0ViaWFzKQorI2RlZmluZSBzZXRleHBvbmVudHBvcyh4LHkpIHsgKCooc2hvcnQgKikmKCh4KS0+ZXhwKSkgPSBcCisgICgoeSkgKyBFWFRFTkRFRF9FYmlhcykgJiAweDdmZmY7IH0KKyNkZWZpbmUgZXhwb25lbnQxNih4KSAgICAgICAgICgqKHNob3J0ICopJigoeCktPmV4cCkpCisjZGVmaW5lIHNldGV4cG9uZW50MTYoeCx5KSAgeyAoKihzaG9ydCAqKSYoKHgpLT5leHApKSA9ICh5KTsgfQorI2RlZmluZSBhZGRleHBvbmVudCh4LHkpICAgIHsgKCooc2hvcnQgKikmKCh4KS0+ZXhwKSkgKz0gKHkpOyB9CisjZGVmaW5lIHN0ZGV4cCh4KSAgICAgICAgICAgeyAoKihzaG9ydCAqKSYoKHgpLT5leHApKSArPSBFWFRFTkRFRF9FYmlhczsgfQorCisjZGVmaW5lIGlzZGVub3JtYWwocHRyKSAgIChleHBvbmVudChwdHIpID09IEVYUF9CSUFTK0VYUF9VTkRFUikKKworI2RlZmluZSBzaWduaWZpY2FuZCh4KSAoICgodW5zaWduZWQgbG9uZyBsb25nICopJigoeCktPnNpZ2wpKVswXSApCisKKworLyotLS0tLSBQcm90b3R5cGVzIGZvciBmdW5jdGlvbnMgd3JpdHRlbiBpbiBhc3NlbWJsZXIgLS0tLS0qLworLyogZXh0ZXJuIHZvaWQgcmVnX21vdmUoRlBVX1JFRyAqYSwgRlBVX1JFRyAqYik7ICovCisKK2FzbWxpbmthZ2UgaW50IEZQVV9ub3JtYWxpemUoRlBVX1JFRyAqeCk7Cithc21saW5rYWdlIGludCBGUFVfbm9ybWFsaXplX251byhGUFVfUkVHICp4KTsKK2FzbWxpbmthZ2UgaW50IEZQVV91X3N1YihGUFVfUkVHIGNvbnN0ICphcmcxLCBGUFVfUkVHIGNvbnN0ICphcmcyLAorCQkJIEZQVV9SRUcgKmFuc3csIHVuc2lnbmVkIGludCBjb250cm9sX3csIHVfY2hhciBzaWduLAorCQkJIGludCBleHBhLCBpbnQgZXhwYik7Cithc21saW5rYWdlIGludCBGUFVfdV9tdWwoRlBVX1JFRyBjb25zdCAqYXJnMSwgRlBVX1JFRyBjb25zdCAqYXJnMiwKKwkJCSBGUFVfUkVHICphbnN3LCB1bnNpZ25lZCBpbnQgY29udHJvbF93LCB1X2NoYXIgc2lnbiwKKwkJCSBpbnQgZXhwb24pOworYXNtbGlua2FnZSBpbnQgRlBVX3VfZGl2KEZQVV9SRUcgY29uc3QgKmFyZzEsIEZQVV9SRUcgY29uc3QgKmFyZzIsCisJCQkgRlBVX1JFRyAqYW5zdywgdW5zaWduZWQgaW50IGNvbnRyb2xfdywgdV9jaGFyIHNpZ24pOworYXNtbGlua2FnZSBpbnQgRlBVX3VfYWRkKEZQVV9SRUcgY29uc3QgKmFyZzEsIEZQVV9SRUcgY29uc3QgKmFyZzIsCisJCQkgRlBVX1JFRyAqYW5zdywgdW5zaWduZWQgaW50IGNvbnRyb2xfdywgdV9jaGFyIHNpZ24sCisJCQkgaW50IGV4cGEsIGludCBleHBiKTsKK2FzbWxpbmthZ2UgaW50IHdtX3NxcnQoRlBVX1JFRyAqbiwgaW50IGR1bW15MSwgaW50IGR1bW15MiwKKwkJICAgICAgIHVuc2lnbmVkIGludCBjb250cm9sX3csIHVfY2hhciBzaWduKTsKK2FzbWxpbmthZ2UgdW5zaWduZWQJRlBVX3Nocngodm9pZCAqbCwgdW5zaWduZWQgeCk7Cithc21saW5rYWdlIHVuc2lnbmVkCUZQVV9zaHJ4cyh2b2lkICp2LCB1bnNpZ25lZCB4KTsKK2FzbWxpbmthZ2UgdW5zaWduZWQgbG9uZyBGUFVfZGl2X3NtYWxsKHVuc2lnbmVkIGxvbmcgbG9uZyAqeCwgdW5zaWduZWQgbG9uZyB5KTsKK2FzbWxpbmthZ2UgaW50IEZQVV9yb3VuZChGUFVfUkVHICphcmcsIHVuc2lnbmVkIGludCBleHRlbnQsIGludCBkdW1teSwKKwkJCSB1bnNpZ25lZCBpbnQgY29udHJvbF93LCB1X2NoYXIgc2lnbik7CisKKyNpZm5kZWYgTUFLSU5HX1BST1RPCisjaW5jbHVkZSAiZnB1X3Byb3RvLmgiCisjZW5kaWYKKworI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworCisjZW5kaWYgLyogX0ZQVV9FTVVfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYXRoLWVtdS9mcHVfZW50cnkuYyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9mcHVfZW50cnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTNmMTZlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L2ZwdV9lbnRyeS5jCkBAIC0wLDAgKzEsNzYwIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICBmcHVfZW50cnkuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBUaGUgZW50cnkgZnVuY3Rpb25zIGZvciB3bS1GUFUtZW11ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTMsMTk5NCwxOTk2LDE5OTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgQXVzdHJhbGlhIHwKKyB8ICAgICAgICAgICAgICAgICAgRS1tYWlsICAgYmlsbG1Ac3VidXJiaWEubmV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBTZWUgdGhlIGZpbGVzICJSRUFETUUiIGFuZCAiQ09QWUlORyIgZm9yIGZ1cnRoZXIgY29weXJpZ2h0IGFuZCB3YXJyYW50eSAgIHwKKyB8IGluZm9ybWF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgTm90ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICBUaGUgZmlsZSBjb250YWlucyBjb2RlIHdoaWNoIGFjY2Vzc2VzIHVzZXIgbWVtb3J5LiAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgIEVtdWxhdG9yIHN0YXRpYyBkYXRhIG1heSBjaGFuZ2Ugd2hlbiB1c2VyIG1lbW9yeSBpcyBhY2Nlc3NlZCwgZHVlIHRvICAgfAorIHwgICAgb3RoZXIgcHJvY2Vzc2VzIHVzaW5nIHRoZSBlbXVsYXRvciB3aGlsZSBzd2FwcGluZyBpcyBpbiBwcm9ncmVzcy4gICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgbWF0aF9lbXVsYXRlKCksIHJlc3RvcmVfaTM4N19zb2Z0KCkgYW5kIHNhdmVfaTM4N19zb2Z0KCkgYXJlIHRoZSBvbmx5ICAgICB8CisgfCBlbnRyeSBwb2ludHMgZm9yIHdtLUZQVS1lbXUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vZGVzYy5oPgorCisjaW5jbHVkZSAiZnB1X3N5c3RlbS5oIgorI2luY2x1ZGUgImZwdV9lbXUuaCIKKyNpbmNsdWRlICJleGNlcHRpb24uaCIKKyNpbmNsdWRlICJjb250cm9sX3cuaCIKKyNpbmNsdWRlICJzdGF0dXNfdy5oIgorCisjZGVmaW5lIF9fQkFEX18gRlBVX2lsbGVnYWwgICAvKiBJbGxlZ2FsIG9uIGFuIDgwNDg2LCBjYXVzZXMgU0lHSUxMICovCisKKyNpZm5kZWYgTk9fVU5ET0NfQ09ERSAgICAvKiBVbi1kb2N1bWVudGVkIEZQVSBvcC1jb2RlcyBzdXBwb3J0ZWQgYnkgZGVmYXVsdC4gKi8KKworLyogV0FSTklORzogVGhlc2UgY29kZXMgYXJlIG5vdCBkb2N1bWVudGVkIGJ5IEludGVsIGluIHRoZWlyIDgwNDg2IG1hbnVhbAorICAgYW5kIG1heSBub3Qgd29yayBvbiBGUFUgY2xvbmVzIG9yIGxhdGVyIEludGVsIEZQVXMuICovCisKKy8qIENoYW5nZXMgdG8gc3VwcG9ydCB0aGUgdW4tZG9jIGNvZGVzIHByb3ZpZGVkIGJ5IExpbnVzIFRvcnZhbGRzLiAqLworCisjZGVmaW5lIF9kOV9kOF8gZnN0cF9pICAgIC8qIHVub2ZmaWNpYWwgY29kZSAoMTkpICovCisjZGVmaW5lIF9kY19kMF8gZmNvbV9zdCAgIC8qIHVub2ZmaWNpYWwgY29kZSAoMTQpICovCisjZGVmaW5lIF9kY19kOF8gZmNvbXBzdCAgIC8qIHVub2ZmaWNpYWwgY29kZSAoMWMpICovCisjZGVmaW5lIF9kZF9jOF8gZnhjaF9pICAgIC8qIHVub2ZmaWNpYWwgY29kZSAoMGQpICovCisjZGVmaW5lIF9kZV9kMF8gZmNvbXBzdCAgIC8qIHVub2ZmaWNpYWwgY29kZSAoMTYpICovCisjZGVmaW5lIF9kZl9jMF8gZmZyZWVwICAgIC8qIHVub2ZmaWNpYWwgY29kZSAoMDcpIGZmcmVlICsgcG9wICovCisjZGVmaW5lIF9kZl9jOF8gZnhjaF9pICAgIC8qIHVub2ZmaWNpYWwgY29kZSAoMGYpICovCisjZGVmaW5lIF9kZl9kMF8gZnN0cF9pICAgIC8qIHVub2ZmaWNpYWwgY29kZSAoMTcpICovCisjZGVmaW5lIF9kZl9kOF8gZnN0cF9pICAgIC8qIHVub2ZmaWNpYWwgY29kZSAoMWYpICovCisKK3N0YXRpYyBGVU5DIGNvbnN0IHN0X2luc3RyX3RhYmxlWzY0XSA9IHsKKyAgZmFkZF9fLCAgIGZsZF9pXywgICAgIF9fQkFEX18sIF9fQkFEX18sIGZhZGRfaSwgIGZmcmVlXywgIGZhZGRwXywgIF9kZl9jMF8sCisgIGZtdWxfXywgICBmeGNoX2ksICAgICBfX0JBRF9fLCBfX0JBRF9fLCBmbXVsX2ksICBfZGRfYzhfLCBmbXVscF8sICBfZGZfYzhfLAorICBmY29tX3N0LCAgZnBfbm9wLCAgICAgX19CQURfXywgX19CQURfXywgX2RjX2QwXywgZnN0X2lfLCAgX2RlX2QwXywgX2RmX2QwXywKKyAgZmNvbXBzdCwgIF9kOV9kOF8sICAgIF9fQkFEX18sIF9fQkFEX18sIF9kY19kOF8sIGZzdHBfaSwgIGZjb21wcCwgIF9kZl9kOF8sCisgIGZzdWJfXywgICBGUFVfZXRjLCAgICBfX0JBRF9fLCBmaW5pdF8sICBmc3VicmksICBmdWNvbV8sICBmc3VicnAsICBmc3Rzd18sCisgIGZzdWJyXywgICBmY29uc3QsICAgICBmdWNvbXBwLCBfX0JBRF9fLCBmc3ViX2ksICBmdWNvbXAsICBmc3VicF8sICBfX0JBRF9fLAorICBmZGl2X18sICAgRlBVX3RyaWdhLCAgX19CQURfXywgX19CQURfXywgZmRpdnJpLCAgX19CQURfXywgZmRpdnJwLCAgX19CQURfXywKKyAgZmRpdnJfLCAgIEZQVV90cmlnYiwgIF9fQkFEX18sIF9fQkFEX18sIGZkaXZfaSwgIF9fQkFEX18sIGZkaXZwXywgIF9fQkFEX18sCit9OworCisjZWxzZSAgICAgLyogU3VwcG9ydCBvbmx5IGRvY3VtZW50ZWQgRlBVIG9wLWNvZGVzICovCisKK3N0YXRpYyBGVU5DIGNvbnN0IHN0X2luc3RyX3RhYmxlWzY0XSA9IHsKKyAgZmFkZF9fLCAgIGZsZF9pXywgICAgIF9fQkFEX18sIF9fQkFEX18sIGZhZGRfaSwgIGZmcmVlXywgIGZhZGRwXywgIF9fQkFEX18sCisgIGZtdWxfXywgICBmeGNoX2ksICAgICBfX0JBRF9fLCBfX0JBRF9fLCBmbXVsX2ksICBfX0JBRF9fLCBmbXVscF8sICBfX0JBRF9fLAorICBmY29tX3N0LCAgZnBfbm9wLCAgICAgX19CQURfXywgX19CQURfXywgX19CQURfXywgZnN0X2lfLCAgX19CQURfXywgX19CQURfXywKKyAgZmNvbXBzdCwgIF9fQkFEX18sICAgIF9fQkFEX18sIF9fQkFEX18sIF9fQkFEX18sIGZzdHBfaSwgIGZjb21wcCwgIF9fQkFEX18sCisgIGZzdWJfXywgICBGUFVfZXRjLCAgICBfX0JBRF9fLCBmaW5pdF8sICBmc3VicmksICBmdWNvbV8sICBmc3VicnAsICBmc3Rzd18sCisgIGZzdWJyXywgICBmY29uc3QsICAgICBmdWNvbXBwLCBfX0JBRF9fLCBmc3ViX2ksICBmdWNvbXAsICBmc3VicF8sICBfX0JBRF9fLAorICBmZGl2X18sICAgRlBVX3RyaWdhLCAgX19CQURfXywgX19CQURfXywgZmRpdnJpLCAgX19CQURfXywgZmRpdnJwLCAgX19CQURfXywKKyAgZmRpdnJfLCAgIEZQVV90cmlnYiwgIF9fQkFEX18sIF9fQkFEX18sIGZkaXZfaSwgIF9fQkFEX18sIGZkaXZwXywgIF9fQkFEX18sCit9OworCisjZW5kaWYgLyogTk9fVU5ET0NfQ09ERSAqLworCisKKyNkZWZpbmUgX05PTkVfIDAgICAvKiBUYWtlIG5vIHNwZWNpYWwgYWN0aW9uICovCisjZGVmaW5lIF9SRUcwXyAxICAgLyogTmVlZCB0byBjaGVjayBmb3Igbm90IGVtcHR5IHN0KDApICovCisjZGVmaW5lIF9SRUdJXyAyICAgLyogTmVlZCB0byBjaGVjayBmb3Igbm90IGVtcHR5IHN0KDApIGFuZCBzdChybSkgKi8KKyNkZWZpbmUgX1JFR2lfIDAgICAvKiBVc2VzIHN0KHJtKSAqLworI2RlZmluZSBfUFVTSF8gMyAgIC8qIE5lZWQgdG8gY2hlY2sgZm9yIHNwYWNlIHRvIHB1c2ggb250byBzdGFjayAqLworI2RlZmluZSBfbnVsbF8gNCAgIC8qIEZ1bmN0aW9uIGlsbGVnYWwgb3Igbm90IGltcGxlbWVudGVkICovCisjZGVmaW5lIF9SRUdJaSA1ICAgLyogVXNlcyBzdCgwKSBhbmQgc3Qocm0pLCByZXN1bHQgdG8gc3Qocm0pICovCisjZGVmaW5lIF9SRUdJcCA2ICAgLyogVXNlcyBzdCgwKSBhbmQgc3Qocm0pLCByZXN1bHQgdG8gc3Qocm0pIHRoZW4gcG9wICovCisjZGVmaW5lIF9SRUdJYyAwICAgLyogQ29tcGFyZSBzdCgwKSBhbmQgc3Qocm0pICovCisjZGVmaW5lIF9SRUdJbiAwICAgLyogVXNlcyBzdCgwKSBhbmQgc3Qocm0pLCBidXQgaGFuZGxlIGNoZWNrcyBsYXRlciAqLworCisjaWZuZGVmIE5PX1VORE9DX0NPREUKKworLyogVW4tZG9jdW1lbnRlZCBGUFUgb3AtY29kZXMgc3VwcG9ydGVkIGJ5IGRlZmF1bHQuIChzZWUgYWJvdmUpICovCisKK3N0YXRpYyB1X2NoYXIgY29uc3QgdHlwZV90YWJsZVs2NF0gPSB7CisgIF9SRUdJXywgX05PTkVfLCBfbnVsbF8sIF9udWxsXywgX1JFR0lpLCBfUkVHaV8sIF9SRUdJcCwgX1JFR2lfLAorICBfUkVHSV8sIF9SRUdJbiwgX251bGxfLCBfbnVsbF8sIF9SRUdJaSwgX1JFR0lfLCBfUkVHSXAsIF9SRUdJXywKKyAgX1JFR0ljLCBfTk9ORV8sIF9udWxsXywgX251bGxfLCBfUkVHSWMsIF9SRUcwXywgX1JFR0ljLCBfUkVHMF8sCisgIF9SRUdJYywgX1JFRzBfLCBfbnVsbF8sIF9udWxsXywgX1JFR0ljLCBfUkVHMF8sIF9SRUdJYywgX1JFRzBfLAorICBfUkVHSV8sIF9OT05FXywgX251bGxfLCBfTk9ORV8sIF9SRUdJaSwgX1JFR0ljLCBfUkVHSXAsIF9OT05FXywKKyAgX1JFR0lfLCBfTk9ORV8sIF9SRUdJYywgX251bGxfLCBfUkVHSWksIF9SRUdJYywgX1JFR0lwLCBfbnVsbF8sCisgIF9SRUdJXywgX05PTkVfLCBfbnVsbF8sIF9udWxsXywgX1JFR0lpLCBfbnVsbF8sIF9SRUdJcCwgX251bGxfLAorICBfUkVHSV8sIF9OT05FXywgX251bGxfLCBfbnVsbF8sIF9SRUdJaSwgX251bGxfLCBfUkVHSXAsIF9udWxsXworfTsKKworI2Vsc2UgICAgIC8qIFN1cHBvcnQgb25seSBkb2N1bWVudGVkIEZQVSBvcC1jb2RlcyAqLworCitzdGF0aWMgdV9jaGFyIGNvbnN0IHR5cGVfdGFibGVbNjRdID0geworICBfUkVHSV8sIF9OT05FXywgX251bGxfLCBfbnVsbF8sIF9SRUdJaSwgX1JFR2lfLCBfUkVHSXAsIF9udWxsXywKKyAgX1JFR0lfLCBfUkVHSW4sIF9udWxsXywgX251bGxfLCBfUkVHSWksIF9udWxsXywgX1JFR0lwLCBfbnVsbF8sCisgIF9SRUdJYywgX05PTkVfLCBfbnVsbF8sIF9udWxsXywgX251bGxfLCBfUkVHMF8sIF9udWxsXywgX251bGxfLAorICBfUkVHSWMsIF9udWxsXywgX251bGxfLCBfbnVsbF8sIF9udWxsXywgX1JFRzBfLCBfUkVHSWMsIF9udWxsXywKKyAgX1JFR0lfLCBfTk9ORV8sIF9udWxsXywgX05PTkVfLCBfUkVHSWksIF9SRUdJYywgX1JFR0lwLCBfTk9ORV8sCisgIF9SRUdJXywgX05PTkVfLCBfUkVHSWMsIF9udWxsXywgX1JFR0lpLCBfUkVHSWMsIF9SRUdJcCwgX251bGxfLAorICBfUkVHSV8sIF9OT05FXywgX251bGxfLCBfbnVsbF8sIF9SRUdJaSwgX251bGxfLCBfUkVHSXAsIF9udWxsXywKKyAgX1JFR0lfLCBfTk9ORV8sIF9udWxsXywgX251bGxfLCBfUkVHSWksIF9udWxsXywgX1JFR0lwLCBfbnVsbF8KK307CisKKyNlbmRpZiAvKiBOT19VTkRPQ19DT0RFICovCisKKworI2lmZGVmIFJFX0VOVFJBTlRfQ0hFQ0tJTkcKK3VfY2hhciBlbXVsYXRpbmc9MDsKKyNlbmRpZiAvKiBSRV9FTlRSQU5UX0NIRUNLSU5HICovCisKK3N0YXRpYyBpbnQgdmFsaWRfcHJlZml4KHVfY2hhciAqQnl0ZSwgdV9jaGFyIF9fdXNlciAqKmZwdV9laXAsCisJCQlvdmVycmlkZXMgKm92ZXJyaWRlKTsKKworYXNtbGlua2FnZSB2b2lkIG1hdGhfZW11bGF0ZShsb25nIGFyZykKK3sKKyAgdV9jaGFyICBGUFVfbW9kcm0sIGJ5dGUxOworICB1bnNpZ25lZCBzaG9ydCBjb2RlOworICBmcHVfYWRkcl9tb2RlcyBhZGRyX21vZGVzOworICBpbnQgdW5tYXNrZWQ7CisgIEZQVV9SRUcgbG9hZGVkX2RhdGE7CisgIEZQVV9SRUcgKnN0MF9wdHI7CisgIHVfY2hhcgkgIGxvYWRlZF90YWcsIHN0MF90YWc7CisgIHZvaWQgX191c2VyICpkYXRhX2FkZHJlc3M7CisgIHN0cnVjdCBhZGRyZXNzIGRhdGFfc2VsX29mZjsKKyAgc3RydWN0IGFkZHJlc3MgZW50cnlfc2VsX29mZjsKKyAgdW5zaWduZWQgbG9uZyBjb2RlX2Jhc2UgPSAwOworICB1bnNpZ25lZCBsb25nIGNvZGVfbGltaXQgPSAwOyAgLyogSW5pdGlhbGl6ZWQgdG8gc3RvcCBjb21waWxlciB3YXJuaW5ncyAqLworICBzdHJ1Y3QgZGVzY19zdHJ1Y3QgY29kZV9kZXNjcmlwdG9yOworCisjaWZkZWYgUkVfRU5UUkFOVF9DSEVDS0lORworICBpZiAoIGVtdWxhdGluZyApCisgICAgeworICAgICAgcHJpbnRrKCJFUlJPUjogd20tRlBVLWVtdSBpcyBub3QgUkUtRU5UUkFOVCFcbiIpOworICAgIH0KKyAgUkVfRU5UUkFOVF9DSEVDS19PTjsKKyNlbmRpZiAvKiBSRV9FTlRSQU5UX0NIRUNLSU5HICovCisKKyAgaWYgKCF1c2VkX21hdGgoKSkKKyAgICB7CisgICAgICBmaW5pdCgpOworICAgICAgc2V0X3VzZWRfbWF0aCgpOworICAgIH0KKworICBTRVRVUF9EQVRBX0FSRUEoYXJnKTsKKworICBGUFVfT1JJR19FSVAgPSBGUFVfRUlQOworCisgIGlmICggKEZQVV9FRkxBR1MgJiAweDAwMDIwMDAwKSAhPSAwICkKKyAgICB7CisgICAgICAvKiBWaXJ0dWFsIDgwODYgbW9kZSAqLworICAgICAgYWRkcl9tb2Rlcy5kZWZhdWx0X21vZGUgPSBWTTg2OworICAgICAgRlBVX0VJUCArPSBjb2RlX2Jhc2UgPSBGUFVfQ1MgPDwgNDsKKyAgICAgIGNvZGVfbGltaXQgPSBjb2RlX2Jhc2UgKyAweGZmZmY7ICAvKiBBc3N1bWVzIGNvZGVfYmFzZSA8PSAweGZmZmYwMDAwICovCisgICAgfQorICBlbHNlIGlmICggRlBVX0NTID09IF9fVVNFUl9DUyAmJiBGUFVfRFMgPT0gX19VU0VSX0RTICkKKyAgICB7CisgICAgICBhZGRyX21vZGVzLmRlZmF1bHRfbW9kZSA9IDA7CisgICAgfQorICBlbHNlIGlmICggRlBVX0NTID09IF9fS0VSTkVMX0NTICkKKyAgICB7CisgICAgICBwcmludGsoIm1hdGhfZW11bGF0ZTogJTA0eDolMDhseFxuIixGUFVfQ1MsRlBVX0VJUCk7CisgICAgICBwYW5pYygiTWF0aCBlbXVsYXRpb24gbmVlZGVkIGluIGtlcm5lbCIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKworICAgICAgaWYgKCAoRlBVX0NTICYgNCkgIT0gNCApICAgLyogTXVzdCBiZSBpbiB0aGUgTERUICovCisJeworCSAgLyogQ2FuIG9ubHkgaGFuZGxlIHNlZ21lbnRlZCBhZGRyZXNzaW5nIHZpYSB0aGUgTERUCisJICAgICBmb3Igbm93LCBhbmQgaXQgbXVzdCBiZSAxNiBiaXQgKi8KKwkgIHByaW50aygiRlBVIGVtdWxhdG9yOiBVbnN1cHBvcnRlZCBhZGRyZXNzaW5nIG1vZGVcbiIpOworCSAgbWF0aF9hYm9ydChGUFVfaW5mbywgU0lHSUxMKTsKKwl9CisKKyAgICAgIGNvZGVfZGVzY3JpcHRvciA9IExEVF9ERVNDUklQVE9SKEZQVV9DUyk7CisgICAgICBpZiAoIFNFR19EX1NJWkUoY29kZV9kZXNjcmlwdG9yKSApCisJeworCSAgLyogVGhlIGFib3ZlIHRlc3QgbWF5IGJlIHdyb25nLCB0aGUgYm9vayBpcyBub3QgY2xlYXIgKi8KKwkgIC8qIFNlZ21lbnRlZCAzMiBiaXQgcHJvdGVjdGVkIG1vZGUgKi8KKwkgIGFkZHJfbW9kZXMuZGVmYXVsdF9tb2RlID0gU0VHMzI7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIDE2IGJpdCBwcm90ZWN0ZWQgbW9kZSAqLworCSAgYWRkcl9tb2Rlcy5kZWZhdWx0X21vZGUgPSBQTTE2OworCX0KKyAgICAgIEZQVV9FSVAgKz0gY29kZV9iYXNlID0gU0VHX0JBU0VfQUREUihjb2RlX2Rlc2NyaXB0b3IpOworICAgICAgY29kZV9saW1pdCA9IGNvZGVfYmFzZQorCSsgKFNFR19MSU1JVChjb2RlX2Rlc2NyaXB0b3IpKzEpICogU0VHX0dSQU5VTEFSSVRZKGNvZGVfZGVzY3JpcHRvcikKKwkgIC0gMTsKKyAgICAgIGlmICggY29kZV9saW1pdCA8IGNvZGVfYmFzZSApIGNvZGVfbGltaXQgPSAweGZmZmZmZmZmOworICAgIH0KKworICBGUFVfbG9va2FoZWFkID0gMTsKKyAgaWYgKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1BUUkFDRUQpCisgICAgRlBVX2xvb2thaGVhZCA9IDA7CisKKyAgaWYgKCAhdmFsaWRfcHJlZml4KCZieXRlMSwgKHVfY2hhciBfX3VzZXIgKiopJkZQVV9FSVAsCisJCSAgICAgJmFkZHJfbW9kZXMub3ZlcnJpZGUpICkKKyAgICB7CisgICAgICBSRV9FTlRSQU5UX0NIRUNLX09GRjsKKyAgICAgIHByaW50aygiRlBVIGVtdWxhdG9yOiBVbmtub3duIHByZWZpeCBieXRlIDB4JTAyeCwgcHJvYmFibHkgZHVlIHRvXG4iCisJICAgICAiRlBVIGVtdWxhdG9yOiBzZWxmLW1vZGlmeWluZyBjb2RlISAoZW11bGF0aW9uIGltcG9zc2libGUpXG4iLAorCSAgICAgYnl0ZTEpOworICAgICAgUkVfRU5UUkFOVF9DSEVDS19PTjsKKyAgICAgIEVYQ0VQVElPTihFWF9JTlRFUk5BTHwweDEyNik7CisgICAgICBtYXRoX2Fib3J0KEZQVV9pbmZvLFNJR0lMTCk7CisgICAgfQorCitkb19hbm90aGVyX0ZQVV9pbnN0cnVjdGlvbjoKKworICBub19pcF91cGRhdGUgPSAwOworCisgIEZQVV9FSVArKzsgIC8qIFdlIGhhdmUgZmV0Y2hlZCB0aGUgcHJlZml4IGFuZCBmaXJzdCBjb2RlIGJ5dGVzLiAqLworCisgIGlmICggYWRkcl9tb2Rlcy5kZWZhdWx0X21vZGUgKQorICAgIHsKKyAgICAgIC8qIFRoaXMgY2hlY2tzIGZvciB0aGUgbWluaW11bSBpbnN0cnVjdGlvbiBieXRlcy4KKwkgV2UgYWxzbyBuZWVkIHRvIGNoZWNrIGFueSBleHRyYSAoYWRkcmVzcyBtb2RlKSBjb2RlIGFjY2Vzcy4gKi8KKyAgICAgIGlmICggRlBVX0VJUCA+IGNvZGVfbGltaXQgKQorCW1hdGhfYWJvcnQoRlBVX2luZm8sU0lHU0VHVik7CisgICAgfQorCisgIGlmICggKGJ5dGUxICYgMHhmOCkgIT0gMHhkOCApCisgICAgeworICAgICAgaWYgKCBieXRlMSA9PSBGV0FJVF9PUENPREUgKQorCXsKKwkgIGlmIChwYXJ0aWFsX3N0YXR1cyAmIFNXX1N1bW1hcnkpCisJICAgIGdvdG8gZG9fdGhlX0ZQVV9pbnRlcnJ1cHQ7CisJICBlbHNlCisJICAgIGdvdG8gRlBVX2Z3YWl0X2RvbmU7CisJfQorI2lmZGVmIFBBUkFOT0lECisgICAgICBFWENFUFRJT04oRVhfSU5URVJOQUx8MHgxMjgpOworICAgICAgbWF0aF9hYm9ydChGUFVfaW5mbyxTSUdJTEwpOworI2VuZGlmIC8qIFBBUkFOT0lEICovCisgICAgfQorCisgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworICBGUFVfY29kZV9hY2Nlc3Nfb2soMSk7CisgIEZQVV9nZXRfdXNlcihGUFVfbW9kcm0sICh1X2NoYXIgX191c2VyICopIEZQVV9FSVApOworICBSRV9FTlRSQU5UX0NIRUNLX09OOworICBGUFVfRUlQKys7CisKKyAgaWYgKHBhcnRpYWxfc3RhdHVzICYgU1dfU3VtbWFyeSkKKyAgICB7CisgICAgICAvKiBJZ25vcmUgdGhlIGVycm9yIGZvciBub3cgaWYgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gaXMgYSBuby13YWl0CisJIGNvbnRyb2wgaW5zdHJ1Y3Rpb24gKi8KKyAgICAgIC8qIFRoZSA4MDQ4NiBtYW51YWwgY29udHJhZGljdHMgaXRzZWxmIG9uIHRoaXMgdG9waWMsCisJIGJ1dCBhIHJlYWwgODA0ODYgdXNlcyB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9uczoKKwkgZm5pbml0LCBmbnN0ZW52LCBmbnNhdmUsIGZuc3RzdywgZm5zdGVudiwgZm5jbGV4LgorICAgICAgICovCisgICAgICBjb2RlID0gKEZQVV9tb2RybSA8PCA4KSB8IGJ5dGUxOworICAgICAgaWYgKCAhICggKCgoY29kZSAmIDB4ZjgwMykgPT0gMHhlMDAzKSB8fCAgICAvKiBmbmNsZXgsIGZuaW5pdCwgZm5zdHN3ICovCisJCSgoKGNvZGUgJiAweDMwMDMpID09IDB4MzAwMSkgJiYgICAvKiBmbnNhdmUsIGZuc3RjdywgZm5zdGVudiwKKwkJCQkJCSAgICAgZm5zdHN3ICovCisJCSAoKGNvZGUgJiAweGMwMDApICE9IDB4YzAwMCkpKSApICkKKwl7CisJICAvKgorCSAgICogIFdlIG5lZWQgdG8gc2ltdWxhdGUgdGhlIGFjdGlvbiBvZiB0aGUga2VybmVsIHRvIEZQVQorCSAgICogIGludGVycnVwdHMgaGVyZS4KKwkgICAqLworCWRvX3RoZV9GUFVfaW50ZXJydXB0OgorCisJICBGUFVfRUlQID0gRlBVX09SSUdfRUlQOwkvKiBQb2ludCB0byBjdXJyZW50IEZQVSBpbnN0cnVjdGlvbi4gKi8KKworCSAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisJICBjdXJyZW50LT50aHJlYWQudHJhcF9ubyA9IDE2OworCSAgY3VycmVudC0+dGhyZWFkLmVycm9yX2NvZGUgPSAwOworCSAgc2VuZF9zaWcoU0lHRlBFLCBjdXJyZW50LCAxKTsKKwkgIHJldHVybjsKKwl9CisgICAgfQorCisgIGVudHJ5X3NlbF9vZmYub2Zmc2V0ID0gRlBVX09SSUdfRUlQOworICBlbnRyeV9zZWxfb2ZmLnNlbGVjdG9yID0gRlBVX0NTOworICBlbnRyeV9zZWxfb2ZmLm9wY29kZSA9IChieXRlMSA8PCA4KSB8IEZQVV9tb2RybTsKKworICBGUFVfcm0gPSBGUFVfbW9kcm0gJiA3OworCisgIGlmICggRlBVX21vZHJtIDwgMDMwMCApCisgICAgeworICAgICAgLyogQWxsIG9mIHRoZXNlIGluc3RydWN0aW9ucyB1c2UgdGhlIG1vZC9ybSBieXRlIHRvIGdldCBhIGRhdGEgYWRkcmVzcyAqLworCisgICAgICBpZiAoIChhZGRyX21vZGVzLmRlZmF1bHRfbW9kZSAmIFNJWFRFRU4pCisJICBeIChhZGRyX21vZGVzLm92ZXJyaWRlLmFkZHJlc3Nfc2l6ZSA9PSBBRERSX1NJWkVfUFJFRklYKSApCisJZGF0YV9hZGRyZXNzID0gRlBVX2dldF9hZGRyZXNzXzE2KEZQVV9tb2RybSwgJkZQVV9FSVAsICZkYXRhX3NlbF9vZmYsCisJCQkJCSAgYWRkcl9tb2Rlcyk7CisgICAgICBlbHNlCisJZGF0YV9hZGRyZXNzID0gRlBVX2dldF9hZGRyZXNzKEZQVV9tb2RybSwgJkZQVV9FSVAsICZkYXRhX3NlbF9vZmYsCisJCQkJICAgICAgIGFkZHJfbW9kZXMpOworCisgICAgICBpZiAoIGFkZHJfbW9kZXMuZGVmYXVsdF9tb2RlICkKKwl7CisJICBpZiAoIEZQVV9FSVAtMSA+IGNvZGVfbGltaXQgKQorCSAgICBtYXRoX2Fib3J0KEZQVV9pbmZvLFNJR1NFR1YpOworCX0KKworICAgICAgaWYgKCAhKGJ5dGUxICYgMSkgKQorCXsKKwkgIHVuc2lnbmVkIHNob3J0IHN0YXR1czEgPSBwYXJ0aWFsX3N0YXR1czsKKworCSAgc3QwX3B0ciA9ICZzdCgwKTsKKwkgIHN0MF90YWcgPSBGUFVfZ2V0dGFnMCgpOworCisJICAvKiBTdGFjayB1bmRlcmZsb3cgaGFzIHByaW9yaXR5ICovCisJICBpZiAoIE5PVF9FTVBUWV9TVDAgKQorCSAgICB7CisJICAgICAgaWYgKCBhZGRyX21vZGVzLmRlZmF1bHRfbW9kZSAmIFBST1RFQ1RFRCApCisJCXsKKwkJICAvKiBUaGlzIHRhYmxlIHdvcmtzIGZvciAxNiBhbmQgMzIgYml0IHByb3RlY3RlZCBtb2RlICovCisJCSAgaWYgKCBhY2Nlc3NfbGltaXQgPCBkYXRhX3NpemVzXzE2WyhieXRlMSA+PiAxKSAmIDNdICkKKwkJICAgIG1hdGhfYWJvcnQoRlBVX2luZm8sU0lHU0VHVik7CisJCX0KKworCSAgICAgIHVubWFza2VkID0gMDsgIC8qIERvIHRoaXMgaGVyZSB0byBzdG9wIGNvbXBpbGVyIHdhcm5pbmdzLiAqLworCSAgICAgIHN3aXRjaCAoIChieXRlMSA+PiAxKSAmIDMgKQorCQl7CisJCWNhc2UgMDoKKwkJICB1bm1hc2tlZCA9IEZQVV9sb2FkX3NpbmdsZSgoZmxvYXQgX191c2VyICopZGF0YV9hZGRyZXNzLAorCQkJCQkgICAgICZsb2FkZWRfZGF0YSk7CisJCSAgbG9hZGVkX3RhZyA9IHVubWFza2VkICYgMHhmZjsKKwkJICB1bm1hc2tlZCAmPSB+MHhmZjsKKwkJICBicmVhazsKKwkJY2FzZSAxOgorCQkgIGxvYWRlZF90YWcgPSBGUFVfbG9hZF9pbnQzMigobG9uZyBfX3VzZXIgKilkYXRhX2FkZHJlc3MsICZsb2FkZWRfZGF0YSk7CisJCSAgYnJlYWs7CisJCWNhc2UgMjoKKwkJICB1bm1hc2tlZCA9IEZQVV9sb2FkX2RvdWJsZSgoZG91YmxlIF9fdXNlciAqKWRhdGFfYWRkcmVzcywKKwkJCQkJICAgICAmbG9hZGVkX2RhdGEpOworCQkgIGxvYWRlZF90YWcgPSB1bm1hc2tlZCAmIDB4ZmY7CisJCSAgdW5tYXNrZWQgJj0gfjB4ZmY7CisJCSAgYnJlYWs7CisJCWNhc2UgMzoKKwkJZGVmYXVsdDogIC8qIFVzZWQgaGVyZSB0byBzdXBwcmVzcyBnY2Mgd2FybmluZ3MuICovCisJCSAgbG9hZGVkX3RhZyA9IEZQVV9sb2FkX2ludDE2KChzaG9ydCBfX3VzZXIgKilkYXRhX2FkZHJlc3MsICZsb2FkZWRfZGF0YSk7CisJCSAgYnJlYWs7CisJCX0KKworCSAgICAgIC8qIE5vIG1vcmUgYWNjZXNzIHRvIHVzZXIgbWVtb3J5LCBpdCBpcyBzYWZlCisJCSB0byB1c2Ugc3RhdGljIGRhdGEgbm93ICovCisKKwkgICAgICAvKiBOYU4gb3BlcmFuZHMgaGF2ZSB0aGUgbmV4dCBwcmlvcml0eS4gKi8KKwkgICAgICAvKiBXZSBoYXZlIHRvIGRlbGF5IGxvb2tpbmcgYXQgc3QoMCkgdW50aWwgYWZ0ZXIKKwkJIGxvYWRpbmcgdGhlIGRhdGEsIGJlY2F1c2UgdGhhdCBkYXRhIG1pZ2h0IGNvbnRhaW4gYW4gU05hTiAqLworCSAgICAgIGlmICggKChzdDBfdGFnID09IFRBR19TcGVjaWFsKSAmJiBpc05hTihzdDBfcHRyKSkgfHwKKwkJICAoKGxvYWRlZF90YWcgPT0gVEFHX1NwZWNpYWwpICYmIGlzTmFOKCZsb2FkZWRfZGF0YSkpICkKKwkJeworCQkgIC8qIFJlc3RvcmUgdGhlIHN0YXR1cyB3b3JkOyB3ZSBtaWdodCBoYXZlIGxvYWRlZCBhCisJCSAgICAgZGVub3JtYWwuICovCisJCSAgcGFydGlhbF9zdGF0dXMgPSBzdGF0dXMxOworCQkgIGlmICggKEZQVV9tb2RybSAmIDB4MzApID09IDB4MTAgKQorCQkgICAgeworCQkgICAgICAvKiBmY29tIG9yIGZjb21wICovCisJCSAgICAgIEVYQ0VQVElPTihFWF9JbnZhbGlkKTsKKwkJICAgICAgc2V0Y2MoU1dfQzMgfCBTV19DMiB8IFNXX0MwKTsKKwkJICAgICAgaWYgKCAoRlBVX21vZHJtICYgMHgwOCkgJiYgKGNvbnRyb2xfd29yZCAmIENXX0ludmFsaWQpICkKKwkJCUZQVV9wb3AoKTsgICAgICAgICAgICAgLyogZmNvbXAsIG1hc2tlZCwgc28gd2UgcG9wLiAqLworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgaWYgKCBsb2FkZWRfdGFnID09IFRBR19TcGVjaWFsICkKKwkJCWxvYWRlZF90YWcgPSBGUFVfU3BlY2lhbCgmbG9hZGVkX2RhdGEpOworI2lmZGVmIFBFQ1VMSUFSXzQ4NgorCQkgICAgICAvKiBUaGlzIGlzIG5vdCByZWFsbHkgbmVlZGVkLCBidXQgZ2l2ZXMgYmVoYXZpb3VyCisJCQkgaWRlbnRpY2FsIHRvIGFuIDgwNDg2ICovCisJCSAgICAgIGlmICggKEZQVV9tb2RybSAmIDB4MjgpID09IDB4MjAgKQorCQkJLyogZmRpdiBvciBmc3ViICovCisJCQlyZWFsXzJvcF9OYU4oJmxvYWRlZF9kYXRhLCBsb2FkZWRfdGFnLCAwLCAmbG9hZGVkX2RhdGEpOworCQkgICAgICBlbHNlCisjZW5kaWYgLyogUEVDVUxJQVJfNDg2ICovIAorCQkJLyogZmFkZCwgZmRpdnIsIGZtdWwsIG9yIGZzdWJyICovCisJCQlyZWFsXzJvcF9OYU4oJmxvYWRlZF9kYXRhLCBsb2FkZWRfdGFnLCAwLCBzdDBfcHRyKTsKKwkJICAgIH0KKwkJICBnb3RvIHJlZ19tZW1faW5zdHJfZG9uZTsKKwkJfQorCisJICAgICAgaWYgKCB1bm1hc2tlZCAmJiAhKChGUFVfbW9kcm0gJiAweDMwKSA9PSAweDEwKSApCisJCXsKKwkJICAvKiBJcyBub3QgYSBjb21wYXJpc29uIGluc3RydWN0aW9uLiAqLworCQkgIGlmICggKEZQVV9tb2RybSAmIDB4MzgpID09IDB4MzggKQorCQkgICAgeworCQkgICAgICAvKiBmZGl2ciAqLworCQkgICAgICBpZiAoIChzdDBfdGFnID09IFRBR19aZXJvKSAmJgorCQkJICAgKChsb2FkZWRfdGFnID09IFRBR19WYWxpZCkKKwkJCSAgICB8fCAobG9hZGVkX3RhZyA9PSBUQUdfU3BlY2lhbAorCQkJCSYmIGlzZGVub3JtYWwoJmxvYWRlZF9kYXRhKSkpICkKKwkJCXsKKwkJCSAgaWYgKCBGUFVfZGl2aWRlX2J5X3plcm8oMCwgZ2V0c2lnbigmbG9hZGVkX2RhdGEpKQorCQkJICAgICAgIDwgMCApCisJCQkgICAgeworCQkJICAgICAgLyogV2UgdXNlIHRoZSBmYWN0IGhlcmUgdGhhdCB0aGUgdW5tYXNrZWQKKwkJCQkgZXhjZXB0aW9uIGluIHRoZSBsb2FkZWQgZGF0YSB3YXMgZm9yIGEKKwkJCQkgZGVub3JtYWwgb3BlcmFuZCAqLworCQkJICAgICAgLyogUmVzdG9yZSB0aGUgc3RhdGUgb2YgdGhlIGRlbm9ybWFsIG9wIGJpdCAqLworCQkJICAgICAgcGFydGlhbF9zdGF0dXMgJj0gflNXX0Rlbm9ybV9PcDsKKwkJCSAgICAgIHBhcnRpYWxfc3RhdHVzIHw9IHN0YXR1czEgJiBTV19EZW5vcm1fT3A7CisJCQkgICAgfQorCQkJICBlbHNlCisJCQkgICAgc2V0c2lnbihzdDBfcHRyLCBnZXRzaWduKCZsb2FkZWRfZGF0YSkpOworCQkJfQorCQkgICAgfQorCQkgIGdvdG8gcmVnX21lbV9pbnN0cl9kb25lOworCQl9CisKKwkgICAgICBzd2l0Y2ggKCAoRlBVX21vZHJtID4+IDMpICYgNyApCisJCXsKKwkJY2FzZSAwOiAgICAgICAgIC8qIGZhZGQgKi8KKwkJICBjbGVhcl9DMSgpOworCQkgIEZQVV9hZGQoJmxvYWRlZF9kYXRhLCBsb2FkZWRfdGFnLCAwLCBjb250cm9sX3dvcmQpOworCQkgIGJyZWFrOworCQljYXNlIDE6ICAgICAgICAgLyogZm11bCAqLworCQkgIGNsZWFyX0MxKCk7CisJCSAgRlBVX211bCgmbG9hZGVkX2RhdGEsIGxvYWRlZF90YWcsIDAsIGNvbnRyb2xfd29yZCk7CisJCSAgYnJlYWs7CisJCWNhc2UgMjogICAgICAgICAvKiBmY29tICovCisJCSAgRlBVX2NvbXBhcmVfc3RfZGF0YSgmbG9hZGVkX2RhdGEsIGxvYWRlZF90YWcpOworCQkgIGJyZWFrOworCQljYXNlIDM6ICAgICAgICAgLyogZmNvbXAgKi8KKwkJICBpZiAoICFGUFVfY29tcGFyZV9zdF9kYXRhKCZsb2FkZWRfZGF0YSwgbG9hZGVkX3RhZykKKwkJICAgICAgICYmICF1bm1hc2tlZCApCisJCSAgICBGUFVfcG9wKCk7CisJCSAgYnJlYWs7CisJCWNhc2UgNDogICAgICAgICAvKiBmc3ViICovCisJCSAgY2xlYXJfQzEoKTsKKwkJICBGUFVfc3ViKExPQURFRHxsb2FkZWRfdGFnLCAoaW50KSZsb2FkZWRfZGF0YSwgY29udHJvbF93b3JkKTsKKwkJICBicmVhazsKKwkJY2FzZSA1OiAgICAgICAgIC8qIGZzdWJyICovCisJCSAgY2xlYXJfQzEoKTsKKwkJICBGUFVfc3ViKFJFVnxMT0FERUR8bG9hZGVkX3RhZywgKGludCkmbG9hZGVkX2RhdGEsIGNvbnRyb2xfd29yZCk7CisJCSAgYnJlYWs7CisJCWNhc2UgNjogICAgICAgICAvKiBmZGl2ICovCisJCSAgY2xlYXJfQzEoKTsKKwkJICBGUFVfZGl2KExPQURFRHxsb2FkZWRfdGFnLCAoaW50KSZsb2FkZWRfZGF0YSwgY29udHJvbF93b3JkKTsKKwkJICBicmVhazsKKwkJY2FzZSA3OiAgICAgICAgIC8qIGZkaXZyICovCisJCSAgY2xlYXJfQzEoKTsKKwkJICBpZiAoIHN0MF90YWcgPT0gVEFHX1plcm8gKQorCQkgICAgcGFydGlhbF9zdGF0dXMgPSBzdGF0dXMxOyAgLyogVW5kbyBhbnkgZGVub3JtIHRhZywKKwkJCQkJCSAgemVyby1kaXZpZGUgaGFzIHByaW9yaXR5LiAqLworCQkgIEZQVV9kaXYoUkVWfExPQURFRHxsb2FkZWRfdGFnLCAoaW50KSZsb2FkZWRfZGF0YSwgY29udHJvbF93b3JkKTsKKwkJICBicmVhazsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoIChGUFVfbW9kcm0gJiAweDMwKSA9PSAweDEwICkKKwkJeworCQkgIC8qIFRoZSBpbnN0cnVjdGlvbiBpcyBmY29tIG9yIGZjb21wICovCisJCSAgRVhDRVBUSU9OKEVYX1N0YWNrVW5kZXIpOworCQkgIHNldGNjKFNXX0MzIHwgU1dfQzIgfCBTV19DMCk7CisJCSAgaWYgKCAoRlBVX21vZHJtICYgMHgwOCkgJiYgKGNvbnRyb2xfd29yZCAmIENXX0ludmFsaWQpICkKKwkJICAgIEZQVV9wb3AoKTsgICAgICAgICAgICAgLyogZmNvbXAgKi8KKwkJfQorCSAgICAgIGVsc2UKKwkJRlBVX3N0YWNrX3VuZGVyZmxvdygpOworCSAgICB9CisJcmVnX21lbV9pbnN0cl9kb25lOgorCSAgb3BlcmFuZF9hZGRyZXNzID0gZGF0YV9zZWxfb2ZmOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoICEobm9faXBfdXBkYXRlID0KKwkJIEZQVV9sb2FkX3N0b3JlKCgoRlBVX21vZHJtICYgMHgzOCkgfCAoYnl0ZTEgJiA2KSkgPj4gMSwKKwkJCQlhZGRyX21vZGVzLCBkYXRhX2FkZHJlc3MpKSApCisJICAgIHsKKwkgICAgICBvcGVyYW5kX2FkZHJlc3MgPSBkYXRhX3NlbF9vZmY7CisJICAgIH0KKwl9CisKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBOb25lIG9mIHRoZXNlIGluc3RydWN0aW9ucyBhY2Nlc3MgdXNlciBtZW1vcnkgKi8KKyAgICAgIHVfY2hhciBpbnN0cl9pbmRleCA9IChGUFVfbW9kcm0gJiAweDM4KSB8IChieXRlMSAmIDcpOworCisjaWZkZWYgUEVDVUxJQVJfNDg2CisgICAgICAvKiBUaGlzIGlzIHN1cHBvc2VkIHRvIGJlIHVuZGVmaW5lZCwgYnV0IGEgcmVhbCA4MDQ4NiBzZWVtcworCSB0byBkbyB0aGlzOiAqLworICAgICAgb3BlcmFuZF9hZGRyZXNzLm9mZnNldCA9IDA7CisgICAgICBvcGVyYW5kX2FkZHJlc3Muc2VsZWN0b3IgPSBGUFVfRFM7CisjZW5kaWYgLyogUEVDVUxJQVJfNDg2ICovCisKKyAgICAgIHN0MF9wdHIgPSAmc3QoMCk7CisgICAgICBzdDBfdGFnID0gRlBVX2dldHRhZzAoKTsKKyAgICAgIHN3aXRjaCAoIHR5cGVfdGFibGVbKGludCkgaW5zdHJfaW5kZXhdICkKKwl7CisJY2FzZSBfTk9ORV86ICAgLyogYWxzbyBfUkVHSWM6IF9SRUdJbiAqLworCSAgYnJlYWs7CisJY2FzZSBfUkVHMF86CisJICBpZiAoICFOT1RfRU1QVFlfU1QwICkKKwkgICAgeworCSAgICAgIEZQVV9zdGFja191bmRlcmZsb3coKTsKKwkgICAgICBnb3RvIEZQVV9pbnN0cnVjdGlvbl9kb25lOworCSAgICB9CisJICBicmVhazsKKwljYXNlIF9SRUdJaToKKwkgIGlmICggIU5PVF9FTVBUWV9TVDAgfHwgIU5PVF9FTVBUWShGUFVfcm0pICkKKwkgICAgeworCSAgICAgIEZQVV9zdGFja191bmRlcmZsb3dfaShGUFVfcm0pOworCSAgICAgIGdvdG8gRlBVX2luc3RydWN0aW9uX2RvbmU7CisJICAgIH0KKwkgIGJyZWFrOworCWNhc2UgX1JFR0lwOgorCSAgaWYgKCAhTk9UX0VNUFRZX1NUMCB8fCAhTk9UX0VNUFRZKEZQVV9ybSkgKQorCSAgICB7CisJICAgICAgRlBVX3N0YWNrX3VuZGVyZmxvd19wb3AoRlBVX3JtKTsKKwkgICAgICBnb3RvIEZQVV9pbnN0cnVjdGlvbl9kb25lOworCSAgICB9CisJICBicmVhazsKKwljYXNlIF9SRUdJXzoKKwkgIGlmICggIU5PVF9FTVBUWV9TVDAgfHwgIU5PVF9FTVBUWShGUFVfcm0pICkKKwkgICAgeworCSAgICAgIEZQVV9zdGFja191bmRlcmZsb3coKTsKKwkgICAgICBnb3RvIEZQVV9pbnN0cnVjdGlvbl9kb25lOworCSAgICB9CisJICBicmVhazsKKwljYXNlIF9QVVNIXzogICAgIC8qIE9ubHkgdXNlZCBieSB0aGUgZmxkIHN0KGkpIGluc3RydWN0aW9uICovCisJICBicmVhazsKKwljYXNlIF9udWxsXzoKKwkgIEZQVV9pbGxlZ2FsKCk7CisJICBnb3RvIEZQVV9pbnN0cnVjdGlvbl9kb25lOworCWRlZmF1bHQ6CisJICBFWENFUFRJT04oRVhfSU5URVJOQUx8MHgxMTEpOworCSAgZ290byBGUFVfaW5zdHJ1Y3Rpb25fZG9uZTsKKwl9CisgICAgICAoKnN0X2luc3RyX3RhYmxlWyhpbnQpIGluc3RyX2luZGV4XSkoKTsKKworRlBVX2luc3RydWN0aW9uX2RvbmU6CisgICAgICA7CisgICAgfQorCisgIGlmICggISBub19pcF91cGRhdGUgKQorICAgIGluc3RydWN0aW9uX2FkZHJlc3MgPSBlbnRyeV9zZWxfb2ZmOworCitGUFVfZndhaXRfZG9uZToKKworI2lmZGVmIERFQlVHCisgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworICBGUFVfcHJpbnRhbGwoKTsKKyAgUkVfRU5UUkFOVF9DSEVDS19PTjsKKyNlbmRpZiAvKiBERUJVRyAqLworCisgIGlmIChGUFVfbG9va2FoZWFkICYmICFuZWVkX3Jlc2NoZWQoKSkKKyAgICB7CisgICAgICBGUFVfT1JJR19FSVAgPSBGUFVfRUlQIC0gY29kZV9iYXNlOworICAgICAgaWYgKCB2YWxpZF9wcmVmaXgoJmJ5dGUxLCAodV9jaGFyIF9fdXNlciAqKikmRlBVX0VJUCwKKwkJCSZhZGRyX21vZGVzLm92ZXJyaWRlKSApCisJZ290byBkb19hbm90aGVyX0ZQVV9pbnN0cnVjdGlvbjsKKyAgICB9CisKKyAgaWYgKCBhZGRyX21vZGVzLmRlZmF1bHRfbW9kZSApCisgICAgRlBVX0VJUCAtPSBjb2RlX2Jhc2U7CisKKyAgUkVfRU5UUkFOVF9DSEVDS19PRkY7Cit9CisKKworLyogU3VwcG9ydCBmb3IgcHJlZml4IGJ5dGVzIGlzIG5vdCB5ZXQgY29tcGxldGUuIFRvIHByb3Blcmx5IGhhbmRsZQorICAgYWxsIHByZWZpeCBieXRlcywgZnVydGhlciBjaGFuZ2VzIGFyZSBuZWVkZWQgaW4gdGhlIGVtdWxhdG9yIGNvZGUKKyAgIHdoaWNoIGFjY2Vzc2VzIHVzZXIgYWRkcmVzcyBzcGFjZS4gQWNjZXNzIHRvIHNlcGFyYXRlIHNlZ21lbnRzIGlzCisgICBpbXBvcnRhbnQgZm9yIG1zZG9zIGVtdWxhdGlvbi4gKi8KK3N0YXRpYyBpbnQgdmFsaWRfcHJlZml4KHVfY2hhciAqQnl0ZSwgdV9jaGFyIF9fdXNlciAqKmZwdV9laXAsCisJCQlvdmVycmlkZXMgKm92ZXJyaWRlKQoreworICB1X2NoYXIgYnl0ZTsKKyAgdV9jaGFyIF9fdXNlciAqaXAgPSAqZnB1X2VpcDsKKworICAqb3ZlcnJpZGUgPSAob3ZlcnJpZGVzKSB7IDAsIDAsIFBSRUZJWF9ERUZBVUxUIH07ICAgICAgIC8qIGRlZmF1bHRzICovCisKKyAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisgIEZQVV9jb2RlX2FjY2Vzc19vaygxKTsKKyAgRlBVX2dldF91c2VyKGJ5dGUsIGlwKTsKKyAgUkVfRU5UUkFOVF9DSEVDS19PTjsKKworICB3aGlsZSAoIDEgKQorICAgIHsKKyAgICAgIHN3aXRjaCAoIGJ5dGUgKQorCXsKKwljYXNlIEFERFJfU0laRV9QUkVGSVg6CisJICBvdmVycmlkZS0+YWRkcmVzc19zaXplID0gQUREUl9TSVpFX1BSRUZJWDsKKwkgIGdvdG8gZG9fbmV4dF9ieXRlOworCisJY2FzZSBPUF9TSVpFX1BSRUZJWDoKKwkgIG92ZXJyaWRlLT5vcGVyYW5kX3NpemUgPSBPUF9TSVpFX1BSRUZJWDsKKwkgIGdvdG8gZG9fbmV4dF9ieXRlOworCisJY2FzZSBQUkVGSVhfQ1M6CisJICBvdmVycmlkZS0+c2VnbWVudCA9IFBSRUZJWF9DU187CisJICBnb3RvIGRvX25leHRfYnl0ZTsKKwljYXNlIFBSRUZJWF9FUzoKKwkgIG92ZXJyaWRlLT5zZWdtZW50ID0gUFJFRklYX0VTXzsKKwkgIGdvdG8gZG9fbmV4dF9ieXRlOworCWNhc2UgUFJFRklYX1NTOgorCSAgb3ZlcnJpZGUtPnNlZ21lbnQgPSBQUkVGSVhfU1NfOworCSAgZ290byBkb19uZXh0X2J5dGU7CisJY2FzZSBQUkVGSVhfRlM6CisJICBvdmVycmlkZS0+c2VnbWVudCA9IFBSRUZJWF9GU187CisJICBnb3RvIGRvX25leHRfYnl0ZTsKKwljYXNlIFBSRUZJWF9HUzoKKwkgIG92ZXJyaWRlLT5zZWdtZW50ID0gUFJFRklYX0dTXzsKKwkgIGdvdG8gZG9fbmV4dF9ieXRlOworCWNhc2UgUFJFRklYX0RTOgorCSAgb3ZlcnJpZGUtPnNlZ21lbnQgPSBQUkVGSVhfRFNfOworCSAgZ290byBkb19uZXh0X2J5dGU7CisKKy8qIGxvY2sgaXMgbm90IGEgdmFsaWQgcHJlZml4IGZvciBGUFUgaW5zdHJ1Y3Rpb25zLAorICAgbGV0IHRoZSBjcHUgaGFuZGxlIGl0IHRvIGdlbmVyYXRlIGEgU0lHSUxMLiAqLworLyoJY2FzZSBQUkVGSVhfTE9DSzogKi8KKworCSAgLyogcmVwLi4gcHJlZml4ZXMgaGF2ZSBubyBtZWFuaW5nIGZvciBGUFUgaW5zdHJ1Y3Rpb25zICovCisJY2FzZSBQUkVGSVhfUkVQRToKKwljYXNlIFBSRUZJWF9SRVBORToKKworCWRvX25leHRfYnl0ZToKKwkgIGlwKys7CisJICBSRV9FTlRSQU5UX0NIRUNLX09GRjsKKwkgIEZQVV9jb2RlX2FjY2Vzc19vaygxKTsKKwkgIEZQVV9nZXRfdXNlcihieXRlLCBpcCk7CisJICBSRV9FTlRSQU5UX0NIRUNLX09OOworCSAgYnJlYWs7CisJY2FzZSBGV0FJVF9PUENPREU6CisJICAqQnl0ZSA9IGJ5dGU7CisJICByZXR1cm4gMTsKKwlkZWZhdWx0OgorCSAgaWYgKCAoYnl0ZSAmIDB4ZjgpID09IDB4ZDggKQorCSAgICB7CisJICAgICAgKkJ5dGUgPSBieXRlOworCSAgICAgICpmcHVfZWlwID0gaXA7CisJICAgICAgcmV0dXJuIDE7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIE5vdCBhIHZhbGlkIHNlcXVlbmNlIG9mIHByZWZpeCBieXRlcyBmb2xsb3dlZCBieQorCQkgYW4gRlBVIGluc3RydWN0aW9uLiAqLworCSAgICAgICpCeXRlID0gYnl0ZTsgIC8qIE5lZWRlZCBmb3IgZXJyb3IgbWVzc2FnZS4gKi8KKwkgICAgICByZXR1cm4gMDsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKKwordm9pZCBtYXRoX2Fib3J0KHN0cnVjdCBpbmZvICogaW5mbywgdW5zaWduZWQgaW50IHNpZ25hbCkKK3sKKwlGUFVfRUlQID0gRlBVX09SSUdfRUlQOworCWN1cnJlbnQtPnRocmVhZC50cmFwX25vID0gMTY7CisJY3VycmVudC0+dGhyZWFkLmVycm9yX2NvZGUgPSAwOworCXNlbmRfc2lnKHNpZ25hbCxjdXJyZW50LDEpOworCVJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworCV9fYXNtX18oIm1vdmwgJTAsJSVlc3AgOyByZXQiOiA6ImciICgoKGxvbmcpIGluZm8pLTQpKTsKKyNpZmRlZiBQQVJBTk9JRAorICAgICAgcHJpbnRrKCJFUlJPUjogd20tRlBVLWVtdSBtYXRoX2Fib3J0IGZhaWxlZCFcbiIpOworI2VuZGlmIC8qIFBBUkFOT0lEICovCit9CisKKworCisjZGVmaW5lIFMzODcgKChzdHJ1Y3QgaTM4N19zb2Z0X3N0cnVjdCAqKXMzODcpCisjZGVmaW5lIHNzdGF0dXNfd29yZCgpIFwKKyAgKChTMzg3LT5zd2QgJiB+U1dfVG9wICYgMHhmZmZmKSB8ICgoUzM4Ny0+ZnRvcCA8PCBTV19Ub3BfU2hpZnQpICYgU1dfVG9wKSkKKworaW50IHJlc3RvcmVfaTM4N19zb2Z0KHZvaWQgKnMzODcsIHN0cnVjdCBfZnBzdGF0ZSBfX3VzZXIgKmJ1ZikKK3sKKyAgdV9jaGFyIF9fdXNlciAqZCA9ICh1X2NoYXIgX191c2VyICopYnVmOworICBpbnQgb2Zmc2V0LCBvdGhlciwgaSwgdGFncywgcmVnbnIsIHRhZywgbmV3dG9wOworCisgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworICBGUFVfYWNjZXNzX29rKFZFUklGWV9SRUFELCBkLCA3KjQgKyA4KjEwKTsKKyAgaWYgKF9fY29weV9mcm9tX3VzZXIoJlMzODctPmN3ZCwgZCwgNyo0KSkKKyAgICByZXR1cm4gLTE7CisgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CisKKyAgZCArPSA3KjQ7CisKKyAgUzM4Ny0+ZnRvcCA9IChTMzg3LT5zd2QgPj4gU1dfVG9wX1NoaWZ0KSAmIDc7CisgIG9mZnNldCA9IChTMzg3LT5mdG9wICYgNykgKiAxMDsKKyAgb3RoZXIgPSA4MCAtIG9mZnNldDsKKworICBSRV9FTlRSQU5UX0NIRUNLX09GRjsKKyAgLyogQ29weSBhbGwgcmVnaXN0ZXJzIGluIHN0YWNrIG9yZGVyLiAqLworICBpZiAoX19jb3B5X2Zyb21fdXNlcigoKHVfY2hhciAqKSZTMzg3LT5zdF9zcGFjZSkrb2Zmc2V0LCBkLCBvdGhlcikpCisgICAgcmV0dXJuIC0xOworICBpZiAoIG9mZnNldCApCisgICAgaWYgKF9fY29weV9mcm9tX3VzZXIoKHVfY2hhciAqKSZTMzg3LT5zdF9zcGFjZSwgZCtvdGhlciwgb2Zmc2V0KSkKKyAgICAgIHJldHVybiAtMTsKKyAgUkVfRU5UUkFOVF9DSEVDS19PTjsKKworICAvKiBUaGUgdGFncyBtYXkgbmVlZCB0byBiZSBjb3JyZWN0ZWQgbm93LiAqLworICB0YWdzID0gUzM4Ny0+dHdkOworICBuZXd0b3AgPSBTMzg3LT5mdG9wOworICBmb3IgKCBpID0gMDsgaSA8IDg7IGkrKyApCisgICAgeworICAgICAgcmVnbnIgPSAoaStuZXd0b3ApICYgNzsKKyAgICAgIGlmICggKCh0YWdzID4+ICgocmVnbnIgJiA3KSoyKSkgJiAzKSAhPSBUQUdfRW1wdHkgKQorCXsKKwkgIC8qIFRoZSBsb2FkZWQgZGF0YSBvdmVyLXJpZGVzIGFsbCBvdGhlciBjYXNlcy4gKi8KKwkgIHRhZyA9IEZQVV90YWdvZigoRlBVX1JFRyAqKSgodV9jaGFyICopUzM4Ny0+c3Rfc3BhY2UgKyAxMCpyZWducikpOworCSAgdGFncyAmPSB+KDMgPDwgKHJlZ25yKjIpKTsKKwkgIHRhZ3MgfD0gKHRhZyAmIDMpIDw8IChyZWducioyKTsKKwl9CisgICAgfQorICBTMzg3LT50d2QgPSB0YWdzOworCisgIHJldHVybiAwOworfQorCisKK2ludCBzYXZlX2kzODdfc29mdCh2b2lkICpzMzg3LCBzdHJ1Y3QgX2Zwc3RhdGUgX191c2VyICogYnVmKQoreworICB1X2NoYXIgX191c2VyICpkID0gKHVfY2hhciBfX3VzZXIgKilidWY7CisgIGludCBvZmZzZXQgPSAoUzM4Ny0+ZnRvcCAmIDcpICogMTAsIG90aGVyID0gODAgLSBvZmZzZXQ7CisKKyAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisgIEZQVV9hY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBkLCA3KjQgKyA4KjEwKTsKKyNpZmRlZiBQRUNVTElBUl80ODYKKyAgUzM4Ny0+Y3dkICY9IH4weGUwODA7CisgIC8qIEFuIDgwNDg2IHNldHMgbmVhcmx5IGFsbCBvZiB0aGUgcmVzZXJ2ZWQgYml0cyB0byAxLiAqLworICBTMzg3LT5jd2QgfD0gMHhmZmZmMDA0MDsKKyAgUzM4Ny0+c3dkID0gc3N0YXR1c193b3JkKCkgfCAweGZmZmYwMDAwOworICBTMzg3LT50d2QgfD0gMHhmZmZmMDAwMDsKKyAgUzM4Ny0+ZmNzICY9IH4weGY4MDAwMDAwOworICBTMzg3LT5mb3MgfD0gMHhmZmZmMDAwMDsKKyNlbmRpZiAvKiBQRUNVTElBUl80ODYgKi8KKyAgX19jb3B5X3RvX3VzZXIoZCwgJlMzODctPmN3ZCwgNyo0KTsKKyAgUkVfRU5UUkFOVF9DSEVDS19PTjsKKworICBkICs9IDcqNDsKKworICBSRV9FTlRSQU5UX0NIRUNLX09GRjsKKyAgLyogQ29weSBhbGwgcmVnaXN0ZXJzIGluIHN0YWNrIG9yZGVyLiAqLworICBpZiAoX19jb3B5X3RvX3VzZXIoZCwgKCh1X2NoYXIgKikmUzM4Ny0+c3Rfc3BhY2UpK29mZnNldCwgb3RoZXIpKQorICAgIHJldHVybiAtMTsKKyAgaWYgKCBvZmZzZXQgKQorICAgIGlmIChfX2NvcHlfdG9fdXNlcihkK290aGVyLCAodV9jaGFyICopJlMzODctPnN0X3NwYWNlLCBvZmZzZXQpKQorICAgICAgcmV0dXJuIC0xCisgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CisKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWF0aC1lbXUvZnB1X2V0Yy5jIGIvYXJjaC9pMzg2L21hdGgtZW11L2ZwdV9ldGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2I1ZDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L2ZwdV9ldGMuYwpAQCAtMCwwICsxLDE0MyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgZnB1X2V0Yy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgSW1wbGVtZW50IGEgZmV3IEZQVSBpbnN0cnVjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENvcHlyaWdodCAoQykgMTk5MiwxOTkzLDE5OTQsMTk5NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgQXVzdHJhbGlhLiAgRS1tYWlsICAgYmlsbG1Ac3VidXJiaWEubmV0ICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJmcHVfc3lzdGVtLmgiCisjaW5jbHVkZSAiZXhjZXB0aW9uLmgiCisjaW5jbHVkZSAiZnB1X2VtdS5oIgorI2luY2x1ZGUgInN0YXR1c193LmgiCisjaW5jbHVkZSAicmVnX2NvbnN0YW50LmgiCisKKworc3RhdGljIHZvaWQgZmNocyhGUFVfUkVHICpzdDBfcHRyLCB1X2NoYXIgc3QwdGFnKQoreworICBpZiAoIHN0MHRhZyBeIFRBR19FbXB0eSApCisgICAgeworICAgICAgc2lnbmJ5dGUoc3QwX3B0cikgXj0gU0lHTl9ORUc7CisgICAgICBjbGVhcl9DMSgpOworICAgIH0KKyAgZWxzZQorICAgIEZQVV9zdGFja191bmRlcmZsb3coKTsKK30KKworCitzdGF0aWMgdm9pZCBmYWJzKEZQVV9SRUcgKnN0MF9wdHIsIHVfY2hhciBzdDB0YWcpCit7CisgIGlmICggc3QwdGFnIF4gVEFHX0VtcHR5ICkKKyAgICB7CisgICAgICBzZXRwb3NpdGl2ZShzdDBfcHRyKTsKKyAgICAgIGNsZWFyX0MxKCk7CisgICAgfQorICBlbHNlCisgICAgRlBVX3N0YWNrX3VuZGVyZmxvdygpOworfQorCisKK3N0YXRpYyB2b2lkIGZ0c3RfKEZQVV9SRUcgKnN0MF9wdHIsIHVfY2hhciBzdDB0YWcpCit7CisgIHN3aXRjaCAoc3QwdGFnKQorICAgIHsKKyAgICBjYXNlIFRBR19aZXJvOgorICAgICAgc2V0Y2MoU1dfQzMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUQUdfVmFsaWQ6CisgICAgICBpZiAoZ2V0c2lnbihzdDBfcHRyKSA9PSBTSUdOX1BPUykKKyAgICAgICAgc2V0Y2MoMCk7CisgICAgICBlbHNlCisgICAgICAgIHNldGNjKFNXX0MwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVEFHX1NwZWNpYWw6CisgICAgICBzd2l0Y2ggKCBGUFVfU3BlY2lhbChzdDBfcHRyKSApCisJeworCWNhc2UgVFdfRGVub3JtYWw6CisJICBpZiAoZ2V0c2lnbihzdDBfcHRyKSA9PSBTSUdOX1BPUykKKwkgICAgc2V0Y2MoMCk7CisJICBlbHNlCisJICAgIHNldGNjKFNXX0MwKTsKKwkgIGlmICggZGVub3JtYWxfb3BlcmFuZCgpIDwgMCApCisJICAgIHsKKyNpZmRlZiBQRUNVTElBUl80ODYKKwkgICAgICAvKiBUaGlzIGlzIHdlaXJkISAqLworCSAgICAgIGlmIChnZXRzaWduKHN0MF9wdHIpID09IFNJR05fUE9TKQorCQlzZXRjYyhTV19DMyk7CisjZW5kaWYgLyogUEVDVUxJQVJfNDg2ICovCisJICAgICAgcmV0dXJuOworCSAgICB9CisJICBicmVhazsKKwljYXNlIFRXX05hTjoKKwkgIHNldGNjKFNXX0MwfFNXX0MyfFNXX0MzKTsgICAvKiBPcGVyYW5kIGlzIG5vdCBjb21wYXJhYmxlICovIAorCSAgRVhDRVBUSU9OKEVYX0ludmFsaWQpOworCSAgYnJlYWs7CisJY2FzZSBUV19JbmZpbml0eToKKwkgIGlmIChnZXRzaWduKHN0MF9wdHIpID09IFNJR05fUE9TKQorCSAgICBzZXRjYygwKTsKKwkgIGVsc2UKKwkgICAgc2V0Y2MoU1dfQzApOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIHNldGNjKFNXX0MwfFNXX0MyfFNXX0MzKTsgICAvKiBPcGVyYW5kIGlzIG5vdCBjb21wYXJhYmxlICovIAorCSAgRVhDRVBUSU9OKEVYX0lOVEVSTkFMfDB4MTQpOworCSAgYnJlYWs7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBUQUdfRW1wdHk6CisgICAgICBzZXRjYyhTV19DMHxTV19DMnxTV19DMyk7CisgICAgICBFWENFUFRJT04oRVhfU3RhY2tVbmRlcik7CisgICAgICBicmVhazsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQgZnhhbShGUFVfUkVHICpzdDBfcHRyLCB1X2NoYXIgc3QwdGFnKQoreworICBpbnQgYyA9IDA7CisgIHN3aXRjaCAoc3QwdGFnKQorICAgIHsKKyAgICBjYXNlIFRBR19FbXB0eToKKyAgICAgIGMgPSBTV19DM3xTV19DMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVEFHX1plcm86CisgICAgICBjID0gU1dfQzM7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRBR19WYWxpZDoKKyAgICAgIGMgPSBTV19DMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVEFHX1NwZWNpYWw6CisgICAgICBzd2l0Y2ggKCBGUFVfU3BlY2lhbChzdDBfcHRyKSApCisJeworCWNhc2UgVFdfRGVub3JtYWw6CisJICBjID0gU1dfQzJ8U1dfQzM7ICAvKiBEZW5vcm1hbCAqLworCSAgYnJlYWs7CisJY2FzZSBUV19OYU46CisJICAvKiBXZSBhbHNvIHVzZSBOYU4gZm9yIHVuc3VwcG9ydGVkIHR5cGVzLiAqLworCSAgaWYgKCAoc3QwX3B0ci0+c2lnaCAmIDB4ODAwMDAwMDApICYmIChleHBvbmVudChzdDBfcHRyKSA9PSBFWFBfT1ZFUikgKQorCSAgICBjID0gU1dfQzA7CisJICBicmVhazsKKwljYXNlIFRXX0luZmluaXR5OgorCSAgYyA9IFNXX0MyfFNXX0MwOworCSAgYnJlYWs7CisJfQorICAgIH0KKyAgaWYgKCBnZXRzaWduKHN0MF9wdHIpID09IFNJR05fTkVHICkKKyAgICBjIHw9IFNXX0MxOworICBzZXRjYyhjKTsKK30KKworCitzdGF0aWMgRlVOQ19TVDAgY29uc3QgZnBfZXRjX3RhYmxlW10gPSB7CisgIGZjaHMsIGZhYnMsIChGVU5DX1NUMClGUFVfaWxsZWdhbCwgKEZVTkNfU1QwKUZQVV9pbGxlZ2FsLAorICBmdHN0XywgZnhhbSwgKEZVTkNfU1QwKUZQVV9pbGxlZ2FsLCAoRlVOQ19TVDApRlBVX2lsbGVnYWwKK307CisKK3ZvaWQgRlBVX2V0Yyh2b2lkKQoreworICAoZnBfZXRjX3RhYmxlW0ZQVV9ybV0pKCZzdCgwKSwgRlBVX2dldHRhZzAoKSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWF0aC1lbXUvZnB1X3Byb3RvLmggYi9hcmNoL2kzODYvbWF0aC1lbXUvZnB1X3Byb3RvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdhOGE3ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWF0aC1lbXUvZnB1X3Byb3RvLmgKQEAgLTAsMCArMSwxNDAgQEAKKyNpZm5kZWYgX0ZQVV9QUk9UT19ICisjZGVmaW5lIF9GUFVfUFJPVE9fSAorCisvKiBlcnJvcnMuYyAqLworZXh0ZXJuIHZvaWQgRlBVX2lsbGVnYWwodm9pZCk7CitleHRlcm4gdm9pZCBGUFVfcHJpbnRhbGwodm9pZCk7Cithc21saW5rYWdlIHZvaWQgRlBVX2V4Y2VwdGlvbihpbnQgbik7CitleHRlcm4gaW50IHJlYWxfMW9wX05hTihGUFVfUkVHICphKTsKK2V4dGVybiBpbnQgcmVhbF8yb3BfTmFOKEZQVV9SRUcgY29uc3QgKmIsIHVfY2hhciB0YWdiLCBpbnQgZGVzdHN0bnIsCisJCQlGUFVfUkVHIGNvbnN0ICpkZWZhdWx0TmFOKTsKK2FzbWxpbmthZ2UgaW50IGFyaXRoX2ludmFsaWQoaW50IGRlc3RzdG5yKTsKK2FzbWxpbmthZ2UgaW50IEZQVV9kaXZpZGVfYnlfemVybyhpbnQgZGVzdHN0bnIsIHVfY2hhciBzaWduKTsKK2V4dGVybiBpbnQgc2V0X3ByZWNpc2lvbl9mbGFnKGludCBmbGFncyk7Cithc21saW5rYWdlIHZvaWQgc2V0X3ByZWNpc2lvbl9mbGFnX3VwKHZvaWQpOworYXNtbGlua2FnZSB2b2lkIHNldF9wcmVjaXNpb25fZmxhZ19kb3duKHZvaWQpOworYXNtbGlua2FnZSBpbnQgZGVub3JtYWxfb3BlcmFuZCh2b2lkKTsKK2FzbWxpbmthZ2UgaW50IGFyaXRoX292ZXJmbG93KEZQVV9SRUcgKmRlc3QpOworYXNtbGlua2FnZSBpbnQgYXJpdGhfdW5kZXJmbG93KEZQVV9SRUcgKmRlc3QpOworZXh0ZXJuIHZvaWQgRlBVX3N0YWNrX292ZXJmbG93KHZvaWQpOworZXh0ZXJuIHZvaWQgRlBVX3N0YWNrX3VuZGVyZmxvdyh2b2lkKTsKK2V4dGVybiB2b2lkIEZQVV9zdGFja191bmRlcmZsb3dfaShpbnQgaSk7CitleHRlcm4gdm9pZCBGUFVfc3RhY2tfdW5kZXJmbG93X3BvcChpbnQgaSk7CisvKiBmcHVfYXJpdGguYyAqLworZXh0ZXJuIHZvaWQgZmFkZF9fKHZvaWQpOworZXh0ZXJuIHZvaWQgZm11bF9fKHZvaWQpOworZXh0ZXJuIHZvaWQgZnN1Yl9fKHZvaWQpOworZXh0ZXJuIHZvaWQgZnN1YnJfKHZvaWQpOworZXh0ZXJuIHZvaWQgZmRpdl9fKHZvaWQpOworZXh0ZXJuIHZvaWQgZmRpdnJfKHZvaWQpOworZXh0ZXJuIHZvaWQgZmFkZF9pKHZvaWQpOworZXh0ZXJuIHZvaWQgZm11bF9pKHZvaWQpOworZXh0ZXJuIHZvaWQgZnN1YnJpKHZvaWQpOworZXh0ZXJuIHZvaWQgZnN1Yl9pKHZvaWQpOworZXh0ZXJuIHZvaWQgZmRpdnJpKHZvaWQpOworZXh0ZXJuIHZvaWQgZmRpdl9pKHZvaWQpOworZXh0ZXJuIHZvaWQgZmFkZHBfKHZvaWQpOworZXh0ZXJuIHZvaWQgZm11bHBfKHZvaWQpOworZXh0ZXJuIHZvaWQgZnN1YnJwKHZvaWQpOworZXh0ZXJuIHZvaWQgZnN1YnBfKHZvaWQpOworZXh0ZXJuIHZvaWQgZmRpdnJwKHZvaWQpOworZXh0ZXJuIHZvaWQgZmRpdnBfKHZvaWQpOworLyogZnB1X2F1eC5jICovCitleHRlcm4gdm9pZCBmaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGZpbml0Xyh2b2lkKTsKK2V4dGVybiB2b2lkIGZzdHN3Xyh2b2lkKTsKK2V4dGVybiB2b2lkIGZwX25vcCh2b2lkKTsKK2V4dGVybiB2b2lkIGZsZF9pXyh2b2lkKTsKK2V4dGVybiB2b2lkIGZ4Y2hfaSh2b2lkKTsKK2V4dGVybiB2b2lkIGZmcmVlXyh2b2lkKTsKK2V4dGVybiB2b2lkIGZmcmVlcCh2b2lkKTsKK2V4dGVybiB2b2lkIGZzdF9pXyh2b2lkKTsKK2V4dGVybiB2b2lkIGZzdHBfaSh2b2lkKTsKKy8qIGZwdV9lbnRyeS5jICovCithc21saW5rYWdlIGV4dGVybiB2b2lkIG1hdGhfZW11bGF0ZShsb25nIGFyZyk7CitleHRlcm4gdm9pZCBtYXRoX2Fib3J0KHN0cnVjdCBpbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgc2lnbmFsKTsKKy8qIGZwdV9ldGMuYyAqLworZXh0ZXJuIHZvaWQgRlBVX2V0Yyh2b2lkKTsKKy8qIGZwdV90YWdzLmMgKi8KK2V4dGVybiBpbnQgRlBVX2dldHRhZzAodm9pZCk7CitleHRlcm4gaW50IEZQVV9nZXR0YWdpKGludCBzdG5yKTsKK2V4dGVybiBpbnQgRlBVX2dldHRhZyhpbnQgcmVnbnIpOworZXh0ZXJuIHZvaWQgRlBVX3NldHRhZzAoaW50IHRhZyk7CitleHRlcm4gdm9pZCBGUFVfc2V0dGFnaShpbnQgc3RuciwgaW50IHRhZyk7CitleHRlcm4gdm9pZCBGUFVfc2V0dGFnKGludCByZWduciwgaW50IHRhZyk7CitleHRlcm4gaW50IEZQVV9TcGVjaWFsKEZQVV9SRUcgY29uc3QgKnB0cik7CitleHRlcm4gaW50IGlzTmFOKEZQVV9SRUcgY29uc3QgKnB0cik7CitleHRlcm4gdm9pZCBGUFVfcG9wKHZvaWQpOworZXh0ZXJuIGludCBGUFVfZW1wdHlfaShpbnQgc3Rucik7CitleHRlcm4gaW50IEZQVV9zdGFja292ZXJmbG93KEZQVV9SRUcgKipzdF9uZXdfcHRyKTsKK2V4dGVybiB2b2lkIEZQVV9jb3B5X3RvX3JlZ2koRlBVX1JFRyBjb25zdCAqciwgdV9jaGFyIHRhZywgaW50IHN0bnIpOworZXh0ZXJuIHZvaWQgRlBVX2NvcHlfdG9fcmVnMShGUFVfUkVHIGNvbnN0ICpyLCB1X2NoYXIgdGFnKTsKK2V4dGVybiB2b2lkIEZQVV9jb3B5X3RvX3JlZzAoRlBVX1JFRyBjb25zdCAqciwgdV9jaGFyIHRhZyk7CisvKiBmcHVfdHJpZy5jICovCitleHRlcm4gdm9pZCBGUFVfdHJpZ2Eodm9pZCk7CitleHRlcm4gdm9pZCBGUFVfdHJpZ2Iodm9pZCk7CisvKiBnZXRfYWRkcmVzcy5jICovCitleHRlcm4gdm9pZCBfX3VzZXIgKkZQVV9nZXRfYWRkcmVzcyh1X2NoYXIgRlBVX21vZHJtLCB1bnNpZ25lZCBsb25nICpmcHVfZWlwLAorCQkJIHN0cnVjdCBhZGRyZXNzICphZGRyLCBmcHVfYWRkcl9tb2RlcyBhZGRyX21vZGVzKTsKK2V4dGVybiB2b2lkIF9fdXNlciAqRlBVX2dldF9hZGRyZXNzXzE2KHVfY2hhciBGUFVfbW9kcm0sIHVuc2lnbmVkIGxvbmcgKmZwdV9laXAsCisJCQkgICAgc3RydWN0IGFkZHJlc3MgKmFkZHIsIGZwdV9hZGRyX21vZGVzIGFkZHJfbW9kZXMpOworLyogbG9hZF9zdG9yZS5jICovCitleHRlcm4gaW50IEZQVV9sb2FkX3N0b3JlKHVfY2hhciB0eXBlLCBmcHVfYWRkcl9tb2RlcyBhZGRyX21vZGVzLAorCQkJICAgIHZvaWQgX191c2VyICpkYXRhX2FkZHJlc3MpOworLyogcG9seV8yeG0xLmMgKi8KK2V4dGVybiBpbnQgcG9seV8yeG0xKHVfY2hhciBzaWduLCBGUFVfUkVHICphcmcsIEZQVV9SRUcgKnJlc3VsdCk7CisvKiBwb2x5X2F0YW4uYyAqLworZXh0ZXJuIHZvaWQgcG9seV9hdGFuKEZQVV9SRUcgKnN0MF9wdHIsIHVfY2hhciBzdDBfdGFnLCBGUFVfUkVHICpzdDFfcHRyLAorCQkgICAgICB1X2NoYXIgc3QxX3RhZyk7CisvKiBwb2x5X2wyLmMgKi8KK2V4dGVybiB2b2lkIHBvbHlfbDIoRlBVX1JFRyAqc3QwX3B0ciwgRlBVX1JFRyAqc3QxX3B0ciwgdV9jaGFyIHN0MV9zaWduKTsKK2V4dGVybiBpbnQgcG9seV9sMnAxKHVfY2hhciBzMCwgdV9jaGFyIHMxLCBGUFVfUkVHICpyMCwgRlBVX1JFRyAqcjEsCisJCSAgICAgRlBVX1JFRyAqZCk7CisvKiBwb2x5X3Npbi5jICovCitleHRlcm4gdm9pZCBwb2x5X3NpbmUoRlBVX1JFRyAqc3QwX3B0cik7CitleHRlcm4gdm9pZCBwb2x5X2NvcyhGUFVfUkVHICpzdDBfcHRyKTsKKy8qIHBvbHlfdGFuLmMgKi8KK2V4dGVybiB2b2lkIHBvbHlfdGFuKEZQVV9SRUcgKnN0MF9wdHIpOworLyogcmVnX2FkZF9zdWIuYyAqLworZXh0ZXJuIGludCBGUFVfYWRkKEZQVV9SRUcgY29uc3QgKmIsIHVfY2hhciB0YWdiLCBpbnQgZGVzdHJuciwgaW50IGNvbnRyb2xfdyk7CitleHRlcm4gaW50IEZQVV9zdWIoaW50IGZsYWdzLCBpbnQgcm0sIGludCBjb250cm9sX3cpOworLyogcmVnX2NvbXBhcmUuYyAqLworZXh0ZXJuIGludCBGUFVfY29tcGFyZV9zdF9kYXRhKEZQVV9SRUcgY29uc3QgKmxvYWRlZF9kYXRhLCB1X2NoYXIgbG9hZGVkX3RhZyk7CitleHRlcm4gdm9pZCBmY29tX3N0KHZvaWQpOworZXh0ZXJuIHZvaWQgZmNvbXBzdCh2b2lkKTsKK2V4dGVybiB2b2lkIGZjb21wcCh2b2lkKTsKK2V4dGVybiB2b2lkIGZ1Y29tXyh2b2lkKTsKK2V4dGVybiB2b2lkIGZ1Y29tcCh2b2lkKTsKK2V4dGVybiB2b2lkIGZ1Y29tcHAodm9pZCk7CisvKiByZWdfY29uc3RhbnQuYyAqLworZXh0ZXJuIHZvaWQgZmNvbnN0KHZvaWQpOworLyogcmVnX2xkX3N0ci5jICovCitleHRlcm4gaW50IEZQVV9sb2FkX2V4dGVuZGVkKGxvbmcgZG91YmxlIF9fdXNlciAqcywgaW50IHN0bnIpOworZXh0ZXJuIGludCBGUFVfbG9hZF9kb3VibGUoZG91YmxlIF9fdXNlciAqZGZsb2F0LCBGUFVfUkVHICpsb2FkZWRfZGF0YSk7CitleHRlcm4gaW50IEZQVV9sb2FkX3NpbmdsZShmbG9hdCBfX3VzZXIgKnNpbmdsZSwgRlBVX1JFRyAqbG9hZGVkX2RhdGEpOworZXh0ZXJuIGludCBGUFVfbG9hZF9pbnQ2NChsb25nIGxvbmcgX191c2VyICpfcyk7CitleHRlcm4gaW50IEZQVV9sb2FkX2ludDMyKGxvbmcgX191c2VyICpfcywgRlBVX1JFRyAqbG9hZGVkX2RhdGEpOworZXh0ZXJuIGludCBGUFVfbG9hZF9pbnQxNihzaG9ydCBfX3VzZXIgKl9zLCBGUFVfUkVHICpsb2FkZWRfZGF0YSk7CitleHRlcm4gaW50IEZQVV9sb2FkX2JjZCh1X2NoYXIgX191c2VyICpzKTsKK2V4dGVybiBpbnQgRlBVX3N0b3JlX2V4dGVuZGVkKEZQVV9SRUcgKnN0MF9wdHIsIHVfY2hhciBzdDBfdGFnLAorCQkJICAgICAgbG9uZyBkb3VibGUgX191c2VyICpkKTsKK2V4dGVybiBpbnQgRlBVX3N0b3JlX2RvdWJsZShGUFVfUkVHICpzdDBfcHRyLCB1X2NoYXIgc3QwX3RhZywgZG91YmxlIF9fdXNlciAqZGZsb2F0KTsKK2V4dGVybiBpbnQgRlBVX3N0b3JlX3NpbmdsZShGUFVfUkVHICpzdDBfcHRyLCB1X2NoYXIgc3QwX3RhZywgZmxvYXQgX191c2VyICpzaW5nbGUpOworZXh0ZXJuIGludCBGUFVfc3RvcmVfaW50NjQoRlBVX1JFRyAqc3QwX3B0ciwgdV9jaGFyIHN0MF90YWcsIGxvbmcgbG9uZyBfX3VzZXIgKmQpOworZXh0ZXJuIGludCBGUFVfc3RvcmVfaW50MzIoRlBVX1JFRyAqc3QwX3B0ciwgdV9jaGFyIHN0MF90YWcsIGxvbmcgX191c2VyICpkKTsKK2V4dGVybiBpbnQgRlBVX3N0b3JlX2ludDE2KEZQVV9SRUcgKnN0MF9wdHIsIHVfY2hhciBzdDBfdGFnLCBzaG9ydCBfX3VzZXIgKmQpOworZXh0ZXJuIGludCBGUFVfc3RvcmVfYmNkKEZQVV9SRUcgKnN0MF9wdHIsIHVfY2hhciBzdDBfdGFnLCB1X2NoYXIgX191c2VyICpkKTsKK2V4dGVybiBpbnQgRlBVX3JvdW5kX3RvX2ludChGUFVfUkVHICpyLCB1X2NoYXIgdGFnKTsKK2V4dGVybiB1X2NoYXIgX191c2VyICpmbGRlbnYoZnB1X2FkZHJfbW9kZXMgYWRkcl9tb2RlcywgdV9jaGFyIF9fdXNlciAqcyk7CitleHRlcm4gdm9pZCBmcnN0b3IoZnB1X2FkZHJfbW9kZXMgYWRkcl9tb2RlcywgdV9jaGFyIF9fdXNlciAqZGF0YV9hZGRyZXNzKTsKK2V4dGVybiB1X2NoYXIgX191c2VyICpmc3RlbnYoZnB1X2FkZHJfbW9kZXMgYWRkcl9tb2RlcywgdV9jaGFyIF9fdXNlciAqZCk7CitleHRlcm4gdm9pZCBmc2F2ZShmcHVfYWRkcl9tb2RlcyBhZGRyX21vZGVzLCB1X2NoYXIgX191c2VyICpkYXRhX2FkZHJlc3MpOworZXh0ZXJuIGludCBGUFVfdGFnb2YoRlBVX1JFRyAqcHRyKTsKKy8qIHJlZ19tdWwuYyAqLworZXh0ZXJuIGludCBGUFVfbXVsKEZQVV9SRUcgY29uc3QgKmIsIHVfY2hhciB0YWdiLCBpbnQgZGVzdHN0bnIsIGludCBjb250cm9sX3cpOworCitleHRlcm4gaW50IEZQVV9kaXYoaW50IGZsYWdzLCBpbnQgcmVncm0sIGludCBjb250cm9sX3cpOworLyogcmVnX2NvbnZlcnQuYyAqLworZXh0ZXJuIGludCBGUFVfdG9fZXhwMTYoRlBVX1JFRyBjb25zdCAqYSwgRlBVX1JFRyAqeCk7CisjZW5kaWYgLyogX0ZQVV9QUk9UT19IICovCisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYXRoLWVtdS9mcHVfc3lzdGVtLmggYi9hcmNoL2kzODYvbWF0aC1lbXUvZnB1X3N5c3RlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMjYzNDEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWF0aC1lbXUvZnB1X3N5c3RlbS5oCkBAIC0wLDAgKzEsODkgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgIGZwdV9zeXN0ZW0uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENvcHlyaWdodCAoQykgMTk5MiwxOTk0LDE5OTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgQXVzdHJhbGlhLiAgRS1tYWlsICAgYmlsbG1Ac3VidXJiaWEubmV0ICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIF9GUFVfU1lTVEVNX0gKKyNkZWZpbmUgX0ZQVV9TWVNURU1fSAorCisvKiBzeXN0ZW0gZGVwZW5kZW50IGRlZmluaXRpb25zICovCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisKKy8qIFRoaXMgc2V0cyB0aGUgcG9pbnRlciBGUFVfaW5mbyB0byBwb2ludCB0byB0aGUgYXJndW1lbnQgcGFydAorICAgb2YgdGhlIHN0YWNrIGZyYW1lIG9mIG1hdGhfZW11bGF0ZSgpICovCisjZGVmaW5lIFNFVFVQX0RBVEFfQVJFQShhcmcpCUZQVV9pbmZvID0gKHN0cnVjdCBpbmZvICopICZhcmcKKworLyogcyBpcyBhbHdheXMgZnJvbSBhIGNwdSByZWdpc3RlciwgYW5kIHRoZSBjcHUgZG9lcyBib3VuZHMgY2hlY2tpbmcKKyAqIGR1cmluZyByZWdpc3RlciBsb2FkIC0tPiBubyBmdXJ0aGVyIGJvdW5kcyBjaGVja3MgbmVlZGVkICovCisjZGVmaW5lIExEVF9ERVNDUklQVE9SKHMpCSgoKHN0cnVjdCBkZXNjX3N0cnVjdCAqKWN1cnJlbnQtPm1tLT5jb250ZXh0LmxkdClbKHMpID4+IDNdKQorI2RlZmluZSBTRUdfRF9TSVpFKHgpCQkoKHgpLmIgJiAoMyA8PCAyMSkpCisjZGVmaW5lIFNFR19HX0JJVCh4KQkJKCh4KS5iICYgKDEgPDwgMjMpKQorI2RlZmluZSBTRUdfR1JBTlVMQVJJVFkoeCkJKCgoeCkuYiAmICgxIDw8IDIzKSkgPyA0MDk2IDogMSkKKyNkZWZpbmUgU0VHXzI4Nl9NT0RFKHgpCQkoKHgpLmIgJiAoIDB4ZmYwMDAwMDAgfCAweGYwMDAwIHwgKDEgPDwgMjMpKSkKKyNkZWZpbmUgU0VHX0JBU0VfQUREUihzKQkoKChzKS5iICYgMHhmZjAwMDAwMCkgXAorCQkJCSB8ICgoKHMpLmIgJiAweGZmKSA8PCAxNikgfCAoKHMpLmEgPj4gMTYpKQorI2RlZmluZSBTRUdfTElNSVQocykJCSgoKHMpLmIgJiAweGZmMDAwMCkgfCAoKHMpLmEgJiAweGZmZmYpKQorI2RlZmluZSBTRUdfRVhFQ1VURV9PTkxZKHMpCSgoKHMpLmIgJiAoKDEgPDwgMTEpIHwgKDEgPDwgOSkpKSA9PSAoMSA8PCAxMSkpCisjZGVmaW5lIFNFR19XUklURV9QRVJNKHMpCSgoKHMpLmIgJiAoKDEgPDwgMTEpIHwgKDEgPDwgOSkpKSA9PSAoMSA8PCA5KSkKKyNkZWZpbmUgU0VHX0VYUEFORF9ET1dOKHMpCSgoKHMpLmIgJiAoKDEgPDwgMTEpIHwgKDEgPDwgMTApKSkgXAorCQkJCSA9PSAoMSA8PCAxMCkpCisKKyNkZWZpbmUgSTM4NwkJCShjdXJyZW50LT50aHJlYWQuaTM4NykKKyNkZWZpbmUgRlBVX2luZm8JCShJMzg3LnNvZnQuaW5mbykKKworI2RlZmluZSBGUFVfQ1MJCQkoKih1bnNpZ25lZCBzaG9ydCAqKSAmKEZQVV9pbmZvLT5fX19jcykpCisjZGVmaW5lIEZQVV9TUwkJCSgqKHVuc2lnbmVkIHNob3J0ICopICYoRlBVX2luZm8tPl9fX3NzKSkKKyNkZWZpbmUgRlBVX0RTCQkJKCoodW5zaWduZWQgc2hvcnQgKikgJihGUFVfaW5mby0+X19fZHMpKQorI2RlZmluZSBGUFVfRUFYCQkJKEZQVV9pbmZvLT5fX19lYXgpCisjZGVmaW5lIEZQVV9FRkxBR1MJCShGUFVfaW5mby0+X19fZWZsYWdzKQorI2RlZmluZSBGUFVfRUlQCQkJKEZQVV9pbmZvLT5fX19laXApCisjZGVmaW5lIEZQVV9PUklHX0VJUAkJKEZQVV9pbmZvLT5fX19vcmlnX2VpcCkKKworI2RlZmluZSBGUFVfbG9va2FoZWFkICAgICAgICAgICAoSTM4Ny5zb2Z0Lmxvb2thaGVhZCkKKworLyogbnogaWYgaXBfb2Zmc2V0IGFuZCBjc19zZWxlY3RvciBhcmUgbm90IHRvIGJlIHNldCBmb3IgdGhlIGN1cnJlbnQKKyAgIGluc3RydWN0aW9uLiAqLworI2RlZmluZSBub19pcF91cGRhdGUJCSgqKHVfY2hhciAqKSYoSTM4Ny5zb2Z0Lm5vX3VwZGF0ZSkpCisjZGVmaW5lIEZQVV9ybQkJCSgqKHVfY2hhciAqKSYoSTM4Ny5zb2Z0LnJtKSkKKworLyogTnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEgd2hpY2ggY2FuIGJlIGxlZ2FsbHkgYWNjZXNzZWQgYnkgdGhlIGN1cnJlbnQKKyAgIGluc3RydWN0aW9uLiBUaGlzIG9ubHkgbmVlZHMgdG8gaG9sZCBhIG51bWJlciA8PSAxMDgsIHNvIGEgYnl0ZSB3aWxsIGRvLiAqLworI2RlZmluZSBhY2Nlc3NfbGltaXQJCSgqKHVfY2hhciAqKSYoSTM4Ny5zb2Z0LmFsaW1pdCkpCisKKyNkZWZpbmUgcGFydGlhbF9zdGF0dXMJCShJMzg3LnNvZnQuc3dkKQorI2RlZmluZSBjb250cm9sX3dvcmQJCShJMzg3LnNvZnQuY3dkKQorI2RlZmluZSBmcHVfdGFnX3dvcmQJCShJMzg3LnNvZnQudHdkKQorI2RlZmluZSByZWdpc3RlcnMJCShJMzg3LnNvZnQuc3Rfc3BhY2UpCisjZGVmaW5lIHRvcAkJCShJMzg3LnNvZnQuZnRvcCkKKworI2RlZmluZSBpbnN0cnVjdGlvbl9hZGRyZXNzCSgqKHN0cnVjdCBhZGRyZXNzICopJkkzODcuc29mdC5maXApCisjZGVmaW5lIG9wZXJhbmRfYWRkcmVzcwkJKCooc3RydWN0IGFkZHJlc3MgKikmSTM4Ny5zb2Z0LmZvbykKKworI2RlZmluZSBGUFVfYWNjZXNzX29rKHgseSx6KQlpZiAoICFhY2Nlc3Nfb2soeCx5LHopICkgXAorCQkJCW1hdGhfYWJvcnQoRlBVX2luZm8sU0lHU0VHVikKKworI3VuZGVmIEZQVV9JR05PUkVfQ09ERV9TRUdWCisjaWZkZWYgRlBVX0lHTk9SRV9DT0RFX1NFR1YKKy8qIGFjY2Vzc19vaygpIGlzIHZlcnkgZXhwZW5zaXZlLCBhbmQgY2F1c2VzIHRoZSBlbXVsYXRvciB0byBydW4KKyAgIGFib3V0IDIwJSBzbG93ZXIgaWYgYXBwbGllZCB0byB0aGUgY29kZS4gQW55d2F5LCBlcnJvcnMgZHVlIHRvIGJhZAorICAgY29kZSBhZGRyZXNzZXMgc2hvdWxkIGJlIG11Y2ggcmFyZXIgdGhhbiBlcnJvcnMgZHVlIHRvIGJhZCBkYXRhCisgICBhZGRyZXNzZXMuICovCisjZGVmaW5lCUZQVV9jb2RlX2FjY2Vzc19vayh6KQorI2Vsc2UKKy8qIEEgc2ltcGxlciB0ZXN0IHRoYW4gYWNjZXNzX29rKCkgY2FuIHByb2JhYmx5IGJlIGRvbmUgZm9yCisgICBGUFVfY29kZV9hY2Nlc3Nfb2soKSBiZWNhdXNlIHRoZSBvbmx5IHBvc3NpYmxlIGVycm9yIGlzIHRvIHN0ZXAKKyAgIHBhc3QgdGhlIHVwcGVyIGJvdW5kYXJ5IG9mIGEgbGVnYWwgY29kZSBhcmVhLiAqLworI2RlZmluZQlGUFVfY29kZV9hY2Nlc3Nfb2soeikgRlBVX2FjY2Vzc19vayhWRVJJRllfUkVBRCwodm9pZCBfX3VzZXIgKilGUFVfRUlQLHopCisjZW5kaWYKKworI2RlZmluZSBGUFVfZ2V0X3VzZXIoeCx5KSAgICAgICBnZXRfdXNlcigoeCksKHkpKQorI2RlZmluZSBGUFVfcHV0X3VzZXIoeCx5KSAgICAgICBwdXRfdXNlcigoeCksKHkpKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYXRoLWVtdS9mcHVfdGFncy5jIGIvYXJjaC9pMzg2L21hdGgtZW11L2ZwdV90YWdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I0MzZmZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9mcHVfdGFncy5jCkBAIC0wLDAgKzEsMTI3IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICBmcHVfdGFncy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgU2V0IEZQVSByZWdpc3RlciB0YWdzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29weXJpZ2h0IChDKSAxOTk3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgQXVzdHJhbGlhIHwKKyB8ICAgICAgICAgICAgICAgICAgRS1tYWlsICAgYmlsbG1AamFjb2JpLm1hdGhzLm1vbmFzaC5lZHUuYXUgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImZwdV9lbXUuaCIKKyNpbmNsdWRlICJmcHVfc3lzdGVtLmgiCisjaW5jbHVkZSAiZXhjZXB0aW9uLmgiCisKKwordm9pZCBGUFVfcG9wKHZvaWQpCit7CisgIGZwdV90YWdfd29yZCB8PSAzIDw8ICgodG9wICYgNykqMik7CisgIHRvcCsrOworfQorCisKK2ludCBGUFVfZ2V0dGFnMCh2b2lkKQoreworICByZXR1cm4gKGZwdV90YWdfd29yZCA+PiAoKHRvcCAmIDcpKjIpKSAmIDM7Cit9CisKKworaW50IEZQVV9nZXR0YWdpKGludCBzdG5yKQoreworICByZXR1cm4gKGZwdV90YWdfd29yZCA+PiAoKCh0b3Arc3RucikgJiA3KSoyKSkgJiAzOworfQorCisKK2ludCBGUFVfZ2V0dGFnKGludCByZWducikKK3sKKyAgcmV0dXJuIChmcHVfdGFnX3dvcmQgPj4gKChyZWduciAmIDcpKjIpKSAmIDM7Cit9CisKKwordm9pZCBGUFVfc2V0dGFnMChpbnQgdGFnKQoreworICBpbnQgcmVnbnIgPSB0b3A7CisgIHJlZ25yICY9IDc7CisgIGZwdV90YWdfd29yZCAmPSB+KDMgPDwgKHJlZ25yKjIpKTsKKyAgZnB1X3RhZ193b3JkIHw9ICh0YWcgJiAzKSA8PCAocmVnbnIqMik7Cit9CisKKwordm9pZCBGUFVfc2V0dGFnaShpbnQgc3RuciwgaW50IHRhZykKK3sKKyAgaW50IHJlZ25yID0gc3Rucit0b3A7CisgIHJlZ25yICY9IDc7CisgIGZwdV90YWdfd29yZCAmPSB+KDMgPDwgKHJlZ25yKjIpKTsKKyAgZnB1X3RhZ193b3JkIHw9ICh0YWcgJiAzKSA8PCAocmVnbnIqMik7Cit9CisKKwordm9pZCBGUFVfc2V0dGFnKGludCByZWduciwgaW50IHRhZykKK3sKKyAgcmVnbnIgJj0gNzsKKyAgZnB1X3RhZ193b3JkICY9IH4oMyA8PCAocmVnbnIqMikpOworICBmcHVfdGFnX3dvcmQgfD0gKHRhZyAmIDMpIDw8IChyZWducioyKTsKK30KKworCitpbnQgRlBVX1NwZWNpYWwoRlBVX1JFRyBjb25zdCAqcHRyKQoreworICBpbnQgZXhwID0gZXhwb25lbnQocHRyKTsKKworICBpZiAoIGV4cCA9PSBFWFBfQklBUytFWFBfVU5ERVIgKQorICAgIHJldHVybiBUV19EZW5vcm1hbDsKKyAgZWxzZSBpZiAoIGV4cCAhPSBFWFBfQklBUytFWFBfT1ZFUiApCisgICAgcmV0dXJuIFRXX05hTjsKKyAgZWxzZSBpZiAoIChwdHItPnNpZ2ggPT0gMHg4MDAwMDAwMCkgJiYgKHB0ci0+c2lnbCA9PSAwKSApCisgICAgcmV0dXJuIFRXX0luZmluaXR5OworICByZXR1cm4gVFdfTmFOOworfQorCisKK2ludCBpc05hTihGUFVfUkVHIGNvbnN0ICpwdHIpCit7CisgIHJldHVybiAoIChleHBvbmVudChwdHIpID09IEVYUF9CSUFTK0VYUF9PVkVSKQorCSAgICYmICEoKHB0ci0+c2lnaCA9PSAweDgwMDAwMDAwKSAmJiAocHRyLT5zaWdsID09IDApKSApOworfQorCisKK2ludCBGUFVfZW1wdHlfaShpbnQgc3RucikKK3sKKyAgaW50IHJlZ25yID0gKHRvcCtzdG5yKSAmIDc7CisKKyAgcmV0dXJuICgoZnB1X3RhZ193b3JkID4+IChyZWducioyKSkgJiAzKSA9PSBUQUdfRW1wdHk7Cit9CisKKworaW50IEZQVV9zdGFja292ZXJmbG93KEZQVV9SRUcgKipzdF9uZXdfcHRyKQoreworICAqc3RfbmV3X3B0ciA9ICZzdCgtMSk7CisKKyAgcmV0dXJuICgoZnB1X3RhZ193b3JkID4+ICgoKHRvcCAtIDEpICYgNykqMikpICYgMykgIT0gVEFHX0VtcHR5OworfQorCisKK3ZvaWQgRlBVX2NvcHlfdG9fcmVnaShGUFVfUkVHIGNvbnN0ICpyLCB1X2NoYXIgdGFnLCBpbnQgc3RucikKK3sKKyAgcmVnX2NvcHkociwgJnN0KHN0bnIpKTsKKyAgRlBVX3NldHRhZ2koc3RuciwgdGFnKTsKK30KKwordm9pZCBGUFVfY29weV90b19yZWcxKEZQVV9SRUcgY29uc3QgKnIsIHVfY2hhciB0YWcpCit7CisgIHJlZ19jb3B5KHIsICZzdCgxKSk7CisgIEZQVV9zZXR0YWdpKDEsIHRhZyk7Cit9CisKK3ZvaWQgRlBVX2NvcHlfdG9fcmVnMChGUFVfUkVHIGNvbnN0ICpyLCB1X2NoYXIgdGFnKQoreworICBpbnQgcmVnbnIgPSB0b3A7CisgIHJlZ25yICY9IDc7CisKKyAgcmVnX2NvcHkociwgJnN0KDApKTsKKworICBmcHVfdGFnX3dvcmQgJj0gfigzIDw8IChyZWducioyKSk7CisgIGZwdV90YWdfd29yZCB8PSAodGFnICYgMykgPDwgKHJlZ25yKjIpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hdGgtZW11L2ZwdV90cmlnLmMgYi9hcmNoL2kzODYvbWF0aC1lbXUvZnB1X3RyaWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDNjYmRlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L2ZwdV90cmlnLmMKQEAgLTAsMCArMSwxODQ1IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICBmcHVfdHJpZy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgRlBVICJ0cmFuc2NlbmRlbnRhbCIgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTMsMTk5NCwxOTk3LDE5OTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgVy4gTWV0emVudGhlbiwgMjIgUGFya2VyIFN0LCBPcm1vbmQsIFZpYyAzMTYzLCAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICBBdXN0cmFsaWEuICBFLW1haWwgICBiaWxsbUBtZWxicGMub3JnLmF1ICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImZwdV9zeXN0ZW0uaCIKKyNpbmNsdWRlICJleGNlcHRpb24uaCIKKyNpbmNsdWRlICJmcHVfZW11LmgiCisjaW5jbHVkZSAic3RhdHVzX3cuaCIKKyNpbmNsdWRlICJjb250cm9sX3cuaCIKKyNpbmNsdWRlICJyZWdfY29uc3RhbnQuaCIJCisKK3N0YXRpYyB2b2lkIHJlbV9rZXJuZWwodW5zaWduZWQgbG9uZyBsb25nIHN0MCwgdW5zaWduZWQgbG9uZyBsb25nICp5LAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHN0MSwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBxLCBpbnQgbik7CisKKyNkZWZpbmUgQkVUVEVSX1RIQU5fNDg2CisKKyNkZWZpbmUgRkNPUyAgNAorCisvKiBVc2VkIG9ubHkgYnkgZnB0YW4sIGZzaW4sIGZjb3MsIGFuZCBmc2luY29zLiAqLworLyogVGhpcyByb3V0aW5lIHByb2R1Y2VzIHZlcnkgYWNjdXJhdGUgcmVzdWx0cywgc2ltaWxhciB0bworICAgdXNpbmcgYSB2YWx1ZSBvZiBwaSB3aXRoIG1vcmUgdGhhbiAxMjggYml0cyBwcmVjaXNpb24uICovCisvKiBMaW1pdGVkIG1lYXN1cmVtZW50cyBzaG93IG5vIHJlc3VsdHMgd29yc2UgdGhhbiA2NCBiaXQgcHJlY2lzaW9uCisgICBleGNlcHQgZm9yIHRoZSByZXN1bHRzIGZvciBhcmd1bWVudHMgY2xvc2UgdG8gMl42Mywgd2hlcmUgdGhlCisgICBwcmVjaXNpb24gb2YgdGhlIHJlc3VsdCBzb21ldGltZXMgZGVncmFkZXMgdG8gYWJvdXQgNjMuOSBiaXRzICovCitzdGF0aWMgaW50IHRyaWdfYXJnKEZQVV9SRUcgKnN0MF9wdHIsIGludCBldmVuKQoreworICBGUFVfUkVHIHRtcDsKKyAgdV9jaGFyIHRtcHRhZzsKKyAgdW5zaWduZWQgbG9uZyBsb25nIHE7CisgIGludCBvbGRfY3cgPSBjb250cm9sX3dvcmQsIHNhdmVkX3N0YXR1cyA9IHBhcnRpYWxfc3RhdHVzOworICBpbnQgdGFnLCBzdDBfdGFnID0gVEFHX1ZhbGlkOworCisgIGlmICggZXhwb25lbnQoc3QwX3B0cikgPj0gNjMgKQorICAgIHsKKyAgICAgIHBhcnRpYWxfc3RhdHVzIHw9IFNXX0MyOyAgICAgLyogUmVkdWN0aW9uIGluY29tcGxldGUuICovCisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGNvbnRyb2xfd29yZCAmPSB+Q1dfUkM7CisgIGNvbnRyb2xfd29yZCB8PSBSQ19DSE9QOworCisgIHNldHBvc2l0aXZlKHN0MF9wdHIpOworICB0YWcgPSBGUFVfdV9kaXYoc3QwX3B0ciwgJkNPTlNUX1BJMiwgJnRtcCwgUFJfNjRfQklUUyB8IFJDX0NIT1AgfCAweDNmLAorCQkgIFNJR05fUE9TKTsKKworICBGUFVfcm91bmRfdG9faW50KCZ0bXAsIHRhZyk7ICAvKiBGb3J0dW5hdGVseSwgdGhpcyBjYW4ndCBvdmVyZmxvdworCQkJCSAgIHRvIDJeNjQgKi8KKyAgcSA9IHNpZ25pZmljYW5kKCZ0bXApOworICBpZiAoIHEgKQorICAgIHsKKyAgICAgIHJlbV9rZXJuZWwoc2lnbmlmaWNhbmQoc3QwX3B0ciksCisJCSAmc2lnbmlmaWNhbmQoJnRtcCksCisJCSBzaWduaWZpY2FuZCgmQ09OU1RfUEkyKSwKKwkJIHEsIGV4cG9uZW50KHN0MF9wdHIpIC0gZXhwb25lbnQoJkNPTlNUX1BJMikpOworICAgICAgc2V0ZXhwb25lbnQxNigmdG1wLCBleHBvbmVudCgmQ09OU1RfUEkyKSk7CisgICAgICBzdDBfdGFnID0gRlBVX25vcm1hbGl6ZSgmdG1wKTsKKyAgICAgIEZQVV9jb3B5X3RvX3JlZzAoJnRtcCwgc3QwX3RhZyk7CisgICAgfQorCisgIGlmICggKGV2ZW4gJiYgIShxICYgMSkpIHx8ICghZXZlbiAmJiAocSAmIDEpKSApCisgICAgeworICAgICAgc3QwX3RhZyA9IEZQVV9zdWIoUkVWfExPQURFRHxUQUdfVmFsaWQsIChpbnQpJkNPTlNUX1BJMiwgRlVMTF9QUkVDSVNJT04pOworCisjaWZkZWYgQkVUVEVSX1RIQU5fNDg2CisgICAgICAvKiBTbyBmYXIsIHRoZSByZXN1bHRzIGFyZSBleGFjdCBidXQgYmFzZWQgdXBvbiBhIDY0IGJpdAorCSBwcmVjaXNpb24gYXBwcm94aW1hdGlvbiB0byBwaS8yLiBUaGUgdGVjaG5pcXVlIHVzZWQKKwkgbm93IGlzIGVxdWl2YWxlbnQgdG8gdXNpbmcgYW4gYXBwcm94aW1hdGlvbiB0byBwaS8yIHdoaWNoCisJIGlzIGFjY3VyYXRlIHRvIGFib3V0IDEyOCBiaXRzLiAqLworICAgICAgaWYgKCAoZXhwb25lbnQoc3QwX3B0cikgPD0gZXhwb25lbnQoJkNPTlNUX1BJMmV4dHJhKSArIDY0KSB8fCAocSA+IDEpICkKKwl7CisJICAvKiBUaGlzIGNvZGUgZ2l2ZXMgdGhlIGVmZmVjdCBvZiBoYXZpbmcgcGkvMiB0byBiZXR0ZXIgdGhhbgorCSAgICAgMTI4IGJpdHMgcHJlY2lzaW9uLiAqLworCisJICBzaWduaWZpY2FuZCgmdG1wKSA9IHEgKyAxOworCSAgc2V0ZXhwb25lbnQxNigmdG1wLCA2Myk7CisJICBGUFVfbm9ybWFsaXplKCZ0bXApOworCSAgdG1wdGFnID0KKwkgICAgRlBVX3VfbXVsKCZDT05TVF9QSTJleHRyYSwgJnRtcCwgJnRtcCwgRlVMTF9QUkVDSVNJT04sIFNJR05fUE9TLAorCQkgICAgICBleHBvbmVudCgmQ09OU1RfUEkyZXh0cmEpICsgZXhwb25lbnQoJnRtcCkpOworCSAgc2V0c2lnbigmdG1wLCBnZXRzaWduKCZDT05TVF9QSTJleHRyYSkpOworCSAgc3QwX3RhZyA9IEZQVV9hZGQoJnRtcCwgdG1wdGFnLCAwLCBGVUxMX1BSRUNJU0lPTik7CisJICBpZiAoIHNpZ25uZWdhdGl2ZShzdDBfcHRyKSApCisJICAgIHsKKwkgICAgICAvKiBDT05TVF9QSTJleHRyYSBpcyBuZWdhdGl2ZSwgc28gdGhlIHJlc3VsdCBvZiB0aGUgYWRkaXRpb24KKwkJIGNhbiBiZSBuZWdhdGl2ZS4gVGhpcyBtZWFucyB0aGF0IHRoZSBhcmd1bWVudCBpcyBhY3R1YWxseQorCQkgaW4gYSBkaWZmZXJlbnQgcXVhZHJhbnQuIFRoZSBjb3JyZWN0aW9uIGlzIGFsd2F5cyA8IHBpLzIsCisJCSBzbyBpdCBjYW4ndCBvdmVyZmxvdyBpbnRvIHlldCBhbm90aGVyIHF1YWRyYW50LiAqLworCSAgICAgIHNldHBvc2l0aXZlKHN0MF9wdHIpOworCSAgICAgIHErKzsKKwkgICAgfQorCX0KKyNlbmRpZiAvKiBCRVRURVJfVEhBTl80ODYgKi8KKyAgICB9CisjaWZkZWYgQkVUVEVSX1RIQU5fNDg2CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBTbyBmYXIsIHRoZSByZXN1bHRzIGFyZSBleGFjdCBidXQgYmFzZWQgdXBvbiBhIDY0IGJpdAorCSBwcmVjaXNpb24gYXBwcm94aW1hdGlvbiB0byBwaS8yLiBUaGUgdGVjaG5pcXVlIHVzZWQKKwkgbm93IGlzIGVxdWl2YWxlbnQgdG8gdXNpbmcgYW4gYXBwcm94aW1hdGlvbiB0byBwaS8yIHdoaWNoCisJIGlzIGFjY3VyYXRlIHRvIGFib3V0IDEyOCBiaXRzLiAqLworICAgICAgaWYgKCAoKHEgPiAwKSAmJiAoZXhwb25lbnQoc3QwX3B0cikgPD0gZXhwb25lbnQoJkNPTlNUX1BJMmV4dHJhKSArIDY0KSkKKwkgICB8fCAocSA+IDEpICkKKwl7CisJICAvKiBUaGlzIGNvZGUgZ2l2ZXMgdGhlIGVmZmVjdCBvZiBoYXZpbmcgcC8yIHRvIGJldHRlciB0aGFuCisJICAgICAxMjggYml0cyBwcmVjaXNpb24uICovCisKKwkgIHNpZ25pZmljYW5kKCZ0bXApID0gcTsKKwkgIHNldGV4cG9uZW50MTYoJnRtcCwgNjMpOworCSAgRlBVX25vcm1hbGl6ZSgmdG1wKTsgICAgICAgICAvKiBUaGlzIG11c3QgcmV0dXJuIFRBR19WYWxpZCAqLworCSAgdG1wdGFnID0gRlBVX3VfbXVsKCZDT05TVF9QSTJleHRyYSwgJnRtcCwgJnRtcCwgRlVMTF9QUkVDSVNJT04sCisJCQkgICAgIFNJR05fUE9TLAorCQkJICAgICBleHBvbmVudCgmQ09OU1RfUEkyZXh0cmEpICsgZXhwb25lbnQoJnRtcCkpOworCSAgc2V0c2lnbigmdG1wLCBnZXRzaWduKCZDT05TVF9QSTJleHRyYSkpOworCSAgc3QwX3RhZyA9IEZQVV9zdWIoTE9BREVEfCh0bXB0YWcgJiAweDBmKSwgKGludCkmdG1wLAorCQkJICAgIEZVTExfUFJFQ0lTSU9OKTsKKwkgIGlmICggKGV4cG9uZW50KHN0MF9wdHIpID09IGV4cG9uZW50KCZDT05TVF9QSTIpKSAmJgorCSAgICAgICgoc3QwX3B0ci0+c2lnaCA+IENPTlNUX1BJMi5zaWdoKQorCSAgICAgICB8fCAoKHN0MF9wdHItPnNpZ2ggPT0gQ09OU1RfUEkyLnNpZ2gpCisJCSAgICYmIChzdDBfcHRyLT5zaWdsID4gQ09OU1RfUEkyLnNpZ2wpKSkgKQorCSAgICB7CisJICAgICAgLyogQ09OU1RfUEkyZXh0cmEgaXMgbmVnYXRpdmUsIHNvIHRoZSByZXN1bHQgb2YgdGhlCisJCSBzdWJ0cmFjdGlvbiBjYW4gYmUgbGFyZ2VyIHRoYW4gcGkvMi4gVGhpcyBtZWFucworCQkgdGhhdCB0aGUgYXJndW1lbnQgaXMgYWN0dWFsbHkgaW4gYSBkaWZmZXJlbnQgcXVhZHJhbnQuCisJCSBUaGUgY29ycmVjdGlvbiBpcyBhbHdheXMgPCBwaS8yLCBzbyBpdCBjYW4ndCBvdmVyZmxvdworCQkgaW50byB5ZXQgYW5vdGhlciBxdWFkcmFudC4gKi8KKwkgICAgICBzdDBfdGFnID0gRlBVX3N1YihSRVZ8TE9BREVEfFRBR19WYWxpZCwgKGludCkmQ09OU1RfUEkyLAorCQkJCUZVTExfUFJFQ0lTSU9OKTsKKwkgICAgICBxKys7CisJICAgIH0KKwl9CisgICAgfQorI2VuZGlmIC8qIEJFVFRFUl9USEFOXzQ4NiAqLworCisgIEZQVV9zZXR0YWcwKHN0MF90YWcpOworICBjb250cm9sX3dvcmQgPSBvbGRfY3c7CisgIHBhcnRpYWxfc3RhdHVzID0gc2F2ZWRfc3RhdHVzICYgflNXX0MyOyAgICAgLyogUmVkdWN0aW9uIGNvbXBsZXRlLiAqLworCisgIHJldHVybiAocSAmIDMpIHwgZXZlbjsKK30KKworCisvKiBDb252ZXJ0IGEgbG9uZyB0byByZWdpc3RlciAqLworc3RhdGljIHZvaWQgY29udmVydF9sMnJlZyhsb25nIGNvbnN0ICphcmcsIGludCBkZXN0c3RucikKK3sKKyAgaW50IHRhZzsKKyAgbG9uZyBudW0gPSAqYXJnOworICB1X2NoYXIgc2lnbjsKKyAgRlBVX1JFRyAqZGVzdCA9ICZzdChkZXN0c3Rucik7CisKKyAgaWYgKG51bSA9PSAwKQorICAgIHsKKyAgICAgIEZQVV9jb3B5X3RvX3JlZ2koJkNPTlNUX1osIFRBR19aZXJvLCBkZXN0c3Rucik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChudW0gPiAwKQorICAgIHsgc2lnbiA9IFNJR05fUE9TOyB9CisgIGVsc2UKKyAgICB7IG51bSA9IC1udW07IHNpZ24gPSBTSUdOX05FRzsgfQorCisgIGRlc3QtPnNpZ2ggPSBudW07CisgIGRlc3QtPnNpZ2wgPSAwOworICBzZXRleHBvbmVudDE2KGRlc3QsIDMxKTsKKyAgdGFnID0gRlBVX25vcm1hbGl6ZShkZXN0KTsKKyAgRlBVX3NldHRhZ2koZGVzdHN0bnIsIHRhZyk7CisgIHNldHNpZ24oZGVzdCwgc2lnbik7CisgIHJldHVybjsKK30KKworCitzdGF0aWMgdm9pZCBzaW5nbGVfYXJnX2Vycm9yKEZQVV9SRUcgKnN0MF9wdHIsIHVfY2hhciBzdDBfdGFnKQoreworICBpZiAoIHN0MF90YWcgPT0gVEFHX0VtcHR5ICkKKyAgICBGUFVfc3RhY2tfdW5kZXJmbG93KCk7ICAvKiBQdXRzIGEgUU5hTiBpbiBzdCgwKSAqLworICBlbHNlIGlmICggc3QwX3RhZyA9PSBUV19OYU4gKQorICAgIHJlYWxfMW9wX05hTihzdDBfcHRyKTsgICAgICAgLyogcmV0dXJuIHdpdGggYSBOYU4gaW4gc3QoMCkgKi8KKyNpZmRlZiBQQVJBTk9JRAorICBlbHNlCisgICAgRVhDRVBUSU9OKEVYX0lOVEVSTkFMfDB4MDExMik7CisjZW5kaWYgLyogUEFSQU5PSUQgKi8KK30KKworCitzdGF0aWMgdm9pZCBzaW5nbGVfYXJnXzJfZXJyb3IoRlBVX1JFRyAqc3QwX3B0ciwgdV9jaGFyIHN0MF90YWcpCit7CisgIGludCBpc05hTjsKKworICBzd2l0Y2ggKCBzdDBfdGFnICkKKyAgICB7CisgICAgY2FzZSBUV19OYU46CisgICAgICBpc05hTiA9IChleHBvbmVudChzdDBfcHRyKSA9PSBFWFBfT1ZFUikgJiYgKHN0MF9wdHItPnNpZ2ggJiAweDgwMDAwMDAwKTsKKyAgICAgIGlmICggaXNOYU4gJiYgIShzdDBfcHRyLT5zaWdoICYgMHg0MDAwMDAwMCkgKSAgIC8qIFNpZ25hbGluZyA/ICovCisJeworCSAgRVhDRVBUSU9OKEVYX0ludmFsaWQpOworCSAgaWYgKCBjb250cm9sX3dvcmQgJiBDV19JbnZhbGlkICkKKwkgICAgeworCSAgICAgIC8qIFRoZSBtYXNrZWQgcmVzcG9uc2UgKi8KKwkgICAgICAvKiBDb252ZXJ0IHRvIGEgUU5hTiAqLworCSAgICAgIHN0MF9wdHItPnNpZ2ggfD0gMHg0MDAwMDAwMDsKKwkgICAgICBwdXNoKCk7CisJICAgICAgRlBVX2NvcHlfdG9fcmVnMChzdDBfcHRyLCBUQUdfU3BlY2lhbCk7CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmICggaXNOYU4gKQorCXsKKwkgIC8qIEEgUU5hTiAqLworCSAgcHVzaCgpOworCSAgRlBVX2NvcHlfdG9fcmVnMChzdDBfcHRyLCBUQUdfU3BlY2lhbCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIHBzZXVkb05hTiBvciBvdGhlciB1bnN1cHBvcnRlZCAqLworCSAgRVhDRVBUSU9OKEVYX0ludmFsaWQpOworCSAgaWYgKCBjb250cm9sX3dvcmQgJiBDV19JbnZhbGlkICkKKwkgICAgeworCSAgICAgIC8qIFRoZSBtYXNrZWQgcmVzcG9uc2UgKi8KKwkgICAgICBGUFVfY29weV90b19yZWcwKCZDT05TVF9RTmFOLCBUQUdfU3BlY2lhbCk7CisJICAgICAgcHVzaCgpOworCSAgICAgIEZQVV9jb3B5X3RvX3JlZzAoJkNPTlNUX1FOYU4sIFRBR19TcGVjaWFsKTsKKwkgICAgfQorCX0KKyAgICAgIGJyZWFrOyAgICAgICAgICAgICAgLyogcmV0dXJuIHdpdGggYSBOYU4gaW4gc3QoMCkgKi8KKyNpZmRlZiBQQVJBTk9JRAorICAgIGRlZmF1bHQ6CisgICAgICBFWENFUFRJT04oRVhfSU5URVJOQUx8MHgwMTEyKTsKKyNlbmRpZiAvKiBQQVJBTk9JRCAqLworICAgIH0KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIGYyeG0xKEZQVV9SRUcgKnN0MF9wdHIsIHVfY2hhciB0YWcpCit7CisgIEZQVV9SRUcgYTsKKworICBjbGVhcl9DMSgpOworCisgIGlmICggdGFnID09IFRBR19WYWxpZCApCisgICAgeworICAgICAgLyogRm9yIGFuIDgwNDg2IEZQVSwgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQgaWYgdGhlIGFyZyBpcyA+PSAxLjAgKi8KKyAgICAgIGlmICggZXhwb25lbnQoc3QwX3B0cikgPCAwICkKKwl7CisJZGVub3JtYWxfYXJnOgorCisJICBGUFVfdG9fZXhwMTYoc3QwX3B0ciwgJmEpOworCisJICAvKiBwb2x5XzJ4bTEoeCkgcmVxdWlyZXMgMCA8IHN0KDApIDwgMS4gKi8KKwkgIHBvbHlfMnhtMShnZXRzaWduKHN0MF9wdHIpLCAmYSwgc3QwX3B0cik7CisJfQorICAgICAgc2V0X3ByZWNpc2lvbl9mbGFnX3VwKCk7ICAgLyogODA0ODYgYXBwZWFycyB0byBhbHdheXMgZG8gdGhpcyAqLworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoIHRhZyA9PSBUQUdfWmVybyApCisgICAgcmV0dXJuOworCisgIGlmICggdGFnID09IFRBR19TcGVjaWFsICkKKyAgICB0YWcgPSBGUFVfU3BlY2lhbChzdDBfcHRyKTsKKworICBzd2l0Y2ggKCB0YWcgKQorICAgIHsKKyAgICBjYXNlIFRXX0Rlbm9ybWFsOgorICAgICAgaWYgKCBkZW5vcm1hbF9vcGVyYW5kKCkgPCAwICkKKwlyZXR1cm47CisgICAgICBnb3RvIGRlbm9ybWFsX2FyZzsKKyAgICBjYXNlIFRXX0luZmluaXR5OgorICAgICAgaWYgKCBzaWdubmVnYXRpdmUoc3QwX3B0cikgKQorCXsKKwkgIC8qIC1pbmZpbml0eSBnaXZlcyAtMSAocDE2LTEwKSAqLworCSAgRlBVX2NvcHlfdG9fcmVnMCgmQ09OU1RfMSwgVEFHX1ZhbGlkKTsKKwkgIHNldG5lZ2F0aXZlKHN0MF9wdHIpOworCX0KKyAgICAgIHJldHVybjsKKyAgICBkZWZhdWx0OgorICAgICAgc2luZ2xlX2FyZ19lcnJvcihzdDBfcHRyLCB0YWcpOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZCBmcHRhbihGUFVfUkVHICpzdDBfcHRyLCB1X2NoYXIgc3QwX3RhZykKK3sKKyAgRlBVX1JFRyAqc3RfbmV3X3B0cjsKKyAgaW50IHE7CisgIHVfY2hhciBhcmdfc2lnbiA9IGdldHNpZ24oc3QwX3B0cik7CisKKyAgLyogU3RhY2sgdW5kZXJmbG93IGhhcyBoaWdoZXIgcHJpb3JpdHkgKi8KKyAgaWYgKCBzdDBfdGFnID09IFRBR19FbXB0eSApCisgICAgeworICAgICAgRlBVX3N0YWNrX3VuZGVyZmxvdygpOyAgLyogUHV0cyBhIFFOYU4gaW4gc3QoMCkgKi8KKyAgICAgIGlmICggY29udHJvbF93b3JkICYgQ1dfSW52YWxpZCApCisJeworCSAgc3RfbmV3X3B0ciA9ICZzdCgtMSk7CisJICBwdXNoKCk7CisJICBGUFVfc3RhY2tfdW5kZXJmbG93KCk7ICAvKiBQdXRzIGEgUU5hTiBpbiB0aGUgbmV3IHN0KDApICovCisJfQorICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoIFNUQUNLX09WRVJGTE9XICkKKyAgICB7IEZQVV9zdGFja19vdmVyZmxvdygpOyByZXR1cm47IH0KKworICBpZiAoIHN0MF90YWcgPT0gVEFHX1ZhbGlkICkKKyAgICB7CisgICAgICBpZiAoIGV4cG9uZW50KHN0MF9wdHIpID4gLTQwICkKKwl7CisJICBpZiAoIChxID0gdHJpZ19hcmcoc3QwX3B0ciwgMCkpID09IC0xICkKKwkgICAgeworCSAgICAgIC8qIE9wZXJhbmQgaXMgb3V0IG9mIHJhbmdlICovCisJICAgICAgcmV0dXJuOworCSAgICB9CisKKwkgIHBvbHlfdGFuKHN0MF9wdHIpOworCSAgc2V0c2lnbihzdDBfcHRyLCAocSAmIDEpIF4gKGFyZ19zaWduICE9IDApKTsKKwkgIHNldF9wcmVjaXNpb25fZmxhZ191cCgpOyAgLyogV2UgZG8gbm90IHJlYWxseSBrbm93IGlmIHVwIG9yIGRvd24gKi8KKwl9CisgICAgICBlbHNlCisJeworCSAgLyogRm9yIGEgc21hbGwgYXJnLCB0aGUgcmVzdWx0ID09IHRoZSBhcmd1bWVudCAqLworCSAgLyogVW5kZXJmbG93IG1heSBoYXBwZW4gKi8KKworCWRlbm9ybWFsX2FyZzoKKworCSAgRlBVX3RvX2V4cDE2KHN0MF9wdHIsIHN0MF9wdHIpOworICAgICAgCisJICBzdDBfdGFnID0gRlBVX3JvdW5kKHN0MF9wdHIsIDEsIDAsIEZVTExfUFJFQ0lTSU9OLCBhcmdfc2lnbik7CisJICBGUFVfc2V0dGFnMChzdDBfdGFnKTsKKwl9CisgICAgICBwdXNoKCk7CisgICAgICBGUFVfY29weV90b19yZWcwKCZDT05TVF8xLCBUQUdfVmFsaWQpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoIHN0MF90YWcgPT0gVEFHX1plcm8gKQorICAgIHsKKyAgICAgIHB1c2goKTsKKyAgICAgIEZQVV9jb3B5X3RvX3JlZzAoJkNPTlNUXzEsIFRBR19WYWxpZCk7CisgICAgICBzZXRjYygwKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKCBzdDBfdGFnID09IFRBR19TcGVjaWFsICkKKyAgICBzdDBfdGFnID0gRlBVX1NwZWNpYWwoc3QwX3B0cik7CisKKyAgaWYgKCBzdDBfdGFnID09IFRXX0Rlbm9ybWFsICkKKyAgICB7CisgICAgICBpZiAoIGRlbm9ybWFsX29wZXJhbmQoKSA8IDAgKQorCXJldHVybjsKKworICAgICAgZ290byBkZW5vcm1hbF9hcmc7CisgICAgfQorCisgIGlmICggc3QwX3RhZyA9PSBUV19JbmZpbml0eSApCisgICAgeworICAgICAgLyogVGhlIDgwNDg2IHRyZWF0cyBpbmZpbml0eSBhcyBhbiBpbnZhbGlkIG9wZXJhbmQgKi8KKyAgICAgIGlmICggYXJpdGhfaW52YWxpZCgwKSA+PSAwICkKKwl7CisJICBzdF9uZXdfcHRyID0gJnN0KC0xKTsKKwkgIHB1c2goKTsKKwkgIGFyaXRoX2ludmFsaWQoMCk7CisJfQorICAgICAgcmV0dXJuOworICAgIH0KKworICBzaW5nbGVfYXJnXzJfZXJyb3Ioc3QwX3B0ciwgc3QwX3RhZyk7Cit9CisKKworc3RhdGljIHZvaWQgZnh0cmFjdChGUFVfUkVHICpzdDBfcHRyLCB1X2NoYXIgc3QwX3RhZykKK3sKKyAgRlBVX1JFRyAqc3RfbmV3X3B0cjsKKyAgdV9jaGFyIHNpZ247CisgIHJlZ2lzdGVyIEZQVV9SRUcgKnN0MV9wdHIgPSBzdDBfcHRyOyAgLyogYW50aWNpcGF0ZSAqLworCisgIGlmICggU1RBQ0tfT1ZFUkZMT1cgKQorICAgIHsgIEZQVV9zdGFja19vdmVyZmxvdygpOyByZXR1cm47IH0KKworICBjbGVhcl9DMSgpOworCisgIGlmICggc3QwX3RhZyA9PSBUQUdfVmFsaWQgKQorICAgIHsKKyAgICAgIGxvbmcgZTsKKworICAgICAgcHVzaCgpOworICAgICAgc2lnbiA9IGdldHNpZ24oc3QxX3B0cik7CisgICAgICByZWdfY29weShzdDFfcHRyLCBzdF9uZXdfcHRyKTsKKyAgICAgIHNldGV4cG9uZW50MTYoc3RfbmV3X3B0ciwgZXhwb25lbnQoc3RfbmV3X3B0cikpOworCisgICAgZGVub3JtYWxfYXJnOgorCisgICAgICBlID0gZXhwb25lbnQxNihzdF9uZXdfcHRyKTsKKyAgICAgIGNvbnZlcnRfbDJyZWcoJmUsIDEpOworICAgICAgc2V0ZXhwb25lbnRwb3Moc3RfbmV3X3B0ciwgMCk7CisgICAgICBzZXRzaWduKHN0X25ld19wdHIsIHNpZ24pOworICAgICAgRlBVX3NldHRhZzAoVEFHX1ZhbGlkKTsgICAgICAgLyogTmVlZGVkIGlmIGFyZyB3YXMgYSBkZW5vcm1hbCAqLworICAgICAgcmV0dXJuOworICAgIH0KKyAgZWxzZSBpZiAoIHN0MF90YWcgPT0gVEFHX1plcm8gKQorICAgIHsKKyAgICAgIHNpZ24gPSBnZXRzaWduKHN0MF9wdHIpOworCisgICAgICBpZiAoIEZQVV9kaXZpZGVfYnlfemVybygwLCBTSUdOX05FRykgPCAwICkKKwlyZXR1cm47CisKKyAgICAgIHB1c2goKTsKKyAgICAgIEZQVV9jb3B5X3RvX3JlZzAoJkNPTlNUX1osIFRBR19aZXJvKTsKKyAgICAgIHNldHNpZ24oc3RfbmV3X3B0ciwgc2lnbik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmICggc3QwX3RhZyA9PSBUQUdfU3BlY2lhbCApCisgICAgc3QwX3RhZyA9IEZQVV9TcGVjaWFsKHN0MF9wdHIpOworCisgIGlmICggc3QwX3RhZyA9PSBUV19EZW5vcm1hbCApCisgICAgeworICAgICAgaWYgKGRlbm9ybWFsX29wZXJhbmQoKSA8IDAgKQorCXJldHVybjsKKworICAgICAgcHVzaCgpOworICAgICAgc2lnbiA9IGdldHNpZ24oc3QxX3B0cik7CisgICAgICBGUFVfdG9fZXhwMTYoc3QxX3B0ciwgc3RfbmV3X3B0cik7CisgICAgICBnb3RvIGRlbm9ybWFsX2FyZzsKKyAgICB9CisgIGVsc2UgaWYgKCBzdDBfdGFnID09IFRXX0luZmluaXR5ICkKKyAgICB7CisgICAgICBzaWduID0gZ2V0c2lnbihzdDBfcHRyKTsKKyAgICAgIHNldHBvc2l0aXZlKHN0MF9wdHIpOworICAgICAgcHVzaCgpOworICAgICAgRlBVX2NvcHlfdG9fcmVnMCgmQ09OU1RfSU5GLCBUQUdfU3BlY2lhbCk7CisgICAgICBzZXRzaWduKHN0X25ld19wdHIsIHNpZ24pOworICAgICAgcmV0dXJuOworICAgIH0KKyAgZWxzZSBpZiAoIHN0MF90YWcgPT0gVFdfTmFOICkKKyAgICB7CisgICAgICBpZiAoIHJlYWxfMW9wX05hTihzdDBfcHRyKSA8IDAgKQorCXJldHVybjsKKworICAgICAgcHVzaCgpOworICAgICAgRlBVX2NvcHlfdG9fcmVnMChzdDBfcHRyLCBUQUdfU3BlY2lhbCk7CisgICAgICByZXR1cm47CisgICAgfQorICBlbHNlIGlmICggc3QwX3RhZyA9PSBUQUdfRW1wdHkgKQorICAgIHsKKyAgICAgIC8qIElzIHRoaXMgdGhlIGNvcnJlY3QgYmVoYXZpb3VyPyAqLworICAgICAgaWYgKCBjb250cm9sX3dvcmQgJiBFWF9JbnZhbGlkICkKKwl7CisJICBGUFVfc3RhY2tfdW5kZXJmbG93KCk7CisJICBwdXNoKCk7CisJICBGUFVfc3RhY2tfdW5kZXJmbG93KCk7CisJfQorICAgICAgZWxzZQorCUVYQ0VQVElPTihFWF9TdGFja1VuZGVyKTsKKyAgICB9CisjaWZkZWYgUEFSQU5PSUQKKyAgZWxzZQorICAgIEVYQ0VQVElPTihFWF9JTlRFUk5BTCB8IDB4MTE5KTsKKyNlbmRpZiAvKiBQQVJBTk9JRCAqLworfQorCisKK3N0YXRpYyB2b2lkIGZkZWNzdHAodm9pZCkKK3sKKyAgY2xlYXJfQzEoKTsKKyAgdG9wLS07Cit9CisKK3N0YXRpYyB2b2lkIGZpbmNzdHAodm9pZCkKK3sKKyAgY2xlYXJfQzEoKTsKKyAgdG9wKys7Cit9CisKKworc3RhdGljIHZvaWQgZnNxcnRfKEZQVV9SRUcgKnN0MF9wdHIsIHVfY2hhciBzdDBfdGFnKQoreworICBpbnQgZXhwb247CisKKyAgY2xlYXJfQzEoKTsKKworICBpZiAoIHN0MF90YWcgPT0gVEFHX1ZhbGlkICkKKyAgICB7CisgICAgICB1X2NoYXIgdGFnOworICAgICAgCisgICAgICBpZiAoc2lnbm5lZ2F0aXZlKHN0MF9wdHIpKQorCXsKKwkgIGFyaXRoX2ludmFsaWQoMCk7ICAvKiBzcXJ0KG5lZ2F0aXZlKSBpcyBpbnZhbGlkICovCisJICByZXR1cm47CisJfQorCisgICAgICAvKiBtYWtlIHN0KDApIGluICBbMS4wIC4uIDQuMCkgKi8KKyAgICAgIGV4cG9uID0gZXhwb25lbnQoc3QwX3B0cik7CisKKyAgICBkZW5vcm1hbF9hcmc6CisKKyAgICAgIHNldGV4cG9uZW50MTYoc3QwX3B0ciwgKGV4cG9uICYgMSkpOworCisgICAgICAvKiBEbyB0aGUgY29tcHV0YXRpb24sIHRoZSBzaWduIG9mIHRoZSByZXN1bHQgd2lsbCBiZSBwb3NpdGl2ZS4gKi8KKyAgICAgIHRhZyA9IHdtX3NxcnQoc3QwX3B0ciwgMCwgMCwgY29udHJvbF93b3JkLCBTSUdOX1BPUyk7CisgICAgICBhZGRleHBvbmVudChzdDBfcHRyLCBleHBvbiA+PiAxKTsKKyAgICAgIEZQVV9zZXR0YWcwKHRhZyk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmICggc3QwX3RhZyA9PSBUQUdfWmVybyApCisgICAgcmV0dXJuOworCisgIGlmICggc3QwX3RhZyA9PSBUQUdfU3BlY2lhbCApCisgICAgc3QwX3RhZyA9IEZQVV9TcGVjaWFsKHN0MF9wdHIpOworCisgIGlmICggc3QwX3RhZyA9PSBUV19JbmZpbml0eSApCisgICAgeworICAgICAgaWYgKCBzaWdubmVnYXRpdmUoc3QwX3B0cikgKQorCWFyaXRoX2ludmFsaWQoMCk7ICAvKiBzcXJ0KC1JbmZpbml0eSkgaXMgaW52YWxpZCAqLworICAgICAgcmV0dXJuOworICAgIH0KKyAgZWxzZSBpZiAoIHN0MF90YWcgPT0gVFdfRGVub3JtYWwgKQorICAgIHsKKyAgICAgIGlmIChzaWdubmVnYXRpdmUoc3QwX3B0cikpCisJeworCSAgYXJpdGhfaW52YWxpZCgwKTsgIC8qIHNxcnQobmVnYXRpdmUpIGlzIGludmFsaWQgKi8KKwkgIHJldHVybjsKKwl9CisKKyAgICAgIGlmICggZGVub3JtYWxfb3BlcmFuZCgpIDwgMCApCisJcmV0dXJuOworCisgICAgICBGUFVfdG9fZXhwMTYoc3QwX3B0ciwgc3QwX3B0cik7CisKKyAgICAgIGV4cG9uID0gZXhwb25lbnQxNihzdDBfcHRyKTsKKworICAgICAgZ290byBkZW5vcm1hbF9hcmc7CisgICAgfQorCisgIHNpbmdsZV9hcmdfZXJyb3Ioc3QwX3B0ciwgc3QwX3RhZyk7CisKK30KKworCitzdGF0aWMgdm9pZCBmcm5kaW50XyhGUFVfUkVHICpzdDBfcHRyLCB1X2NoYXIgc3QwX3RhZykKK3sKKyAgaW50IGZsYWdzLCB0YWc7CisKKyAgaWYgKCBzdDBfdGFnID09IFRBR19WYWxpZCApCisgICAgeworICAgICAgdV9jaGFyIHNpZ247CisKKyAgICBkZW5vcm1hbF9hcmc6CisKKyAgICAgIHNpZ24gPSBnZXRzaWduKHN0MF9wdHIpOworCisgICAgICBpZiAoZXhwb25lbnQoc3QwX3B0cikgPiA2MykKKwlyZXR1cm47CisKKyAgICAgIGlmICggc3QwX3RhZyA9PSBUV19EZW5vcm1hbCApCisJeworCSAgaWYgKGRlbm9ybWFsX29wZXJhbmQoKSA8IDAgKQorCSAgICByZXR1cm47CisJfQorCisgICAgICAvKiBGb3J0dW5hdGVseSwgdGhpcyBjYW4ndCBvdmVyZmxvdyB0byAyXjY0ICovCisgICAgICBpZiAoIChmbGFncyA9IEZQVV9yb3VuZF90b19pbnQoc3QwX3B0ciwgc3QwX3RhZykpICkKKwlzZXRfcHJlY2lzaW9uX2ZsYWcoZmxhZ3MpOworCisgICAgICBzZXRleHBvbmVudDE2KHN0MF9wdHIsIDYzKTsKKyAgICAgIHRhZyA9IEZQVV9ub3JtYWxpemUoc3QwX3B0cik7CisgICAgICBzZXRzaWduKHN0MF9wdHIsIHNpZ24pOworICAgICAgRlBVX3NldHRhZzAodGFnKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKCBzdDBfdGFnID09IFRBR19aZXJvICkKKyAgICByZXR1cm47CisKKyAgaWYgKCBzdDBfdGFnID09IFRBR19TcGVjaWFsICkKKyAgICBzdDBfdGFnID0gRlBVX1NwZWNpYWwoc3QwX3B0cik7CisKKyAgaWYgKCBzdDBfdGFnID09IFRXX0Rlbm9ybWFsICkKKyAgICBnb3RvIGRlbm9ybWFsX2FyZzsKKyAgZWxzZSBpZiAoIHN0MF90YWcgPT0gVFdfSW5maW5pdHkgKQorICAgIHJldHVybjsKKyAgZWxzZQorICAgIHNpbmdsZV9hcmdfZXJyb3Ioc3QwX3B0ciwgc3QwX3RhZyk7Cit9CisKKworc3RhdGljIGludCBmc2luKEZQVV9SRUcgKnN0MF9wdHIsIHVfY2hhciB0YWcpCit7CisgIHVfY2hhciBhcmdfc2lnbiA9IGdldHNpZ24oc3QwX3B0cik7CisKKyAgaWYgKCB0YWcgPT0gVEFHX1ZhbGlkICkKKyAgICB7CisgICAgICBpbnQgcTsKKworICAgICAgaWYgKCBleHBvbmVudChzdDBfcHRyKSA+IC00MCApCisJeworCSAgaWYgKCAocSA9IHRyaWdfYXJnKHN0MF9wdHIsIDApKSA9PSAtMSApCisJICAgIHsKKwkgICAgICAvKiBPcGVyYW5kIGlzIG91dCBvZiByYW5nZSAqLworCSAgICAgIHJldHVybiAxOworCSAgICB9CisKKwkgIHBvbHlfc2luZShzdDBfcHRyKTsKKwkgIAorCSAgaWYgKHEgJiAyKQorCSAgICBjaGFuZ2VzaWduKHN0MF9wdHIpOworCisJICBzZXRzaWduKHN0MF9wdHIsIGdldHNpZ24oc3QwX3B0cikgXiBhcmdfc2lnbik7CisKKwkgIC8qIFdlIGRvIG5vdCByZWFsbHkga25vdyBpZiB1cCBvciBkb3duICovCisJICBzZXRfcHJlY2lzaW9uX2ZsYWdfdXAoKTsKKwkgIHJldHVybiAwOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBGb3IgYSBzbWFsbCBhcmcsIHRoZSByZXN1bHQgPT0gdGhlIGFyZ3VtZW50ICovCisJICBzZXRfcHJlY2lzaW9uX2ZsYWdfdXAoKTsgIC8qIE11c3QgYmUgdXAuICovCisJICByZXR1cm4gMDsKKwl9CisgICAgfQorCisgIGlmICggdGFnID09IFRBR19aZXJvICkKKyAgICB7CisgICAgICBzZXRjYygwKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBpZiAoIHRhZyA9PSBUQUdfU3BlY2lhbCApCisgICAgdGFnID0gRlBVX1NwZWNpYWwoc3QwX3B0cik7CisKKyAgaWYgKCB0YWcgPT0gVFdfRGVub3JtYWwgKQorICAgIHsKKyAgICAgIGlmICggZGVub3JtYWxfb3BlcmFuZCgpIDwgMCApCisJcmV0dXJuIDE7CisKKyAgICAgIC8qIEZvciBhIHNtYWxsIGFyZywgdGhlIHJlc3VsdCA9PSB0aGUgYXJndW1lbnQgKi8KKyAgICAgIC8qIFVuZGVyZmxvdyBtYXkgaGFwcGVuICovCisgICAgICBGUFVfdG9fZXhwMTYoc3QwX3B0ciwgc3QwX3B0cik7CisgICAgICAKKyAgICAgIHRhZyA9IEZQVV9yb3VuZChzdDBfcHRyLCAxLCAwLCBGVUxMX1BSRUNJU0lPTiwgYXJnX3NpZ24pOworCisgICAgICBGUFVfc2V0dGFnMCh0YWcpOworCisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGVsc2UgaWYgKCB0YWcgPT0gVFdfSW5maW5pdHkgKQorICAgIHsKKyAgICAgIC8qIFRoZSA4MDQ4NiB0cmVhdHMgaW5maW5pdHkgYXMgYW4gaW52YWxpZCBvcGVyYW5kICovCisgICAgICBhcml0aF9pbnZhbGlkKDApOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc2luZ2xlX2FyZ19lcnJvcihzdDBfcHRyLCB0YWcpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorCisKK3N0YXRpYyBpbnQgZl9jb3MoRlBVX1JFRyAqc3QwX3B0ciwgdV9jaGFyIHRhZykKK3sKKyAgdV9jaGFyIHN0MF9zaWduOworCisgIHN0MF9zaWduID0gZ2V0c2lnbihzdDBfcHRyKTsKKworICBpZiAoIHRhZyA9PSBUQUdfVmFsaWQgKQorICAgIHsKKyAgICAgIGludCBxOworCisgICAgICBpZiAoIGV4cG9uZW50KHN0MF9wdHIpID4gLTQwICkKKwl7CisJICBpZiAoIChleHBvbmVudChzdDBfcHRyKSA8IDApCisJICAgICAgfHwgKChleHBvbmVudChzdDBfcHRyKSA9PSAwKQorCQkgICYmIChzaWduaWZpY2FuZChzdDBfcHRyKSA8PSAweGM5MGZkYWEyMjE2OGMyMzRMTCkpICkKKwkgICAgeworCSAgICAgIHBvbHlfY29zKHN0MF9wdHIpOworCisJICAgICAgLyogV2UgZG8gbm90IHJlYWxseSBrbm93IGlmIHVwIG9yIGRvd24gKi8KKwkgICAgICBzZXRfcHJlY2lzaW9uX2ZsYWdfZG93bigpOworCSAgCisJICAgICAgcmV0dXJuIDA7CisJICAgIH0KKwkgIGVsc2UgaWYgKCAocSA9IHRyaWdfYXJnKHN0MF9wdHIsIEZDT1MpKSAhPSAtMSApCisJICAgIHsKKwkgICAgICBwb2x5X3NpbmUoc3QwX3B0cik7CisKKwkgICAgICBpZiAoKHErMSkgJiAyKQorCQljaGFuZ2VzaWduKHN0MF9wdHIpOworCisJICAgICAgLyogV2UgZG8gbm90IHJlYWxseSBrbm93IGlmIHVwIG9yIGRvd24gKi8KKwkgICAgICBzZXRfcHJlY2lzaW9uX2ZsYWdfZG93bigpOworCSAgCisJICAgICAgcmV0dXJuIDA7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIE9wZXJhbmQgaXMgb3V0IG9mIHJhbmdlICovCisJICAgICAgcmV0dXJuIDE7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCWRlbm9ybWFsX2FyZzoKKworCSAgc2V0Y2MoMCk7CisJICBGUFVfY29weV90b19yZWcwKCZDT05TVF8xLCBUQUdfVmFsaWQpOworI2lmZGVmIFBFQ1VMSUFSXzQ4NgorCSAgc2V0X3ByZWNpc2lvbl9mbGFnX2Rvd24oKTsgIC8qIDgwNDg2IGFwcGVhcnMgdG8gZG8gdGhpcy4gKi8KKyNlbHNlCisJICBzZXRfcHJlY2lzaW9uX2ZsYWdfdXAoKTsgIC8qIE11c3QgYmUgdXAuICovCisjZW5kaWYgLyogUEVDVUxJQVJfNDg2ICovCisJICByZXR1cm4gMDsKKwl9CisgICAgfQorICBlbHNlIGlmICggdGFnID09IFRBR19aZXJvICkKKyAgICB7CisgICAgICBGUFVfY29weV90b19yZWcwKCZDT05TVF8xLCBUQUdfVmFsaWQpOworICAgICAgc2V0Y2MoMCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgaWYgKCB0YWcgPT0gVEFHX1NwZWNpYWwgKQorICAgIHRhZyA9IEZQVV9TcGVjaWFsKHN0MF9wdHIpOworCisgIGlmICggdGFnID09IFRXX0Rlbm9ybWFsICkKKyAgICB7CisgICAgICBpZiAoIGRlbm9ybWFsX29wZXJhbmQoKSA8IDAgKQorCXJldHVybiAxOworCisgICAgICBnb3RvIGRlbm9ybWFsX2FyZzsKKyAgICB9CisgIGVsc2UgaWYgKCB0YWcgPT0gVFdfSW5maW5pdHkgKQorICAgIHsKKyAgICAgIC8qIFRoZSA4MDQ4NiB0cmVhdHMgaW5maW5pdHkgYXMgYW4gaW52YWxpZCBvcGVyYW5kICovCisgICAgICBhcml0aF9pbnZhbGlkKDApOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc2luZ2xlX2FyZ19lcnJvcihzdDBfcHRyLCB0YWcpOyAgLyogcmVxdWlyZXMgc3QwX3B0ciA9PSAmc3QoMCkgKi8KKyAgICAgIHJldHVybiAxOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZCBmY29zKEZQVV9SRUcgKnN0MF9wdHIsIHVfY2hhciBzdDBfdGFnKQoreworICBmX2NvcyhzdDBfcHRyLCBzdDBfdGFnKTsKK30KKworCitzdGF0aWMgdm9pZCBmc2luY29zKEZQVV9SRUcgKnN0MF9wdHIsIHVfY2hhciBzdDBfdGFnKQoreworICBGUFVfUkVHICpzdF9uZXdfcHRyOworICBGUFVfUkVHIGFyZzsKKyAgdV9jaGFyIHRhZzsKKworICAvKiBTdGFjayB1bmRlcmZsb3cgaGFzIGhpZ2hlciBwcmlvcml0eSAqLworICBpZiAoIHN0MF90YWcgPT0gVEFHX0VtcHR5ICkKKyAgICB7CisgICAgICBGUFVfc3RhY2tfdW5kZXJmbG93KCk7ICAvKiBQdXRzIGEgUU5hTiBpbiBzdCgwKSAqLworICAgICAgaWYgKCBjb250cm9sX3dvcmQgJiBDV19JbnZhbGlkICkKKwl7CisJICBzdF9uZXdfcHRyID0gJnN0KC0xKTsKKwkgIHB1c2goKTsKKwkgIEZQVV9zdGFja191bmRlcmZsb3coKTsgIC8qIFB1dHMgYSBRTmFOIGluIHRoZSBuZXcgc3QoMCkgKi8KKwl9CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmICggU1RBQ0tfT1ZFUkZMT1cgKQorICAgIHsgRlBVX3N0YWNrX292ZXJmbG93KCk7IHJldHVybjsgfQorCisgIGlmICggc3QwX3RhZyA9PSBUQUdfU3BlY2lhbCApCisgICAgdGFnID0gRlBVX1NwZWNpYWwoc3QwX3B0cik7CisgIGVsc2UKKyAgICB0YWcgPSBzdDBfdGFnOworCisgIGlmICggdGFnID09IFRXX05hTiApCisgICAgeworICAgICAgc2luZ2xlX2FyZ18yX2Vycm9yKHN0MF9wdHIsIFRXX05hTik7CisgICAgICByZXR1cm47CisgICAgfQorICBlbHNlIGlmICggdGFnID09IFRXX0luZmluaXR5ICkKKyAgICB7CisgICAgICAvKiBUaGUgODA0ODYgdHJlYXRzIGluZmluaXR5IGFzIGFuIGludmFsaWQgb3BlcmFuZCAqLworICAgICAgaWYgKCBhcml0aF9pbnZhbGlkKDApID49IDAgKQorCXsKKwkgIC8qIE1hc2tlZCByZXNwb25zZSAqLworCSAgcHVzaCgpOworCSAgYXJpdGhfaW52YWxpZCgwKTsKKwl9CisgICAgICByZXR1cm47CisgICAgfQorCisgIHJlZ19jb3B5KHN0MF9wdHIsICZhcmcpOworICBpZiAoICFmc2luKHN0MF9wdHIsIHN0MF90YWcpICkKKyAgICB7CisgICAgICBwdXNoKCk7CisgICAgICBGUFVfY29weV90b19yZWcwKCZhcmcsIHN0MF90YWcpOworICAgICAgZl9jb3MoJnN0KDApLCBzdDBfdGFnKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBBbiBlcnJvciwgc28gcmVzdG9yZSBzdCgwKSAqLworICAgICAgRlBVX2NvcHlfdG9fcmVnMCgmYXJnLCBzdDBfdGFnKTsKKyAgICB9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogVGhlIGZvbGxvd2luZyBhbGwgcmVxdWlyZSB0d28gYXJndW1lbnRzOiBzdCgwKSBhbmQgc3QoMSkgKi8KKworLyogQSBsZWFuLCBtZWFuIGtlcm5lbCBmb3IgdGhlIGZwcmVtIGluc3RydWN0aW9ucy4gVGhpcyByZWxpZXMgdXBvbgorICAgdGhlIGRpdmlzaW9uIGFuZCByb3VuZGluZyB0byBhbiBpbnRlZ2VyIGluIGRvX2ZwcmVtIGdpdmluZyBhbgorICAgZXhhY3QgcmVzdWx0LiBCZWNhdXNlIG9mIHRoaXMsIHJlbV9rZXJuZWwoKSBuZWVkcyB0byBkZWFsIG9ubHkgd2l0aAorICAgdGhlIGxlYXN0IHNpZ25pZmljYW50IDY0IGJpdHMsIHRoZSBtb3JlIHNpZ25pZmljYW50IGJpdHMgb2YgdGhlCisgICByZXN1bHQgbXVzdCBiZSB6ZXJvLgorICovCitzdGF0aWMgdm9pZCByZW1fa2VybmVsKHVuc2lnbmVkIGxvbmcgbG9uZyBzdDAsIHVuc2lnbmVkIGxvbmcgbG9uZyAqeSwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBzdDEsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgcSwgaW50IG4pCit7CisgIGludCBkdW1teTsKKyAgdW5zaWduZWQgbG9uZyBsb25nIHg7CisKKyAgeCA9IHN0MCA8PCBuOworCisgIC8qIERvIHRoZSByZXF1aXJlZCBtdWx0aXBsaWNhdGlvbiBhbmQgc3VidHJhY3Rpb24gaW4gdGhlIG9uZSBvcGVyYXRpb24gKi8KKworICAvKiBsc3cgeCAtPSBsc3cgc3QxICogbHN3IHEgKi8KKyAgYXNtIHZvbGF0aWxlICgibXVsbCAlNDsgc3VibCAlJWVheCwlMDsgc2JibCAlJWVkeCwlMSIKKwkJOiI9bSIgKCgodW5zaWduZWQgKikmeClbMF0pLCAiPW0iICgoKHVuc2lnbmVkICopJngpWzFdKSwKKwkJIj1hIiAoZHVtbXkpCisJCToiMiIgKCgodW5zaWduZWQgKikmc3QxKVswXSksICJtIiAoKCh1bnNpZ25lZCAqKSZxKVswXSkKKwkJOiIlZHgiKTsKKyAgLyogbXN3IHggLT0gbXN3IHN0MSAqIGxzdyBxICovCisgIGFzbSB2b2xhdGlsZSAoIm11bGwgJTM7IHN1YmwgJSVlYXgsJTAiCisJCToiPW0iICgoKHVuc2lnbmVkICopJngpWzFdKSwgIj1hIiAoZHVtbXkpCisJCToiMSIgKCgodW5zaWduZWQgKikmc3QxKVsxXSksICJtIiAoKCh1bnNpZ25lZCAqKSZxKVswXSkKKwkJOiIlZHgiKTsKKyAgLyogbXN3IHggLT0gbHN3IHN0MSAqIG1zdyBxICovCisgIGFzbSB2b2xhdGlsZSAoIm11bGwgJTM7IHN1YmwgJSVlYXgsJTAiCisJCToiPW0iICgoKHVuc2lnbmVkICopJngpWzFdKSwgIj1hIiAoZHVtbXkpCisJCToiMSIgKCgodW5zaWduZWQgKikmc3QxKVswXSksICJtIiAoKCh1bnNpZ25lZCAqKSZxKVsxXSkKKwkJOiIlZHgiKTsKKworICAqeSA9IHg7Cit9CisKKworLyogUmVtYWluZGVyIG9mIHN0KDApIC8gc3QoMSkgKi8KKy8qIFRoaXMgcm91dGluZSBwcm9kdWNlcyBleGFjdCByZXN1bHRzLCBpLmUuIHRoZXJlIGlzIG5ldmVyIGFueQorICAgcm91bmRpbmcgb3IgdHJ1bmNhdGlvbiwgZXRjIG9mIHRoZSByZXN1bHQuICovCitzdGF0aWMgdm9pZCBkb19mcHJlbShGUFVfUkVHICpzdDBfcHRyLCB1X2NoYXIgc3QwX3RhZywgaW50IHJvdW5kKQoreworICBGUFVfUkVHICpzdDFfcHRyID0gJnN0KDEpOworICB1X2NoYXIgc3QxX3RhZyA9IEZQVV9nZXR0YWdpKDEpOworCisgIGlmICggISgoc3QwX3RhZyBeIFRBR19WYWxpZCkgfCAoc3QxX3RhZyBeIFRBR19WYWxpZCkpICkKKyAgICB7CisgICAgICBGUFVfUkVHIHRtcCwgc3QwLCBzdDE7CisgICAgICB1X2NoYXIgc3QwX3NpZ24sIHN0MV9zaWduOworICAgICAgdV9jaGFyIHRtcHRhZzsKKyAgICAgIGludCB0YWc7CisgICAgICBpbnQgb2xkX2N3OworICAgICAgaW50IGV4cGRpZjsKKyAgICAgIGxvbmcgbG9uZyBxOworICAgICAgdW5zaWduZWQgc2hvcnQgc2F2ZWRfc3RhdHVzOworICAgICAgaW50IGNjOworCisgICAgZnByZW1fdmFsaWQ6CisgICAgICAvKiBDb252ZXJ0IHJlZ2lzdGVycyBmb3IgaW50ZXJuYWwgdXNlLiAqLworICAgICAgc3QwX3NpZ24gPSBGUFVfdG9fZXhwMTYoc3QwX3B0ciwgJnN0MCk7CisgICAgICBzdDFfc2lnbiA9IEZQVV90b19leHAxNihzdDFfcHRyLCAmc3QxKTsKKyAgICAgIGV4cGRpZiA9IGV4cG9uZW50MTYoJnN0MCkgLSBleHBvbmVudDE2KCZzdDEpOworCisgICAgICBvbGRfY3cgPSBjb250cm9sX3dvcmQ7CisgICAgICBjYyA9IDA7CisKKyAgICAgIC8qIFdlIHdhbnQgdGhlIHN0YXR1cyBmb2xsb3dpbmcgdGhlIGRlbm9ybSB0ZXN0cywgYnV0IGRvbid0IHdhbnQKKwkgdGhlIHN0YXR1cyBjaGFuZ2VkIGJ5IHRoZSBhcml0aG1ldGljIG9wZXJhdGlvbnMuICovCisgICAgICBzYXZlZF9zdGF0dXMgPSBwYXJ0aWFsX3N0YXR1czsKKyAgICAgIGNvbnRyb2xfd29yZCAmPSB+Q1dfUkM7CisgICAgICBjb250cm9sX3dvcmQgfD0gUkNfQ0hPUDsKKworICAgICAgaWYgKCBleHBkaWYgPCA2NCApCisJeworCSAgLyogVGhpcyBzaG91bGQgYmUgdGhlIG1vc3QgY29tbW9uIGNhc2UgKi8KKworCSAgaWYgKCBleHBkaWYgPiAtMiApCisJICAgIHsKKwkgICAgICB1X2NoYXIgc2lnbiA9IHN0MF9zaWduIF4gc3QxX3NpZ247CisJICAgICAgdGFnID0gRlBVX3VfZGl2KCZzdDAsICZzdDEsICZ0bXAsCisJCQkgICAgICBQUl82NF9CSVRTIHwgUkNfQ0hPUCB8IDB4M2YsCisJCQkgICAgICBzaWduKTsKKwkgICAgICBzZXRzaWduKCZ0bXAsIHNpZ24pOworCisJICAgICAgaWYgKCBleHBvbmVudCgmdG1wKSA+PSAwICkKKwkJeworCQkgIEZQVV9yb3VuZF90b19pbnQoJnRtcCwgdGFnKTsgIC8qIEZvcnR1bmF0ZWx5LCB0aGlzIGNhbid0CisJCQkJCQkgICBvdmVyZmxvdyB0byAyXjY0ICovCisJCSAgcSA9IHNpZ25pZmljYW5kKCZ0bXApOworCisJCSAgcmVtX2tlcm5lbChzaWduaWZpY2FuZCgmc3QwKSwKKwkJCSAgICAgJnNpZ25pZmljYW5kKCZ0bXApLAorCQkJICAgICBzaWduaWZpY2FuZCgmc3QxKSwKKwkJCSAgICAgcSwgZXhwZGlmKTsKKworCQkgIHNldGV4cG9uZW50MTYoJnRtcCwgZXhwb25lbnQxNigmc3QxKSk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICByZWdfY29weSgmc3QwLCAmdG1wKTsKKwkJICBxID0gMDsKKwkJfQorCisJICAgICAgaWYgKCAocm91bmQgPT0gUkNfUk5EKSAmJiAodG1wLnNpZ2ggJiAweGMwMDAwMDAwKSApCisJCXsKKwkJICAvKiBXZSBtYXkgbmVlZCB0byBzdWJ0cmFjdCBzdCgxKSBvbmNlIG1vcmUsCisJCSAgICAgdG8gZ2V0IGEgcmVzdWx0IDw9IDEvMiBvZiBzdCgxKS4gKi8KKwkJICB1bnNpZ25lZCBsb25nIGxvbmcgeDsKKwkJICBleHBkaWYgPSBleHBvbmVudDE2KCZzdDEpIC0gZXhwb25lbnQxNigmdG1wKTsKKwkJICBpZiAoIGV4cGRpZiA8PSAxICkKKwkJICAgIHsKKwkJICAgICAgaWYgKCBleHBkaWYgPT0gMCApCisJCQl4ID0gc2lnbmlmaWNhbmQoJnN0MSkgLSBzaWduaWZpY2FuZCgmdG1wKTsKKwkJICAgICAgZWxzZSAvKiBleHBkaWYgaXMgMSAqLworCQkJeCA9IChzaWduaWZpY2FuZCgmc3QxKSA8PCAxKSAtIHNpZ25pZmljYW5kKCZ0bXApOworCQkgICAgICBpZiAoICh4IDwgc2lnbmlmaWNhbmQoJnRtcCkpIHx8CisJCQkgIC8qIG9yIGVxdWktZGlzdGFudCAoZnJvbSAwICYgc3QoMSkpIGFuZCBxIGlzIG9kZCAqLworCQkJICAoKHggPT0gc2lnbmlmaWNhbmQoJnRtcCkpICYmIChxICYgMSkgKSApCisJCQl7CisJCQkgIHN0MF9zaWduID0gISBzdDBfc2lnbjsKKwkJCSAgc2lnbmlmaWNhbmQoJnRtcCkgPSB4OworCQkJICBxKys7CisJCQl9CisJCSAgICB9CisJCX0KKworCSAgICAgIGlmIChxICYgNCkgY2MgfD0gU1dfQzA7CisJICAgICAgaWYgKHEgJiAyKSBjYyB8PSBTV19DMzsKKwkgICAgICBpZiAocSAmIDEpIGNjIHw9IFNXX0MxOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBjb250cm9sX3dvcmQgPSBvbGRfY3c7CisJICAgICAgc2V0Y2MoMCk7CisJICAgICAgcmV0dXJuOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIFRoZXJlIGlzIGEgbGFyZ2UgZXhwb25lbnQgZGlmZmVyZW5jZSAoID49IDY0ICkgKi8KKwkgIC8qIFRvIG1ha2UgbXVjaCBzZW5zZSwgdGhlIGNvZGUgaW4gdGhpcyBzZWN0aW9uIHNob3VsZAorCSAgICAgYmUgZG9uZSBhdCBoaWdoIHByZWNpc2lvbi4gKi8KKwkgIGludCBleHBfMSwgTjsKKwkgIHVfY2hhciBzaWduOworCisJICAvKiBwcmV2ZW50IG92ZXJmbG93IGhlcmUgKi8KKwkgIC8qIE4gaXMgJ2EgbnVtYmVyIGJldHdlZW4gMzIgYW5kIDYzJyAocDI2LTExMykgKi8KKwkgIHJlZ19jb3B5KCZzdDAsICZ0bXApOworCSAgdG1wdGFnID0gc3QwX3RhZzsKKwkgIE4gPSAoZXhwZGlmICYgMHgwMDAwMDAxZikgKyAzMjsgIC8qIFRoaXMgY2hvaWNlIGdpdmVzIHJlc3VsdHMKKwkJCQkJICAgICAgaWRlbnRpY2FsIHRvIGFuIEFNRCA0ODYgKi8KKwkgIHNldGV4cG9uZW50MTYoJnRtcCwgTik7CisJICBleHBfMSA9IGV4cG9uZW50MTYoJnN0MSk7CisJICBzZXRleHBvbmVudDE2KCZzdDEsIDApOworCSAgZXhwZGlmIC09IE47CisKKwkgIHNpZ24gPSBnZXRzaWduKCZ0bXApIF4gc3QxX3NpZ247CisJICB0YWcgPSBGUFVfdV9kaXYoJnRtcCwgJnN0MSwgJnRtcCwgUFJfNjRfQklUUyB8IFJDX0NIT1AgfCAweDNmLAorCQkJICBzaWduKTsKKwkgIHNldHNpZ24oJnRtcCwgc2lnbik7CisKKwkgIEZQVV9yb3VuZF90b19pbnQoJnRtcCwgdGFnKTsgIC8qIEZvcnR1bmF0ZWx5LCB0aGlzIGNhbid0CisJCQkJCSAgIG92ZXJmbG93IHRvIDJeNjQgKi8KKworCSAgcmVtX2tlcm5lbChzaWduaWZpY2FuZCgmc3QwKSwKKwkJICAgICAmc2lnbmlmaWNhbmQoJnRtcCksCisJCSAgICAgc2lnbmlmaWNhbmQoJnN0MSksCisJCSAgICAgc2lnbmlmaWNhbmQoJnRtcCksCisJCSAgICAgZXhwb25lbnQoJnRtcCkKKwkJICAgICApOyAKKwkgIHNldGV4cG9uZW50MTYoJnRtcCwgZXhwXzEgKyBleHBkaWYpOworCisJICAvKiBJdCBpcyBwb3NzaWJsZSBmb3IgdGhlIG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZSBoZXJlLgorCSAgICAgV2hhdCBkb2VzIHRoZSBJRUVFIHN0YW5kYXJkIHNheT8gVGhlIEludGVsIDgwNDg2IG1hbnVhbAorCSAgICAgaW1wbGllcyB0aGF0IHRoZSBvcGVyYXRpb24gd2lsbCBuZXZlciBiZSBjb21wbGV0ZWQgYXQgdGhpcworCSAgICAgcG9pbnQsIGFuZCB0aGUgYmVoYXZpb3VyIG9mIGEgcmVhbCA4MDQ4NiBjb25maXJtcyB0aGlzLgorCSAgICovCisJICBpZiAoICEodG1wLnNpZ2ggfCB0bXAuc2lnbCkgKQorCSAgICB7CisJICAgICAgLyogVGhlIHJlc3VsdCBpcyB6ZXJvICovCisJICAgICAgY29udHJvbF93b3JkID0gb2xkX2N3OworCSAgICAgIHBhcnRpYWxfc3RhdHVzID0gc2F2ZWRfc3RhdHVzOworCSAgICAgIEZQVV9jb3B5X3RvX3JlZzAoJkNPTlNUX1osIFRBR19aZXJvKTsKKwkgICAgICBzZXRzaWduKCZzdDAsIHN0MF9zaWduKTsKKyNpZmRlZiBQRUNVTElBUl80ODYKKwkgICAgICBzZXRjYyhTV19DMik7CisjZWxzZQorCSAgICAgIHNldGNjKDApOworI2VuZGlmIC8qIFBFQ1VMSUFSXzQ4NiAqLworCSAgICAgIHJldHVybjsKKwkgICAgfQorCSAgY2MgPSBTV19DMjsKKwl9CisKKyAgICAgIGNvbnRyb2xfd29yZCA9IG9sZF9jdzsKKyAgICAgIHBhcnRpYWxfc3RhdHVzID0gc2F2ZWRfc3RhdHVzOworICAgICAgdGFnID0gRlBVX25vcm1hbGl6ZV9udW8oJnRtcCk7CisgICAgICByZWdfY29weSgmdG1wLCBzdDBfcHRyKTsKKworICAgICAgLyogVGhlIG9ubHkgY29uZGl0aW9uIHRvIGJlIGxvb2tlZCBmb3IgaXMgdW5kZXJmbG93LAorCSBhbmQgaXQgY2FuIG9jY3VyIGhlcmUgb25seSBpZiB1bmRlcmZsb3cgaXMgdW5tYXNrZWQuICovCisgICAgICBpZiAoIChleHBvbmVudDE2KCZ0bXApIDw9IEVYUF9VTkRFUikgJiYgKHRhZyAhPSBUQUdfWmVybykKKwkgICYmICEoY29udHJvbF93b3JkICYgQ1dfVW5kZXJmbG93KSApCisJeworCSAgc2V0Y2MoY2MpOworCSAgdGFnID0gYXJpdGhfdW5kZXJmbG93KHN0MF9wdHIpOworCSAgc2V0c2lnbihzdDBfcHRyLCBzdDBfc2lnbik7CisJICBGUFVfc2V0dGFnMCh0YWcpOworCSAgcmV0dXJuOworCX0KKyAgICAgIGVsc2UgaWYgKCAoZXhwb25lbnQxNigmdG1wKSA+IEVYUF9VTkRFUikgfHwgKHRhZyA9PSBUQUdfWmVybykgKQorCXsKKwkgIHN0ZGV4cChzdDBfcHRyKTsKKwkgIHNldHNpZ24oc3QwX3B0ciwgc3QwX3NpZ24pOworCX0KKyAgICAgIGVsc2UKKwl7CisJICB0YWcgPSBGUFVfcm91bmQoc3QwX3B0ciwgMCwgMCwgRlVMTF9QUkVDSVNJT04sIHN0MF9zaWduKTsKKwl9CisgICAgICBGUFVfc2V0dGFnMCh0YWcpOworICAgICAgc2V0Y2MoY2MpOworCisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmICggc3QwX3RhZyA9PSBUQUdfU3BlY2lhbCApCisgICAgc3QwX3RhZyA9IEZQVV9TcGVjaWFsKHN0MF9wdHIpOworICBpZiAoIHN0MV90YWcgPT0gVEFHX1NwZWNpYWwgKQorICAgIHN0MV90YWcgPSBGUFVfU3BlY2lhbChzdDFfcHRyKTsKKworICBpZiAoICgoc3QwX3RhZyA9PSBUQUdfVmFsaWQpICYmIChzdDFfdGFnID09IFRXX0Rlbm9ybWFsKSkKKwkgICAgfHwgKChzdDBfdGFnID09IFRXX0Rlbm9ybWFsKSAmJiAoc3QxX3RhZyA9PSBUQUdfVmFsaWQpKQorCSAgICB8fCAoKHN0MF90YWcgPT0gVFdfRGVub3JtYWwpICYmIChzdDFfdGFnID09IFRXX0Rlbm9ybWFsKSkgKQorICAgIHsKKyAgICAgIGlmICggZGVub3JtYWxfb3BlcmFuZCgpIDwgMCApCisJcmV0dXJuOworICAgICAgZ290byBmcHJlbV92YWxpZDsKKyAgICB9CisgIGVsc2UgaWYgKCAoc3QwX3RhZyA9PSBUQUdfRW1wdHkpIHx8IChzdDFfdGFnID09IFRBR19FbXB0eSkgKQorICAgIHsKKyAgICAgIEZQVV9zdGFja191bmRlcmZsb3coKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGVsc2UgaWYgKCBzdDBfdGFnID09IFRBR19aZXJvICkKKyAgICB7CisgICAgICBpZiAoIHN0MV90YWcgPT0gVEFHX1ZhbGlkICkKKwl7CisJICBzZXRjYygwKTsgcmV0dXJuOworCX0KKyAgICAgIGVsc2UgaWYgKCBzdDFfdGFnID09IFRXX0Rlbm9ybWFsICkKKwl7CisJICBpZiAoIGRlbm9ybWFsX29wZXJhbmQoKSA8IDAgKQorCSAgICByZXR1cm47CisJICBzZXRjYygwKTsgcmV0dXJuOworCX0KKyAgICAgIGVsc2UgaWYgKCBzdDFfdGFnID09IFRBR19aZXJvICkKKwl7IGFyaXRoX2ludmFsaWQoMCk7IHJldHVybjsgfSAvKiBmcHJlbSg/LDApIGFsd2F5cyBpbnZhbGlkICovCisgICAgICBlbHNlIGlmICggc3QxX3RhZyA9PSBUV19JbmZpbml0eSApCisJeyBzZXRjYygwKTsgcmV0dXJuOyB9CisgICAgfQorICBlbHNlIGlmICggKHN0MF90YWcgPT0gVEFHX1ZhbGlkKSB8fCAoc3QwX3RhZyA9PSBUV19EZW5vcm1hbCkgKQorICAgIHsKKyAgICAgIGlmICggc3QxX3RhZyA9PSBUQUdfWmVybyApCisJeworCSAgYXJpdGhfaW52YWxpZCgwKTsgLyogZnByZW0oVmFsaWQsWmVybykgaXMgaW52YWxpZCAqLworCSAgcmV0dXJuOworCX0KKyAgICAgIGVsc2UgaWYgKCBzdDFfdGFnICE9IFRXX05hTiApCisJeworCSAgaWYgKCAoKHN0MF90YWcgPT0gVFdfRGVub3JtYWwpIHx8IChzdDFfdGFnID09IFRXX0Rlbm9ybWFsKSkKKwkgICAgICAgJiYgKGRlbm9ybWFsX29wZXJhbmQoKSA8IDApICkKKwkgICAgcmV0dXJuOworCisJICBpZiAoIHN0MV90YWcgPT0gVFdfSW5maW5pdHkgKQorCSAgICB7CisJICAgICAgLyogZnByZW0oVmFsaWQsSW5maW5pdHkpIGlzIG8uay4gKi8KKwkgICAgICBzZXRjYygwKTsgcmV0dXJuOworCSAgICB9CisJfQorICAgIH0KKyAgZWxzZSBpZiAoIHN0MF90YWcgPT0gVFdfSW5maW5pdHkgKQorICAgIHsKKyAgICAgIGlmICggc3QxX3RhZyAhPSBUV19OYU4gKQorCXsKKwkgIGFyaXRoX2ludmFsaWQoMCk7IC8qIGZwcmVtKEluZmluaXR5LD8pIGlzIGludmFsaWQgKi8KKwkgIHJldHVybjsKKwl9CisgICAgfQorCisgIC8qIE9uZSBvZiB0aGUgcmVnaXN0ZXJzIG11c3QgY29udGFpbiBhIE5hTiBpZiB3ZSBnb3QgaGVyZS4gKi8KKworI2lmZGVmIFBBUkFOT0lECisgIGlmICggKHN0MF90YWcgIT0gVFdfTmFOKSAmJiAoc3QxX3RhZyAhPSBUV19OYU4pICkKKyAgICAgIEVYQ0VQVElPTihFWF9JTlRFUk5BTCB8IDB4MTE4KTsKKyNlbmRpZiAvKiBQQVJBTk9JRCAqLworCisgIHJlYWxfMm9wX05hTihzdDFfcHRyLCBzdDFfdGFnLCAwLCBzdDFfcHRyKTsKKworfQorCisKKy8qIFNUKDEpIDwtIFNUKDEpICogbG9nIFNUOyAgcG9wIFNUICovCitzdGF0aWMgdm9pZCBmeWwyeChGUFVfUkVHICpzdDBfcHRyLCB1X2NoYXIgc3QwX3RhZykKK3sKKyAgRlBVX1JFRyAqc3QxX3B0ciA9ICZzdCgxKSwgZXhwb25lbnQ7CisgIHVfY2hhciBzdDFfdGFnID0gRlBVX2dldHRhZ2koMSk7CisgIHVfY2hhciBzaWduOworICBpbnQgZSwgdGFnOworCisgIGNsZWFyX0MxKCk7CisKKyAgaWYgKCAoc3QwX3RhZyA9PSBUQUdfVmFsaWQpICYmIChzdDFfdGFnID09IFRBR19WYWxpZCkgKQorICAgIHsKKyAgICBib3RoX3ZhbGlkOgorICAgICAgLyogQm90aCByZWdzIGFyZSBWYWxpZCBvciBEZW5vcm1hbCAqLworICAgICAgaWYgKCBzaWducG9zaXRpdmUoc3QwX3B0cikgKQorCXsKKwkgIGlmICggc3QwX3RhZyA9PSBUV19EZW5vcm1hbCApCisJICAgIEZQVV90b19leHAxNihzdDBfcHRyLCBzdDBfcHRyKTsKKwkgIGVsc2UKKwkgICAgLyogQ29udmVydCBzdCgwKSBmb3IgaW50ZXJuYWwgdXNlLiAqLworCSAgICBzZXRleHBvbmVudDE2KHN0MF9wdHIsIGV4cG9uZW50KHN0MF9wdHIpKTsKKworCSAgaWYgKCAoc3QwX3B0ci0+c2lnaCA9PSAweDgwMDAwMDAwKSAmJiAoc3QwX3B0ci0+c2lnbCA9PSAwKSApCisJICAgIHsKKwkgICAgICAvKiBTcGVjaWFsIGNhc2UuIFRoZSByZXN1bHQgY2FuIGJlIHByZWNpc2UuICovCisJICAgICAgdV9jaGFyIGVzaWduOworCSAgICAgIGUgPSBleHBvbmVudDE2KHN0MF9wdHIpOworCSAgICAgIGlmICggZSA+PSAwICkKKwkJeworCQkgIGV4cG9uZW50LnNpZ2ggPSBlOworCQkgIGVzaWduID0gU0lHTl9QT1M7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBleHBvbmVudC5zaWdoID0gLWU7CisJCSAgZXNpZ24gPSBTSUdOX05FRzsKKwkJfQorCSAgICAgIGV4cG9uZW50LnNpZ2wgPSAwOworCSAgICAgIHNldGV4cG9uZW50MTYoJmV4cG9uZW50LCAzMSk7CisJICAgICAgdGFnID0gRlBVX25vcm1hbGl6ZV9udW8oJmV4cG9uZW50KTsKKwkgICAgICBzdGRleHAoJmV4cG9uZW50KTsKKwkgICAgICBzZXRzaWduKCZleHBvbmVudCwgZXNpZ24pOworCSAgICAgIHRhZyA9IEZQVV9tdWwoJmV4cG9uZW50LCB0YWcsIDEsIEZVTExfUFJFQ0lTSU9OKTsKKwkgICAgICBpZiAoIHRhZyA+PSAwICkKKwkJRlBVX3NldHRhZ2koMSwgdGFnKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogVGhlIHVzdWFsIGNhc2UgKi8KKwkgICAgICBzaWduID0gZ2V0c2lnbihzdDFfcHRyKTsKKwkgICAgICBpZiAoIHN0MV90YWcgPT0gVFdfRGVub3JtYWwgKQorCQlGUFVfdG9fZXhwMTYoc3QxX3B0ciwgc3QxX3B0cik7CisJICAgICAgZWxzZQorCQkvKiBDb252ZXJ0IHN0KDEpIGZvciBpbnRlcm5hbCB1c2UuICovCisJCXNldGV4cG9uZW50MTYoc3QxX3B0ciwgZXhwb25lbnQoc3QxX3B0cikpOworCSAgICAgIHBvbHlfbDIoc3QwX3B0ciwgc3QxX3B0ciwgc2lnbik7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgLyogbmVnYXRpdmUgKi8KKwkgIGlmICggYXJpdGhfaW52YWxpZCgxKSA8IDAgKQorCSAgICByZXR1cm47CisJfQorCisgICAgICBGUFVfcG9wKCk7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKCBzdDBfdGFnID09IFRBR19TcGVjaWFsICkKKyAgICBzdDBfdGFnID0gRlBVX1NwZWNpYWwoc3QwX3B0cik7CisgIGlmICggc3QxX3RhZyA9PSBUQUdfU3BlY2lhbCApCisgICAgc3QxX3RhZyA9IEZQVV9TcGVjaWFsKHN0MV9wdHIpOworCisgIGlmICggKHN0MF90YWcgPT0gVEFHX0VtcHR5KSB8fCAoc3QxX3RhZyA9PSBUQUdfRW1wdHkpICkKKyAgICB7CisgICAgICBGUFVfc3RhY2tfdW5kZXJmbG93X3BvcCgxKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGVsc2UgaWYgKCAoc3QwX3RhZyA8PSBUV19EZW5vcm1hbCkgJiYgKHN0MV90YWcgPD0gVFdfRGVub3JtYWwpICkKKyAgICB7CisgICAgICBpZiAoIHN0MF90YWcgPT0gVEFHX1plcm8gKQorCXsKKwkgIGlmICggc3QxX3RhZyA9PSBUQUdfWmVybyApCisJICAgIHsKKwkgICAgICAvKiBCb3RoIGFyZ3MgemVybyBpcyBpbnZhbGlkICovCisJICAgICAgaWYgKCBhcml0aF9pbnZhbGlkKDEpIDwgMCApCisJCXJldHVybjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgdV9jaGFyIHNpZ247CisJICAgICAgc2lnbiA9IGdldHNpZ24oc3QxX3B0cileU0lHTl9ORUc7CisJICAgICAgaWYgKCBGUFVfZGl2aWRlX2J5X3plcm8oMSwgc2lnbikgPCAwICkKKwkJcmV0dXJuOworCisJICAgICAgc2V0c2lnbihzdDFfcHRyLCBzaWduKTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKCBzdDFfdGFnID09IFRBR19aZXJvICkKKwl7CisJICAvKiBzdCgxKSBjb250YWlucyB6ZXJvLCBzdCgwKSB2YWxpZCA8PiAwICovCisJICAvKiBaZXJvIGlzIHRoZSB2YWxpZCBhbnN3ZXIgKi8KKwkgIHNpZ24gPSBnZXRzaWduKHN0MV9wdHIpOworCSAgCisJICBpZiAoIHNpZ25uZWdhdGl2ZShzdDBfcHRyKSApCisJICAgIHsKKwkgICAgICAvKiBsb2cobmVnYXRpdmUpICovCisJICAgICAgaWYgKCBhcml0aF9pbnZhbGlkKDEpIDwgMCApCisJCXJldHVybjsKKwkgICAgfQorCSAgZWxzZSBpZiAoIChzdDBfdGFnID09IFRXX0Rlbm9ybWFsKSAmJiAoZGVub3JtYWxfb3BlcmFuZCgpIDwgMCkgKQorCSAgICByZXR1cm47CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoIGV4cG9uZW50KHN0MF9wdHIpIDwgMCApCisJCXNpZ24gXj0gU0lHTl9ORUc7CisKKwkgICAgICBGUFVfY29weV90b19yZWcxKCZDT05TVF9aLCBUQUdfWmVybyk7CisJICAgICAgc2V0c2lnbihzdDFfcHRyLCBzaWduKTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBPbmUgb3IgYm90aCBvcGVyYW5kcyBhcmUgZGVub3JtYWxzLiAqLworCSAgaWYgKCBkZW5vcm1hbF9vcGVyYW5kKCkgPCAwICkKKwkgICAgcmV0dXJuOworCSAgZ290byBib3RoX3ZhbGlkOworCX0KKyAgICB9CisgIGVsc2UgaWYgKCAoc3QwX3RhZyA9PSBUV19OYU4pIHx8IChzdDFfdGFnID09IFRXX05hTikgKQorICAgIHsKKyAgICAgIGlmICggcmVhbF8yb3BfTmFOKHN0MF9wdHIsIHN0MF90YWcsIDEsIHN0MF9wdHIpIDwgMCApCisJcmV0dXJuOworICAgIH0KKyAgLyogT25lIG9yIGJvdGggYXJnIG11c3QgYmUgYW4gaW5maW5pdHkgKi8KKyAgZWxzZSBpZiAoIHN0MF90YWcgPT0gVFdfSW5maW5pdHkgKQorICAgIHsKKyAgICAgIGlmICggKHNpZ25uZWdhdGl2ZShzdDBfcHRyKSkgfHwgKHN0MV90YWcgPT0gVEFHX1plcm8pICkKKwl7CisJICAvKiBsb2coLWluZmluaXR5KSBvciAwKmxvZyhpbmZpbml0eSkgKi8KKwkgIGlmICggYXJpdGhfaW52YWxpZCgxKSA8IDAgKQorCSAgICByZXR1cm47CisJfQorICAgICAgZWxzZQorCXsKKwkgIHVfY2hhciBzaWduID0gZ2V0c2lnbihzdDFfcHRyKTsKKworCSAgaWYgKCAoc3QxX3RhZyA9PSBUV19EZW5vcm1hbCkgJiYgKGRlbm9ybWFsX29wZXJhbmQoKSA8IDApICkKKwkgICAgcmV0dXJuOworCisJICBGUFVfY29weV90b19yZWcxKCZDT05TVF9JTkYsIFRBR19TcGVjaWFsKTsKKwkgIHNldHNpZ24oc3QxX3B0ciwgc2lnbik7CisJfQorICAgIH0KKyAgLyogc3QoMSkgbXVzdCBiZSBpbmZpbml0eSBoZXJlICovCisgIGVsc2UgaWYgKCAoKHN0MF90YWcgPT0gVEFHX1ZhbGlkKSB8fCAoc3QwX3RhZyA9PSBUV19EZW5vcm1hbCkpCisJICAgICYmICggc2lnbnBvc2l0aXZlKHN0MF9wdHIpICkgKQorICAgIHsKKyAgICAgIGlmICggZXhwb25lbnQoc3QwX3B0cikgPj0gMCApCisJeworCSAgaWYgKCAoZXhwb25lbnQoc3QwX3B0cikgPT0gMCkgJiYKKwkgICAgICAoc3QwX3B0ci0+c2lnaCA9PSAweDgwMDAwMDAwKSAmJgorCSAgICAgIChzdDBfcHRyLT5zaWdsID09IDApICkKKwkgICAgeworCSAgICAgIC8qIHN0KDApIGhvbGRzIDEuMCAqLworCSAgICAgIC8qIGluZmluaXR5KmxvZygxKSAqLworCSAgICAgIGlmICggYXJpdGhfaW52YWxpZCgxKSA8IDAgKQorCQlyZXR1cm47CisJICAgIH0KKwkgIC8qIGVsc2Ugc3QoMCkgaXMgcG9zaXRpdmUgYW5kID4gMS4wICovCisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIHN0KDApIGlzIHBvc2l0aXZlIGFuZCA8IDEuMCAqLworCisJICBpZiAoIChzdDBfdGFnID09IFRXX0Rlbm9ybWFsKSAmJiAoZGVub3JtYWxfb3BlcmFuZCgpIDwgMCkgKQorCSAgICByZXR1cm47CisKKwkgIGNoYW5nZXNpZ24oc3QxX3B0cik7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIHN0KDApIG11c3QgYmUgemVybyBvciBuZWdhdGl2ZSAqLworICAgICAgaWYgKCBzdDBfdGFnID09IFRBR19aZXJvICkKKwl7CisJICAvKiBUaGlzIHNob3VsZCBiZSBpbnZhbGlkLCBidXQgYSByZWFsIDgwNDg2IGlzIGhhcHB5IHdpdGggaXQuICovCisKKyNpZm5kZWYgUEVDVUxJQVJfNDg2CisJICBzaWduID0gZ2V0c2lnbihzdDFfcHRyKTsKKwkgIGlmICggRlBVX2RpdmlkZV9ieV96ZXJvKDEsIHNpZ24pIDwgMCApCisJICAgIHJldHVybjsKKyNlbmRpZiAvKiBQRUNVTElBUl80ODYgKi8KKworCSAgY2hhbmdlc2lnbihzdDFfcHRyKTsKKwl9CisgICAgICBlbHNlIGlmICggYXJpdGhfaW52YWxpZCgxKSA8IDAgKQkgIC8qIGxvZyhuZWdhdGl2ZSkgKi8KKwlyZXR1cm47CisgICAgfQorCisgIEZQVV9wb3AoKTsKK30KKworCitzdGF0aWMgdm9pZCBmcGF0YW4oRlBVX1JFRyAqc3QwX3B0ciwgdV9jaGFyIHN0MF90YWcpCit7CisgIEZQVV9SRUcgKnN0MV9wdHIgPSAmc3QoMSk7CisgIHVfY2hhciBzdDFfdGFnID0gRlBVX2dldHRhZ2koMSk7CisgIGludCB0YWc7CisKKyAgY2xlYXJfQzEoKTsKKyAgaWYgKCAhKChzdDBfdGFnIF4gVEFHX1ZhbGlkKSB8IChzdDFfdGFnIF4gVEFHX1ZhbGlkKSkgKQorICAgIHsKKyAgICB2YWxpZF9hdGFuOgorCisgICAgICBwb2x5X2F0YW4oc3QwX3B0ciwgc3QwX3RhZywgc3QxX3B0ciwgc3QxX3RhZyk7CisKKyAgICAgIEZQVV9wb3AoKTsKKworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoIHN0MF90YWcgPT0gVEFHX1NwZWNpYWwgKQorICAgIHN0MF90YWcgPSBGUFVfU3BlY2lhbChzdDBfcHRyKTsKKyAgaWYgKCBzdDFfdGFnID09IFRBR19TcGVjaWFsICkKKyAgICBzdDFfdGFnID0gRlBVX1NwZWNpYWwoc3QxX3B0cik7CisKKyAgaWYgKCAoKHN0MF90YWcgPT0gVEFHX1ZhbGlkKSAmJiAoc3QxX3RhZyA9PSBUV19EZW5vcm1hbCkpCisJICAgIHx8ICgoc3QwX3RhZyA9PSBUV19EZW5vcm1hbCkgJiYgKHN0MV90YWcgPT0gVEFHX1ZhbGlkKSkKKwkgICAgfHwgKChzdDBfdGFnID09IFRXX0Rlbm9ybWFsKSAmJiAoc3QxX3RhZyA9PSBUV19EZW5vcm1hbCkpICkKKyAgICB7CisgICAgICBpZiAoIGRlbm9ybWFsX29wZXJhbmQoKSA8IDAgKQorCXJldHVybjsKKworICAgICAgZ290byB2YWxpZF9hdGFuOworICAgIH0KKyAgZWxzZSBpZiAoIChzdDBfdGFnID09IFRBR19FbXB0eSkgfHwgKHN0MV90YWcgPT0gVEFHX0VtcHR5KSApCisgICAgeworICAgICAgRlBVX3N0YWNrX3VuZGVyZmxvd19wb3AoMSk7CisgICAgICByZXR1cm47CisgICAgfQorICBlbHNlIGlmICggKHN0MF90YWcgPT0gVFdfTmFOKSB8fCAoc3QxX3RhZyA9PSBUV19OYU4pICkKKyAgICB7CisgICAgICBpZiAoIHJlYWxfMm9wX05hTihzdDBfcHRyLCBzdDBfdGFnLCAxLCBzdDBfcHRyKSA+PSAwICkKKwkgIEZQVV9wb3AoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGVsc2UgaWYgKCAoc3QwX3RhZyA9PSBUV19JbmZpbml0eSkgfHwgKHN0MV90YWcgPT0gVFdfSW5maW5pdHkpICkKKyAgICB7CisgICAgICB1X2NoYXIgc2lnbiA9IGdldHNpZ24oc3QxX3B0cik7CisgICAgICBpZiAoIHN0MF90YWcgPT0gVFdfSW5maW5pdHkgKQorCXsKKwkgIGlmICggc3QxX3RhZyA9PSBUV19JbmZpbml0eSApCisJICAgIHsKKwkgICAgICBpZiAoIHNpZ25wb3NpdGl2ZShzdDBfcHRyKSApCisJCXsKKwkJICBGUFVfY29weV90b19yZWcxKCZDT05TVF9QSTQsIFRBR19WYWxpZCk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBzZXRwb3NpdGl2ZShzdDFfcHRyKTsKKwkJICB0YWcgPSBGUFVfdV9hZGQoJkNPTlNUX1BJNCwgJkNPTlNUX1BJMiwgc3QxX3B0ciwKKwkJCQkgIEZVTExfUFJFQ0lTSU9OLCBTSUdOX1BPUywKKwkJCQkgIGV4cG9uZW50KCZDT05TVF9QSTQpLCBleHBvbmVudCgmQ09OU1RfUEkyKSk7CisJCSAgaWYgKCB0YWcgPj0gMCApCisJCSAgICBGUFVfc2V0dGFnaSgxLCB0YWcpOworCQl9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmICggKHN0MV90YWcgPT0gVFdfRGVub3JtYWwpICYmIChkZW5vcm1hbF9vcGVyYW5kKCkgPCAwKSApCisJCXJldHVybjsKKworCSAgICAgIGlmICggc2lnbnBvc2l0aXZlKHN0MF9wdHIpICkKKwkJeworCQkgIEZQVV9jb3B5X3RvX3JlZzEoJkNPTlNUX1osIFRBR19aZXJvKTsKKwkJICBzZXRzaWduKHN0MV9wdHIsIHNpZ24pOyAgIC8qIEFuIDgwNDg2IHByZXNlcnZlcyB0aGUgc2lnbiAqLworCQkgIEZQVV9wb3AoKTsKKwkJICByZXR1cm47CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBGUFVfY29weV90b19yZWcxKCZDT05TVF9QSSwgVEFHX1ZhbGlkKTsKKwkJfQorCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIHN0KDEpIGlzIGluZmluaXR5LCBzdCgwKSBub3QgaW5maW5pdHkgKi8KKwkgIGlmICggKHN0MF90YWcgPT0gVFdfRGVub3JtYWwpICYmIChkZW5vcm1hbF9vcGVyYW5kKCkgPCAwKSApCisJICAgIHJldHVybjsKKworCSAgRlBVX2NvcHlfdG9fcmVnMSgmQ09OU1RfUEkyLCBUQUdfVmFsaWQpOworCX0KKyAgICAgIHNldHNpZ24oc3QxX3B0ciwgc2lnbik7CisgICAgfQorICBlbHNlIGlmICggc3QxX3RhZyA9PSBUQUdfWmVybyApCisgICAgeworICAgICAgLyogc3QoMCkgbXVzdCBiZSB2YWxpZCBvciB6ZXJvICovCisgICAgICB1X2NoYXIgc2lnbiA9IGdldHNpZ24oc3QxX3B0cik7CisKKyAgICAgIGlmICggKHN0MF90YWcgPT0gVFdfRGVub3JtYWwpICYmIChkZW5vcm1hbF9vcGVyYW5kKCkgPCAwKSApCisJcmV0dXJuOworCisgICAgICBpZiAoIHNpZ25wb3NpdGl2ZShzdDBfcHRyKSApCisJeworCSAgLyogQW4gODA0ODYgcHJlc2VydmVzIHRoZSBzaWduICovCisJICBGUFVfcG9wKCk7CisJICByZXR1cm47CisJfQorCisgICAgICBGUFVfY29weV90b19yZWcxKCZDT05TVF9QSSwgVEFHX1ZhbGlkKTsKKyAgICAgIHNldHNpZ24oc3QxX3B0ciwgc2lnbik7CisgICAgfQorICBlbHNlIGlmICggc3QwX3RhZyA9PSBUQUdfWmVybyApCisgICAgeworICAgICAgLyogc3QoMSkgbXVzdCBiZSBUQUdfVmFsaWQgaGVyZSAqLworICAgICAgdV9jaGFyIHNpZ24gPSBnZXRzaWduKHN0MV9wdHIpOworCisgICAgICBpZiAoIChzdDFfdGFnID09IFRXX0Rlbm9ybWFsKSAmJiAoZGVub3JtYWxfb3BlcmFuZCgpIDwgMCkgKQorCXJldHVybjsKKworICAgICAgRlBVX2NvcHlfdG9fcmVnMSgmQ09OU1RfUEkyLCBUQUdfVmFsaWQpOworICAgICAgc2V0c2lnbihzdDFfcHRyLCBzaWduKTsKKyAgICB9CisjaWZkZWYgUEFSQU5PSUQKKyAgZWxzZQorICAgIEVYQ0VQVElPTihFWF9JTlRFUk5BTCB8IDB4MTI1KTsKKyNlbmRpZiAvKiBQQVJBTk9JRCAqLworCisgIEZQVV9wb3AoKTsKKyAgc2V0X3ByZWNpc2lvbl9mbGFnX3VwKCk7ICAvKiBXZSBkbyBub3QgcmVhbGx5IGtub3cgaWYgdXAgb3IgZG93biAqLworfQorCisKK3N0YXRpYyB2b2lkIGZwcmVtKEZQVV9SRUcgKnN0MF9wdHIsIHVfY2hhciBzdDBfdGFnKQoreworICBkb19mcHJlbShzdDBfcHRyLCBzdDBfdGFnLCBSQ19DSE9QKTsKK30KKworCitzdGF0aWMgdm9pZCBmcHJlbTEoRlBVX1JFRyAqc3QwX3B0ciwgdV9jaGFyIHN0MF90YWcpCit7CisgIGRvX2ZwcmVtKHN0MF9wdHIsIHN0MF90YWcsIFJDX1JORCk7Cit9CisKKworc3RhdGljIHZvaWQgZnlsMnhwMShGUFVfUkVHICpzdDBfcHRyLCB1X2NoYXIgc3QwX3RhZykKK3sKKyAgdV9jaGFyIHNpZ24sIHNpZ24xOworICBGUFVfUkVHICpzdDFfcHRyID0gJnN0KDEpLCBhLCBiOworICB1X2NoYXIgc3QxX3RhZyA9IEZQVV9nZXR0YWdpKDEpOworCisgIGNsZWFyX0MxKCk7CisgIGlmICggISgoc3QwX3RhZyBeIFRBR19WYWxpZCkgfCAoc3QxX3RhZyBeIFRBR19WYWxpZCkpICkKKyAgICB7CisgICAgdmFsaWRfeWwyeHAxOgorCisgICAgICBzaWduID0gZ2V0c2lnbihzdDBfcHRyKTsKKyAgICAgIHNpZ24xID0gZ2V0c2lnbihzdDFfcHRyKTsKKworICAgICAgRlBVX3RvX2V4cDE2KHN0MF9wdHIsICZhKTsKKyAgICAgIEZQVV90b19leHAxNihzdDFfcHRyLCAmYik7CisKKyAgICAgIGlmICggcG9seV9sMnAxKHNpZ24sIHNpZ24xLCAmYSwgJmIsIHN0MV9wdHIpICkKKwlyZXR1cm47CisKKyAgICAgIEZQVV9wb3AoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKCBzdDBfdGFnID09IFRBR19TcGVjaWFsICkKKyAgICBzdDBfdGFnID0gRlBVX1NwZWNpYWwoc3QwX3B0cik7CisgIGlmICggc3QxX3RhZyA9PSBUQUdfU3BlY2lhbCApCisgICAgc3QxX3RhZyA9IEZQVV9TcGVjaWFsKHN0MV9wdHIpOworCisgIGlmICggKChzdDBfdGFnID09IFRBR19WYWxpZCkgJiYgKHN0MV90YWcgPT0gVFdfRGVub3JtYWwpKQorCSAgICB8fCAoKHN0MF90YWcgPT0gVFdfRGVub3JtYWwpICYmIChzdDFfdGFnID09IFRBR19WYWxpZCkpCisJICAgIHx8ICgoc3QwX3RhZyA9PSBUV19EZW5vcm1hbCkgJiYgKHN0MV90YWcgPT0gVFdfRGVub3JtYWwpKSApCisgICAgeworICAgICAgaWYgKCBkZW5vcm1hbF9vcGVyYW5kKCkgPCAwICkKKwlyZXR1cm47CisKKyAgICAgIGdvdG8gdmFsaWRfeWwyeHAxOworICAgIH0KKyAgZWxzZSBpZiAoIChzdDBfdGFnID09IFRBR19FbXB0eSkgfCAoc3QxX3RhZyA9PSBUQUdfRW1wdHkpICkKKyAgICB7CisgICAgICBGUFVfc3RhY2tfdW5kZXJmbG93X3BvcCgxKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGVsc2UgaWYgKCBzdDBfdGFnID09IFRBR19aZXJvICkKKyAgICB7CisgICAgICBzd2l0Y2ggKCBzdDFfdGFnICkKKwl7CisJY2FzZSBUV19EZW5vcm1hbDoKKwkgIGlmICggZGVub3JtYWxfb3BlcmFuZCgpIDwgMCApCisJICAgIHJldHVybjsKKworCWNhc2UgVEFHX1plcm86CisJY2FzZSBUQUdfVmFsaWQ6CisJICBzZXRzaWduKHN0MF9wdHIsIGdldHNpZ24oc3QwX3B0cikgXiBnZXRzaWduKHN0MV9wdHIpKTsKKwkgIEZQVV9jb3B5X3RvX3JlZzEoc3QwX3B0ciwgc3QwX3RhZyk7CisJICBicmVhazsKKworCWNhc2UgVFdfSW5maW5pdHk6CisJICAvKiBJbmZpbml0eSpsb2coMSkgKi8KKwkgIGlmICggYXJpdGhfaW52YWxpZCgxKSA8IDAgKQorCSAgICByZXR1cm47CisJICBicmVhazsKKworCWNhc2UgVFdfTmFOOgorCSAgaWYgKCByZWFsXzJvcF9OYU4oc3QwX3B0ciwgc3QwX3RhZywgMSwgc3QwX3B0cikgPCAwICkKKwkgICAgcmV0dXJuOworCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorI2lmZGVmIFBBUkFOT0lECisJICBFWENFUFRJT04oRVhfSU5URVJOQUwgfCAweDExNik7CisJICByZXR1cm47CisjZW5kaWYgLyogUEFSQU5PSUQgKi8KKwkgIGJyZWFrOworCX0KKyAgICB9CisgIGVsc2UgaWYgKCAoc3QwX3RhZyA9PSBUQUdfVmFsaWQpIHx8IChzdDBfdGFnID09IFRXX0Rlbm9ybWFsKSApCisgICAgeworICAgICAgc3dpdGNoICggc3QxX3RhZyApCisJeworCWNhc2UgVEFHX1plcm86CisJICBpZiAoIHNpZ25uZWdhdGl2ZShzdDBfcHRyKSApCisJICAgIHsKKwkgICAgICBpZiAoIGV4cG9uZW50KHN0MF9wdHIpID49IDAgKQorCQl7CisJCSAgLyogc3QoMCkgaG9sZHMgPD0gLTEuMCAqLworI2lmZGVmIFBFQ1VMSUFSXzQ4NiAgIC8qIFN0dXBpZCA4MDQ4NiBkb2Vzbid0IHdvcnJ5IGFib3V0IGxvZyhuZWdhdGl2ZSkuICovCisJCSAgY2hhbmdlc2lnbihzdDFfcHRyKTsKKyNlbHNlCisJCSAgaWYgKCBhcml0aF9pbnZhbGlkKDEpIDwgMCApCisJCSAgICByZXR1cm47CisjZW5kaWYgLyogUEVDVUxJQVJfNDg2ICovCisJCX0KKwkgICAgICBlbHNlIGlmICggKHN0MF90YWcgPT0gVFdfRGVub3JtYWwpICYmIChkZW5vcm1hbF9vcGVyYW5kKCkgPCAwKSApCisJCXJldHVybjsKKwkgICAgICBlbHNlCisJCWNoYW5nZXNpZ24oc3QxX3B0cik7CisJICAgIH0KKwkgIGVsc2UgaWYgKCAoc3QwX3RhZyA9PSBUV19EZW5vcm1hbCkgJiYgKGRlbm9ybWFsX29wZXJhbmQoKSA8IDApICkKKwkgICAgcmV0dXJuOworCSAgYnJlYWs7CisKKwljYXNlIFRXX0luZmluaXR5OgorCSAgaWYgKCBzaWdubmVnYXRpdmUoc3QwX3B0cikgKQorCSAgICB7CisJICAgICAgaWYgKCAoZXhwb25lbnQoc3QwX3B0cikgPj0gMCkgJiYKKwkJICAhKChzdDBfcHRyLT5zaWdoID09IDB4ODAwMDAwMDApICYmCisJCSAgICAoc3QwX3B0ci0+c2lnbCA9PSAwKSkgKQorCQl7CisJCSAgLyogc3QoMCkgaG9sZHMgPCAtMS4wICovCisjaWZkZWYgUEVDVUxJQVJfNDg2ICAgLyogU3R1cGlkIDgwNDg2IGRvZXNuJ3Qgd29ycnkgYWJvdXQgbG9nKG5lZ2F0aXZlKS4gKi8KKwkJICBjaGFuZ2VzaWduKHN0MV9wdHIpOworI2Vsc2UKKwkJICBpZiAoIGFyaXRoX2ludmFsaWQoMSkgPCAwICkgcmV0dXJuOworI2VuZGlmIC8qIFBFQ1VMSUFSXzQ4NiAqLworCQl9CisJICAgICAgZWxzZSBpZiAoIChzdDBfdGFnID09IFRXX0Rlbm9ybWFsKSAmJiAoZGVub3JtYWxfb3BlcmFuZCgpIDwgMCkgKQorCQlyZXR1cm47CisJICAgICAgZWxzZQorCQljaGFuZ2VzaWduKHN0MV9wdHIpOworCSAgICB9CisJICBlbHNlIGlmICggKHN0MF90YWcgPT0gVFdfRGVub3JtYWwpICYmIChkZW5vcm1hbF9vcGVyYW5kKCkgPCAwKSApCisJICAgIHJldHVybjsKKwkgIGJyZWFrOworCisJY2FzZSBUV19OYU46CisJICBpZiAoIHJlYWxfMm9wX05hTihzdDBfcHRyLCBzdDBfdGFnLCAxLCBzdDBfcHRyKSA8IDAgKQorCSAgICByZXR1cm47CisJfQorCisgICAgfQorICBlbHNlIGlmICggc3QwX3RhZyA9PSBUV19OYU4gKQorICAgIHsKKyAgICAgIGlmICggcmVhbF8yb3BfTmFOKHN0MF9wdHIsIHN0MF90YWcsIDEsIHN0MF9wdHIpIDwgMCApCisJcmV0dXJuOworICAgIH0KKyAgZWxzZSBpZiAoIHN0MF90YWcgPT0gVFdfSW5maW5pdHkgKQorICAgIHsKKyAgICAgIGlmICggc3QxX3RhZyA9PSBUV19OYU4gKQorCXsKKwkgIGlmICggcmVhbF8yb3BfTmFOKHN0MF9wdHIsIHN0MF90YWcsIDEsIHN0MF9wdHIpIDwgMCApCisJICAgIHJldHVybjsKKwl9CisgICAgICBlbHNlIGlmICggc2lnbm5lZ2F0aXZlKHN0MF9wdHIpICkKKwl7CisjaWZuZGVmIFBFQ1VMSUFSXzQ4NgorCSAgLyogVGhpcyBzaG91bGQgaGF2ZSBoaWdoZXIgcHJpb3JpdHkgdGhhbiBkZW5vcm1hbHMsIGJ1dC4uLiAqLworCSAgaWYgKCBhcml0aF9pbnZhbGlkKDEpIDwgMCApICAvKiBsb2coLWluZmluaXR5KSAqLworCSAgICByZXR1cm47CisjZW5kaWYgLyogUEVDVUxJQVJfNDg2ICovCisJICBpZiAoIChzdDFfdGFnID09IFRXX0Rlbm9ybWFsKSAmJiAoZGVub3JtYWxfb3BlcmFuZCgpIDwgMCkgKQorCSAgICByZXR1cm47CisjaWZkZWYgUEVDVUxJQVJfNDg2CisJICAvKiBEZW5vcm1hbCBvcGVyYW5kcyBhY3R1YWxseSBnZXQgaGlnaGVyIHByaW9yaXR5ICovCisJICBpZiAoIGFyaXRoX2ludmFsaWQoMSkgPCAwICkgIC8qIGxvZygtaW5maW5pdHkpICovCisJICAgIHJldHVybjsKKyNlbmRpZiAvKiBQRUNVTElBUl80ODYgKi8KKwl9CisgICAgICBlbHNlIGlmICggc3QxX3RhZyA9PSBUQUdfWmVybyApCisJeworCSAgLyogbG9nKGluZmluaXR5KSAqLworCSAgaWYgKCBhcml0aF9pbnZhbGlkKDEpIDwgMCApCisJICAgIHJldHVybjsKKwl9CisJCisgICAgICAvKiBzdCgxKSBtdXN0IGJlIHZhbGlkIGhlcmUuICovCisKKyAgICAgIGVsc2UgaWYgKCAoc3QxX3RhZyA9PSBUV19EZW5vcm1hbCkgJiYgKGRlbm9ybWFsX29wZXJhbmQoKSA8IDApICkKKwlyZXR1cm47CisKKyAgICAgIC8qIFRoZSBNYW51YWwgc2F5cyB0aGF0IGxvZyhJbmZpbml0eSkgaXMgaW52YWxpZCwgYnV0IGEgcmVhbAorCSA4MDQ4NiBzZW5zaWJseSBzYXlzIHRoYXQgaXQgaXMgby5rLiAqLworICAgICAgZWxzZQorCXsKKwkgIHVfY2hhciBzaWduID0gZ2V0c2lnbihzdDFfcHRyKTsKKwkgIEZQVV9jb3B5X3RvX3JlZzEoJkNPTlNUX0lORiwgVEFHX1NwZWNpYWwpOworCSAgc2V0c2lnbihzdDFfcHRyLCBzaWduKTsKKwl9CisgICAgfQorI2lmZGVmIFBBUkFOT0lECisgIGVsc2UKKyAgICB7CisgICAgICBFWENFUFRJT04oRVhfSU5URVJOQUwgfCAweDExNyk7CisgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmIC8qIFBBUkFOT0lEICovCisKKyAgRlBVX3BvcCgpOworICByZXR1cm47CisKK30KKworCitzdGF0aWMgdm9pZCBmc2NhbGUoRlBVX1JFRyAqc3QwX3B0ciwgdV9jaGFyIHN0MF90YWcpCit7CisgIEZQVV9SRUcgKnN0MV9wdHIgPSAmc3QoMSk7CisgIHVfY2hhciBzdDFfdGFnID0gRlBVX2dldHRhZ2koMSk7CisgIGludCBvbGRfY3cgPSBjb250cm9sX3dvcmQ7CisgIHVfY2hhciBzaWduID0gZ2V0c2lnbihzdDBfcHRyKTsKKworICBjbGVhcl9DMSgpOworICBpZiAoICEoKHN0MF90YWcgXiBUQUdfVmFsaWQpIHwgKHN0MV90YWcgXiBUQUdfVmFsaWQpKSApCisgICAgeworICAgICAgbG9uZyBzY2FsZTsKKyAgICAgIEZQVV9SRUcgdG1wOworCisgICAgICAvKiBDb252ZXJ0IHJlZ2lzdGVyIGZvciBpbnRlcm5hbCB1c2UuICovCisgICAgICBzZXRleHBvbmVudDE2KHN0MF9wdHIsIGV4cG9uZW50KHN0MF9wdHIpKTsKKworICAgIHZhbGlkX3NjYWxlOgorCisgICAgICBpZiAoIGV4cG9uZW50KHN0MV9wdHIpID4gMzAgKQorCXsKKwkgIC8qIDJeMzEgaXMgZmFyIHRvbyBsYXJnZSwgd291bGQgcmVxdWlyZSAyXigyXjMwKSBvciAyXigtMl4zMCkgKi8KKworCSAgaWYgKCBzaWducG9zaXRpdmUoc3QxX3B0cikgKQorCSAgICB7CisJICAgICAgRVhDRVBUSU9OKEVYX092ZXJmbG93KTsKKwkgICAgICBGUFVfY29weV90b19yZWcwKCZDT05TVF9JTkYsIFRBR19TcGVjaWFsKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgRVhDRVBUSU9OKEVYX1VuZGVyZmxvdyk7CisJICAgICAgRlBVX2NvcHlfdG9fcmVnMCgmQ09OU1RfWiwgVEFHX1plcm8pOworCSAgICB9CisJICBzZXRzaWduKHN0MF9wdHIsIHNpZ24pOworCSAgcmV0dXJuOworCX0KKworICAgICAgY29udHJvbF93b3JkICY9IH5DV19SQzsKKyAgICAgIGNvbnRyb2xfd29yZCB8PSBSQ19DSE9QOworICAgICAgcmVnX2NvcHkoc3QxX3B0ciwgJnRtcCk7CisgICAgICBGUFVfcm91bmRfdG9faW50KCZ0bXAsIHN0MV90YWcpOyAgICAgIC8qIFRoaXMgY2FuIG5ldmVyIG92ZXJmbG93IGhlcmUgKi8KKyAgICAgIGNvbnRyb2xfd29yZCA9IG9sZF9jdzsKKyAgICAgIHNjYWxlID0gc2lnbm5lZ2F0aXZlKHN0MV9wdHIpID8gLXRtcC5zaWdsIDogdG1wLnNpZ2w7CisgICAgICBzY2FsZSArPSBleHBvbmVudDE2KHN0MF9wdHIpOworCisgICAgICBzZXRleHBvbmVudDE2KHN0MF9wdHIsIHNjYWxlKTsKKworICAgICAgLyogVXNlIEZQVV9yb3VuZCgpIHRvIHByb3Blcmx5IGRldGVjdCB1bmRlci9vdmVyZmxvdyBldGMgKi8KKyAgICAgIEZQVV9yb3VuZChzdDBfcHRyLCAwLCAwLCBjb250cm9sX3dvcmQsIHNpZ24pOworCisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmICggc3QwX3RhZyA9PSBUQUdfU3BlY2lhbCApCisgICAgc3QwX3RhZyA9IEZQVV9TcGVjaWFsKHN0MF9wdHIpOworICBpZiAoIHN0MV90YWcgPT0gVEFHX1NwZWNpYWwgKQorICAgIHN0MV90YWcgPSBGUFVfU3BlY2lhbChzdDFfcHRyKTsKKworICBpZiAoIChzdDBfdGFnID09IFRBR19WYWxpZCkgfHwgKHN0MF90YWcgPT0gVFdfRGVub3JtYWwpICkKKyAgICB7CisgICAgICBzd2l0Y2ggKCBzdDFfdGFnICkKKwl7CisJY2FzZSBUQUdfVmFsaWQ6CisJICAvKiBzdCgwKSBtdXN0IGJlIGEgZGVub3JtYWwgKi8KKwkgIGlmICggKHN0MF90YWcgPT0gVFdfRGVub3JtYWwpICYmIChkZW5vcm1hbF9vcGVyYW5kKCkgPCAwKSApCisJICAgIHJldHVybjsKKworCSAgRlBVX3RvX2V4cDE2KHN0MF9wdHIsIHN0MF9wdHIpOyAgLyogV2lsbCBub3QgYmUgbGVmdCBvbiBzdGFjayAqLworCSAgZ290byB2YWxpZF9zY2FsZTsKKworCWNhc2UgVEFHX1plcm86CisJICBpZiAoIHN0MF90YWcgPT0gVFdfRGVub3JtYWwgKQorCSAgICBkZW5vcm1hbF9vcGVyYW5kKCk7CisJICByZXR1cm47CisKKwljYXNlIFRXX0Rlbm9ybWFsOgorCSAgZGVub3JtYWxfb3BlcmFuZCgpOworCSAgcmV0dXJuOworCisJY2FzZSBUV19JbmZpbml0eToKKwkgIGlmICggKHN0MF90YWcgPT0gVFdfRGVub3JtYWwpICYmIChkZW5vcm1hbF9vcGVyYW5kKCkgPCAwKSApCisJICAgIHJldHVybjsKKworCSAgaWYgKCBzaWducG9zaXRpdmUoc3QxX3B0cikgKQorCSAgICBGUFVfY29weV90b19yZWcwKCZDT05TVF9JTkYsIFRBR19TcGVjaWFsKTsKKwkgIGVsc2UKKwkgICAgRlBVX2NvcHlfdG9fcmVnMCgmQ09OU1RfWiwgVEFHX1plcm8pOworCSAgc2V0c2lnbihzdDBfcHRyLCBzaWduKTsKKwkgIHJldHVybjsKKworCWNhc2UgVFdfTmFOOgorCSAgcmVhbF8yb3BfTmFOKHN0MV9wdHIsIHN0MV90YWcsIDAsIHN0MF9wdHIpOworCSAgcmV0dXJuOworCX0KKyAgICB9CisgIGVsc2UgaWYgKCBzdDBfdGFnID09IFRBR19aZXJvICkKKyAgICB7CisgICAgICBzd2l0Y2ggKCBzdDFfdGFnICkKKwl7CisJY2FzZSBUQUdfVmFsaWQ6CisJY2FzZSBUQUdfWmVybzoKKwkgIHJldHVybjsKKworCWNhc2UgVFdfRGVub3JtYWw6CisJICBkZW5vcm1hbF9vcGVyYW5kKCk7CisJICByZXR1cm47CisKKwljYXNlIFRXX0luZmluaXR5OgorCSAgaWYgKCBzaWducG9zaXRpdmUoc3QxX3B0cikgKQorCSAgICBhcml0aF9pbnZhbGlkKDApOyAvKiBaZXJvIHNjYWxlZCBieSArSW5maW5pdHkgKi8KKwkgIHJldHVybjsKKworCWNhc2UgVFdfTmFOOgorCSAgcmVhbF8yb3BfTmFOKHN0MV9wdHIsIHN0MV90YWcsIDAsIHN0MF9wdHIpOworCSAgcmV0dXJuOworCX0KKyAgICB9CisgIGVsc2UgaWYgKCBzdDBfdGFnID09IFRXX0luZmluaXR5ICkKKyAgICB7CisgICAgICBzd2l0Y2ggKCBzdDFfdGFnICkKKwl7CisJY2FzZSBUQUdfVmFsaWQ6CisJY2FzZSBUQUdfWmVybzoKKwkgIHJldHVybjsKKworCWNhc2UgVFdfRGVub3JtYWw6CisJICBkZW5vcm1hbF9vcGVyYW5kKCk7CisJICByZXR1cm47CisKKwljYXNlIFRXX0luZmluaXR5OgorCSAgaWYgKCBzaWdubmVnYXRpdmUoc3QxX3B0cikgKQorCSAgICBhcml0aF9pbnZhbGlkKDApOyAvKiBJbmZpbml0eSBzY2FsZWQgYnkgLUluZmluaXR5ICovCisJICByZXR1cm47CisKKwljYXNlIFRXX05hTjoKKwkgIHJlYWxfMm9wX05hTihzdDFfcHRyLCBzdDFfdGFnLCAwLCBzdDBfcHRyKTsKKwkgIHJldHVybjsKKwl9CisgICAgfQorICBlbHNlIGlmICggc3QwX3RhZyA9PSBUV19OYU4gKQorICAgIHsKKyAgICAgIGlmICggc3QxX3RhZyAhPSBUQUdfRW1wdHkgKQorCXsgcmVhbF8yb3BfTmFOKHN0MV9wdHIsIHN0MV90YWcsIDAsIHN0MF9wdHIpOyByZXR1cm47IH0KKyAgICB9CisKKyNpZmRlZiBQQVJBTk9JRAorICBpZiAoICEoKHN0MF90YWcgPT0gVEFHX0VtcHR5KSB8fCAoc3QxX3RhZyA9PSBUQUdfRW1wdHkpKSApCisgICAgeworICAgICAgRVhDRVBUSU9OKEVYX0lOVEVSTkFMIHwgMHgxMTUpOworICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisgIC8qIEF0IGxlYXN0IG9uZSBvZiBzdCgwKSwgc3QoMSkgbXVzdCBiZSBlbXB0eSAqLworICBGUFVfc3RhY2tfdW5kZXJmbG93KCk7CisKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBGVU5DX1NUMCBjb25zdCB0cmlnX3RhYmxlX2FbXSA9IHsKKyAgZjJ4bTEsIGZ5bDJ4LCBmcHRhbiwgZnBhdGFuLAorICBmeHRyYWN0LCBmcHJlbTEsIChGVU5DX1NUMClmZGVjc3RwLCAoRlVOQ19TVDApZmluY3N0cAorfTsKKwordm9pZCBGUFVfdHJpZ2Eodm9pZCkKK3sKKyAgKHRyaWdfdGFibGVfYVtGUFVfcm1dKSgmc3QoMCksIEZQVV9nZXR0YWcwKCkpOworfQorCisKK3N0YXRpYyBGVU5DX1NUMCBjb25zdCB0cmlnX3RhYmxlX2JbXSA9CisgIHsKKyAgICBmcHJlbSwgZnlsMnhwMSwgZnNxcnRfLCBmc2luY29zLCBmcm5kaW50XywgZnNjYWxlLCAoRlVOQ19TVDApZnNpbiwgZmNvcworICB9OworCit2b2lkIEZQVV90cmlnYih2b2lkKQoreworICAodHJpZ190YWJsZV9iW0ZQVV9ybV0pKCZzdCgwKSwgRlBVX2dldHRhZzAoKSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWF0aC1lbXUvZ2V0X2FkZHJlc3MuYyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9nZXRfYWRkcmVzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMTc1NzMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWF0aC1lbXUvZ2V0X2FkZHJlc3MuYwpAQCAtMCwwICsxLDQ0OSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgZ2V0X2FkZHJlc3MuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgR2V0IHRoZSBlZmZlY3RpdmUgYWRkcmVzcyBmcm9tIGFuIEZQVSBpbnN0cnVjdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENvcHlyaWdodCAoQykgMTk5MiwxOTkzLDE5OTQsMTk5NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgQXVzdHJhbGlhLiAgRS1tYWlsICAgYmlsbG1Ac3VidXJiaWEubmV0ICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgTm90ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICBUaGUgZmlsZSBjb250YWlucyBjb2RlIHdoaWNoIGFjY2Vzc2VzIHVzZXIgbWVtb3J5LiAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgIEVtdWxhdG9yIHN0YXRpYyBkYXRhIG1heSBjaGFuZ2Ugd2hlbiB1c2VyIG1lbW9yeSBpcyBhY2Nlc3NlZCwgZHVlIHRvICAgfAorIHwgICAgb3RoZXIgcHJvY2Vzc2VzIHVzaW5nIHRoZSBlbXVsYXRvciB3aGlsZSBzd2FwcGluZyBpcyBpbiBwcm9ncmVzcy4gICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vZGVzYy5oPgorCisjaW5jbHVkZSAiZnB1X3N5c3RlbS5oIgorI2luY2x1ZGUgImV4Y2VwdGlvbi5oIgorI2luY2x1ZGUgImZwdV9lbXUuaCIKKworCisjZGVmaW5lIEZQVV9XUklURV9CSVQgMHgxMAorCitzdGF0aWMgaW50IHJlZ19vZmZzZXRbXSA9IHsKKwlvZmZzZXRvZihzdHJ1Y3QgaW5mbyxfX19lYXgpLAorCW9mZnNldG9mKHN0cnVjdCBpbmZvLF9fX2VjeCksCisJb2Zmc2V0b2Yoc3RydWN0IGluZm8sX19fZWR4KSwKKwlvZmZzZXRvZihzdHJ1Y3QgaW5mbyxfX19lYngpLAorCW9mZnNldG9mKHN0cnVjdCBpbmZvLF9fX2VzcCksCisJb2Zmc2V0b2Yoc3RydWN0IGluZm8sX19fZWJwKSwKKwlvZmZzZXRvZihzdHJ1Y3QgaW5mbyxfX19lc2kpLAorCW9mZnNldG9mKHN0cnVjdCBpbmZvLF9fX2VkaSkKK307CisKKyNkZWZpbmUgUkVHXyh4KSAoKihsb25nICopKHJlZ19vZmZzZXRbKHgpXSsodV9jaGFyICopIEZQVV9pbmZvKSkKKworc3RhdGljIGludCByZWdfb2Zmc2V0X3ZtODZbXSA9IHsKKwlvZmZzZXRvZihzdHJ1Y3QgaW5mbyxfX19jcyksCisJb2Zmc2V0b2Yoc3RydWN0IGluZm8sX19fdm04Nl9kcyksCisJb2Zmc2V0b2Yoc3RydWN0IGluZm8sX19fdm04Nl9lcyksCisJb2Zmc2V0b2Yoc3RydWN0IGluZm8sX19fdm04Nl9mcyksCisJb2Zmc2V0b2Yoc3RydWN0IGluZm8sX19fdm04Nl9ncyksCisJb2Zmc2V0b2Yoc3RydWN0IGluZm8sX19fc3MpLAorCW9mZnNldG9mKHN0cnVjdCBpbmZvLF9fX3ZtODZfZHMpCisgICAgICB9OworCisjZGVmaW5lIFZNODZfUkVHXyh4KSAoKih1bnNpZ25lZCBzaG9ydCAqKSBcCisJCSAgICAgIChyZWdfb2Zmc2V0X3ZtODZbKCh1bnNpZ25lZCl4KV0rKHVfY2hhciAqKSBGUFVfaW5mbykpCisKKy8qIFRoZXNlIGFyZSBkdW1teSwgZnMgYW5kIGdzIGFyZSBub3Qgc2F2ZWQgb24gdGhlIHN0YWNrLiAqLworI2RlZmluZSBfX19GUyBfX19kcworI2RlZmluZSBfX19HUyBfX19kcworCitzdGF0aWMgaW50IHJlZ19vZmZzZXRfcG1bXSA9IHsKKwlvZmZzZXRvZihzdHJ1Y3QgaW5mbyxfX19jcyksCisJb2Zmc2V0b2Yoc3RydWN0IGluZm8sX19fZHMpLAorCW9mZnNldG9mKHN0cnVjdCBpbmZvLF9fX2VzKSwKKwlvZmZzZXRvZihzdHJ1Y3QgaW5mbyxfX19GUyksCisJb2Zmc2V0b2Yoc3RydWN0IGluZm8sX19fR1MpLAorCW9mZnNldG9mKHN0cnVjdCBpbmZvLF9fX3NzKSwKKwlvZmZzZXRvZihzdHJ1Y3QgaW5mbyxfX19kcykKKyAgICAgIH07CisKKyNkZWZpbmUgUE1fUkVHXyh4KSAoKih1bnNpZ25lZCBzaG9ydCAqKSBcCisJCSAgICAgIChyZWdfb2Zmc2V0X3BtWygodW5zaWduZWQpeCldKyh1X2NoYXIgKikgRlBVX2luZm8pKQorCisKKy8qIERlY29kZSB0aGUgU0lCIGJ5dGUuIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyBtb2QgIT0gMCAqLworc3RhdGljIGludCBzaWIoaW50IG1vZCwgdW5zaWduZWQgbG9uZyAqZnB1X2VpcCkKK3sKKyAgdV9jaGFyIHNzLGluZGV4LGJhc2U7CisgIGxvbmcgb2Zmc2V0OworCisgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworICBGUFVfY29kZV9hY2Nlc3Nfb2soMSk7CisgIEZQVV9nZXRfdXNlcihiYXNlLCAodV9jaGFyIF9fdXNlciAqKSAoKmZwdV9laXApKTsgICAvKiBUaGUgU0lCIGJ5dGUgKi8KKyAgUkVfRU5UUkFOVF9DSEVDS19PTjsKKyAgKCpmcHVfZWlwKSsrOworICBzcyA9IGJhc2UgPj4gNjsKKyAgaW5kZXggPSAoYmFzZSA+PiAzKSAmIDc7CisgIGJhc2UgJj0gNzsKKworICBpZiAoKG1vZCA9PSAwKSAmJiAoYmFzZSA9PSA1KSkKKyAgICBvZmZzZXQgPSAwOyAgICAgICAgICAgICAgLyogTm8gYmFzZSByZWdpc3RlciAqLworICBlbHNlCisgICAgb2Zmc2V0ID0gUkVHXyhiYXNlKTsKKworICBpZiAoaW5kZXggPT0gNCkKKyAgICB7CisgICAgICAvKiBObyBpbmRleCByZWdpc3RlciAqLworICAgICAgLyogQSBub24temVybyBzcyBpcyBpbGxlZ2FsICovCisgICAgICBpZiAoIHNzICkKKwlFWENFUFRJT04oRVhfSW52YWxpZCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgb2Zmc2V0ICs9IChSRUdfKGluZGV4KSkgPDwgc3M7CisgICAgfQorCisgIGlmIChtb2QgPT0gMSkKKyAgICB7CisgICAgICAvKiA4IGJpdCBzaWduZWQgZGlzcGxhY2VtZW50ICovCisgICAgICBsb25nIGRpc3BsYWNlbWVudDsKKyAgICAgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworICAgICAgRlBVX2NvZGVfYWNjZXNzX29rKDEpOworICAgICAgRlBVX2dldF91c2VyKGRpc3BsYWNlbWVudCwgKHNpZ25lZCBjaGFyIF9fdXNlciAqKSAoKmZwdV9laXApKTsKKyAgICAgIG9mZnNldCArPSBkaXNwbGFjZW1lbnQ7CisgICAgICBSRV9FTlRSQU5UX0NIRUNLX09OOworICAgICAgKCpmcHVfZWlwKSsrOworICAgIH0KKyAgZWxzZSBpZiAobW9kID09IDIgfHwgYmFzZSA9PSA1KSAvKiBUaGUgc2Vjb25kIGNvbmRpdGlvbiBhbHNvIGhhcyBtb2Q9PTAgKi8KKyAgICB7CisgICAgICAvKiAzMiBiaXQgZGlzcGxhY2VtZW50ICovCisgICAgICBsb25nIGRpc3BsYWNlbWVudDsKKyAgICAgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworICAgICAgRlBVX2NvZGVfYWNjZXNzX29rKDQpOworICAgICAgRlBVX2dldF91c2VyKGRpc3BsYWNlbWVudCwgKGxvbmcgX191c2VyICopICgqZnB1X2VpcCkpOworICAgICAgb2Zmc2V0ICs9IGRpc3BsYWNlbWVudDsKKyAgICAgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CisgICAgICAoKmZwdV9laXApICs9IDQ7CisgICAgfQorCisgIHJldHVybiBvZmZzZXQ7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgdm04Nl9zZWdtZW50KHVfY2hhciBzZWdtZW50LAorCQkJCSAgc3RydWN0IGFkZHJlc3MgKmFkZHIpCit7CisgIHNlZ21lbnQtLTsKKyNpZmRlZiBQQVJBTk9JRAorICBpZiAoIHNlZ21lbnQgPiBQUkVGSVhfU1NfICkKKyAgICB7CisgICAgICBFWENFUFRJT04oRVhfSU5URVJOQUx8MHgxMzApOworICAgICAgbWF0aF9hYm9ydChGUFVfaW5mbyxTSUdTRUdWKTsKKyAgICB9CisjZW5kaWYgLyogUEFSQU5PSUQgKi8KKyAgYWRkci0+c2VsZWN0b3IgPSBWTTg2X1JFR18oc2VnbWVudCk7CisgIHJldHVybiAodW5zaWduZWQgbG9uZylWTTg2X1JFR18oc2VnbWVudCkgPDwgNDsKK30KKworCisvKiBUaGlzIHNob3VsZCB3b3JrIGZvciAxNiBhbmQgMzIgYml0IHByb3RlY3RlZCBtb2RlLiAqLworc3RhdGljIGxvbmcgcG1fYWRkcmVzcyh1X2NoYXIgRlBVX21vZHJtLCB1X2NoYXIgc2VnbWVudCwKKwkJICAgICAgIHN0cnVjdCBhZGRyZXNzICphZGRyLCBsb25nIG9mZnNldCkKK3sgCisgIHN0cnVjdCBkZXNjX3N0cnVjdCBkZXNjcmlwdG9yOworICB1bnNpZ25lZCBsb25nIGJhc2VfYWRkcmVzcywgbGltaXQsIGFkZHJlc3MsIHNlZ190b3A7CisgIHVuc2lnbmVkIHNob3J0IHNlbGVjdG9yOworCisgIHNlZ21lbnQtLTsKKworI2lmZGVmIFBBUkFOT0lECisgIC8qIHNlZ21lbnQgaXMgdW5zaWduZWQsIHNvIHRoaXMgYWxzbyBkZXRlY3RzIGlmIHNlZ21lbnQgd2FzIDA6ICovCisgIGlmICggc2VnbWVudCA+IFBSRUZJWF9TU18gKQorICAgIHsKKyAgICAgIEVYQ0VQVElPTihFWF9JTlRFUk5BTHwweDEzMik7CisgICAgICBtYXRoX2Fib3J0KEZQVV9pbmZvLFNJR1NFR1YpOworICAgIH0KKyNlbmRpZiAvKiBQQVJBTk9JRCAqLworCisgIHN3aXRjaCAoIHNlZ21lbnQgKQorICAgIHsKKyAgICAgIC8qIGZzIGFuZCBncyBhcmVuJ3QgdXNlZCBieSB0aGUga2VybmVsLCBzbyB0aGV5IHN0aWxsIGhhdmUgdGhlaXIKKwkgdXNlci1zcGFjZSB2YWx1ZXMuICovCisgICAgY2FzZSBQUkVGSVhfRlNfLTE6CisgICAgICAvKiBUaGUgY2FzdCBpcyBuZWVkZWQgaGVyZSB0byBnZXQgZ2NjIDIuOC4wIHRvIHVzZSBhIDE2IGJpdCByZWdpc3RlcgorCSBpbiB0aGUgYXNzZW1ibGVyIHN0YXRlbWVudC4gKi8KKworICAgICAgX19hc21fXygibW92ICUlZnMsJTAiOiI9ciIgKHNlbGVjdG9yKSk7CisgICAgICBhZGRyLT5zZWxlY3RvciA9IHNlbGVjdG9yOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUkVGSVhfR1NfLTE6CisgICAgICAvKiBUaGUgY2FzdCBpcyBuZWVkZWQgaGVyZSB0byBnZXQgZ2NjIDIuOC4wIHRvIHVzZSBhIDE2IGJpdCByZWdpc3RlcgorCSBpbiB0aGUgYXNzZW1ibGVyIHN0YXRlbWVudC4gKi8KKyAgICAgIF9fYXNtX18oIm1vdiAlJWdzLCUwIjoiPXIiIChzZWxlY3RvcikpOworICAgICAgYWRkci0+c2VsZWN0b3IgPSBzZWxlY3RvcjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBhZGRyLT5zZWxlY3RvciA9IFBNX1JFR18oc2VnbWVudCk7CisgICAgfQorCisgIGRlc2NyaXB0b3IgPSBMRFRfREVTQ1JJUFRPUihQTV9SRUdfKHNlZ21lbnQpKTsKKyAgYmFzZV9hZGRyZXNzID0gU0VHX0JBU0VfQUREUihkZXNjcmlwdG9yKTsKKyAgYWRkcmVzcyA9IGJhc2VfYWRkcmVzcyArIG9mZnNldDsKKyAgbGltaXQgPSBiYXNlX2FkZHJlc3MKKwkrIChTRUdfTElNSVQoZGVzY3JpcHRvcikrMSkgKiBTRUdfR1JBTlVMQVJJVFkoZGVzY3JpcHRvcikgLSAxOworICBpZiAoIGxpbWl0IDwgYmFzZV9hZGRyZXNzICkgbGltaXQgPSAweGZmZmZmZmZmOworCisgIGlmICggU0VHX0VYUEFORF9ET1dOKGRlc2NyaXB0b3IpICkKKyAgICB7CisgICAgICBpZiAoIFNFR19HX0JJVChkZXNjcmlwdG9yKSApCisJc2VnX3RvcCA9IDB4ZmZmZmZmZmY7CisgICAgICBlbHNlCisJeworCSAgc2VnX3RvcCA9IGJhc2VfYWRkcmVzcyArICgxIDw8IDIwKTsKKwkgIGlmICggc2VnX3RvcCA8IGJhc2VfYWRkcmVzcyApIHNlZ190b3AgPSAweGZmZmZmZmZmOworCX0KKyAgICAgIGFjY2Vzc19saW1pdCA9CisJKGFkZHJlc3MgPD0gbGltaXQpIHx8IChhZGRyZXNzID49IHNlZ190b3ApID8gMCA6CisJICAoKHNlZ190b3AtYWRkcmVzcykgPj0gMjU1ID8gMjU1IDogc2VnX3RvcC1hZGRyZXNzKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBhY2Nlc3NfbGltaXQgPQorCShhZGRyZXNzID4gbGltaXQpIHx8IChhZGRyZXNzIDwgYmFzZV9hZGRyZXNzKSA/IDAgOgorCSAgKChsaW1pdC1hZGRyZXNzKSA+PSAyNTQgPyAyNTUgOiBsaW1pdC1hZGRyZXNzKzEpOworICAgIH0KKyAgaWYgKCBTRUdfRVhFQ1VURV9PTkxZKGRlc2NyaXB0b3IpIHx8CisgICAgICAoIVNFR19XUklURV9QRVJNKGRlc2NyaXB0b3IpICYmIChGUFVfbW9kcm0gJiBGUFVfV1JJVEVfQklUKSkgKQorICAgIHsKKyAgICAgIGFjY2Vzc19saW1pdCA9IDA7CisgICAgfQorICByZXR1cm4gYWRkcmVzczsKK30KKworCisvKgorICAgICAgIE1PRCBSL00gYnl0ZTogIE1PRCA9PSAzIGhhcyBhIHNwZWNpYWwgdXNlIGZvciB0aGUgRlBVCisgICAgICAgICAgICAgICAgICAgICAgU0lCIGJ5dGUgdXNlZCBpZmYgUi9NID0gMTAwYgorCisgICAgICAgNyAgIDYgICA1ICAgNCAgIDMgICAyICAgMSAgIDAKKyAgICAgICAuLi4uLiAgIC4uLi4uLi4uLiAgIC4uLi4uLi4uLgorICAgICAgICBNT0QgICAgT1BDT0RFKDIpICAgICBSL00KKworCisgICAgICAgU0lCIGJ5dGUKKworICAgICAgIDcgICA2ICAgNSAgIDQgICAzICAgMiAgIDEgICAwCisgICAgICAgLi4uLi4gICAuLi4uLi4uLi4gICAuLi4uLi4uLi4KKyAgICAgICAgU1MgICAgICBJTkRFWCAgICAgICAgQkFTRQorCisqLworCit2b2lkIF9fdXNlciAqRlBVX2dldF9hZGRyZXNzKHVfY2hhciBGUFVfbW9kcm0sIHVuc2lnbmVkIGxvbmcgKmZwdV9laXAsCisJCSAgc3RydWN0IGFkZHJlc3MgKmFkZHIsCisJCSAgZnB1X2FkZHJfbW9kZXMgYWRkcl9tb2RlcykKK3sKKyAgdV9jaGFyIG1vZDsKKyAgdW5zaWduZWQgcm0gPSBGUFVfbW9kcm0gJiA3OworICBsb25nICpjcHVfcmVnX3B0cjsKKyAgaW50IGFkZHJlc3MgPSAwOyAgICAgLyogSW5pdGlhbGl6ZWQganVzdCB0byBzdG9wIGNvbXBpbGVyIHdhcm5pbmdzLiAqLworCisgIC8qIE1lbW9yeSBhY2Nlc3NlZCB2aWEgdGhlIGNzIHNlbGVjdG9yIGlzIHdyaXRlIHByb3RlY3RlZAorICAgICBpbiBgbm9uLXNlZ21lbnRlZCcgMzIgYml0IHByb3RlY3RlZCBtb2RlLiAqLworICBpZiAoICFhZGRyX21vZGVzLmRlZmF1bHRfbW9kZSAmJiAoRlBVX21vZHJtICYgRlBVX1dSSVRFX0JJVCkKKyAgICAgICYmIChhZGRyX21vZGVzLm92ZXJyaWRlLnNlZ21lbnQgPT0gUFJFRklYX0NTXykgKQorICAgIHsKKyAgICAgIG1hdGhfYWJvcnQoRlBVX2luZm8sU0lHU0VHVik7CisgICAgfQorCisgIGFkZHItPnNlbGVjdG9yID0gRlBVX0RTOyAgIC8qIERlZmF1bHQsIGZvciAzMiBiaXQgbm9uLXNlZ21lbnRlZCBtb2RlLiAqLworCisgIG1vZCA9IChGUFVfbW9kcm0gPj4gNikgJiAzOworCisgIGlmIChybSA9PSA0ICYmIG1vZCAhPSAzKQorICAgIHsKKyAgICAgIGFkZHJlc3MgPSBzaWIobW9kLCBmcHVfZWlwKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBjcHVfcmVnX3B0ciA9ICYgUkVHXyhybSk7CisgICAgICBzd2l0Y2ggKG1vZCkKKwl7CisJY2FzZSAwOgorCSAgaWYgKHJtID09IDUpCisJICAgIHsKKwkgICAgICAvKiBTcGVjaWFsIGNhc2U6IGRpc3AzMiAqLworCSAgICAgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworCSAgICAgIEZQVV9jb2RlX2FjY2Vzc19vayg0KTsKKwkgICAgICBGUFVfZ2V0X3VzZXIoYWRkcmVzcywgKHVuc2lnbmVkIGxvbmcgX191c2VyICopICgqZnB1X2VpcCkpOworCSAgICAgICgqZnB1X2VpcCkgKz0gNDsKKwkgICAgICBSRV9FTlRSQU5UX0NIRUNLX09OOworCSAgICAgIGFkZHItPm9mZnNldCA9IGFkZHJlc3M7CisJICAgICAgcmV0dXJuICh2b2lkIF9fdXNlciAqKSBhZGRyZXNzOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBhZGRyZXNzID0gKmNwdV9yZWdfcHRyOyAgLyogSnVzdCByZXR1cm4gdGhlIGNvbnRlbnRzCisJCQkJCSAgb2YgdGhlIGNwdSByZWdpc3RlciAqLworCSAgICAgIGFkZHItPm9mZnNldCA9IGFkZHJlc3M7CisJICAgICAgcmV0dXJuICh2b2lkIF9fdXNlciAqKSBhZGRyZXNzOworCSAgICB9CisJY2FzZSAxOgorCSAgLyogOCBiaXQgc2lnbmVkIGRpc3BsYWNlbWVudCAqLworCSAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisJICBGUFVfY29kZV9hY2Nlc3Nfb2soMSk7CisJICBGUFVfZ2V0X3VzZXIoYWRkcmVzcywgKHNpZ25lZCBjaGFyIF9fdXNlciAqKSAoKmZwdV9laXApKTsKKwkgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CisJICAoKmZwdV9laXApKys7CisJICBicmVhazsKKwljYXNlIDI6CisJICAvKiAzMiBiaXQgZGlzcGxhY2VtZW50ICovCisJICBSRV9FTlRSQU5UX0NIRUNLX09GRjsKKwkgIEZQVV9jb2RlX2FjY2Vzc19vayg0KTsKKwkgIEZQVV9nZXRfdXNlcihhZGRyZXNzLCAobG9uZyBfX3VzZXIgKikgKCpmcHVfZWlwKSk7CisJICAoKmZwdV9laXApICs9IDQ7CisJICBSRV9FTlRSQU5UX0NIRUNLX09OOworCSAgYnJlYWs7CisJY2FzZSAzOgorCSAgLyogTm90IGxlZ2FsIGZvciB0aGUgRlBVICovCisJICBFWENFUFRJT04oRVhfSW52YWxpZCk7CisJfQorICAgICAgYWRkcmVzcyArPSAqY3B1X3JlZ19wdHI7CisgICAgfQorCisgIGFkZHItPm9mZnNldCA9IGFkZHJlc3M7CisKKyAgc3dpdGNoICggYWRkcl9tb2Rlcy5kZWZhdWx0X21vZGUgKQorICAgIHsKKyAgICBjYXNlIDA6CisgICAgICBicmVhazsKKyAgICBjYXNlIFZNODY6CisgICAgICBhZGRyZXNzICs9IHZtODZfc2VnbWVudChhZGRyX21vZGVzLm92ZXJyaWRlLnNlZ21lbnQsIGFkZHIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQTTE2OgorICAgIGNhc2UgU0VHMzI6CisgICAgICBhZGRyZXNzID0gcG1fYWRkcmVzcyhGUFVfbW9kcm0sIGFkZHJfbW9kZXMub3ZlcnJpZGUuc2VnbWVudCwKKwkJCSAgIGFkZHIsIGFkZHJlc3MpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEVYQ0VQVElPTihFWF9JTlRFUk5BTHwweDEzMyk7CisgICAgfQorCisgIHJldHVybiAodm9pZCBfX3VzZXIgKilhZGRyZXNzOworfQorCisKK3ZvaWQgX191c2VyICpGUFVfZ2V0X2FkZHJlc3NfMTYodV9jaGFyIEZQVV9tb2RybSwgdW5zaWduZWQgbG9uZyAqZnB1X2VpcCwKKwkJICAgICBzdHJ1Y3QgYWRkcmVzcyAqYWRkciwKKwkJICAgICBmcHVfYWRkcl9tb2RlcyBhZGRyX21vZGVzKQoreworICB1X2NoYXIgbW9kOworICB1bnNpZ25lZCBybSA9IEZQVV9tb2RybSAmIDc7CisgIGludCBhZGRyZXNzID0gMDsgICAgIC8qIERlZmF1bHQgdXNlZCBmb3IgbW9kID09IDAgKi8KKworICAvKiBNZW1vcnkgYWNjZXNzZWQgdmlhIHRoZSBjcyBzZWxlY3RvciBpcyB3cml0ZSBwcm90ZWN0ZWQKKyAgICAgaW4gYG5vbi1zZWdtZW50ZWQnIDMyIGJpdCBwcm90ZWN0ZWQgbW9kZS4gKi8KKyAgaWYgKCAhYWRkcl9tb2Rlcy5kZWZhdWx0X21vZGUgJiYgKEZQVV9tb2RybSAmIEZQVV9XUklURV9CSVQpCisgICAgICAmJiAoYWRkcl9tb2Rlcy5vdmVycmlkZS5zZWdtZW50ID09IFBSRUZJWF9DU18pICkKKyAgICB7CisgICAgICBtYXRoX2Fib3J0KEZQVV9pbmZvLFNJR1NFR1YpOworICAgIH0KKworICBhZGRyLT5zZWxlY3RvciA9IEZQVV9EUzsgICAvKiBEZWZhdWx0LCBmb3IgMzIgYml0IG5vbi1zZWdtZW50ZWQgbW9kZS4gKi8KKworICBtb2QgPSAoRlBVX21vZHJtID4+IDYpICYgMzsKKworICBzd2l0Y2ggKG1vZCkKKyAgICB7CisgICAgY2FzZSAwOgorICAgICAgaWYgKHJtID09IDYpCisJeworCSAgLyogU3BlY2lhbCBjYXNlOiBkaXNwMTYgKi8KKwkgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworCSAgRlBVX2NvZGVfYWNjZXNzX29rKDIpOworCSAgRlBVX2dldF91c2VyKGFkZHJlc3MsICh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKikgKCpmcHVfZWlwKSk7CisJICAoKmZwdV9laXApICs9IDI7CisJICBSRV9FTlRSQU5UX0NIRUNLX09OOworCSAgZ290byBhZGRfc2VnbWVudDsKKwl9CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAvKiA4IGJpdCBzaWduZWQgZGlzcGxhY2VtZW50ICovCisgICAgICBSRV9FTlRSQU5UX0NIRUNLX09GRjsKKyAgICAgIEZQVV9jb2RlX2FjY2Vzc19vaygxKTsKKyAgICAgIEZQVV9nZXRfdXNlcihhZGRyZXNzLCAoc2lnbmVkIGNoYXIgX191c2VyICopICgqZnB1X2VpcCkpOworICAgICAgUkVfRU5UUkFOVF9DSEVDS19PTjsKKyAgICAgICgqZnB1X2VpcCkrKzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIC8qIDE2IGJpdCBkaXNwbGFjZW1lbnQgKi8KKyAgICAgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworICAgICAgRlBVX2NvZGVfYWNjZXNzX29rKDIpOworICAgICAgRlBVX2dldF91c2VyKGFkZHJlc3MsICh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKikgKCpmcHVfZWlwKSk7CisgICAgICAoKmZwdV9laXApICs9IDI7CisgICAgICBSRV9FTlRSQU5UX0NIRUNLX09OOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgLyogTm90IGxlZ2FsIGZvciB0aGUgRlBVICovCisgICAgICBFWENFUFRJT04oRVhfSW52YWxpZCk7CisgICAgICBicmVhazsKKyAgICB9CisgIHN3aXRjaCAoIHJtICkKKyAgICB7CisgICAgY2FzZSAwOgorICAgICAgYWRkcmVzcyArPSBGUFVfaW5mby0+X19fZWJ4ICsgRlBVX2luZm8tPl9fX2VzaTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIGFkZHJlc3MgKz0gRlBVX2luZm8tPl9fX2VieCArIEZQVV9pbmZvLT5fX19lZGk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBhZGRyZXNzICs9IEZQVV9pbmZvLT5fX19lYnAgKyBGUFVfaW5mby0+X19fZXNpOworICAgICAgaWYgKCBhZGRyX21vZGVzLm92ZXJyaWRlLnNlZ21lbnQgPT0gUFJFRklYX0RFRkFVTFQgKQorCWFkZHJfbW9kZXMub3ZlcnJpZGUuc2VnbWVudCA9IFBSRUZJWF9TU187CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICBhZGRyZXNzICs9IEZQVV9pbmZvLT5fX19lYnAgKyBGUFVfaW5mby0+X19fZWRpOworICAgICAgaWYgKCBhZGRyX21vZGVzLm92ZXJyaWRlLnNlZ21lbnQgPT0gUFJFRklYX0RFRkFVTFQgKQorCWFkZHJfbW9kZXMub3ZlcnJpZGUuc2VnbWVudCA9IFBSRUZJWF9TU187CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICBhZGRyZXNzICs9IEZQVV9pbmZvLT5fX19lc2k7CisgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICBhZGRyZXNzICs9IEZQVV9pbmZvLT5fX19lZGk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDY6CisgICAgICBhZGRyZXNzICs9IEZQVV9pbmZvLT5fX19lYnA7CisgICAgICBpZiAoIGFkZHJfbW9kZXMub3ZlcnJpZGUuc2VnbWVudCA9PSBQUkVGSVhfREVGQVVMVCApCisJYWRkcl9tb2Rlcy5vdmVycmlkZS5zZWdtZW50ID0gUFJFRklYX1NTXzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNzoKKyAgICAgIGFkZHJlc3MgKz0gRlBVX2luZm8tPl9fX2VieDsKKyAgICAgIGJyZWFrOworICAgIH0KKworIGFkZF9zZWdtZW50OgorICBhZGRyZXNzICY9IDB4ZmZmZjsKKworICBhZGRyLT5vZmZzZXQgPSBhZGRyZXNzOworCisgIHN3aXRjaCAoIGFkZHJfbW9kZXMuZGVmYXVsdF9tb2RlICkKKyAgICB7CisgICAgY2FzZSAwOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBWTTg2OgorICAgICAgYWRkcmVzcyArPSB2bTg2X3NlZ21lbnQoYWRkcl9tb2Rlcy5vdmVycmlkZS5zZWdtZW50LCBhZGRyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUE0xNjoKKyAgICBjYXNlIFNFRzMyOgorICAgICAgYWRkcmVzcyA9IHBtX2FkZHJlc3MoRlBVX21vZHJtLCBhZGRyX21vZGVzLm92ZXJyaWRlLnNlZ21lbnQsCisJCQkgICBhZGRyLCBhZGRyZXNzKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBFWENFUFRJT04oRVhfSU5URVJOQUx8MHgxMzEpOworICAgIH0KKworICByZXR1cm4gKHZvaWQgX191c2VyICopYWRkcmVzcyA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWF0aC1lbXUvbG9hZF9zdG9yZS5jIGIvYXJjaC9pMzg2L21hdGgtZW11L2xvYWRfc3RvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTMxNGJlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L2xvYWRfc3RvcmUuYwpAQCAtMCwwICsxLDI3MCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgbG9hZF9zdG9yZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgVGhpcyBmaWxlIGNvbnRhaW5zIG1vc3Qgb2YgdGhlIGNvZGUgdG8gaW50ZXJwcmV0IHRoZSBGUFUgaW5zdHJ1Y3Rpb25zICAgICB8CisgfCB3aGljaCBsb2FkIGFuZCBzdG9yZSBmcm9tIHVzZXIgbWVtb3J5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTMsMTk5NCwxOTk3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgVy4gTWV0emVudGhlbiwgMjIgUGFya2VyIFN0LCBPcm1vbmQsIFZpYyAzMTYzLCAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICBBdXN0cmFsaWEuICBFLW1haWwgICBiaWxsbUBzdWJ1cmJpYS5uZXQgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCBOb3RlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgIFRoZSBmaWxlIGNvbnRhaW5zIGNvZGUgd2hpY2ggYWNjZXNzZXMgdXNlciBtZW1vcnkuICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgRW11bGF0b3Igc3RhdGljIGRhdGEgbWF5IGNoYW5nZSB3aGVuIHVzZXIgbWVtb3J5IGlzIGFjY2Vzc2VkLCBkdWUgdG8gICB8CisgfCAgICBvdGhlciBwcm9jZXNzZXMgdXNpbmcgdGhlIGVtdWxhdG9yIHdoaWxlIHN3YXBwaW5nIGlzIGluIHByb2dyZXNzLiAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJmcHVfc3lzdGVtLmgiCisjaW5jbHVkZSAiZXhjZXB0aW9uLmgiCisjaW5jbHVkZSAiZnB1X2VtdS5oIgorI2luY2x1ZGUgInN0YXR1c193LmgiCisjaW5jbHVkZSAiY29udHJvbF93LmgiCisKKworI2RlZmluZSBfTk9ORV8gMCAgIC8qIHN0MF9wdHIgZXRjIG5vdCBuZWVkZWQgKi8KKyNkZWZpbmUgX1JFRzBfIDEgICAvKiBXaWxsIGJlIHN0b3Jpbmcgc3QoMCkgKi8KKyNkZWZpbmUgX1BVU0hfIDMgICAvKiBOZWVkIHRvIGNoZWNrIGZvciBzcGFjZSB0byBwdXNoIG9udG8gc3RhY2sgKi8KKyNkZWZpbmUgX251bGxfIDQgICAvKiBGdW5jdGlvbiBpbGxlZ2FsIG9yIG5vdCBpbXBsZW1lbnRlZCAqLworCisjZGVmaW5lIHBvcF8wKCkJeyBGUFVfc2V0dGFnMChUQUdfRW1wdHkpOyB0b3ArKzsgfQorCisKK3N0YXRpYyB1X2NoYXIgY29uc3QgdHlwZV90YWJsZVszMl0gPSB7CisgIF9QVVNIXywgX1BVU0hfLCBfUFVTSF8sIF9QVVNIXywKKyAgX251bGxfLCBfbnVsbF8sIF9udWxsXywgX251bGxfLAorICBfUkVHMF8sIF9SRUcwXywgX1JFRzBfLCBfUkVHMF8sCisgIF9SRUcwXywgX1JFRzBfLCBfUkVHMF8sIF9SRUcwXywKKyAgX05PTkVfLCBfbnVsbF8sIF9OT05FXywgX1BVU0hfLAorICBfTk9ORV8sIF9QVVNIXywgX251bGxfLCBfUFVTSF8sCisgIF9OT05FXywgX251bGxfLCBfTk9ORV8sIF9SRUcwXywKKyAgX05PTkVfLCBfUkVHMF8sIF9OT05FXywgX1JFRzBfCisgIH07CisKK3VfY2hhciBjb25zdCBkYXRhX3NpemVzXzE2WzMyXSA9IHsKKyAgNCwgIDQsICA4LCAgMiwgIDAsICAwLCAgMCwgIDAsCisgIDQsICA0LCAgOCwgIDIsICA0LCAgNCwgIDgsICAyLAorICAxNCwgMCwgOTQsIDEwLCAgMiwgMTAsICAwLCAgOCwgIAorICAxNCwgMCwgOTQsIDEwLCAgMiwgMTAsICAyLCAgOAorfTsKKworc3RhdGljIHVfY2hhciBjb25zdCBkYXRhX3NpemVzXzMyWzMyXSA9IHsKKyAgNCwgIDQsICA4LCAgMiwgIDAsICAwLCAgMCwgIDAsCisgIDQsICA0LCAgOCwgIDIsICA0LCAgNCwgIDgsICAyLAorICAyOCwgMCwxMDgsIDEwLCAgMiwgMTAsICAwLCAgOCwgIAorICAyOCwgMCwxMDgsIDEwLCAgMiwgMTAsICAyLCAgOAorfTsKKworaW50IEZQVV9sb2FkX3N0b3JlKHVfY2hhciB0eXBlLCBmcHVfYWRkcl9tb2RlcyBhZGRyX21vZGVzLAorCQkgICAgIHZvaWQgX191c2VyICpkYXRhX2FkZHJlc3MpCit7CisgIEZQVV9SRUcgbG9hZGVkX2RhdGE7CisgIEZQVV9SRUcgKnN0MF9wdHI7CisgIHVfY2hhciBzdDBfdGFnID0gVEFHX0VtcHR5OyAgLyogVGhpcyBpcyBqdXN0IHRvIHN0b3AgYSBnY2Mgd2FybmluZy4gKi8KKyAgdV9jaGFyIGxvYWRlZF90YWc7CisKKyAgc3QwX3B0ciA9IE5VTEw7ICAgIC8qIEluaXRpYWxpemVkIGp1c3QgdG8gc3RvcCBjb21waWxlciB3YXJuaW5ncy4gKi8KKworICBpZiAoIGFkZHJfbW9kZXMuZGVmYXVsdF9tb2RlICYgUFJPVEVDVEVEICkKKyAgICB7CisgICAgICBpZiAoIGFkZHJfbW9kZXMuZGVmYXVsdF9tb2RlID09IFNFRzMyICkKKwl7CisJICBpZiAoIGFjY2Vzc19saW1pdCA8IGRhdGFfc2l6ZXNfMzJbdHlwZV0gKQorCSAgICBtYXRoX2Fib3J0KEZQVV9pbmZvLFNJR1NFR1YpOworCX0KKyAgICAgIGVsc2UgaWYgKCBhZGRyX21vZGVzLmRlZmF1bHRfbW9kZSA9PSBQTTE2ICkKKwl7CisJICBpZiAoIGFjY2Vzc19saW1pdCA8IGRhdGFfc2l6ZXNfMTZbdHlwZV0gKQorCSAgICBtYXRoX2Fib3J0KEZQVV9pbmZvLFNJR1NFR1YpOworCX0KKyNpZmRlZiBQQVJBTk9JRAorICAgICAgZWxzZQorCUVYQ0VQVElPTihFWF9JTlRFUk5BTHwweDE0MCk7CisjZW5kaWYgLyogUEFSQU5PSUQgKi8KKyAgICB9CisKKyAgc3dpdGNoICggdHlwZV90YWJsZVt0eXBlXSApCisgICAgeworICAgIGNhc2UgX05PTkVfOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBfUkVHMF86CisgICAgICBzdDBfcHRyID0gJnN0KDApOyAgICAgICAvKiBTb21lIG9mIHRoZXNlIGluc3RydWN0aW9ucyBwb3AgYWZ0ZXIKKwkJCQkgc3RvcmluZyAqLworICAgICAgc3QwX3RhZyA9IEZQVV9nZXR0YWcwKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIF9QVVNIXzoKKyAgICAgIHsKKwlpZiAoIEZQVV9nZXR0YWdpKC0xKSAhPSBUQUdfRW1wdHkgKQorCSAgeyBGUFVfc3RhY2tfb3ZlcmZsb3coKTsgcmV0dXJuIDA7IH0KKwl0b3AtLTsKKwlzdDBfcHRyID0gJnN0KDApOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBfbnVsbF86CisgICAgICBGUFVfaWxsZWdhbCgpOworICAgICAgcmV0dXJuIDA7CisjaWZkZWYgUEFSQU5PSUQKKyAgICBkZWZhdWx0OgorICAgICAgRVhDRVBUSU9OKEVYX0lOVEVSTkFMfDB4MTQxKTsKKyAgICAgIHJldHVybiAwOworI2VuZGlmIC8qIFBBUkFOT0lEICovCisgICAgfQorCisgIHN3aXRjaCAoIHR5cGUgKQorICAgIHsKKyAgICBjYXNlIDAwMDogICAgICAgLyogZmxkIG0zMnJlYWwgKi8KKyAgICAgIGNsZWFyX0MxKCk7CisgICAgICBsb2FkZWRfdGFnID0gRlBVX2xvYWRfc2luZ2xlKChmbG9hdCBfX3VzZXIgKilkYXRhX2FkZHJlc3MsICZsb2FkZWRfZGF0YSk7CisgICAgICBpZiAoIChsb2FkZWRfdGFnID09IFRBR19TcGVjaWFsKQorCSAgICYmIGlzTmFOKCZsb2FkZWRfZGF0YSkKKwkgICAmJiAocmVhbF8xb3BfTmFOKCZsb2FkZWRfZGF0YSkgPCAwKSApCisJeworCSAgdG9wKys7CisJICBicmVhazsKKwl9CisgICAgICBGUFVfY29weV90b19yZWcwKCZsb2FkZWRfZGF0YSwgbG9hZGVkX3RhZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDAwMTogICAgICAvKiBmaWxkIG0zMmludCAqLworICAgICAgY2xlYXJfQzEoKTsKKyAgICAgIGxvYWRlZF90YWcgPSBGUFVfbG9hZF9pbnQzMigobG9uZyBfX3VzZXIgKilkYXRhX2FkZHJlc3MsICZsb2FkZWRfZGF0YSk7CisgICAgICBGUFVfY29weV90b19yZWcwKCZsb2FkZWRfZGF0YSwgbG9hZGVkX3RhZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDAwMjogICAgICAvKiBmbGQgbTY0cmVhbCAqLworICAgICAgY2xlYXJfQzEoKTsKKyAgICAgIGxvYWRlZF90YWcgPSBGUFVfbG9hZF9kb3VibGUoKGRvdWJsZSBfX3VzZXIgKilkYXRhX2FkZHJlc3MsICZsb2FkZWRfZGF0YSk7CisgICAgICBpZiAoIChsb2FkZWRfdGFnID09IFRBR19TcGVjaWFsKQorCSAgICYmIGlzTmFOKCZsb2FkZWRfZGF0YSkKKwkgICAmJiAocmVhbF8xb3BfTmFOKCZsb2FkZWRfZGF0YSkgPCAwKSApCisJeworCSAgdG9wKys7CisJICBicmVhazsKKwl9CisgICAgICBGUFVfY29weV90b19yZWcwKCZsb2FkZWRfZGF0YSwgbG9hZGVkX3RhZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDAwMzogICAgICAvKiBmaWxkIG0xNmludCAqLworICAgICAgY2xlYXJfQzEoKTsKKyAgICAgIGxvYWRlZF90YWcgPSBGUFVfbG9hZF9pbnQxNigoc2hvcnQgX191c2VyICopZGF0YV9hZGRyZXNzLCAmbG9hZGVkX2RhdGEpOworICAgICAgRlBVX2NvcHlfdG9fcmVnMCgmbG9hZGVkX2RhdGEsIGxvYWRlZF90YWcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAwMTA6ICAgICAgLyogZnN0IG0zMnJlYWwgKi8KKyAgICAgIGNsZWFyX0MxKCk7CisgICAgICBGUFVfc3RvcmVfc2luZ2xlKHN0MF9wdHIsIHN0MF90YWcsIChmbG9hdCBfX3VzZXIgKilkYXRhX2FkZHJlc3MpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAwMTE6ICAgICAgLyogZmlzdCBtMzJpbnQgKi8KKyAgICAgIGNsZWFyX0MxKCk7CisgICAgICBGUFVfc3RvcmVfaW50MzIoc3QwX3B0ciwgc3QwX3RhZywgKGxvbmcgX191c2VyICopZGF0YV9hZGRyZXNzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMDEyOiAgICAgLyogZnN0IG02NHJlYWwgKi8KKyAgICAgIGNsZWFyX0MxKCk7CisgICAgICBGUFVfc3RvcmVfZG91YmxlKHN0MF9wdHIsIHN0MF90YWcsIChkb3VibGUgX191c2VyICopZGF0YV9hZGRyZXNzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMDEzOiAgICAgLyogZmlzdCBtMTZpbnQgKi8KKyAgICAgIGNsZWFyX0MxKCk7CisgICAgICBGUFVfc3RvcmVfaW50MTYoc3QwX3B0ciwgc3QwX3RhZywgKHNob3J0IF9fdXNlciAqKWRhdGFfYWRkcmVzcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDAxNDogICAgIC8qIGZzdHAgbTMycmVhbCAqLworICAgICAgY2xlYXJfQzEoKTsKKyAgICAgIGlmICggRlBVX3N0b3JlX3NpbmdsZShzdDBfcHRyLCBzdDBfdGFnLCAoZmxvYXQgX191c2VyICopZGF0YV9hZGRyZXNzKSApCisJcG9wXzAoKTsgIC8qIHBvcCBvbmx5IGlmIHRoZSBudW1iZXIgd2FzIGFjdHVhbGx5IHN0b3JlZAorCQkgICAgIChzZWUgdGhlIDgwNDg2IG1hbnVhbCBwMTYtMjgpICovCisgICAgICBicmVhazsKKyAgICBjYXNlIDAxNTogICAgIC8qIGZpc3RwIG0zMmludCAqLworICAgICAgY2xlYXJfQzEoKTsKKyAgICAgIGlmICggRlBVX3N0b3JlX2ludDMyKHN0MF9wdHIsIHN0MF90YWcsIChsb25nIF9fdXNlciAqKWRhdGFfYWRkcmVzcykgKQorCXBvcF8wKCk7ICAvKiBwb3Agb25seSBpZiB0aGUgbnVtYmVyIHdhcyBhY3R1YWxseSBzdG9yZWQKKwkJICAgICAoc2VlIHRoZSA4MDQ4NiBtYW51YWwgcDE2LTI4KSAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSAwMTY6ICAgICAvKiBmc3RwIG02NHJlYWwgKi8KKyAgICAgIGNsZWFyX0MxKCk7CisgICAgICBpZiAoIEZQVV9zdG9yZV9kb3VibGUoc3QwX3B0ciwgc3QwX3RhZywgKGRvdWJsZSBfX3VzZXIgKilkYXRhX2FkZHJlc3MpICkKKwlwb3BfMCgpOyAgLyogcG9wIG9ubHkgaWYgdGhlIG51bWJlciB3YXMgYWN0dWFsbHkgc3RvcmVkCisJCSAgICAgKHNlZSB0aGUgODA0ODYgbWFudWFsIHAxNi0yOCkgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMDE3OiAgICAgLyogZmlzdHAgbTE2aW50ICovCisgICAgICBjbGVhcl9DMSgpOworICAgICAgaWYgKCBGUFVfc3RvcmVfaW50MTYoc3QwX3B0ciwgc3QwX3RhZywgKHNob3J0IF9fdXNlciAqKWRhdGFfYWRkcmVzcykgKQorCXBvcF8wKCk7ICAvKiBwb3Agb25seSBpZiB0aGUgbnVtYmVyIHdhcyBhY3R1YWxseSBzdG9yZWQKKwkJICAgICAoc2VlIHRoZSA4MDQ4NiBtYW51YWwgcDE2LTI4KSAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSAwMjA6ICAgICAvKiBmbGRlbnYgIG0xNC8yOGJ5dGUgKi8KKyAgICAgIGZsZGVudihhZGRyX21vZGVzLCAodV9jaGFyIF9fdXNlciAqKWRhdGFfYWRkcmVzcyk7CisgICAgICAvKiBFbnN1cmUgdGhhdCB0aGUgdmFsdWVzIGp1c3QgbG9hZGVkIGFyZSBub3QgY2hhbmdlZCBieQorCSBmaXgtdXAgb3BlcmF0aW9ucy4gKi8KKyAgICAgIHJldHVybiAxOworICAgIGNhc2UgMDIyOiAgICAgLyogZnJzdG9yIG05NC8xMDhieXRlICovCisgICAgICBmcnN0b3IoYWRkcl9tb2RlcywgKHVfY2hhciBfX3VzZXIgKilkYXRhX2FkZHJlc3MpOworICAgICAgLyogRW5zdXJlIHRoYXQgdGhlIHZhbHVlcyBqdXN0IGxvYWRlZCBhcmUgbm90IGNoYW5nZWQgYnkKKwkgZml4LXVwIG9wZXJhdGlvbnMuICovCisgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIDAyMzogICAgIC8qIGZibGQgbTgwZGVjICovCisgICAgICBjbGVhcl9DMSgpOworICAgICAgbG9hZGVkX3RhZyA9IEZQVV9sb2FkX2JjZCgodV9jaGFyIF9fdXNlciAqKWRhdGFfYWRkcmVzcyk7CisgICAgICBGUFVfc2V0dGFnMChsb2FkZWRfdGFnKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMDI0OiAgICAgLyogZmxkY3cgKi8KKyAgICAgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworICAgICAgRlBVX2FjY2Vzc19vayhWRVJJRllfUkVBRCwgZGF0YV9hZGRyZXNzLCAyKTsKKyAgICAgIEZQVV9nZXRfdXNlcihjb250cm9sX3dvcmQsICh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKikgZGF0YV9hZGRyZXNzKTsKKyAgICAgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CisgICAgICBpZiAoIHBhcnRpYWxfc3RhdHVzICYgfmNvbnRyb2xfd29yZCAmIENXX0V4Y2VwdGlvbnMgKQorCXBhcnRpYWxfc3RhdHVzIHw9IChTV19TdW1tYXJ5IHwgU1dfQmFja3dhcmQpOworICAgICAgZWxzZQorCXBhcnRpYWxfc3RhdHVzICY9IH4oU1dfU3VtbWFyeSB8IFNXX0JhY2t3YXJkKTsKKyNpZmRlZiBQRUNVTElBUl80ODYKKyAgICAgIGNvbnRyb2xfd29yZCB8PSAweDQwOyAgLyogQW4gODA0ODYgYXBwZWFycyB0byBhbHdheXMgc2V0IHRoaXMgYml0ICovCisjZW5kaWYgLyogUEVDVUxJQVJfNDg2ICovCisgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIDAyNTogICAgICAvKiBmbGQgbTgwcmVhbCAqLworICAgICAgY2xlYXJfQzEoKTsKKyAgICAgIGxvYWRlZF90YWcgPSBGUFVfbG9hZF9leHRlbmRlZCgobG9uZyBkb3VibGUgX191c2VyICopZGF0YV9hZGRyZXNzLCAwKTsKKyAgICAgIEZQVV9zZXR0YWcwKGxvYWRlZF90YWcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAwMjc6ICAgICAgLyogZmlsZCBtNjRpbnQgKi8KKyAgICAgIGNsZWFyX0MxKCk7CisgICAgICBsb2FkZWRfdGFnID0gRlBVX2xvYWRfaW50NjQoKGxvbmcgbG9uZyBfX3VzZXIgKilkYXRhX2FkZHJlc3MpOworICAgICAgRlBVX3NldHRhZzAobG9hZGVkX3RhZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDAzMDogICAgIC8qIGZzdGVudiAgbTE0LzI4Ynl0ZSAqLworICAgICAgZnN0ZW52KGFkZHJfbW9kZXMsICh1X2NoYXIgX191c2VyICopZGF0YV9hZGRyZXNzKTsKKyAgICAgIHJldHVybiAxOworICAgIGNhc2UgMDMyOiAgICAgIC8qIGZzYXZlICovCisgICAgICBmc2F2ZShhZGRyX21vZGVzLCAodV9jaGFyIF9fdXNlciAqKWRhdGFfYWRkcmVzcyk7CisgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIDAzMzogICAgICAvKiBmYnN0cCBtODBkZWMgKi8KKyAgICAgIGNsZWFyX0MxKCk7CisgICAgICBpZiAoIEZQVV9zdG9yZV9iY2Qoc3QwX3B0ciwgc3QwX3RhZywgKHVfY2hhciBfX3VzZXIgKilkYXRhX2FkZHJlc3MpICkKKwlwb3BfMCgpOyAgLyogcG9wIG9ubHkgaWYgdGhlIG51bWJlciB3YXMgYWN0dWFsbHkgc3RvcmVkCisJCSAgICAgKHNlZSB0aGUgODA0ODYgbWFudWFsIHAxNi0yOCkgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMDM0OiAgICAgIC8qIGZzdGN3IG0xNmludCAqLworICAgICAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisgICAgICBGUFVfYWNjZXNzX29rKFZFUklGWV9XUklURSxkYXRhX2FkZHJlc3MsMik7CisgICAgICBGUFVfcHV0X3VzZXIoY29udHJvbF93b3JkLCAodW5zaWduZWQgc2hvcnQgX191c2VyICopIGRhdGFfYWRkcmVzcyk7CisgICAgICBSRV9FTlRSQU5UX0NIRUNLX09OOworICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSAwMzU6ICAgICAgLyogZnN0cCBtODByZWFsICovCisgICAgICBjbGVhcl9DMSgpOworICAgICAgaWYgKCBGUFVfc3RvcmVfZXh0ZW5kZWQoc3QwX3B0ciwgc3QwX3RhZywgKGxvbmcgZG91YmxlIF9fdXNlciAqKWRhdGFfYWRkcmVzcykgKQorCXBvcF8wKCk7ICAvKiBwb3Agb25seSBpZiB0aGUgbnVtYmVyIHdhcyBhY3R1YWxseSBzdG9yZWQKKwkJICAgICAoc2VlIHRoZSA4MDQ4NiBtYW51YWwgcDE2LTI4KSAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSAwMzY6ICAgICAgLyogZnN0c3cgbTJieXRlICovCisgICAgICBSRV9FTlRSQU5UX0NIRUNLX09GRjsKKyAgICAgIEZQVV9hY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLGRhdGFfYWRkcmVzcywyKTsKKyAgICAgIEZQVV9wdXRfdXNlcihzdGF0dXNfd29yZCgpLCh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKikgZGF0YV9hZGRyZXNzKTsKKyAgICAgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CisgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIDAzNzogICAgICAvKiBmaXN0cCBtNjRpbnQgKi8KKyAgICAgIGNsZWFyX0MxKCk7CisgICAgICBpZiAoIEZQVV9zdG9yZV9pbnQ2NChzdDBfcHRyLCBzdDBfdGFnLCAobG9uZyBsb25nIF9fdXNlciAqKWRhdGFfYWRkcmVzcykgKQorCXBvcF8wKCk7ICAvKiBwb3Agb25seSBpZiB0aGUgbnVtYmVyIHdhcyBhY3R1YWxseSBzdG9yZWQKKwkJICAgICAoc2VlIHRoZSA4MDQ4NiBtYW51YWwgcDE2LTI4KSAqLworICAgICAgYnJlYWs7CisgICAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYXRoLWVtdS9tdWxfWHNpZy5TIGIvYXJjaC9pMzg2L21hdGgtZW11L211bF9Yc2lnLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE3Nzg1YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9tdWxfWHNpZy5TCkBAIC0wLDAgKzEsMTc2IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICBtdWxfWHNpZy5TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBNdWx0aXBseSBhIDEyIGJ5dGUgZml4ZWQgcG9pbnQgbnVtYmVyIGJ5IGFub3RoZXIgZml4ZWQgcG9pbnQgbnVtYmVyLiAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTQsMTk5NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgVy4gTWV0emVudGhlbiwgMjIgUGFya2VyIFN0LCBPcm1vbmQsIFZpYyAzMTYzLCAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICBBdXN0cmFsaWEuICBFLW1haWwgYmlsbG1AamFjb2JpLm1hdGhzLm1vbmFzaC5lZHUuYXUgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDYWxsIGZyb20gQyBhczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgdm9pZCBtdWwzMl9Yc2lnKFhzaWcgKngsIHVuc2lnbmVkIGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgIHZvaWQgbXVsNjRfWHNpZyhYc2lnICp4LCB1bnNpZ25lZCBsb25nIGxvbmcgKmIpICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICB2b2lkIG11bF9Yc2lnX1hzaWcoWHNpZyAqeCwgdW5zaWduZWQgKmIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IFRoZSByZXN1bHQgaXMgbmVpdGhlciByb3VuZGVkIG5vciBub3JtYWxpemVkLCBhbmQgdGhlIGxzIGJpdCBvciBzbyBtYXkgICAgfAorIHwgYmUgd3JvbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkuZmlsZQkibXVsX1hzaWcuUyIKKworCisjaW5jbHVkZSAiZnB1X2VtdS5oIgorCisudGV4dAorRU5UUlkobXVsMzJfWHNpZykKKwlwdXNobCAlZWJwCisJbW92bCAlZXNwLCVlYnAKKwlzdWJsICQxNiwlZXNwCisJcHVzaGwgJWVzaQorCisJbW92bCBQQVJBTTEsJWVzaQorCW1vdmwgUEFSQU0yLCVlY3gKKworCXhvciAlZWF4LCVlYXgKKwltb3ZsICVlYXgsLTQoJWVicCkKKwltb3ZsICVlYXgsLTgoJWVicCkKKworCW1vdmwgKCVlc2kpLCVlYXggICAgICAgIC8qIGxzbCBvZiBYc2lnICovCisJbXVsbCAlZWN4CQkvKiBtc2wgb2YgYiAqLworCW1vdmwgJWVkeCwtMTIoJWVicCkKKworCW1vdmwgNCglZXNpKSwlZWF4CS8qIG1pZGwgb2YgWHNpZyAqLworCW11bGwgJWVjeAkJLyogbXNsIG9mIGIgKi8KKwlhZGRsICVlYXgsLTEyKCVlYnApCisJYWRjbCAlZWR4LC04KCVlYnApCisJYWRjbCAkMCwtNCglZWJwKQorCisJbW92bCA4KCVlc2kpLCVlYXgJLyogbXNsIG9mIFhzaWcgKi8KKwltdWxsICVlY3gJCS8qIG1zbCBvZiBiICovCisJYWRkbCAlZWF4LC04KCVlYnApCisJYWRjbCAlZWR4LC00KCVlYnApCisKKwltb3ZsIC0xMiglZWJwKSwlZWF4CisJbW92bCAlZWF4LCglZXNpKQorCW1vdmwgLTgoJWVicCksJWVheAorCW1vdmwgJWVheCw0KCVlc2kpCisJbW92bCAtNCglZWJwKSwlZWF4CisJbW92bCAlZWF4LDgoJWVzaSkKKworCXBvcGwgJWVzaQorCWxlYXZlCisJcmV0CisKKworRU5UUlkobXVsNjRfWHNpZykKKwlwdXNobCAlZWJwCisJbW92bCAlZXNwLCVlYnAKKwlzdWJsICQxNiwlZXNwCisJcHVzaGwgJWVzaQorCisJbW92bCBQQVJBTTEsJWVzaQorCW1vdmwgUEFSQU0yLCVlY3gKKworCXhvciAlZWF4LCVlYXgKKwltb3ZsICVlYXgsLTQoJWVicCkKKwltb3ZsICVlYXgsLTgoJWVicCkKKworCW1vdmwgKCVlc2kpLCVlYXggICAgICAgIC8qIGxzbCBvZiBYc2lnICovCisJbXVsbCA0KCVlY3gpCQkvKiBtc2wgb2YgYiAqLworCW1vdmwgJWVkeCwtMTIoJWVicCkKKworCW1vdmwgNCglZXNpKSwlZWF4CS8qIG1pZGwgb2YgWHNpZyAqLworCW11bGwgKCVlY3gpCQkvKiBsc2wgb2YgYiAqLworCWFkZGwgJWVkeCwtMTIoJWVicCkKKwlhZGNsICQwLC04KCVlYnApCisJYWRjbCAkMCwtNCglZWJwKQorCisJbW92bCA0KCVlc2kpLCVlYXgJLyogbWlkbCBvZiBYc2lnICovCisJbXVsbCA0KCVlY3gpCQkvKiBtc2wgb2YgYiAqLworCWFkZGwgJWVheCwtMTIoJWVicCkKKwlhZGNsICVlZHgsLTgoJWVicCkKKwlhZGNsICQwLC00KCVlYnApCisKKwltb3ZsIDgoJWVzaSksJWVheAkvKiBtc2wgb2YgWHNpZyAqLworCW11bGwgKCVlY3gpCQkvKiBsc2wgb2YgYiAqLworCWFkZGwgJWVheCwtMTIoJWVicCkKKwlhZGNsICVlZHgsLTgoJWVicCkKKwlhZGNsICQwLC00KCVlYnApCisKKwltb3ZsIDgoJWVzaSksJWVheAkvKiBtc2wgb2YgWHNpZyAqLworCW11bGwgNCglZWN4KQkJLyogbXNsIG9mIGIgKi8KKwlhZGRsICVlYXgsLTgoJWVicCkKKwlhZGNsICVlZHgsLTQoJWVicCkKKworCW1vdmwgLTEyKCVlYnApLCVlYXgKKwltb3ZsICVlYXgsKCVlc2kpCisJbW92bCAtOCglZWJwKSwlZWF4CisJbW92bCAlZWF4LDQoJWVzaSkKKwltb3ZsIC00KCVlYnApLCVlYXgKKwltb3ZsICVlYXgsOCglZXNpKQorCisJcG9wbCAlZXNpCisJbGVhdmUKKwlyZXQKKworCisKK0VOVFJZKG11bF9Yc2lnX1hzaWcpCisJcHVzaGwgJWVicAorCW1vdmwgJWVzcCwlZWJwCisJc3VibCAkMTYsJWVzcAorCXB1c2hsICVlc2kKKworCW1vdmwgUEFSQU0xLCVlc2kKKwltb3ZsIFBBUkFNMiwlZWN4CisKKwl4b3IgJWVheCwlZWF4CisJbW92bCAlZWF4LC00KCVlYnApCisJbW92bCAlZWF4LC04KCVlYnApCisKKwltb3ZsICglZXNpKSwlZWF4ICAgICAgICAvKiBsc2wgb2YgWHNpZyAqLworCW11bGwgOCglZWN4KQkJLyogbXNsIG9mIGIgKi8KKwltb3ZsICVlZHgsLTEyKCVlYnApCisKKwltb3ZsIDQoJWVzaSksJWVheAkvKiBtaWRsIG9mIFhzaWcgKi8KKwltdWxsIDQoJWVjeCkJCS8qIG1pZGwgb2YgYiAqLworCWFkZGwgJWVkeCwtMTIoJWVicCkKKwlhZGNsICQwLC04KCVlYnApCisJYWRjbCAkMCwtNCglZWJwKQorCisJbW92bCA4KCVlc2kpLCVlYXgJLyogbXNsIG9mIFhzaWcgKi8KKwltdWxsICglZWN4KQkJLyogbHNsIG9mIGIgKi8KKwlhZGRsICVlZHgsLTEyKCVlYnApCisJYWRjbCAkMCwtOCglZWJwKQorCWFkY2wgJDAsLTQoJWVicCkKKworCW1vdmwgNCglZXNpKSwlZWF4CS8qIG1pZGwgb2YgWHNpZyAqLworCW11bGwgOCglZWN4KQkJLyogbXNsIG9mIGIgKi8KKwlhZGRsICVlYXgsLTEyKCVlYnApCisJYWRjbCAlZWR4LC04KCVlYnApCisJYWRjbCAkMCwtNCglZWJwKQorCisJbW92bCA4KCVlc2kpLCVlYXgJLyogbXNsIG9mIFhzaWcgKi8KKwltdWxsIDQoJWVjeCkJCS8qIG1pZGwgb2YgYiAqLworCWFkZGwgJWVheCwtMTIoJWVicCkKKwlhZGNsICVlZHgsLTgoJWVicCkKKwlhZGNsICQwLC00KCVlYnApCisKKwltb3ZsIDgoJWVzaSksJWVheAkvKiBtc2wgb2YgWHNpZyAqLworCW11bGwgOCglZWN4KQkJLyogbXNsIG9mIGIgKi8KKwlhZGRsICVlYXgsLTgoJWVicCkKKwlhZGNsICVlZHgsLTQoJWVicCkKKworCW1vdmwgLTEyKCVlYnApLCVlZHgKKwltb3ZsICVlZHgsKCVlc2kpCisJbW92bCAtOCglZWJwKSwlZWR4CisJbW92bCAlZWR4LDQoJWVzaSkKKwltb3ZsIC00KCVlYnApLCVlZHgKKwltb3ZsICVlZHgsOCglZXNpKQorCisJcG9wbCAlZXNpCisJbGVhdmUKKwlyZXQKKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hdGgtZW11L3BvbHkuaCBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9wb2x5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRiNzk4MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9wb2x5LmgKQEAgLTAsMCArMSwxMjEgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgIHBvbHkuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICBIZWFkZXIgZmlsZSBmb3IgdGhlIEZQVS1lbXUgcG9seSouYyBzb3VyY2UgZmlsZXMuICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDb3B5cmlnaHQgKEMpIDE5OTQsMTk5OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICBXLiBNZXR6ZW50aGVuLCAyMiBQYXJrZXIgU3QsIE9ybW9uZCwgVmljIDMxNjMsICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgIEF1c3RyYWxpYS4gIEUtbWFpbCAgIGJpbGxtQG1lbGJwYy5vcmcuYXUgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IERlY2xhcmF0aW9ucyBhbmQgZGVmaW5pdGlvbnMgZm9yIGZ1bmN0aW9ucyBvcGVyYXRpbmcgb24gWHNpZyAoMTItYnl0ZSAgICAgfAorIHwgZXh0ZW5kZWQtc2lnbmlmaWNhbmQpIHF1YW50aXRpZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBfUE9MWV9ICisjZGVmaW5lIF9QT0xZX0gKKworLyogVGhpcyAxMi1ieXRlIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGltcHJvdmUgdGhlIGFjY3VyYWN5IG9mIGNvbXB1dGF0aW9uCisgICBvZiB0cmFuc2NlbmRlbnRhbCBmdW5jdGlvbnMuCisgICBJbnRlbmRlZCB0byBiZSB1c2VkIHRvIGdldCByZXN1bHRzIGJldHRlciB0aGFuIDgtYnl0ZSBjb21wdXRhdGlvbgorICAgYWxsb3dzLiA5LWJ5dGUgd291bGQgcHJvYmFibHkgYmUgc3VmZmljaWVudC4KKyAgICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGxvbmcgbHN3OworICB1bnNpZ25lZCBsb25nIG1pZHc7CisgIHVuc2lnbmVkIGxvbmcgbXN3OworfSBYc2lnOworCithc21saW5rYWdlIHZvaWQgbXVsNjQodW5zaWduZWQgbG9uZyBsb25nIGNvbnN0ICphLCB1bnNpZ25lZCBsb25nIGxvbmcgY29uc3QgKmIsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAqcmVzdWx0KTsKK2FzbWxpbmthZ2Ugdm9pZCBwb2x5bm9taWFsX1hzaWcoWHNpZyAqLCBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKngsCisJCQkJY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIHRlcm1zW10sIGNvbnN0IGludCBuKTsKKworYXNtbGlua2FnZSB2b2lkIG11bDMyX1hzaWcoWHNpZyAqLCBjb25zdCB1bnNpZ25lZCBsb25nIG11bHQpOworYXNtbGlua2FnZSB2b2lkIG11bDY0X1hzaWcoWHNpZyAqLCBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKm11bHQpOworYXNtbGlua2FnZSB2b2lkIG11bF9Yc2lnX1hzaWcoWHNpZyAqZGVzdCwgY29uc3QgWHNpZyAqbXVsdCk7CisKK2FzbWxpbmthZ2Ugdm9pZCBzaHJfWHNpZyhYc2lnICosIGNvbnN0IGludCBuKTsKK2FzbWxpbmthZ2UgaW50IHJvdW5kX1hzaWcoWHNpZyAqKTsKK2FzbWxpbmthZ2UgaW50IG5vcm1fWHNpZyhYc2lnICopOworYXNtbGlua2FnZSB2b2lkIGRpdl9Yc2lnKFhzaWcgKngxLCBjb25zdCBYc2lnICp4MiwgY29uc3QgWHNpZyAqZGVzdCk7CisKKy8qIE1hY3JvIHRvIGV4dHJhY3QgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgMzIgYml0cyBmcm9tIGEgbG9uZyBsb25nICovCisjZGVmaW5lIExMX01TVyh4KSAgICAgKCgodW5zaWduZWQgbG9uZyAqKSZ4KVsxXSkKKworLyogTWFjcm8gdG8gaW5pdGlhbGl6ZSBhbiBYc2lnIHN0cnVjdCAqLworI2RlZmluZSBNS19YU0lHKGEsYixjKSAgICAgeyBjLCBiLCBhIH0KKworLyogTWFjcm8gdG8gYWNjZXNzIHRoZSA4IG1zIGJ5dGVzIG9mIGFuIFhzaWcgYXMgYSBsb25nIGxvbmcgKi8KKyNkZWZpbmUgWFNJR19MTCh4KSAgICAgICAgICgqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKSZ4Lm1pZHcpCisKKworLyoKKyAgIE5lZWQgdG8gcnVuIGdjYyB3aXRoIG9wdGltaXphdGlvbnMgb24gdG8gZ2V0IHRoZXNlIHRvCisgICBhY3R1YWxseSBiZSBpbi1saW5lLgorICAgKi8KKworLyogTXVsdGlwbHkgdHdvIGZpeGVkLXBvaW50IDMyIGJpdCBudW1iZXJzLCBwcm9kdWNpbmcgYSAzMiBiaXQgcmVzdWx0LgorICAgVGhlIGFuc3dlciBpcyB0aGUgbXMgd29yZCBvZiB0aGUgcHJvZHVjdC4gKi8KKy8qIFNvbWUgdmVyc2lvbnMgb2YgZ2NjIG1ha2UgaXQgZGlmZmljdWx0IHRvIHN0b3AgZWF4IGZyb20gYmVpbmcgY2xvYmJlcmVkLgorICAgTWVyZWx5IHNwZWNpZnlpbmcgdGhhdCBpdCBpcyB1c2VkIGRvZXNuJ3Qgd29yay4uLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbXVsXzMyXzMyKGNvbnN0IHVuc2lnbmVkIGxvbmcgYXJnMSwKKwkJCQkgICAgICBjb25zdCB1bnNpZ25lZCBsb25nIGFyZzIpCit7CisgIGludCByZXR2YWw7CisgIGFzbSB2b2xhdGlsZSAoIm11bGwgJTI7IG1vdmwgJSVlZHgsJSVlYXgiIFwKKwkJOiI9YSIgKHJldHZhbCkgXAorCQk6IjAiIChhcmcxKSwgImciIChhcmcyKSBcCisJCToiZHgiKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworCisvKiBBZGQgdGhlIDEyIGJ5dGUgWHNpZyB4MiB0byBYc2lnIGRlc3QsIHdpdGggbm8gY2hlY2tzIGZvciBvdmVyZmxvdy4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGRfWHNpZ19Yc2lnKFhzaWcgKmRlc3QsIGNvbnN0IFhzaWcgKngyKQoreworICBhc20gdm9sYXRpbGUgKCJtb3ZsICUxLCUlZWRpOyBtb3ZsICUyLCUlZXNpO1xuIgorICAgICAgICAgICAgICAgICJtb3ZsICglJWVzaSksJSVlYXg7IGFkZGwgJSVlYXgsKCUlZWRpKTtcbiIKKyAgICAgICAgICAgICAgICAibW92bCA0KCUlZXNpKSwlJWVheDsgYWRjbCAlJWVheCw0KCUlZWRpKTtcbiIKKyAgICAgICAgICAgICAgICAibW92bCA4KCUlZXNpKSwlJWVheDsgYWRjbCAlJWVheCw4KCUlZWRpKTtcbiIKKyAgICAgICAgICAgICAgICAgOiI9ZyIgKCpkZXN0KToiZyIgKGRlc3QpLCAiZyIgKHgyKQorICAgICAgICAgICAgICAgICA6ImF4Iiwic2kiLCJkaSIpOworfQorCisKKy8qIEFkZCB0aGUgMTIgYnl0ZSBYc2lnIHgyIHRvIFhzaWcgZGVzdCwgYWRqdXN0IGV4cCBpZiBvdmVyZmxvdyBvY2N1cnMuICovCisvKiBOb3RlOiB0aGUgY29uc3RyYWludHMgaW4gdGhlIGFzbSBzdGF0ZW1lbnQgZGlkbid0IGFsd2F5cyB3b3JrIHByb3Blcmx5CisgICB3aXRoIGdjYyAyLjUuOC4gIENoYW5naW5nIGZyb20gdXNpbmcgZWRpIHRvIHVzaW5nIGVjeCBnb3QgYXJvdW5kIHRoZQorICAgcHJvYmxlbSwgYnV0IGtlZXAgZmluZ2VycyBjcm9zc2VkISAqLworc3RhdGljIGlubGluZSB2b2lkIGFkZF90d29fWHNpZyhYc2lnICpkZXN0LCBjb25zdCBYc2lnICp4MiwgbG9uZyBpbnQgKmV4cCkKK3sKKyAgYXNtIHZvbGF0aWxlICgibW92bCAlMiwlJWVjeDsgbW92bCAlMywlJWVzaTtcbiIKKyAgICAgICAgICAgICAgICAibW92bCAoJSVlc2kpLCUlZWF4OyBhZGRsICUlZWF4LCglJWVjeCk7XG4iCisgICAgICAgICAgICAgICAgIm1vdmwgNCglJWVzaSksJSVlYXg7IGFkY2wgJSVlYXgsNCglJWVjeCk7XG4iCisgICAgICAgICAgICAgICAgIm1vdmwgOCglJWVzaSksJSVlYXg7IGFkY2wgJSVlYXgsOCglJWVjeCk7XG4iCisgICAgICAgICAgICAgICAgImpuYyAwZjtcbiIKKwkJInJjcmwgOCglJWVjeCk7IHJjcmwgNCglJWVjeCk7IHJjcmwgKCUlZWN4KVxuIgorICAgICAgICAgICAgICAgICJtb3ZsICU0LCUlZWN4OyBpbmNsICglJWVjeClcbiIKKyAgICAgICAgICAgICAgICAibW92bCAkMSwlJWVheDsgam1wIDFmO1xuIgorICAgICAgICAgICAgICAgICIwOiB4b3JsICUlZWF4LCUlZWF4O1xuIgorICAgICAgICAgICAgICAgICIxOlxuIgorCQk6Ij1nIiAoKmV4cCksICI9ZyIgKCpkZXN0KQorCQk6ImciIChkZXN0KSwgImciICh4MiksICJnIiAoZXhwKQorCQk6ImN4Iiwic2kiLCJheCIpOworfQorCisKKy8qIE5lZ2F0ZSAoc3VidHJhY3QgZnJvbSAxLjApIHRoZSAxMiBieXRlIFhzaWcgKi8KKy8qIFRoaXMgaXMgZmFzdGVyIGluIGEgbG9vcCBvbiBteSAzODYgdGhhbiB1c2luZyB0aGUgIm5lZyIgaW5zdHJ1Y3Rpb24uICovCitzdGF0aWMgaW5saW5lIHZvaWQgbmVnYXRlX1hzaWcoWHNpZyAqeCkKK3sKKyAgYXNtIHZvbGF0aWxlKCJtb3ZsICUxLCUlZXNpO1xuIgorICAgICAgICAgICAgICAgInhvcmwgJSVlY3gsJSVlY3g7XG4iCisgICAgICAgICAgICAgICAibW92bCAlJWVjeCwlJWVheDsgc3VibCAoJSVlc2kpLCUlZWF4OyBtb3ZsICUlZWF4LCglJWVzaSk7XG4iCisgICAgICAgICAgICAgICAibW92bCAlJWVjeCwlJWVheDsgc2JibCA0KCUlZXNpKSwlJWVheDsgbW92bCAlJWVheCw0KCUlZXNpKTtcbiIKKyAgICAgICAgICAgICAgICJtb3ZsICUlZWN4LCUlZWF4OyBzYmJsIDgoJSVlc2kpLCUlZWF4OyBtb3ZsICUlZWF4LDgoJSVlc2kpO1xuIgorICAgICAgICAgICAgICAgOiI9ZyIgKCp4KToiZyIgKHgpOiJzaSIsImF4IiwiY3giKTsKK30KKworI2VuZGlmIC8qIF9QT0xZX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYXRoLWVtdS9wb2x5XzJ4bTEuYyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9wb2x5XzJ4bTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzY2YWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L3BvbHlfMnhtMS5jCkBAIC0wLDAgKzEsMTU2IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICBwb2x5XzJ4bTEuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBGdW5jdGlvbiB0byBjb21wdXRlIDJeeC0xIGJ5IGEgcG9seW5vbWlhbCBhcHByb3hpbWF0aW9uLiAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTMsMTk5NCwxOTk3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgQXVzdHJhbGlhIHwKKyB8ICAgICAgICAgICAgICAgICAgRS1tYWlsICAgYmlsbG1Ac3VidXJiaWEubmV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImV4Y2VwdGlvbi5oIgorI2luY2x1ZGUgInJlZ19jb25zdGFudC5oIgorI2luY2x1ZGUgImZwdV9lbXUuaCIKKyNpbmNsdWRlICJmcHVfc3lzdGVtLmgiCisjaW5jbHVkZSAiY29udHJvbF93LmgiCisjaW5jbHVkZSAicG9seS5oIgorCisKKyNkZWZpbmUJSElQT1dFUgkxMQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBsdGVybXNbSElQT1dFUl0gPQoreworICAweDAwMDAwMDAwMDAwMDAwMDBMTCwgIC8qIFRoaXMgdGVybSBkb25lIHNlcGFyYXRlbHkgYXMgMTIgYnl0ZXMgKi8KKyAgMHhmNWZkZWZmYzE2MmM3NTQzTEwsCisgIDB4MWM2YjA4ZDcwNGEwYmZhNkxMLAorICAweDAyNzY1NTZkZjc0OWNjMjFMTCwKKyAgMHgwMDJiYjBmZmNmMTRmNmI4TEwsCisgIDB4MDAwMjg2MTIyNWVmNzUxY0xMLAorICAweDAwMDAxZmZjYmZjZDU0MjJMTCwKKyAgMHgwMDAwMDE2MmMwMDVkNWYxTEwsCisgIDB4MDAwMDAwMGRhOTZjY2IxYkxMLAorICAweDAwMDAwMDAwNzhkMWI4OTdMTCwKKyAgMHgwMDAwMDAwMDA0MjJiMDI5TEwKK307CisKK3N0YXRpYyBjb25zdCBYc2lnIGhpdGVybSA9IE1LX1hTSUcoMHhiMTcyMTdmNywgMHhkMWNmNzlhYiwgMHhjOGEzOTE5NCk7CisKKy8qIEZvdXIgc2xpY2VzOiAwLjAgOiAwLjI1IDogMC41MCA6IDAuNzUgOiAxLjAsCisgICBUaGVzZSBudW1iZXJzIGFyZSAyXigxLzQpLCAyXigxLzIpLCBhbmQgMl4oMy80KQorICovCitzdGF0aWMgY29uc3QgWHNpZyBzaGlmdHRlcm0wID0gTUtfWFNJRygwLCAwLCAwKTsKK3N0YXRpYyBjb25zdCBYc2lnIHNoaWZ0dGVybTEgPSBNS19YU0lHKDB4OTgzN2YwNTEsIDB4OGRiOGE5NmYsIDB4NDZhZDIzMTgpOworc3RhdGljIGNvbnN0IFhzaWcgc2hpZnR0ZXJtMiA9IE1LX1hTSUcoMHhiNTA0ZjMzMywgMHhmOWRlNjQ4NCwgMHg1OTdkODliMyk7CitzdGF0aWMgY29uc3QgWHNpZyBzaGlmdHRlcm0zID0gTUtfWFNJRygweGQ3NDRmY2NhLCAweGQ2OWQ2YWY0LCAweDM5YTY4YmI5KTsKKworc3RhdGljIGNvbnN0IFhzaWcgKnNoaWZ0dGVybVtdID0geyAmc2hpZnR0ZXJtMCwgJnNoaWZ0dGVybTEsCisJCQkJICAgICAmc2hpZnR0ZXJtMiwgJnNoaWZ0dGVybTMgfTsKKworCisvKi0tLSBwb2x5XzJ4bTEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8IFJlcXVpcmVzIHN0KDApIHdoaWNoIGlzIFRBR19WYWxpZCBhbmQgPCAxLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50CXBvbHlfMnhtMSh1X2NoYXIgc2lnbiwgRlBVX1JFRyAqYXJnLCBGUFVfUkVHICpyZXN1bHQpCit7CisgIGxvbmcgaW50ICAgICAgICAgICAgICBleHBvbmVudCwgc2hpZnQ7CisgIHVuc2lnbmVkIGxvbmcgbG9uZyAgICBYbGw7CisgIFhzaWcgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRvciwgRGVub20sIGFyZ1NpZ25pZjsKKyAgdV9jaGFyICAgICAgICAgICAgICAgIHRhZzsKKworICBleHBvbmVudCA9IGV4cG9uZW50MTYoYXJnKTsKKworI2lmZGVmIFBBUkFOT0lECisgIGlmICggZXhwb25lbnQgPj0gMCApICAgIAkvKiBEb24ndCB3YW50IGEgfG51bWJlcnwgPj0gMS4wICovCisgICAgeworICAgICAgLyogTnVtYmVyIG5lZ2F0aXZlLCB0b28gbGFyZ2UsIG9yIG5vdCBWYWxpZC4gKi8KKyAgICAgIEVYQ0VQVElPTihFWF9JTlRFUk5BTHwweDEyNyk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisjZW5kaWYgLyogUEFSQU5PSUQgKi8KKworICBhcmdTaWduaWYubHN3ID0gMDsKKyAgWFNJR19MTChhcmdTaWduaWYpID0gWGxsID0gc2lnbmlmaWNhbmQoYXJnKTsKKworICBpZiAoIGV4cG9uZW50ID09IC0xICkKKyAgICB7CisgICAgICBzaGlmdCA9IChhcmdTaWduaWYubXN3ICYgMHg0MDAwMDAwMCkgPyAzIDogMjsKKyAgICAgIC8qIHN1YnRyYWN0IDAuNSBvciAwLjc1ICovCisgICAgICBleHBvbmVudCAtPSAyOworICAgICAgWFNJR19MTChhcmdTaWduaWYpIDw8PSAyOworICAgICAgWGxsIDw8PSAyOworICAgIH0KKyAgZWxzZSBpZiAoIGV4cG9uZW50ID09IC0yICkKKyAgICB7CisgICAgICBzaGlmdCA9IDE7CisgICAgICAvKiBzdWJ0cmFjdCAwLjI1ICovCisgICAgICBleHBvbmVudC0tOworICAgICAgWFNJR19MTChhcmdTaWduaWYpIDw8PSAxOworICAgICAgWGxsIDw8PSAxOworICAgIH0KKyAgZWxzZQorICAgIHNoaWZ0ID0gMDsKKworICBpZiAoIGV4cG9uZW50IDwgLTIgKQorICAgIHsKKyAgICAgIC8qIFNoaWZ0IHRoZSBhcmd1bWVudCByaWdodCBieSB0aGUgcmVxdWlyZWQgcGxhY2VzLiAqLworICAgICAgaWYgKCBGUFVfc2hyeCgmWGxsLCAtMi1leHBvbmVudCkgPj0gMHg4MDAwMDAwMFUgKQorCVhsbCsrOwkvKiByb3VuZCB1cCAqLworICAgIH0KKworICBhY2N1bXVsYXRvci5sc3cgPSBhY2N1bXVsYXRvci5taWR3ID0gYWNjdW11bGF0b3IubXN3ID0gMDsKKyAgcG9seW5vbWlhbF9Yc2lnKCZhY2N1bXVsYXRvciwgJlhsbCwgbHRlcm1zLCBISVBPV0VSLTEpOworICBtdWxfWHNpZ19Yc2lnKCZhY2N1bXVsYXRvciwgJmFyZ1NpZ25pZik7CisgIHNocl9Yc2lnKCZhY2N1bXVsYXRvciwgMyk7CisKKyAgbXVsX1hzaWdfWHNpZygmYXJnU2lnbmlmLCAmaGl0ZXJtKTsgICAvKiBUaGUgbGVhZGluZyB0ZXJtICovCisgIGFkZF90d29fWHNpZygmYWNjdW11bGF0b3IsICZhcmdTaWduaWYsICZleHBvbmVudCk7CisKKyAgaWYgKCBzaGlmdCApCisgICAgeworICAgICAgLyogVGhlIGFyZ3VtZW50IGlzIGxhcmdlLCB1c2UgdGhlIGlkZW50aXR5OgorCSBmKHgrYSkgPSBmKGEpICogKGYoeCkgKyAxKSAtIDE7CisJICovCisgICAgICBzaHJfWHNpZygmYWNjdW11bGF0b3IsIC0gZXhwb25lbnQpOworICAgICAgYWNjdW11bGF0b3IubXN3IHw9IDB4ODAwMDAwMDA7ICAgICAgLyogYWRkIDEuMCAqLworICAgICAgbXVsX1hzaWdfWHNpZygmYWNjdW11bGF0b3IsIHNoaWZ0dGVybVtzaGlmdF0pOworICAgICAgYWNjdW11bGF0b3IubXN3ICY9IDB4M2ZmZmZmZmY7ICAgICAgLyogc3VidHJhY3QgMS4wICovCisgICAgICBleHBvbmVudCA9IDE7CisgICAgfQorCisgIGlmICggc2lnbiAhPSBTSUdOX1BPUyApCisgICAgeworICAgICAgLyogVGhlIGFyZ3VtZW50IGlzIG5lZ2F0aXZlLCB1c2UgdGhlIGlkZW50aXR5OgorCSAgICAgZigteCkgPSAtZih4KSAvICgxICsgZih4KSkKKwkgKi8KKyAgICAgIERlbm9tLmxzdyA9IGFjY3VtdWxhdG9yLmxzdzsKKyAgICAgIFhTSUdfTEwoRGVub20pID0gWFNJR19MTChhY2N1bXVsYXRvcik7CisgICAgICBpZiAoIGV4cG9uZW50IDwgMCApCisJc2hyX1hzaWcoJkRlbm9tLCAtIGV4cG9uZW50KTsKKyAgICAgIGVsc2UgaWYgKCBleHBvbmVudCA+IDAgKQorCXsKKwkgIC8qIGV4cG9uZW50IG11c3QgYmUgMSBoZXJlICovCisJICBYU0lHX0xMKERlbm9tKSA8PD0gMTsKKwkgIGlmICggRGVub20ubHN3ICYgMHg4MDAwMDAwMCApCisJICAgIFhTSUdfTEwoRGVub20pIHw9IDE7CisJICAoRGVub20ubHN3KSA8PD0gMTsKKwl9CisgICAgICBEZW5vbS5tc3cgfD0gMHg4MDAwMDAwMDsgICAgICAvKiBhZGQgMS4wICovCisgICAgICBkaXZfWHNpZygmYWNjdW11bGF0b3IsICZEZW5vbSwgJmFjY3VtdWxhdG9yKTsKKyAgICB9CisKKyAgLyogQ29udmVydCB0byA2NCBiaXQgc2lnbmVkLWNvbXBhdGlibGUgKi8KKyAgZXhwb25lbnQgKz0gcm91bmRfWHNpZygmYWNjdW11bGF0b3IpOworCisgIHJlc3VsdCA9ICZzdCgwKTsKKyAgc2lnbmlmaWNhbmQocmVzdWx0KSA9IFhTSUdfTEwoYWNjdW11bGF0b3IpOworICBzZXRleHBvbmVudDE2KHJlc3VsdCwgZXhwb25lbnQpOworCisgIHRhZyA9IEZQVV9yb3VuZChyZXN1bHQsIDEsIDAsIEZVTExfUFJFQ0lTSU9OLCBzaWduKTsKKworICBzZXRzaWduKHJlc3VsdCwgc2lnbik7CisgIEZQVV9zZXR0YWcwKHRhZyk7CisKKyAgcmV0dXJuIDA7CisKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYXRoLWVtdS9wb2x5X2F0YW4uYyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9wb2x5X2F0YW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmY3MDI5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L3BvbHlfYXRhbi5jCkBAIC0wLDAgKzEsMjI5IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICBwb2x5X2F0YW4uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDb21wdXRlIHRoZSBhcmN0YW4gb2YgYSBGUFVfUkVHLCB1c2luZyBhIHBvbHlub21pYWwgYXBwcm94aW1hdGlvbi4gICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTMsMTk5NCwxOTk3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgQXVzdHJhbGlhIHwKKyB8ICAgICAgICAgICAgICAgICAgRS1tYWlsICAgYmlsbG1Ac3VidXJiaWEubmV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImV4Y2VwdGlvbi5oIgorI2luY2x1ZGUgInJlZ19jb25zdGFudC5oIgorI2luY2x1ZGUgImZwdV9lbXUuaCIKKyNpbmNsdWRlICJmcHVfc3lzdGVtLmgiCisjaW5jbHVkZSAic3RhdHVzX3cuaCIKKyNpbmNsdWRlICJjb250cm9sX3cuaCIKKyNpbmNsdWRlICJwb2x5LmgiCisKKworI2RlZmluZQlISVBPV0VSb24JNgkvKiBvZGQgcG9seSwgbmVnYXRpdmUgdGVybXMgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgb2RkbmVndGVybXNbSElQT1dFUm9uXSA9Cit7CisgIDB4MDAwMDAwMDAwMDAwMDAwMExMLCAvKiBEdW1teSAobm90IGZvciAtIDEuMCkgKi8KKyAgMHgwMTUzMjg0MzdmNzU2NDY3TEwsCisgIDB4MDAwNWRkYTI3YjczZGVjNkxMLAorICAweDAwMDAyMjZiZjJiZmI5MWFMTCwKKyAgMHgwMDAwMDBjY2M0MzljNWY3TEwsCisgIDB4MDAwMDAwMDM1NTQzODQwN0xMCit9IDsKKworI2RlZmluZQlISVBPV0VSb3AJNgkvKiBvZGQgcG9seSwgcG9zaXRpdmUgdGVybXMgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgb2RkcGx0ZXJtc1tISVBPV0VSb3BdID0KK3sKKy8qICAweGFhYWFhYWFhYWFhYWFhYWJMTCwgIHRyYW5zZmVycmVkIHRvIGZpeGVkcHRlcm1bXSAqLworICAweDBkYjU1YTcxODc1YzlhYzJMTCwKKyAgMHgwMDI5ZmNlMmQ2Nzg4MGIwTEwsCisgIDB4MDAwMGRmZDM5MDhiNDU5NkxMLAorICAweDAwMDAwNTUwZmQ2MWRhYjRMTCwKKyAgMHgwMDAwMDAxYzk0MjJiM2Y5TEwsCisgIDB4MDAwMDAwMDAzZTMzMDFlMUxMCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIGRlbm9tdGVybSA9IDB4ZWJkOWI4NDJjNWM1M2EwZUxMOworCitzdGF0aWMgY29uc3QgWHNpZyBmaXhlZHB0ZXJtID0gTUtfWFNJRygweGFhYWFhYWFhLCAweGFhYWFhYWFhLCAweGFhYWFhYWFhKTsKKworc3RhdGljIGNvbnN0IFhzaWcgcGlfc2lnbmlmID0gTUtfWFNJRygweGM5MGZkYWEyLCAweDIxNjhjMjM0LCAweGM0YzY2MjhiKTsKKworCisvKi0tLSBwb2x5X2F0YW4oKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZAlwb2x5X2F0YW4oRlBVX1JFRyAqc3QwX3B0ciwgdV9jaGFyIHN0MF90YWcsCisJCSAgRlBVX1JFRyAqc3QxX3B0ciwgdV9jaGFyIHN0MV90YWcpCit7CisgIHVfY2hhcgl0cmFuc2Zvcm1lZCwgaW52ZXJ0ZWQsCisgICAgICAgICAgICAgICAgc2lnbjEsIHNpZ24yOworICBpbnQgICAgICAgICAgIGV4cG9uZW50OworICBsb25nIGludCAgIAlkdW1teV9leHA7CisgIFhzaWcgICAgICAgICAgYWNjdW11bGF0b3IsIE51bWVyLCBEZW5vbSwgYWNjdW11bGF0b3JlLCBhcmdTaWduaWYsCisgICAgICAgICAgICAgICAgYXJnU3EsIGFyZ1NxU3E7CisgIHVfY2hhciAgICAgICAgdGFnOworICAKKyAgc2lnbjEgPSBnZXRzaWduKHN0MF9wdHIpOworICBzaWduMiA9IGdldHNpZ24oc3QxX3B0cik7CisgIGlmICggc3QwX3RhZyA9PSBUQUdfVmFsaWQgKQorICAgIHsKKyAgICAgIGV4cG9uZW50ID0gZXhwb25lbnQoc3QwX3B0cik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogVGhpcyBnaXZlcyBub24tY29tcGF0aWJsZSBzdGFjayBjb250ZW50cy4uLiAqLworICAgICAgRlBVX3RvX2V4cDE2KHN0MF9wdHIsIHN0MF9wdHIpOworICAgICAgZXhwb25lbnQgPSBleHBvbmVudDE2KHN0MF9wdHIpOworICAgIH0KKyAgaWYgKCBzdDFfdGFnID09IFRBR19WYWxpZCApCisgICAgeworICAgICAgZXhwb25lbnQgLT0gZXhwb25lbnQoc3QxX3B0cik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogVGhpcyBnaXZlcyBub24tY29tcGF0aWJsZSBzdGFjayBjb250ZW50cy4uLiAqLworICAgICAgRlBVX3RvX2V4cDE2KHN0MV9wdHIsIHN0MV9wdHIpOworICAgICAgZXhwb25lbnQgLT0gZXhwb25lbnQxNihzdDFfcHRyKTsKKyAgICB9CisKKyAgaWYgKCAoZXhwb25lbnQgPCAwKSB8fCAoKGV4cG9uZW50ID09IDApICYmCisJCQkgICgoc3QwX3B0ci0+c2lnaCA8IHN0MV9wdHItPnNpZ2gpIHx8CisJCQkgICAoKHN0MF9wdHItPnNpZ2ggPT0gc3QxX3B0ci0+c2lnaCkgJiYKKwkJCSAgICAoc3QwX3B0ci0+c2lnbCA8IHN0MV9wdHItPnNpZ2wpKSkgKSApCisgICAgeworICAgICAgaW52ZXJ0ZWQgPSAxOworICAgICAgTnVtZXIubHN3ID0gRGVub20ubHN3ID0gMDsKKyAgICAgIFhTSUdfTEwoTnVtZXIpID0gc2lnbmlmaWNhbmQoc3QwX3B0cik7CisgICAgICBYU0lHX0xMKERlbm9tKSA9IHNpZ25pZmljYW5kKHN0MV9wdHIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGludmVydGVkID0gMDsKKyAgICAgIGV4cG9uZW50ID0gLWV4cG9uZW50OworICAgICAgTnVtZXIubHN3ID0gRGVub20ubHN3ID0gMDsKKyAgICAgIFhTSUdfTEwoTnVtZXIpID0gc2lnbmlmaWNhbmQoc3QxX3B0cik7CisgICAgICBYU0lHX0xMKERlbm9tKSA9IHNpZ25pZmljYW5kKHN0MF9wdHIpOworICAgICB9CisgIGRpdl9Yc2lnKCZOdW1lciwgJkRlbm9tLCAmYXJnU2lnbmlmKTsKKyAgZXhwb25lbnQgKz0gbm9ybV9Yc2lnKCZhcmdTaWduaWYpOworCisgIGlmICggKGV4cG9uZW50ID49IC0xKQorICAgICAgfHwgKChleHBvbmVudCA9PSAtMikgJiYgKGFyZ1NpZ25pZi5tc3cgPiAweGQ0MTNjY2QwKSkgKQorICAgIHsKKyAgICAgIC8qIFRoZSBhcmd1bWVudCBpcyBncmVhdGVyIHRoYW4gc3FydCgyKS0xICg9MC40MTQyMTM1NjIuLi4pICovCisgICAgICAvKiBDb252ZXJ0IHRoZSBhcmd1bWVudCBieSBhbiBpZGVudGl0eSBmb3IgYXRhbiAqLworICAgICAgdHJhbnNmb3JtZWQgPSAxOworCisgICAgICBpZiAoIGV4cG9uZW50ID49IDAgKQorCXsKKyNpZmRlZiBQQVJBTk9JRAorCSAgaWYgKCAhKCAoZXhwb25lbnQgPT0gMCkgJiYgCisJCSAoYXJnU2lnbmlmLmxzdyA9PSAwKSAmJiAoYXJnU2lnbmlmLm1pZHcgPT0gMCkgJiYKKwkJIChhcmdTaWduaWYubXN3ID09IDB4ODAwMDAwMDApICkgKQorCSAgICB7CisJICAgICAgRVhDRVBUSU9OKEVYX0lOVEVSTkFMfDB4MTA0KTsgIC8qIFRoZXJlIG11c3QgYmUgYSBsb2dpYyBlcnJvciAqLworCSAgICAgIHJldHVybjsKKwkgICAgfQorI2VuZGlmIC8qIFBBUkFOT0lEICovCisJICBhcmdTaWduaWYubXN3ID0gMDsgICAvKiBNYWtlIHRoZSB0cmFuc2Zvcm1lZCBhcmcgLT4gMC4wICovCisJfQorICAgICAgZWxzZQorCXsKKwkgIE51bWVyLmxzdyA9IERlbm9tLmxzdyA9IGFyZ1NpZ25pZi5sc3c7CisJICBYU0lHX0xMKE51bWVyKSA9IFhTSUdfTEwoRGVub20pID0gWFNJR19MTChhcmdTaWduaWYpOworCisJICBpZiAoIGV4cG9uZW50IDwgLTEgKQorCSAgICBzaHJfWHNpZygmTnVtZXIsIC0xLWV4cG9uZW50KTsKKwkgIG5lZ2F0ZV9Yc2lnKCZOdW1lcik7CisgICAgICAKKwkgIHNocl9Yc2lnKCZEZW5vbSwgLWV4cG9uZW50KTsKKwkgIERlbm9tLm1zdyB8PSAweDgwMDAwMDAwOworICAgICAgCisJICBkaXZfWHNpZygmTnVtZXIsICZEZW5vbSwgJmFyZ1NpZ25pZik7CisKKwkgIGV4cG9uZW50ID0gLTEgKyBub3JtX1hzaWcoJmFyZ1NpZ25pZik7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHRyYW5zZm9ybWVkID0gMDsKKyAgICB9CisKKyAgYXJnU3EubHN3ID0gYXJnU2lnbmlmLmxzdzsgYXJnU3EubWlkdyA9IGFyZ1NpZ25pZi5taWR3OworICBhcmdTcS5tc3cgPSBhcmdTaWduaWYubXN3OworICBtdWxfWHNpZ19Yc2lnKCZhcmdTcSwgJmFyZ1NxKTsKKyAgCisgIGFyZ1NxU3EubHN3ID0gYXJnU3EubHN3OyBhcmdTcVNxLm1pZHcgPSBhcmdTcS5taWR3OyBhcmdTcVNxLm1zdyA9IGFyZ1NxLm1zdzsKKyAgbXVsX1hzaWdfWHNpZygmYXJnU3FTcSwgJmFyZ1NxU3EpOworCisgIGFjY3VtdWxhdG9yZS5sc3cgPSBhcmdTcS5sc3c7CisgIFhTSUdfTEwoYWNjdW11bGF0b3JlKSA9IFhTSUdfTEwoYXJnU3EpOworCisgIHNocl9Yc2lnKCZhcmdTcSwgMiooLTEtZXhwb25lbnQtMSkpOworICBzaHJfWHNpZygmYXJnU3FTcSwgNCooLTEtZXhwb25lbnQtMSkpOworCisgIC8qIE5vdyBoYXZlIGFyZ1NxIGV0YyB3aXRoIGJpbmFyeSBwb2ludCBhdCB0aGUgbGVmdAorICAgICAuMXh4eHh4eHh4ICovCisKKyAgLyogRG8gdGhlIGJhc2ljIGZpeGVkIHBvaW50IHBvbHlub21pYWwgZXZhbHVhdGlvbiAqLworICBhY2N1bXVsYXRvci5tc3cgPSBhY2N1bXVsYXRvci5taWR3ID0gYWNjdW11bGF0b3IubHN3ID0gMDsKKyAgcG9seW5vbWlhbF9Yc2lnKCZhY2N1bXVsYXRvciwgJlhTSUdfTEwoYXJnU3FTcSksCisJCSAgIG9kZHBsdGVybXMsIEhJUE9XRVJvcC0xKTsKKyAgbXVsNjRfWHNpZygmYWNjdW11bGF0b3IsICZYU0lHX0xMKGFyZ1NxKSk7CisgIG5lZ2F0ZV9Yc2lnKCZhY2N1bXVsYXRvcik7CisgIHBvbHlub21pYWxfWHNpZygmYWNjdW11bGF0b3IsICZYU0lHX0xMKGFyZ1NxU3EpLCBvZGRuZWd0ZXJtcywgSElQT1dFUm9uLTEpOworICBuZWdhdGVfWHNpZygmYWNjdW11bGF0b3IpOworICBhZGRfdHdvX1hzaWcoJmFjY3VtdWxhdG9yLCAmZml4ZWRwdGVybSwgJmR1bW15X2V4cCk7CisKKyAgbXVsNjRfWHNpZygmYWNjdW11bGF0b3JlLCAmZGVub210ZXJtKTsKKyAgc2hyX1hzaWcoJmFjY3VtdWxhdG9yZSwgMSArIDIqKC0xLWV4cG9uZW50KSk7CisgIGFjY3VtdWxhdG9yZS5tc3cgfD0gMHg4MDAwMDAwMDsKKworICBkaXZfWHNpZygmYWNjdW11bGF0b3IsICZhY2N1bXVsYXRvcmUsICZhY2N1bXVsYXRvcik7CisKKyAgbXVsX1hzaWdfWHNpZygmYWNjdW11bGF0b3IsICZhcmdTaWduaWYpOworICBtdWxfWHNpZ19Yc2lnKCZhY2N1bXVsYXRvciwgJmFyZ1NxKTsKKworICBzaHJfWHNpZygmYWNjdW11bGF0b3IsIDMpOworICBuZWdhdGVfWHNpZygmYWNjdW11bGF0b3IpOworICBhZGRfWHNpZ19Yc2lnKCZhY2N1bXVsYXRvciwgJmFyZ1NpZ25pZik7CisKKyAgaWYgKCB0cmFuc2Zvcm1lZCApCisgICAgeworICAgICAgLyogY29tcHV0ZSBwaS80IC0gYWNjdW11bGF0b3IgKi8KKyAgICAgIHNocl9Yc2lnKCZhY2N1bXVsYXRvciwgLTEtZXhwb25lbnQpOworICAgICAgbmVnYXRlX1hzaWcoJmFjY3VtdWxhdG9yKTsKKyAgICAgIGFkZF9Yc2lnX1hzaWcoJmFjY3VtdWxhdG9yLCAmcGlfc2lnbmlmKTsKKyAgICAgIGV4cG9uZW50ID0gLTE7CisgICAgfQorCisgIGlmICggaW52ZXJ0ZWQgKQorICAgIHsKKyAgICAgIC8qIGNvbXB1dGUgcGkvMiAtIGFjY3VtdWxhdG9yICovCisgICAgICBzaHJfWHNpZygmYWNjdW11bGF0b3IsIC1leHBvbmVudCk7CisgICAgICBuZWdhdGVfWHNpZygmYWNjdW11bGF0b3IpOworICAgICAgYWRkX1hzaWdfWHNpZygmYWNjdW11bGF0b3IsICZwaV9zaWduaWYpOworICAgICAgZXhwb25lbnQgPSAwOworICAgIH0KKworICBpZiAoIHNpZ24xICkKKyAgICB7CisgICAgICAvKiBjb21wdXRlIHBpIC0gYWNjdW11bGF0b3IgKi8KKyAgICAgIHNocl9Yc2lnKCZhY2N1bXVsYXRvciwgMSAtIGV4cG9uZW50KTsKKyAgICAgIG5lZ2F0ZV9Yc2lnKCZhY2N1bXVsYXRvcik7CisgICAgICBhZGRfWHNpZ19Yc2lnKCZhY2N1bXVsYXRvciwgJnBpX3NpZ25pZik7CisgICAgICBleHBvbmVudCA9IDE7CisgICAgfQorCisgIGV4cG9uZW50ICs9IHJvdW5kX1hzaWcoJmFjY3VtdWxhdG9yKTsKKworICBzaWduaWZpY2FuZChzdDFfcHRyKSA9IFhTSUdfTEwoYWNjdW11bGF0b3IpOworICBzZXRleHBvbmVudDE2KHN0MV9wdHIsIGV4cG9uZW50KTsKKworICB0YWcgPSBGUFVfcm91bmQoc3QxX3B0ciwgMSwgMCwgRlVMTF9QUkVDSVNJT04sIHNpZ24yKTsKKyAgRlBVX3NldHRhZ2koMSwgdGFnKTsKKworICBzZXRfcHJlY2lzaW9uX2ZsYWdfdXAoKTsgIC8qIFdlIGRvIG5vdCByZWFsbHkga25vdyBpZiB1cCBvciBkb3duLAorCQkJICAgICAgIHVzZSB0aGlzIGFzIHRoZSBkZWZhdWx0LiAqLworCit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWF0aC1lbXUvcG9seV9sMi5jIGIvYXJjaC9pMzg2L21hdGgtZW11L3BvbHlfbDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDAwZTFkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L3BvbHlfbDIuYwpAQCAtMCwwICsxLDI3MiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgcG9seV9sMi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29tcHV0ZSB0aGUgYmFzZSAyIGxvZyBvZiBhIEZQVV9SRUcsIHVzaW5nIGEgcG9seW5vbWlhbCBhcHByb3hpbWF0aW9uLiAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENvcHlyaWdodCAoQykgMTk5MiwxOTkzLDE5OTQsMTk5NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICBXLiBNZXR6ZW50aGVuLCAyMiBQYXJrZXIgU3QsIE9ybW9uZCwgVmljIDMxNjMsIEF1c3RyYWxpYSB8CisgfCAgICAgICAgICAgICAgICAgIEUtbWFpbCAgIGJpbGxtQHN1YnVyYmlhLm5ldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworI2luY2x1ZGUgImV4Y2VwdGlvbi5oIgorI2luY2x1ZGUgInJlZ19jb25zdGFudC5oIgorI2luY2x1ZGUgImZwdV9lbXUuaCIKKyNpbmNsdWRlICJmcHVfc3lzdGVtLmgiCisjaW5jbHVkZSAiY29udHJvbF93LmgiCisjaW5jbHVkZSAicG9seS5oIgorCisKK3N0YXRpYyB2b2lkIGxvZzJfa2VybmVsKEZQVV9SRUcgY29uc3QgKmFyZywgdV9jaGFyIGFyZ3NpZ24sCisJCQlYc2lnICphY2N1bV9yZXN1bHQsIGxvbmcgaW50ICpleHBvbik7CisKKworLyotLS0gcG9seV9sMigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgIEJhc2UgMiBsb2dhcml0aG0gYnkgYSBwb2x5bm9taWFsIGFwcHJveGltYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQJcG9seV9sMihGUFVfUkVHICpzdDBfcHRyLCBGUFVfUkVHICpzdDFfcHRyLCB1X2NoYXIgc3QxX3NpZ24pCit7CisgIGxvbmcgaW50CSAgICAgICBleHBvbmVudCwgZXhwb24sIGV4cG9uX2V4cG9uOworICBYc2lnICAgICAgICAgICAgICAgICBhY2N1bXVsYXRvciwgZXhwb25fYWNjdW0sIHlhY2N1bTsKKyAgdV9jaGFyCQkgICAgICAgc2lnbiwgYXJnc2lnbjsKKyAgRlBVX1JFRyAgICAgICAgICAgICAgeDsKKyAgaW50ICAgICAgICAgICAgICAgICAgdGFnOworCisgIGV4cG9uZW50ID0gZXhwb25lbnQxNihzdDBfcHRyKTsKKworICAvKiBGcm9tIHN0MF9wdHIsIG1ha2UgYSBudW1iZXIgPiBzcXJ0KDIpLzIgYW5kIDwgc3FydCgyKSAqLworICBpZiAoIHN0MF9wdHItPnNpZ2ggPiAodW5zaWduZWQpMHhiNTA0ZjMzNCApCisgICAgeworICAgICAgLyogVHJlYXQgYXMgIHNxcnQoMikvMiA8IHN0MF9wdHIgPCAxICovCisgICAgICBzaWduaWZpY2FuZCgmeCkgPSAtIHNpZ25pZmljYW5kKHN0MF9wdHIpOworICAgICAgc2V0ZXhwb25lbnQxNigmeCwgLTEpOworICAgICAgZXhwb25lbnQrKzsKKyAgICAgIGFyZ3NpZ24gPSBTSUdOX05FRzsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBUcmVhdCBhcyAgMSA8PSBzdDBfcHRyIDwgc3FydCgyKSAqLworICAgICAgeC5zaWdoID0gc3QwX3B0ci0+c2lnaCAtIDB4ODAwMDAwMDA7CisgICAgICB4LnNpZ2wgPSBzdDBfcHRyLT5zaWdsOworICAgICAgc2V0ZXhwb25lbnQxNigmeCwgMCk7CisgICAgICBhcmdzaWduID0gU0lHTl9QT1M7CisgICAgfQorICB0YWcgPSBGUFVfbm9ybWFsaXplX251bygmeCk7CisKKyAgaWYgKCB0YWcgPT0gVEFHX1plcm8gKQorICAgIHsKKyAgICAgIGV4cG9uID0gMDsKKyAgICAgIGFjY3VtdWxhdG9yLm1zdyA9IGFjY3VtdWxhdG9yLm1pZHcgPSBhY2N1bXVsYXRvci5sc3cgPSAwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGxvZzJfa2VybmVsKCZ4LCBhcmdzaWduLCAmYWNjdW11bGF0b3IsICZleHBvbik7CisgICAgfQorCisgIGlmICggZXhwb25lbnQgPCAwICkKKyAgICB7CisgICAgICBzaWduID0gU0lHTl9ORUc7CisgICAgICBleHBvbmVudCA9IC1leHBvbmVudDsKKyAgICB9CisgIGVsc2UKKyAgICBzaWduID0gU0lHTl9QT1M7CisgIGV4cG9uX2FjY3VtLm1zdyA9IGV4cG9uZW50OyBleHBvbl9hY2N1bS5taWR3ID0gZXhwb25fYWNjdW0ubHN3ID0gMDsKKyAgaWYgKCBleHBvbmVudCApCisgICAgeworICAgICAgZXhwb25fZXhwb24gPSAzMSArIG5vcm1fWHNpZygmZXhwb25fYWNjdW0pOworICAgICAgc2hyX1hzaWcoJmFjY3VtdWxhdG9yLCBleHBvbl9leHBvbiAtIGV4cG9uKTsKKworICAgICAgaWYgKCBzaWduIF4gYXJnc2lnbiApCisJbmVnYXRlX1hzaWcoJmFjY3VtdWxhdG9yKTsKKyAgICAgIGFkZF9Yc2lnX1hzaWcoJmFjY3VtdWxhdG9yLCAmZXhwb25fYWNjdW0pOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGV4cG9uX2V4cG9uID0gZXhwb247CisgICAgICBzaWduID0gYXJnc2lnbjsKKyAgICB9CisKKyAgeWFjY3VtLmxzdyA9IDA7IFhTSUdfTEwoeWFjY3VtKSA9IHNpZ25pZmljYW5kKHN0MV9wdHIpOworICBtdWxfWHNpZ19Yc2lnKCZhY2N1bXVsYXRvciwgJnlhY2N1bSk7CisKKyAgZXhwb25fZXhwb24gKz0gcm91bmRfWHNpZygmYWNjdW11bGF0b3IpOworCisgIGlmICggYWNjdW11bGF0b3IubXN3ID09IDAgKQorICAgIHsKKyAgICAgIEZQVV9jb3B5X3RvX3JlZzEoJkNPTlNUX1osIFRBR19aZXJvKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgc2lnbmlmaWNhbmQoc3QxX3B0cikgPSBYU0lHX0xMKGFjY3VtdWxhdG9yKTsKKyAgc2V0ZXhwb25lbnQxNihzdDFfcHRyLCBleHBvbl9leHBvbiArIGV4cG9uZW50MTYoc3QxX3B0cikgKyAxKTsKKworICB0YWcgPSBGUFVfcm91bmQoc3QxX3B0ciwgMSwgMCwgRlVMTF9QUkVDSVNJT04sIHNpZ24gXiBzdDFfc2lnbik7CisgIEZQVV9zZXR0YWdpKDEsIHRhZyk7CisKKyAgc2V0X3ByZWNpc2lvbl9mbGFnX3VwKCk7ICAvKiA4MDQ4NiBhcHBlYXJzIHRvIGFsd2F5cyBkbyB0aGlzICovCisKKyAgcmV0dXJuOworCit9CisKKworLyotLS0gcG9seV9sMnAxKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgIEJhc2UgMiBsb2dhcml0aG0gYnkgYSBwb2x5bm9taWFsIGFwcHJveGltYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgbG9nMih4KzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50CXBvbHlfbDJwMSh1X2NoYXIgc2lnbjAsIHVfY2hhciBzaWduMSwKKwkJICBGUFVfUkVHICpzdDBfcHRyLCBGUFVfUkVHICpzdDFfcHRyLCBGUFVfUkVHICpkZXN0KQoreworICB1X2NoYXIgICAgICAgICAgICAgCXRhZzsKKyAgbG9uZyBpbnQgICAgICAgIAlleHBvbmVudDsKKyAgWHNpZyAgICAgICAgICAgICAgCWFjY3VtdWxhdG9yLCB5YWNjdW07CisKKyAgaWYgKCBleHBvbmVudDE2KHN0MF9wdHIpIDwgMCApCisgICAgeworICAgICAgbG9nMl9rZXJuZWwoc3QwX3B0ciwgc2lnbjAsICZhY2N1bXVsYXRvciwgJmV4cG9uZW50KTsKKworICAgICAgeWFjY3VtLmxzdyA9IDA7CisgICAgICBYU0lHX0xMKHlhY2N1bSkgPSBzaWduaWZpY2FuZChzdDFfcHRyKTsKKyAgICAgIG11bF9Yc2lnX1hzaWcoJmFjY3VtdWxhdG9yLCAmeWFjY3VtKTsKKworICAgICAgZXhwb25lbnQgKz0gcm91bmRfWHNpZygmYWNjdW11bGF0b3IpOworCisgICAgICBleHBvbmVudCArPSBleHBvbmVudDE2KHN0MV9wdHIpICsgMTsKKyAgICAgIGlmICggZXhwb25lbnQgPCBFWFBfV0FZX1VOREVSICkgZXhwb25lbnQgPSBFWFBfV0FZX1VOREVSOworCisgICAgICBzaWduaWZpY2FuZChkZXN0KSA9IFhTSUdfTEwoYWNjdW11bGF0b3IpOworICAgICAgc2V0ZXhwb25lbnQxNihkZXN0LCBleHBvbmVudCk7CisKKyAgICAgIHRhZyA9IEZQVV9yb3VuZChkZXN0LCAxLCAwLCBGVUxMX1BSRUNJU0lPTiwgc2lnbjAgXiBzaWduMSk7CisgICAgICBGUFVfc2V0dGFnaSgxLCB0YWcpOworCisgICAgICBpZiAoIHRhZyA9PSBUQUdfVmFsaWQgKQorCXNldF9wcmVjaXNpb25fZmxhZ191cCgpOyAgIC8qIDgwNDg2IGFwcGVhcnMgdG8gYWx3YXlzIGRvIHRoaXMgKi8KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBUaGUgbWFnbml0dWRlIG9mIHN0MF9wdHIgaXMgZmFyIHRvbyBsYXJnZS4gKi8KKworICAgICAgaWYgKCBzaWduMCAhPSBTSUdOX1BPUyApCisJeworCSAgLyogVHJ5aW5nIHRvIGdldCB0aGUgbG9nIG9mIGEgbmVnYXRpdmUgbnVtYmVyLiAqLworI2lmZGVmIFBFQ1VMSUFSXzQ4NiAgIC8qIFN0dXBpZCA4MDQ4NiBkb2Vzbid0IHdvcnJ5IGFib3V0IGxvZyhuZWdhdGl2ZSkuICovCisJICBjaGFuZ2VzaWduKHN0MV9wdHIpOworI2Vsc2UKKwkgIGlmICggYXJpdGhfaW52YWxpZCgxKSA8IDAgKQorCSAgICByZXR1cm4gMTsKKyNlbmRpZiAvKiBQRUNVTElBUl80ODYgKi8KKwl9CisKKyAgICAgIC8qIDgwNDg2IGFwcGVhcnMgdG8gZG8gdGhpcyAqLworICAgICAgaWYgKCBzaWduMCA9PSBTSUdOX05FRyApCisJc2V0X3ByZWNpc2lvbl9mbGFnX2Rvd24oKTsKKyAgICAgIGVsc2UKKwlzZXRfcHJlY2lzaW9uX2ZsYWdfdXAoKTsKKyAgICB9CisKKyAgaWYgKCBleHBvbmVudChkZXN0KSA8PSBFWFBfVU5ERVIgKQorICAgIEVYQ0VQVElPTihFWF9VbmRlcmZsb3cpOworCisgIHJldHVybiAwOworCit9CisKKworCisKKyN1bmRlZiBISVBPV0VSCisjZGVmaW5lCUhJUE9XRVIJMTAKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgbG9ndGVybXNbSElQT1dFUl0gPQoreworICAweDJhOGVjYTU3MDVmYzJlZjBMTCwKKyAgMHhmNjM4NGVlMWQwMWZlYmNlTEwsCisgIDB4MDkzYmI2Mjg3N2NkZjY0MkxMLAorICAweDAwNjk4NWQ4YTllYzQzOWJMTCwKKyAgMHgwMDA1MjEyYzRmNTVhOWM4TEwsCisgIDB4MDAwMDQzMjZhMTY5MjdmMExMLAorICAweDAwMDAwMzhkMWQ4MGEwZTdMTCwKKyAgMHgwMDAwMDAzMTQxY2M4MGM2TEwsCisgIDB4MDAwMDAwMDJiMTY2OGM5ZkxMLAorICAweDAwMDAwMDAwMmM3YTQ2YWFMTAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbGVhZHRlcm0gPSAweGI4MDAwMDAwOworCisKKy8qLS0tIGxvZzJfa2VybmVsKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgICBCYXNlIDIgbG9nYXJpdGhtIGJ5IGEgcG9seW5vbWlhbCBhcHByb3hpbWF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgIGxvZzIoeCsxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIGxvZzJfa2VybmVsKEZQVV9SRUcgY29uc3QgKmFyZywgdV9jaGFyIGFyZ3NpZ24sIFhzaWcgKmFjY3VtX3Jlc3VsdCwKKwkJCWxvbmcgaW50ICpleHBvbikKK3sKKyAgbG9uZyBpbnQgICAgICAgICAgICAgZXhwb25lbnQsIGFkajsKKyAgdW5zaWduZWQgbG9uZyBsb25nICAgWHNxOworICBYc2lnICAgICAgICAgICAgICAgICBhY2N1bXVsYXRvciwgTnVtZXIsIERlbm9tLCBhcmdTaWduaWYsIGFyZ19zaWduaWY7CisKKyAgZXhwb25lbnQgPSBleHBvbmVudDE2KGFyZyk7CisgIE51bWVyLmxzdyA9IERlbm9tLmxzdyA9IDA7CisgIFhTSUdfTEwoTnVtZXIpID0gWFNJR19MTChEZW5vbSkgPSBzaWduaWZpY2FuZChhcmcpOworICBpZiAoIGFyZ3NpZ24gPT0gU0lHTl9QT1MgKQorICAgIHsKKyAgICAgIHNocl9Yc2lnKCZEZW5vbSwgMiAtICgxICsgZXhwb25lbnQpKTsKKyAgICAgIERlbm9tLm1zdyB8PSAweDgwMDAwMDAwOworICAgICAgZGl2X1hzaWcoJk51bWVyLCAmRGVub20sICZhcmdTaWduaWYpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHNocl9Yc2lnKCZEZW5vbSwgMSAtICgxICsgZXhwb25lbnQpKTsKKyAgICAgIG5lZ2F0ZV9Yc2lnKCZEZW5vbSk7CisgICAgICBpZiAoIERlbm9tLm1zdyAmIDB4ODAwMDAwMDAgKQorCXsKKwkgIGRpdl9Yc2lnKCZOdW1lciwgJkRlbm9tLCAmYXJnU2lnbmlmKTsKKwkgIGV4cG9uZW50ICsrOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBEZW5vbSBtdXN0IGJlIDEuMCAqLworCSAgYXJnU2lnbmlmLmxzdyA9IE51bWVyLmxzdzsgYXJnU2lnbmlmLm1pZHcgPSBOdW1lci5taWR3OworCSAgYXJnU2lnbmlmLm1zdyA9IE51bWVyLm1zdzsKKwl9CisgICAgfQorCisjaWZuZGVmIFBFQ1VMSUFSXzQ4NgorICAvKiBTaG91bGQgY2hlY2sgaGVyZSB0aGF0ICB8bG9jYWxfYXJnfCAgaXMgd2l0aGluIHRoZSB2YWxpZCByYW5nZSAqLworICBpZiAoIGV4cG9uZW50ID49IC0yICkKKyAgICB7CisgICAgICBpZiAoIChleHBvbmVudCA+IC0yKSB8fAorCSAgKGFyZ1NpZ25pZi5tc3cgPiAodW5zaWduZWQpMHhhZmIwY2NjMCkgKQorCXsKKwkgIC8qIFRoZSBhcmd1bWVudCBpcyB0b28gbGFyZ2UgKi8KKwl9CisgICAgfQorI2VuZGlmIC8qIFBFQ1VMSUFSXzQ4NiAqLworCisgIGFyZ19zaWduaWYubHN3ID0gYXJnU2lnbmlmLmxzdzsgWFNJR19MTChhcmdfc2lnbmlmKSA9IFhTSUdfTEwoYXJnU2lnbmlmKTsKKyAgYWRqID0gbm9ybV9Yc2lnKCZhcmdTaWduaWYpOworICBhY2N1bXVsYXRvci5sc3cgPSBhcmdTaWduaWYubHN3OyBYU0lHX0xMKGFjY3VtdWxhdG9yKSA9IFhTSUdfTEwoYXJnU2lnbmlmKTsKKyAgbXVsX1hzaWdfWHNpZygmYWNjdW11bGF0b3IsICZhY2N1bXVsYXRvcik7CisgIHNocl9Yc2lnKCZhY2N1bXVsYXRvciwgMiooLTEgLSAoMSArIGV4cG9uZW50ICsgYWRqKSkpOworICBYc3EgPSBYU0lHX0xMKGFjY3VtdWxhdG9yKTsKKyAgaWYgKCBhY2N1bXVsYXRvci5sc3cgJiAweDgwMDAwMDAwICkKKyAgICBYc3ErKzsKKworICBhY2N1bXVsYXRvci5tc3cgPSBhY2N1bXVsYXRvci5taWR3ID0gYWNjdW11bGF0b3IubHN3ID0gMDsKKyAgLyogRG8gdGhlIGJhc2ljIGZpeGVkIHBvaW50IHBvbHlub21pYWwgZXZhbHVhdGlvbiAqLworICBwb2x5bm9taWFsX1hzaWcoJmFjY3VtdWxhdG9yLCAmWHNxLCBsb2d0ZXJtcywgSElQT1dFUi0xKTsKKworICBtdWxfWHNpZ19Yc2lnKCZhY2N1bXVsYXRvciwgJmFyZ1NpZ25pZik7CisgIHNocl9Yc2lnKCZhY2N1bXVsYXRvciwgNiAtIGFkaik7CisKKyAgbXVsMzJfWHNpZygmYXJnX3NpZ25pZiwgbGVhZHRlcm0pOworICBhZGRfdHdvX1hzaWcoJmFjY3VtdWxhdG9yLCAmYXJnX3NpZ25pZiwgJmV4cG9uZW50KTsKKworICAqZXhwb24gPSBleHBvbmVudCArIDE7CisgIGFjY3VtX3Jlc3VsdC0+bHN3ID0gYWNjdW11bGF0b3IubHN3OworICBhY2N1bV9yZXN1bHQtPm1pZHcgPSBhY2N1bXVsYXRvci5taWR3OworICBhY2N1bV9yZXN1bHQtPm1zdyA9IGFjY3VtdWxhdG9yLm1zdzsKKworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hdGgtZW11L3BvbHlfc2luLmMgYi9hcmNoL2kzODYvbWF0aC1lbXUvcG9seV9zaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzYzMTNmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L3BvbHlfc2luLmMKQEAgLTAsMCArMSwzOTcgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgIHBvbHlfc2luLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICBDb21wdXRhdGlvbiBvZiBhbiBhcHByb3hpbWF0aW9uIG9mIHRoZSBzaW4gZnVuY3Rpb24gYW5kIHRoZSBjb3NpbmUgICAgICAgfAorIHwgIGZ1bmN0aW9uIGJ5IGEgcG9seW5vbWlhbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENvcHlyaWdodCAoQykgMTk5MiwxOTkzLDE5OTQsMTk5NywxOTk5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICBXLiBNZXR6ZW50aGVuLCAyMiBQYXJrZXIgU3QsIE9ybW9uZCwgVmljIDMxNjMsIEF1c3RyYWxpYSB8CisgfCAgICAgICAgICAgICAgICAgIEUtbWFpbCAgIGJpbGxtQG1lbGJwYy5vcmcuYXUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworI2luY2x1ZGUgImV4Y2VwdGlvbi5oIgorI2luY2x1ZGUgInJlZ19jb25zdGFudC5oIgorI2luY2x1ZGUgImZwdV9lbXUuaCIKKyNpbmNsdWRlICJmcHVfc3lzdGVtLmgiCisjaW5jbHVkZSAiY29udHJvbF93LmgiCisjaW5jbHVkZSAicG9seS5oIgorCisKKyNkZWZpbmUJTl9DT0VGRl9QCTQKKyNkZWZpbmUJTl9DT0VGRl9OCTQKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBwb3NfdGVybXNfbFtOX0NPRUZGX1BdID0KK3sKKyAgMHhhYWFhYWFhYWFhYWFhYWFiTEwsCisgIDB4MDBkMDBkMDBkMDBjZjkwNkxMLAorICAweDAwMDAwNmI5OTE1OWE4YmJMTCwKKyAgMHgwMDAwMDAwMDBkNzM5MmU2TEwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgbmVnX3Rlcm1zX2xbTl9DT0VGRl9OXSA9Cit7CisgIDB4MjIyMjIyMjIyMjIyMjE2N0xMLAorICAweDAwMDJlM2JjNzRhYWI2MjRMTCwKKyAgMHgwMDAwMDAwYjA5MjI5MDYyTEwsCisgIDB4MDAwMDAwMDAwMDBjNzk3M0xMCit9OworCisKKworI2RlZmluZQlOX0NPRUZGX1BICTQKKyNkZWZpbmUJTl9DT0VGRl9OSAk0CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIHBvc190ZXJtc19oW05fQ09FRkZfUEhdID0KK3sKKyAgMHgwMDAwMDAwMDAwMDAwMDAwTEwsCisgIDB4MDViMDViMDViMDViMDQwNkxMLAorICAweDAwMDA0OWY5M2VkZDkxYTlMTCwKKyAgMHgwMDAwMDAwMGM5YzllZDYyTEwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgbmVnX3Rlcm1zX2hbTl9DT0VGRl9OSF0gPQoreworICAweGFhYWFhYWFhYWFhYWFhOThMTCwKKyAgMHgwMDFhMDFhMDFhMDE5MDY0TEwsCisgIDB4MDAwMDAwOGY3NmM2OGE3N0xMLAorICAweDAwMDAwMDAwMDBkNThmNWVMTAorfTsKKworCisvKi0tLSBwb2x5X3NpbmUoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZAlwb2x5X3NpbmUoRlBVX1JFRyAqc3QwX3B0cikKK3sKKyAgaW50ICAgICAgICAgICAgICAgICBleHBvbmVudCwgZWNoYW5nZTsKKyAgWHNpZyAgICAgICAgICAgICAgICBhY2N1bXVsYXRvciwgYXJnU3FyZCwgYXJnVG80OworICB1bnNpZ25lZCBsb25nICAgICAgIGZpeF91cCwgYWRqOworICB1bnNpZ25lZCBsb25nIGxvbmcgIGZpeGVkX2FyZzsKKyAgRlBVX1JFRwkgICAgICByZXN1bHQ7CisKKyAgZXhwb25lbnQgPSBleHBvbmVudChzdDBfcHRyKTsKKworICBhY2N1bXVsYXRvci5sc3cgPSBhY2N1bXVsYXRvci5taWR3ID0gYWNjdW11bGF0b3IubXN3ID0gMDsKKworICAvKiBTcGxpdCBpbnRvIHR3byByYW5nZXMsIGZvciBhcmd1bWVudHMgYmVsb3cgYW5kIGFib3ZlIDEuMCAqLworICAvKiBUaGUgYm91bmRhcnkgYmV0d2VlbiB1cHBlciBhbmQgbG93ZXIgaXMgYXBwcm94IDAuODgzMDkxMDEyNTkgKi8KKyAgaWYgKCAoZXhwb25lbnQgPCAtMSkgfHwgKChleHBvbmVudCA9PSAtMSkgJiYgKHN0MF9wdHItPnNpZ2ggPD0gMHhlMjEyNDBhYSkpICkKKyAgICB7CisgICAgICAvKiBUaGUgYXJndW1lbnQgaXMgPD0gMC44ODMwOTEwMTI1OSAqLworCisgICAgICBhcmdTcXJkLm1zdyA9IHN0MF9wdHItPnNpZ2g7IGFyZ1NxcmQubWlkdyA9IHN0MF9wdHItPnNpZ2w7IGFyZ1NxcmQubHN3ID0gMDsKKyAgICAgIG11bDY0X1hzaWcoJmFyZ1NxcmQsICZzaWduaWZpY2FuZChzdDBfcHRyKSk7CisgICAgICBzaHJfWHNpZygmYXJnU3FyZCwgMiooLTEtZXhwb25lbnQpKTsKKyAgICAgIGFyZ1RvNC5tc3cgPSBhcmdTcXJkLm1zdzsgYXJnVG80Lm1pZHcgPSBhcmdTcXJkLm1pZHc7CisgICAgICBhcmdUbzQubHN3ID0gYXJnU3FyZC5sc3c7CisgICAgICBtdWxfWHNpZ19Yc2lnKCZhcmdUbzQsICZhcmdUbzQpOworCisgICAgICBwb2x5bm9taWFsX1hzaWcoJmFjY3VtdWxhdG9yLCAmWFNJR19MTChhcmdUbzQpLCBuZWdfdGVybXNfbCwKKwkJICAgICAgTl9DT0VGRl9OLTEpOworICAgICAgbXVsX1hzaWdfWHNpZygmYWNjdW11bGF0b3IsICZhcmdTcXJkKTsKKyAgICAgIG5lZ2F0ZV9Yc2lnKCZhY2N1bXVsYXRvcik7CisKKyAgICAgIHBvbHlub21pYWxfWHNpZygmYWNjdW11bGF0b3IsICZYU0lHX0xMKGFyZ1RvNCksIHBvc190ZXJtc19sLAorCQkgICAgICBOX0NPRUZGX1AtMSk7CisKKyAgICAgIHNocl9Yc2lnKCZhY2N1bXVsYXRvciwgMik7ICAgIC8qIERpdmlkZSBieSBmb3VyICovCisgICAgICBhY2N1bXVsYXRvci5tc3cgfD0gMHg4MDAwMDAwMDsgIC8qIEFkZCAxLjAgKi8KKworICAgICAgbXVsNjRfWHNpZygmYWNjdW11bGF0b3IsICZzaWduaWZpY2FuZChzdDBfcHRyKSk7CisgICAgICBtdWw2NF9Yc2lnKCZhY2N1bXVsYXRvciwgJnNpZ25pZmljYW5kKHN0MF9wdHIpKTsKKyAgICAgIG11bDY0X1hzaWcoJmFjY3VtdWxhdG9yLCAmc2lnbmlmaWNhbmQoc3QwX3B0cikpOworCisgICAgICAvKiBEaXZpZGUgYnkgZm91ciwgRlBVX1JFRyBjb21wYXRpYmxlLCBldGMgKi8KKyAgICAgIGV4cG9uZW50ID0gMypleHBvbmVudDsKKworICAgICAgLyogVGhlIG1pbmltdW0gZXhwb25lbnQgZGlmZmVyZW5jZSBpcyAzICovCisgICAgICBzaHJfWHNpZygmYWNjdW11bGF0b3IsIGV4cG9uZW50KHN0MF9wdHIpIC0gZXhwb25lbnQpOworCisgICAgICBuZWdhdGVfWHNpZygmYWNjdW11bGF0b3IpOworICAgICAgWFNJR19MTChhY2N1bXVsYXRvcikgKz0gc2lnbmlmaWNhbmQoc3QwX3B0cik7CisKKyAgICAgIGVjaGFuZ2UgPSByb3VuZF9Yc2lnKCZhY2N1bXVsYXRvcik7CisKKyAgICAgIHNldGV4cG9uZW50cG9zKCZyZXN1bHQsIGV4cG9uZW50KHN0MF9wdHIpICsgZWNoYW5nZSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogVGhlIGFyZ3VtZW50IGlzID4gMC44ODMwOTEwMTI1OSAqLworICAgICAgLyogV2UgdXNlIHNpbihzdCgwKSkgPSBjb3MocGkvMi1zdCgwKSkgKi8KKworICAgICAgZml4ZWRfYXJnID0gc2lnbmlmaWNhbmQoc3QwX3B0cik7CisKKyAgICAgIGlmICggZXhwb25lbnQgPT0gMCApCisJeworCSAgLyogVGhlIGFyZ3VtZW50IGlzID49IDEuMCAqLworCisJICAvKiBQdXQgdGhlIGJpbmFyeSBwb2ludCBhdCB0aGUgbGVmdC4gKi8KKwkgIGZpeGVkX2FyZyA8PD0gMTsKKwl9CisgICAgICAvKiBwaS8yIGluIGhleCBpczogMS45MjFmYjU0NDQyZDE4NDY5IDg5OENDNTE3MDFCODM5QTIgNTIwNDlDMSAqLworICAgICAgZml4ZWRfYXJnID0gMHg5MjFmYjU0NDQyZDE4NDY5TEwgLSBmaXhlZF9hcmc7CisgICAgICAvKiBUaGVyZSBpcyBhIHNwZWNpYWwgY2FzZSB3aGljaCBhcmlzZXMgZHVlIHRvIHJvdW5kaW5nLCB0byBmaXggaGVyZS4gKi8KKyAgICAgIGlmICggZml4ZWRfYXJnID09IDB4ZmZmZmZmZmZmZmZmZmZmZkxMICkKKwlmaXhlZF9hcmcgPSAwOworCisgICAgICBYU0lHX0xMKGFyZ1NxcmQpID0gZml4ZWRfYXJnOyBhcmdTcXJkLmxzdyA9IDA7CisgICAgICBtdWw2NF9Yc2lnKCZhcmdTcXJkLCAmZml4ZWRfYXJnKTsKKworICAgICAgWFNJR19MTChhcmdUbzQpID0gWFNJR19MTChhcmdTcXJkKTsgYXJnVG80LmxzdyA9IGFyZ1NxcmQubHN3OworICAgICAgbXVsX1hzaWdfWHNpZygmYXJnVG80LCAmYXJnVG80KTsKKworICAgICAgcG9seW5vbWlhbF9Yc2lnKCZhY2N1bXVsYXRvciwgJlhTSUdfTEwoYXJnVG80KSwgbmVnX3Rlcm1zX2gsCisJCSAgICAgIE5fQ09FRkZfTkgtMSk7CisgICAgICBtdWxfWHNpZ19Yc2lnKCZhY2N1bXVsYXRvciwgJmFyZ1NxcmQpOworICAgICAgbmVnYXRlX1hzaWcoJmFjY3VtdWxhdG9yKTsKKworICAgICAgcG9seW5vbWlhbF9Yc2lnKCZhY2N1bXVsYXRvciwgJlhTSUdfTEwoYXJnVG80KSwgcG9zX3Rlcm1zX2gsCisJCSAgICAgIE5fQ09FRkZfUEgtMSk7CisgICAgICBuZWdhdGVfWHNpZygmYWNjdW11bGF0b3IpOworCisgICAgICBtdWw2NF9Yc2lnKCZhY2N1bXVsYXRvciwgJmZpeGVkX2FyZyk7CisgICAgICBtdWw2NF9Yc2lnKCZhY2N1bXVsYXRvciwgJmZpeGVkX2FyZyk7CisKKyAgICAgIHNocl9Yc2lnKCZhY2N1bXVsYXRvciwgMyk7CisgICAgICBuZWdhdGVfWHNpZygmYWNjdW11bGF0b3IpOworCisgICAgICBhZGRfWHNpZ19Yc2lnKCZhY2N1bXVsYXRvciwgJmFyZ1NxcmQpOworCisgICAgICBzaHJfWHNpZygmYWNjdW11bGF0b3IsIDEpOworCisgICAgICBhY2N1bXVsYXRvci5sc3cgfD0gMTsgIC8qIEEgemVybyBhY2N1bXVsYXRvciBoZXJlIHdvdWxkIGNhdXNlIHByb2JsZW1zICovCisgICAgICBuZWdhdGVfWHNpZygmYWNjdW11bGF0b3IpOworCisgICAgICAvKiBUaGUgYmFzaWMgY29tcHV0YXRpb24gaXMgY29tcGxldGUuIE5vdyBmaXggdGhlIGFuc3dlciB0bworCSBjb21wZW5zYXRlIGZvciB0aGUgZXJyb3IgZHVlIHRvIHRoZSBhcHByb3hpbWF0aW9uIHVzZWQgZm9yCisJIHBpLzIKKwkgKi8KKworICAgICAgLyogVGhpcyBoYXMgYW4gZXhwb25lbnQgb2YgLTY1ICovCisgICAgICBmaXhfdXAgPSAweDg5OGNjNTE3OworICAgICAgLyogVGhlIGZpeC11cCBuZWVkcyB0byBiZSBpbXByb3ZlZCBmb3IgbGFyZ2VyIGFyZ3MgKi8KKyAgICAgIGlmICggYXJnU3FyZC5tc3cgJiAweGZmYzAwMDAwICkKKwl7CisJICAvKiBHZXQgYWJvdXQgMzIgYml0IHByZWNpc2lvbiBpbiB0aGVzZTogKi8KKwkgIGZpeF91cCAtPSBtdWxfMzJfMzIoMHg4OThjYzUxNywgYXJnU3FyZC5tc3cpIC8gNjsKKwl9CisgICAgICBmaXhfdXAgPSBtdWxfMzJfMzIoZml4X3VwLCBMTF9NU1coZml4ZWRfYXJnKSk7CisKKyAgICAgIGFkaiA9IGFjY3VtdWxhdG9yLmxzdzsgICAgLyogdGVtcCBzYXZlICovCisgICAgICBhY2N1bXVsYXRvci5sc3cgLT0gZml4X3VwOworICAgICAgaWYgKCBhY2N1bXVsYXRvci5sc3cgPiBhZGogKQorCVhTSUdfTEwoYWNjdW11bGF0b3IpIC0tOworCisgICAgICBlY2hhbmdlID0gcm91bmRfWHNpZygmYWNjdW11bGF0b3IpOworCisgICAgICBzZXRleHBvbmVudHBvcygmcmVzdWx0LCBlY2hhbmdlIC0gMSk7CisgICAgfQorCisgIHNpZ25pZmljYW5kKCZyZXN1bHQpID0gWFNJR19MTChhY2N1bXVsYXRvcik7CisgIHNldHNpZ24oJnJlc3VsdCwgZ2V0c2lnbihzdDBfcHRyKSk7CisgIEZQVV9jb3B5X3RvX3JlZzAoJnJlc3VsdCwgVEFHX1ZhbGlkKTsKKworI2lmZGVmIFBBUkFOT0lECisgIGlmICggKGV4cG9uZW50KCZyZXN1bHQpID49IDApCisgICAgICAmJiAoc2lnbmlmaWNhbmQoJnJlc3VsdCkgPiAweDgwMDAwMDAwMDAwMDAwMDBMTCkgKQorICAgIHsKKyAgICAgIEVYQ0VQVElPTihFWF9JTlRFUk5BTHwweDE1MCk7CisgICAgfQorI2VuZGlmIC8qIFBBUkFOT0lEICovCisKK30KKworCisKKy8qLS0tIHBvbHlfY29zKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkCXBvbHlfY29zKEZQVV9SRUcgKnN0MF9wdHIpCit7CisgIEZQVV9SRUcJICAgICAgcmVzdWx0OworICBsb25nIGludCAgICAgICAgICAgIGV4cG9uZW50LCBleHAyLCBlY2hhbmdlOworICBYc2lnICAgICAgICAgICAgICAgIGFjY3VtdWxhdG9yLCBhcmdTcXJkLCBmaXhfdXAsIGFyZ1RvNDsKKyAgdW5zaWduZWQgbG9uZyBsb25nICBmaXhlZF9hcmc7CisKKyNpZmRlZiBQQVJBTk9JRAorICBpZiAoIChleHBvbmVudChzdDBfcHRyKSA+IDApCisgICAgICB8fCAoKGV4cG9uZW50KHN0MF9wdHIpID09IDApCisJICAmJiAoc2lnbmlmaWNhbmQoc3QwX3B0cikgPiAweGM5MGZkYWEyMjE2OGMyMzRMTCkpICkKKyAgICB7CisgICAgICBFWENFUFRJT04oRVhfSW52YWxpZCk7CisgICAgICBGUFVfY29weV90b19yZWcwKCZDT05TVF9RTmFOLCBUQUdfU3BlY2lhbCk7CisgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmIC8qIFBBUkFOT0lEICovCisKKyAgZXhwb25lbnQgPSBleHBvbmVudChzdDBfcHRyKTsKKworICBhY2N1bXVsYXRvci5sc3cgPSBhY2N1bXVsYXRvci5taWR3ID0gYWNjdW11bGF0b3IubXN3ID0gMDsKKworICBpZiAoIChleHBvbmVudCA8IC0xKSB8fCAoKGV4cG9uZW50ID09IC0xKSAmJiAoc3QwX3B0ci0+c2lnaCA8PSAweGIwMGQ2ZjU0KSkgKQorICAgIHsKKyAgICAgIC8qIGFyZyBpcyA8IDAuNjg3NzA1ICovCisKKyAgICAgIGFyZ1NxcmQubXN3ID0gc3QwX3B0ci0+c2lnaDsgYXJnU3FyZC5taWR3ID0gc3QwX3B0ci0+c2lnbDsKKyAgICAgIGFyZ1NxcmQubHN3ID0gMDsKKyAgICAgIG11bDY0X1hzaWcoJmFyZ1NxcmQsICZzaWduaWZpY2FuZChzdDBfcHRyKSk7CisKKyAgICAgIGlmICggZXhwb25lbnQgPCAtMSApCisJeworCSAgLyogc2hpZnQgdGhlIGFyZ3VtZW50IHJpZ2h0IGJ5IHRoZSByZXF1aXJlZCBwbGFjZXMgKi8KKwkgIHNocl9Yc2lnKCZhcmdTcXJkLCAyKigtMS1leHBvbmVudCkpOworCX0KKworICAgICAgYXJnVG80Lm1zdyA9IGFyZ1NxcmQubXN3OyBhcmdUbzQubWlkdyA9IGFyZ1NxcmQubWlkdzsKKyAgICAgIGFyZ1RvNC5sc3cgPSBhcmdTcXJkLmxzdzsKKyAgICAgIG11bF9Yc2lnX1hzaWcoJmFyZ1RvNCwgJmFyZ1RvNCk7CisKKyAgICAgIHBvbHlub21pYWxfWHNpZygmYWNjdW11bGF0b3IsICZYU0lHX0xMKGFyZ1RvNCksIG5lZ190ZXJtc19oLAorCQkgICAgICBOX0NPRUZGX05ILTEpOworICAgICAgbXVsX1hzaWdfWHNpZygmYWNjdW11bGF0b3IsICZhcmdTcXJkKTsKKyAgICAgIG5lZ2F0ZV9Yc2lnKCZhY2N1bXVsYXRvcik7CisKKyAgICAgIHBvbHlub21pYWxfWHNpZygmYWNjdW11bGF0b3IsICZYU0lHX0xMKGFyZ1RvNCksIHBvc190ZXJtc19oLAorCQkgICAgICBOX0NPRUZGX1BILTEpOworICAgICAgbmVnYXRlX1hzaWcoJmFjY3VtdWxhdG9yKTsKKworICAgICAgbXVsNjRfWHNpZygmYWNjdW11bGF0b3IsICZzaWduaWZpY2FuZChzdDBfcHRyKSk7CisgICAgICBtdWw2NF9Yc2lnKCZhY2N1bXVsYXRvciwgJnNpZ25pZmljYW5kKHN0MF9wdHIpKTsKKyAgICAgIHNocl9Yc2lnKCZhY2N1bXVsYXRvciwgLTIqKDErZXhwb25lbnQpKTsKKworICAgICAgc2hyX1hzaWcoJmFjY3VtdWxhdG9yLCAzKTsKKyAgICAgIG5lZ2F0ZV9Yc2lnKCZhY2N1bXVsYXRvcik7CisKKyAgICAgIGFkZF9Yc2lnX1hzaWcoJmFjY3VtdWxhdG9yLCAmYXJnU3FyZCk7CisKKyAgICAgIHNocl9Yc2lnKCZhY2N1bXVsYXRvciwgMSk7CisKKyAgICAgIC8qIEl0IGRvZXNuJ3QgbWF0dGVyIGlmIGFjY3VtdWxhdG9yIGlzIGFsbCB6ZXJvIGhlcmUsIHRoZQorCSBmb2xsb3dpbmcgY29kZSB3aWxsIHdvcmsgb2sgKi8KKyAgICAgIG5lZ2F0ZV9Yc2lnKCZhY2N1bXVsYXRvcik7CisKKyAgICAgIGlmICggYWNjdW11bGF0b3IubHN3ICYgMHg4MDAwMDAwMCApCisJWFNJR19MTChhY2N1bXVsYXRvcikgKys7CisgICAgICBpZiAoIGFjY3VtdWxhdG9yLm1zdyA9PSAwICkKKwl7CisJICAvKiBUaGUgcmVzdWx0IGlzIDEuMCAqLworCSAgRlBVX2NvcHlfdG9fcmVnMCgmQ09OU1RfMSwgVEFHX1ZhbGlkKTsKKwkgIHJldHVybjsKKwl9CisgICAgICBlbHNlCisJeworCSAgc2lnbmlmaWNhbmQoJnJlc3VsdCkgPSBYU0lHX0xMKGFjY3VtdWxhdG9yKTsKKyAgICAgIAorCSAgLyogd2lsbCBiZSBhIHZhbGlkIHBvc2l0aXZlIG5yIHdpdGggZXhwb24gPSAtMSAqLworCSAgc2V0ZXhwb25lbnRwb3MoJnJlc3VsdCwgLTEpOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmaXhlZF9hcmcgPSBzaWduaWZpY2FuZChzdDBfcHRyKTsKKworICAgICAgaWYgKCBleHBvbmVudCA9PSAwICkKKwl7CisJICAvKiBUaGUgYXJndW1lbnQgaXMgPj0gMS4wICovCisKKwkgIC8qIFB1dCB0aGUgYmluYXJ5IHBvaW50IGF0IHRoZSBsZWZ0LiAqLworCSAgZml4ZWRfYXJnIDw8PSAxOworCX0KKyAgICAgIC8qIHBpLzIgaW4gaGV4IGlzOiAxLjkyMWZiNTQ0NDJkMTg0NjkgODk4Q0M1MTcwMUI4MzlBMiA1MjA0OUMxICovCisgICAgICBmaXhlZF9hcmcgPSAweDkyMWZiNTQ0NDJkMTg0NjlMTCAtIGZpeGVkX2FyZzsKKyAgICAgIC8qIFRoZXJlIGlzIGEgc3BlY2lhbCBjYXNlIHdoaWNoIGFyaXNlcyBkdWUgdG8gcm91bmRpbmcsIHRvIGZpeCBoZXJlLiAqLworICAgICAgaWYgKCBmaXhlZF9hcmcgPT0gMHhmZmZmZmZmZmZmZmZmZmZmTEwgKQorCWZpeGVkX2FyZyA9IDA7CisKKyAgICAgIGV4cG9uZW50ID0gLTE7CisgICAgICBleHAyID0gLTE7CisKKyAgICAgIC8qIEEgc2hpZnQgaXMgbmVlZGVkIGhlcmUgb25seSBmb3IgYSBuYXJyb3cgcmFuZ2Ugb2YgYXJndW1lbnRzLAorCSBpLmUuIGZvciBmaXhlZF9hcmcgYXBwcm94IDJeLTMyLCBidXQgd2UgcGljayB1cCBtb3JlLi4uICovCisgICAgICBpZiAoICEoTExfTVNXKGZpeGVkX2FyZykgJiAweGZmZmYwMDAwKSApCisJeworCSAgZml4ZWRfYXJnIDw8PSAxNjsKKwkgIGV4cG9uZW50IC09IDE2OworCSAgZXhwMiAtPSAxNjsKKwl9CisKKyAgICAgIFhTSUdfTEwoYXJnU3FyZCkgPSBmaXhlZF9hcmc7IGFyZ1NxcmQubHN3ID0gMDsKKyAgICAgIG11bDY0X1hzaWcoJmFyZ1NxcmQsICZmaXhlZF9hcmcpOworCisgICAgICBpZiAoIGV4cG9uZW50IDwgLTEgKQorCXsKKwkgIC8qIHNoaWZ0IHRoZSBhcmd1bWVudCByaWdodCBieSB0aGUgcmVxdWlyZWQgcGxhY2VzICovCisJICBzaHJfWHNpZygmYXJnU3FyZCwgMiooLTEtZXhwb25lbnQpKTsKKwl9CisKKyAgICAgIGFyZ1RvNC5tc3cgPSBhcmdTcXJkLm1zdzsgYXJnVG80Lm1pZHcgPSBhcmdTcXJkLm1pZHc7CisgICAgICBhcmdUbzQubHN3ID0gYXJnU3FyZC5sc3c7CisgICAgICBtdWxfWHNpZ19Yc2lnKCZhcmdUbzQsICZhcmdUbzQpOworCisgICAgICBwb2x5bm9taWFsX1hzaWcoJmFjY3VtdWxhdG9yLCAmWFNJR19MTChhcmdUbzQpLCBuZWdfdGVybXNfbCwKKwkJICAgICAgTl9DT0VGRl9OLTEpOworICAgICAgbXVsX1hzaWdfWHNpZygmYWNjdW11bGF0b3IsICZhcmdTcXJkKTsKKyAgICAgIG5lZ2F0ZV9Yc2lnKCZhY2N1bXVsYXRvcik7CisKKyAgICAgIHBvbHlub21pYWxfWHNpZygmYWNjdW11bGF0b3IsICZYU0lHX0xMKGFyZ1RvNCksIHBvc190ZXJtc19sLAorCQkgICAgICBOX0NPRUZGX1AtMSk7CisKKyAgICAgIHNocl9Yc2lnKCZhY2N1bXVsYXRvciwgMik7ICAgIC8qIERpdmlkZSBieSBmb3VyICovCisgICAgICBhY2N1bXVsYXRvci5tc3cgfD0gMHg4MDAwMDAwMDsgIC8qIEFkZCAxLjAgKi8KKworICAgICAgbXVsNjRfWHNpZygmYWNjdW11bGF0b3IsICZmaXhlZF9hcmcpOworICAgICAgbXVsNjRfWHNpZygmYWNjdW11bGF0b3IsICZmaXhlZF9hcmcpOworICAgICAgbXVsNjRfWHNpZygmYWNjdW11bGF0b3IsICZmaXhlZF9hcmcpOworCisgICAgICAvKiBEaXZpZGUgYnkgZm91ciwgRlBVX1JFRyBjb21wYXRpYmxlLCBldGMgKi8KKyAgICAgIGV4cG9uZW50ID0gMypleHBvbmVudDsKKworICAgICAgLyogVGhlIG1pbmltdW0gZXhwb25lbnQgZGlmZmVyZW5jZSBpcyAzICovCisgICAgICBzaHJfWHNpZygmYWNjdW11bGF0b3IsIGV4cDIgLSBleHBvbmVudCk7CisKKyAgICAgIG5lZ2F0ZV9Yc2lnKCZhY2N1bXVsYXRvcik7CisgICAgICBYU0lHX0xMKGFjY3VtdWxhdG9yKSArPSBmaXhlZF9hcmc7CisKKyAgICAgIC8qIFRoZSBiYXNpYyBjb21wdXRhdGlvbiBpcyBjb21wbGV0ZS4gTm93IGZpeCB0aGUgYW5zd2VyIHRvCisJIGNvbXBlbnNhdGUgZm9yIHRoZSBlcnJvciBkdWUgdG8gdGhlIGFwcHJveGltYXRpb24gdXNlZCBmb3IKKwkgcGkvMgorCSAqLworCisgICAgICAvKiBUaGlzIGhhcyBhbiBleHBvbmVudCBvZiAtNjUgKi8KKyAgICAgIFhTSUdfTEwoZml4X3VwKSA9IDB4ODk4Y2M1MTcwMWI4MzlhMmxsOworICAgICAgZml4X3VwLmxzdyA9IDA7CisKKyAgICAgIC8qIFRoZSBmaXgtdXAgbmVlZHMgdG8gYmUgaW1wcm92ZWQgZm9yIGxhcmdlciBhcmdzICovCisgICAgICBpZiAoIGFyZ1NxcmQubXN3ICYgMHhmZmMwMDAwMCApCisJeworCSAgLyogR2V0IGFib3V0IDMyIGJpdCBwcmVjaXNpb24gaW4gdGhlc2U6ICovCisJICBmaXhfdXAubXN3IC09IG11bF8zMl8zMigweDg5OGNjNTE3LCBhcmdTcXJkLm1zdykgLyAyOworCSAgZml4X3VwLm1zdyArPSBtdWxfMzJfMzIoMHg4OThjYzUxNywgYXJnVG80Lm1zdykgLyAyNDsKKwl9CisKKyAgICAgIGV4cDIgKz0gbm9ybV9Yc2lnKCZhY2N1bXVsYXRvcik7CisgICAgICBzaHJfWHNpZygmYWNjdW11bGF0b3IsIDEpOyAvKiBQcmV2ZW50IG92ZXJmbG93ICovCisgICAgICBleHAyKys7CisgICAgICBzaHJfWHNpZygmZml4X3VwLCA2NSArIGV4cDIpOworCisgICAgICBhZGRfWHNpZ19Yc2lnKCZhY2N1bXVsYXRvciwgJmZpeF91cCk7CisKKyAgICAgIGVjaGFuZ2UgPSByb3VuZF9Yc2lnKCZhY2N1bXVsYXRvcik7CisKKyAgICAgIHNldGV4cG9uZW50cG9zKCZyZXN1bHQsIGV4cDIgKyBlY2hhbmdlKTsKKyAgICAgIHNpZ25pZmljYW5kKCZyZXN1bHQpID0gWFNJR19MTChhY2N1bXVsYXRvcik7CisgICAgfQorCisgIEZQVV9jb3B5X3RvX3JlZzAoJnJlc3VsdCwgVEFHX1ZhbGlkKTsKKworI2lmZGVmIFBBUkFOT0lECisgIGlmICggKGV4cG9uZW50KCZyZXN1bHQpID49IDApCisgICAgICAmJiAoc2lnbmlmaWNhbmQoJnJlc3VsdCkgPiAweDgwMDAwMDAwMDAwMDAwMDBMTCkgKQorICAgIHsKKyAgICAgIEVYQ0VQVElPTihFWF9JTlRFUk5BTHwweDE1MSk7CisgICAgfQorI2VuZGlmIC8qIFBBUkFOT0lEICovCisKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYXRoLWVtdS9wb2x5X3Rhbi5jIGIvYXJjaC9pMzg2L21hdGgtZW11L3BvbHlfdGFuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRmM2UwMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9wb2x5X3Rhbi5jCkBAIC0wLDAgKzEsMjIyIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICBwb2x5X3Rhbi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDb21wdXRlIHRoZSB0YW4gb2YgYSBGUFVfUkVHLCB1c2luZyBhIHBvbHlub21pYWwgYXBwcm94aW1hdGlvbi4gICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTMsMTk5NCwxOTk3LDE5OTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgVy4gTWV0emVudGhlbiwgMjIgUGFya2VyIFN0LCBPcm1vbmQsIFZpYyAzMTYzLCAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICBBdXN0cmFsaWEuICBFLW1haWwgICBiaWxsbUBtZWxicGMub3JnLmF1ICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImV4Y2VwdGlvbi5oIgorI2luY2x1ZGUgInJlZ19jb25zdGFudC5oIgorI2luY2x1ZGUgImZwdV9lbXUuaCIKKyNpbmNsdWRlICJmcHVfc3lzdGVtLmgiCisjaW5jbHVkZSAiY29udHJvbF93LmgiCisjaW5jbHVkZSAicG9seS5oIgorCisKKyNkZWZpbmUJSGlQT1dFUm9wCTMJLyogb2RkIHBvbHksIHBvc2l0aXZlIHRlcm1zICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIG9kZHBsdGVybVtIaVBPV0VSb3BdID0KK3sKKyAgMHgwMDAwMDAwMDAwMDAwMDAwTEwsCisgIDB4MDA1MWExY2YwOGZjYTIyOExMLAorICAweDAwMDAwMDAwNzEyODRmZjdMTAorfTsKKworI2RlZmluZQlIaVBPV0VSb24JMgkvKiBvZGQgcG9seSwgbmVnYXRpdmUgdGVybXMgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgb2RkbmVndGVybVtIaVBPV0VSb25dID0KK3sKKyAgIDB4MTI5MWE5YTE4NDI0NGU4MExMLAorICAgMHgwMDAwNTgzMjQ1ODE5YzIxTEwKK307CisKKyNkZWZpbmUJSGlQT1dFUmVwCTIJLyogZXZlbiBwb2x5LCBwb3NpdGl2ZSB0ZXJtcyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBldmVucGx0ZXJtW0hpUE9XRVJlcF0gPQoreworICAweDBlODQ4ODg0YjUzOWU4ODhMTCwKKyAgMHgwMDAwM2M3ZjE4Yjg4N2RhTEwKK307CisKKyNkZWZpbmUJSGlQT1dFUmVuCTIJLyogZXZlbiBwb2x5LCBuZWdhdGl2ZSB0ZXJtcyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBldmVubmVndGVybVtIaVBPV0VSZW5dID0KK3sKKyAgMHhmMWYwMjAwZmQ1MTU2OWNjTEwsCisgIDB4MDAzYWZiNDYxMDVjNDQzMkxMCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIHR3b3RoaXJkcyA9IDB4YWFhYWFhYWFhYWFhYWFhYkxMOworCisKKy8qLS0tIHBvbHlfdGFuKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkCXBvbHlfdGFuKEZQVV9SRUcgKnN0MF9wdHIpCit7CisgIGxvbmcgaW50ICAgIAkJZXhwb25lbnQ7CisgIGludCAgICAgICAgICAgICAgICAgICBpbnZlcnQ7CisgIFhzaWcgICAgICAgICAgICAgICAgICBhcmdTcSwgYXJnU3FTcSwgYWNjdW11bGF0b3JvLCBhY2N1bXVsYXRvcmUsIGFjY3VtLAorICAgICAgICAgICAgICAgICAgICAgICAgYXJnU2lnbmlmLCBmaXhfdXA7CisgIHVuc2lnbmVkIGxvbmcgICAgICAgICBhZGo7CisKKyAgZXhwb25lbnQgPSBleHBvbmVudChzdDBfcHRyKTsKKworI2lmZGVmIFBBUkFOT0lECisgIGlmICggc2lnbm5lZ2F0aXZlKHN0MF9wdHIpICkJLyogQ2FuJ3QgaGFjayBhIG51bWJlciA8IDAuMCAqLworICAgIHsgYXJpdGhfaW52YWxpZCgwKTsgcmV0dXJuOyB9ICAvKiBOZWVkIGEgcG9zaXRpdmUgbnVtYmVyICovCisjZW5kaWYgLyogUEFSQU5PSUQgKi8KKworICAvKiBTcGxpdCB0aGUgcHJvYmxlbSBpbnRvIHR3byBkb21haW5zLCBzbWFsbGVyIGFuZCBsYXJnZXIgdGhhbiBwaS80ICovCisgIGlmICggKGV4cG9uZW50ID09IDApIHx8ICgoZXhwb25lbnQgPT0gLTEpICYmIChzdDBfcHRyLT5zaWdoID4gMHhjOTBmZGFhMikpICkKKyAgICB7CisgICAgICAvKiBUaGUgYXJndW1lbnQgaXMgZ3JlYXRlciB0aGFuIChhcHByb3gpIHBpLzQgKi8KKyAgICAgIGludmVydCA9IDE7CisgICAgICBhY2N1bS5sc3cgPSAwOworICAgICAgWFNJR19MTChhY2N1bSkgPSBzaWduaWZpY2FuZChzdDBfcHRyKTsKKyAKKyAgICAgIGlmICggZXhwb25lbnQgPT0gMCApCisJeworCSAgLyogVGhlIGFyZ3VtZW50IGlzID49IDEuMCAqLworCSAgLyogUHV0IHRoZSBiaW5hcnkgcG9pbnQgYXQgdGhlIGxlZnQuICovCisJICBYU0lHX0xMKGFjY3VtKSA8PD0gMTsKKwl9CisgICAgICAvKiBwaS8yIGluIGhleCBpczogMS45MjFmYjU0NDQyZDE4NDY5IDg5OENDNTE3MDFCODM5QTIgNTIwNDlDMSAqLworICAgICAgWFNJR19MTChhY2N1bSkgPSAweDkyMWZiNTQ0NDJkMTg0NjlMTCAtIFhTSUdfTEwoYWNjdW0pOworICAgICAgLyogVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSB3aGljaCBhcmlzZXMgZHVlIHRvIHJvdW5kaW5nLiAqLworICAgICAgaWYgKCBYU0lHX0xMKGFjY3VtKSA9PSAweGZmZmZmZmZmZmZmZmZmZmZMTCApCisJeworCSAgRlBVX3NldHRhZzAoVEFHX1ZhbGlkKTsKKwkgIHNpZ25pZmljYW5kKHN0MF9wdHIpID0gMHg4YTUxZTA0ZGFhYmRhMzYwTEw7CisJICBzZXRleHBvbmVudDE2KHN0MF9wdHIsICgweDQxICsgRVhURU5ERURfRWJpYXMpIHwgU0lHTl9OZWdhdGl2ZSk7CisJICByZXR1cm47CisJfQorCisgICAgICBhcmdTaWduaWYubHN3ID0gYWNjdW0ubHN3OworICAgICAgWFNJR19MTChhcmdTaWduaWYpID0gWFNJR19MTChhY2N1bSk7CisgICAgICBleHBvbmVudCA9IC0xICsgbm9ybV9Yc2lnKCZhcmdTaWduaWYpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGludmVydCA9IDA7CisgICAgICBhcmdTaWduaWYubHN3ID0gMDsKKyAgICAgIFhTSUdfTEwoYWNjdW0pID0gWFNJR19MTChhcmdTaWduaWYpID0gc2lnbmlmaWNhbmQoc3QwX3B0cik7CisgCisgICAgICBpZiAoIGV4cG9uZW50IDwgLTEgKQorCXsKKwkgIC8qIHNoaWZ0IHRoZSBhcmd1bWVudCByaWdodCBieSB0aGUgcmVxdWlyZWQgcGxhY2VzICovCisJICBpZiAoIEZQVV9zaHJ4KCZYU0lHX0xMKGFjY3VtKSwgLTEtZXhwb25lbnQpID49IDB4ODAwMDAwMDBVICkKKwkgICAgWFNJR19MTChhY2N1bSkgKys7CS8qIHJvdW5kIHVwICovCisJfQorICAgIH0KKworICBYU0lHX0xMKGFyZ1NxKSA9IFhTSUdfTEwoYWNjdW0pOyBhcmdTcS5sc3cgPSBhY2N1bS5sc3c7CisgIG11bF9Yc2lnX1hzaWcoJmFyZ1NxLCAmYXJnU3EpOworICBYU0lHX0xMKGFyZ1NxU3EpID0gWFNJR19MTChhcmdTcSk7IGFyZ1NxU3EubHN3ID0gYXJnU3EubHN3OworICBtdWxfWHNpZ19Yc2lnKCZhcmdTcVNxLCAmYXJnU3FTcSk7CisKKyAgLyogQ29tcHV0ZSB0aGUgbmVnYXRpdmUgdGVybXMgZm9yIHRoZSBudW1lcmF0b3IgcG9seW5vbWlhbCAqLworICBhY2N1bXVsYXRvcm8ubXN3ID0gYWNjdW11bGF0b3JvLm1pZHcgPSBhY2N1bXVsYXRvcm8ubHN3ID0gMDsKKyAgcG9seW5vbWlhbF9Yc2lnKCZhY2N1bXVsYXRvcm8sICZYU0lHX0xMKGFyZ1NxU3EpLCBvZGRuZWd0ZXJtLCBIaVBPV0VSb24tMSk7CisgIG11bF9Yc2lnX1hzaWcoJmFjY3VtdWxhdG9ybywgJmFyZ1NxKTsKKyAgbmVnYXRlX1hzaWcoJmFjY3VtdWxhdG9ybyk7CisgIC8qIEFkZCB0aGUgcG9zaXRpdmUgdGVybXMgKi8KKyAgcG9seW5vbWlhbF9Yc2lnKCZhY2N1bXVsYXRvcm8sICZYU0lHX0xMKGFyZ1NxU3EpLCBvZGRwbHRlcm0sIEhpUE9XRVJvcC0xKTsKKworICAKKyAgLyogQ29tcHV0ZSB0aGUgcG9zaXRpdmUgdGVybXMgZm9yIHRoZSBkZW5vbWluYXRvciBwb2x5bm9taWFsICovCisgIGFjY3VtdWxhdG9yZS5tc3cgPSBhY2N1bXVsYXRvcmUubWlkdyA9IGFjY3VtdWxhdG9yZS5sc3cgPSAwOworICBwb2x5bm9taWFsX1hzaWcoJmFjY3VtdWxhdG9yZSwgJlhTSUdfTEwoYXJnU3FTcSksIGV2ZW5wbHRlcm0sIEhpUE9XRVJlcC0xKTsKKyAgbXVsX1hzaWdfWHNpZygmYWNjdW11bGF0b3JlLCAmYXJnU3EpOworICBuZWdhdGVfWHNpZygmYWNjdW11bGF0b3JlKTsKKyAgLyogQWRkIHRoZSBuZWdhdGl2ZSB0ZXJtcyAqLworICBwb2x5bm9taWFsX1hzaWcoJmFjY3VtdWxhdG9yZSwgJlhTSUdfTEwoYXJnU3FTcSksIGV2ZW5uZWd0ZXJtLCBIaVBPV0VSZW4tMSk7CisgIC8qIE11bHRpcGx5IGJ5IGFyZ14yICovCisgIG11bDY0X1hzaWcoJmFjY3VtdWxhdG9yZSwgJlhTSUdfTEwoYXJnU2lnbmlmKSk7CisgIG11bDY0X1hzaWcoJmFjY3VtdWxhdG9yZSwgJlhTSUdfTEwoYXJnU2lnbmlmKSk7CisgIC8qIGRlLW5vcm1hbGl6ZSBhbmQgZGl2aWRlIGJ5IDIgKi8KKyAgc2hyX1hzaWcoJmFjY3VtdWxhdG9yZSwgLTIqKDErZXhwb25lbnQpICsgMSk7CisgIG5lZ2F0ZV9Yc2lnKCZhY2N1bXVsYXRvcmUpOyAgICAgIC8qIFRoaXMgZG9lcyAxIC0gYWNjdW11bGF0b3IgKi8KKworICAvKiBOb3cgZmluZCB0aGUgcmF0aW8uICovCisgIGlmICggYWNjdW11bGF0b3JlLm1zdyA9PSAwICkKKyAgICB7CisgICAgICAvKiBhY2N1bXVsYXRvcm8gbXVzdCBjb250YWluIDEuMCBoZXJlLCAoYWN0dWFsbHksIDApIGJ1dCBpdAorCSByZWFsbHkgZG9lc24ndCBtYXR0ZXIgd2hhdCB2YWx1ZSB3ZSB1c2UgYmVjYXVzZSBpdCB3aWxsCisJIGhhdmUgbmVnbGlnaWJsZSBlZmZlY3QgaW4gbGF0ZXIgY2FsY3VsYXRpb25zCisJICovCisgICAgICBYU0lHX0xMKGFjY3VtKSA9IDB4ODAwMDAwMDAwMDAwMDAwMExMOworICAgICAgYWNjdW0ubHN3ID0gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkaXZfWHNpZygmYWNjdW11bGF0b3JvLCAmYWNjdW11bGF0b3JlLCAmYWNjdW0pOworICAgIH0KKworICAvKiBNdWx0aXBseSBieSAxLzMgKiBhcmdeMyAqLworICBtdWw2NF9Yc2lnKCZhY2N1bSwgJlhTSUdfTEwoYXJnU2lnbmlmKSk7CisgIG11bDY0X1hzaWcoJmFjY3VtLCAmWFNJR19MTChhcmdTaWduaWYpKTsKKyAgbXVsNjRfWHNpZygmYWNjdW0sICZYU0lHX0xMKGFyZ1NpZ25pZikpOworICBtdWw2NF9Yc2lnKCZhY2N1bSwgJnR3b3RoaXJkcyk7CisgIHNocl9Yc2lnKCZhY2N1bSwgLTIqKGV4cG9uZW50KzEpKTsKKworICAvKiB0YW4oYXJnKSA9IGFyZyArIGFjY3VtICovCisgIGFkZF90d29fWHNpZygmYWNjdW0sICZhcmdTaWduaWYsICZleHBvbmVudCk7CisKKyAgaWYgKCBpbnZlcnQgKQorICAgIHsKKyAgICAgIC8qIFdlIG5vdyBoYXZlIHRoZSB2YWx1ZSBvZiB0YW4ocGlfMiAtIGFyZykgd2hlcmUgcGlfMiBpcyBhbgorCSBhcHByb3hpbWF0aW9uIGZvciBwaS8yCisJICovCisgICAgICAvKiBUaGUgbmV4dCBzdGVwIGlzIHRvIGZpeCB0aGUgYW5zd2VyIHRvIGNvbXBlbnNhdGUgZm9yIHRoZQorCSBlcnJvciBkdWUgdG8gdGhlIGFwcHJveGltYXRpb24gdXNlZCBmb3IgcGkvMgorCSAqLworCisgICAgICAvKiBUaGlzIGlzIChhcHByb3gpIGRlbHRhLCB0aGUgZXJyb3IgaW4gb3VyIGFwcHJveCBmb3IgcGkvMgorCSAoc2VlIGFib3ZlKS4gSXQgaGFzIGFuIGV4cG9uZW50IG9mIC02NQorCSAqLworICAgICAgWFNJR19MTChmaXhfdXApID0gMHg4OThjYzUxNzAxYjgzOWEyTEw7CisgICAgICBmaXhfdXAubHN3ID0gMDsKKworICAgICAgaWYgKCBleHBvbmVudCA9PSAwICkKKwlhZGogPSAweGZmZmZmZmZmOyAgIC8qIFdlIHdhbnQgYXBwcm94IDEuMCBoZXJlLCBidXQKKwkJCSAgICAgICB0aGlzIGlzIGNsb3NlIGVub3VnaC4gKi8KKyAgICAgIGVsc2UgaWYgKCBleHBvbmVudCA+IC0zMCApCisJeworCSAgYWRqID0gYWNjdW0ubXN3ID4+IC0oZXhwb25lbnQrMSk7ICAgICAgLyogdGFuICovCisJICBhZGogPSBtdWxfMzJfMzIoYWRqLCBhZGopOyAgICAgICAgICAgICAvKiB0YW5eMiAqLworCX0KKyAgICAgIGVsc2UKKwlhZGogPSAwOworICAgICAgYWRqID0gbXVsXzMyXzMyKDB4ODk4Y2M1MTcsIGFkaik7ICAgICAgICAgIC8qIGRlbHRhICogdGFuXjIgKi8KKworICAgICAgZml4X3VwLm1zdyArPSBhZGo7CisgICAgICBpZiAoICEoZml4X3VwLm1zdyAmIDB4ODAwMDAwMDApICkgICAvKiBkaWQgZml4X3VwIG92ZXJmbG93ID8gKi8KKwl7CisJICAvKiBZZXMsIHdlIG5lZWQgdG8gYWRkIGFuIG1zYiAqLworCSAgc2hyX1hzaWcoJmZpeF91cCwgMSk7CisJICBmaXhfdXAubXN3IHw9IDB4ODAwMDAwMDA7CisJICBzaHJfWHNpZygmZml4X3VwLCA2NCArIGV4cG9uZW50KTsKKwl9CisgICAgICBlbHNlCisJc2hyX1hzaWcoJmZpeF91cCwgNjUgKyBleHBvbmVudCk7CisKKyAgICAgIGFkZF90d29fWHNpZygmYWNjdW0sICZmaXhfdXAsICZleHBvbmVudCk7CisKKyAgICAgIC8qIGFjY3VtIG5vdyBjb250YWlucyB0YW4ocGkvMiAtIGFyZykuCisJIFVzZSB0YW4oYXJnKSA9IDEuMCAvIHRhbihwaS8yIC0gYXJnKQorCSAqLworICAgICAgYWNjdW11bGF0b3JvLmxzdyA9IGFjY3VtdWxhdG9yby5taWR3ID0gMDsKKyAgICAgIGFjY3VtdWxhdG9yby5tc3cgPSAweDgwMDAwMDAwOworICAgICAgZGl2X1hzaWcoJmFjY3VtdWxhdG9ybywgJmFjY3VtLCAmYWNjdW0pOworICAgICAgZXhwb25lbnQgPSAtIGV4cG9uZW50IC0gMTsKKyAgICB9CisKKyAgLyogVHJhbnNmZXIgdGhlIHJlc3VsdCAqLworICByb3VuZF9Yc2lnKCZhY2N1bSk7CisgIEZQVV9zZXR0YWcwKFRBR19WYWxpZCk7CisgIHNpZ25pZmljYW5kKHN0MF9wdHIpID0gWFNJR19MTChhY2N1bSk7CisgIHNldGV4cG9uZW50MTYoc3QwX3B0ciwgZXhwb25lbnQgKyBFWFRFTkRFRF9FYmlhcyk7ICAvKiBSZXN1bHQgaXMgcG9zaXRpdmUuICovCisKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYXRoLWVtdS9wb2x5bm9tX1hzaWcuUyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9wb2x5bm9tX1hzaWcuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzMxNWM4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L3BvbHlub21fWHNpZy5TCkBAIC0wLDAgKzEsMTM1IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICBwb2x5bm9taWFsX1hzaWcuUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBGaXhlZCBwb2ludCBhcml0aG1ldGljIHBvbHlub21pYWwgZXZhbHVhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTMsMTk5NCwxOTk1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgVy4gTWV0emVudGhlbiwgMjIgUGFya2VyIFN0LCBPcm1vbmQsIFZpYyAzMTYzLCAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICBBdXN0cmFsaWEuICBFLW1haWwgYmlsbG1AamFjb2JpLm1hdGhzLm1vbmFzaC5lZHUuYXUgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDYWxsIGZyb20gQyBhczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgdm9pZCBwb2x5bm9taWFsX1hzaWcoWHNpZyAqYWNjdW0sIHVuc2lnbmVkIGxvbmcgbG9uZyB4LCAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgdGVybXNbXSwgaW50IG4pICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENvbXB1dGVzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgdGVybXNbMF0gKyAodGVybXNbMV0gKyAodGVybXNbMl0gKyAuLi4gKyAodGVybXNbbi0xXSp4KSp4KSp4KSp4KSAuLi4gKSp4ICB8CisgfCBhbmQgYWRkcyB0aGUgcmVzdWx0IHRvIHRoZSAxMiBieXRlIFhzaWcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IFRoZSB0ZXJtc1tdIGFyZSBlYWNoIDggYnl0ZXMsIGJ1dCBhbGwgY29tcHV0YXRpb24gaXMgcGVyZm9ybWVkIHRvIDEyIGJ5dGUgfAorIHwgcHJlY2lzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IFRoaXMgZnVuY3Rpb24gbXVzdCBiZSB1c2VkIGNhcmVmdWxseTogbW9zdCBvdmVyZmxvdyBvZiBpbnRlcm1lZGlhdGUgICAgICAgfAorIHwgcmVzdWx0cyBpcyBjb250cm9sbGVkLCBidXQgb3ZlcmZsb3cgb2YgdGhlIHJlc3VsdCBpcyBub3QuICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkuZmlsZQkicG9seW5vbWlhbF9Yc2lnLlMiCisKKyNpbmNsdWRlICJmcHVfZW11LmgiCisKKworI2RlZmluZQlURVJNX1NJWkUJJDgKKyNkZWZpbmUJU1VNX01TCQktMjAoJWVicCkJLyogc3VtIG1zIGxvbmcgKi8KKyNkZWZpbmUgU1VNX01JRERMRQktMjQoJWVicCkJLyogc3VtIG1pZGRsZSBsb25nICovCisjZGVmaW5lCVNVTV9MUwkJLTI4KCVlYnApCS8qIHN1bSBscyBsb25nICovCisjZGVmaW5lCUFDQ1VNX01TCS00KCVlYnApCS8qIGFjY3VtIG1zIGxvbmcgKi8KKyNkZWZpbmUJQUNDVU1fTUlERExFCS04KCVlYnApCS8qIGFjY3VtIG1pZGRsZSBsb25nICovCisjZGVmaW5lCUFDQ1VNX0xTCS0xMiglZWJwKQkvKiBhY2N1bSBscyBsb25nICovCisjZGVmaW5lIE9WRVJGTE9XRUQgICAgICAtMTYoJWVicCkJLyogYWRkaXRpb24gb3ZlcmZsb3cgZmxhZyAqLworCisudGV4dAorRU5UUlkocG9seW5vbWlhbF9Yc2lnKQorCXB1c2hsCSVlYnAKKwltb3ZsCSVlc3AsJWVicAorCXN1YmwJJDMyLCVlc3AKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCXB1c2hsCSVlYngKKworCW1vdmwJUEFSQU0yLCVlc2kJCS8qIHggKi8KKwltb3ZsCVBBUkFNMywlZWRpCQkvKiB0ZXJtcyAqLworCisJbW92bAlURVJNX1NJWkUsJWVheAorCW11bGwJUEFSQU00CQkJLyogbiAqLworCWFkZGwJJWVheCwlZWRpCisKKwltb3ZsCTQoJWVkaSksJWVkeAkJLyogdGVybXNbbl0gKi8KKwltb3ZsCSVlZHgsU1VNX01TCisJbW92bAkoJWVkaSksJWVkeAkJLyogdGVybXNbbl0gKi8KKwltb3ZsCSVlZHgsU1VNX01JRERMRQorCXhvcgklZWF4LCVlYXgKKwltb3ZsCSVlYXgsU1VNX0xTCisJbW92YgklYWwsT1ZFUkZMT1dFRAorCisJc3VibAlURVJNX1NJWkUsJWVkaQorCWRlY2wJUEFSQU00CisJanMJTF9hY2N1bV9kb25lCisKK0xfYWNjdW1fbG9vcDoKKwl4b3IJJWVheCwlZWF4CisJbW92bAklZWF4LEFDQ1VNX01TCisJbW92bAklZWF4LEFDQ1VNX01JRERMRQorCisJbW92bAlTVU1fTUlERExFLCVlYXgKKwltdWxsCSglZXNpKQkJCS8qIHggbHMgbG9uZyAqLworCW1vdmwJJWVkeCxBQ0NVTV9MUworCisJbW92bAlTVU1fTUlERExFLCVlYXgKKwltdWxsCTQoJWVzaSkJCQkvKiB4IG1zIGxvbmcgKi8KKwlhZGRsCSVlYXgsQUNDVU1fTFMKKwlhZGNsCSVlZHgsQUNDVU1fTUlERExFCisJYWRjbAkkMCxBQ0NVTV9NUworCisJbW92bAlTVU1fTVMsJWVheAorCW11bGwJKCVlc2kpCQkJLyogeCBscyBsb25nICovCisJYWRkbAklZWF4LEFDQ1VNX0xTCisJYWRjbAklZWR4LEFDQ1VNX01JRERMRQorCWFkY2wJJDAsQUNDVU1fTVMKKworCW1vdmwJU1VNX01TLCVlYXgKKwltdWxsCTQoJWVzaSkJCQkvKiB4IG1zIGxvbmcgKi8KKwlhZGRsCSVlYXgsQUNDVU1fTUlERExFCisJYWRjbAklZWR4LEFDQ1VNX01TCisKKwl0ZXN0YgkkMHhmZixPVkVSRkxPV0VECisJanoJTF9ub19vdmVyZmxvdworCisJbW92bAkoJWVzaSksJWVheAorCWFkZGwJJWVheCxBQ0NVTV9NSURETEUKKwltb3ZsCTQoJWVzaSksJWVheAorCWFkY2wJJWVheCxBQ0NVTV9NUwkJLyogVGhpcyBjb3VsZCBvdmVyZmxvdyB0b28gKi8KKworTF9ub19vdmVyZmxvdzoKKworLyoKKyAqIE5vdyBwdXQgdGhlIHN1bSBvZiBuZXh0IHRlcm0gYW5kIHRoZSBhY2N1bXVsYXRvcgorICogaW50byB0aGUgc3VtIHJlZ2lzdGVyCisgKi8KKwltb3ZsCUFDQ1VNX0xTLCVlYXgKKwlhZGRsCSglZWRpKSwlZWF4CQkvKiB0ZXJtIGxzIGxvbmcgKi8KKwltb3ZsCSVlYXgsU1VNX0xTCisJbW92bAlBQ0NVTV9NSURETEUsJWVheAorCWFkY2wJKCVlZGkpLCVlYXgJCS8qIHRlcm0gbHMgbG9uZyAqLworCW1vdmwJJWVheCxTVU1fTUlERExFCisJbW92bAlBQ0NVTV9NUywlZWF4CisJYWRjbAk0KCVlZGkpLCVlYXgJCS8qIHRlcm0gbXMgbG9uZyAqLworCW1vdmwJJWVheCxTVU1fTVMKKwlzYmJiCSVhbCwlYWwKKwltb3ZiCSVhbCxPVkVSRkxPV0VECQkvKiBVc2VkIGluIHRoZSBuZXh0IGl0ZXJhdGlvbiAqLworCisJc3VibAlURVJNX1NJWkUsJWVkaQorCWRlY2wJUEFSQU00CisJam5zCUxfYWNjdW1fbG9vcAorCitMX2FjY3VtX2RvbmU6CisJbW92bAlQQVJBTTEsJWVkaQkJLyogYWNjdW0gKi8KKwltb3ZsCVNVTV9MUywlZWF4CisJYWRkbAklZWF4LCglZWRpKQorCW1vdmwJU1VNX01JRERMRSwlZWF4CisJYWRjbAklZWF4LDQoJWVkaSkKKwltb3ZsCVNVTV9NUywlZWF4CisJYWRjbAklZWF4LDgoJWVkaSkKKworCXBvcGwJJWVieAorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCWxlYXZlCisJcmV0CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWF0aC1lbXUvcmVnX2FkZF9zdWIuYyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9yZWdfYWRkX3N1Yi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZDNiMzcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWF0aC1lbXUvcmVnX2FkZF9zdWIuYwpAQCAtMCwwICsxLDM3NCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgcmVnX2FkZF9zdWIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgRnVuY3Rpb25zIHRvIGFkZCBvciBzdWJ0cmFjdCB0d28gcmVnaXN0ZXJzIGFuZCBwdXQgdGhlIHJlc3VsdCBpbiBhIHRoaXJkLiB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENvcHlyaWdodCAoQykgMTk5MiwxOTkzLDE5OTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICBXLiBNZXR6ZW50aGVuLCAyMiBQYXJrZXIgU3QsIE9ybW9uZCwgVmljIDMxNjMsIEF1c3RyYWxpYSB8CisgfCAgICAgICAgICAgICAgICAgIEUtbWFpbCAgIGJpbGxtQHN1YnVyYmlhLm5ldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgIEZvciBlYWNoIGZ1bmN0aW9uLCB0aGUgZGVzdGluYXRpb24gbWF5IGJlIGFueSBGUFVfUkVHLCBpbmNsdWRpbmcgb25lIG9mICB8CisgfCB0aGUgc291cmNlIEZQVV9SRUdzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICBFYWNoIGZ1bmN0aW9uIHJldHVybnMgMCBpZiB0aGUgYW5zd2VyIGlzIG8uay4sIG90aGVyd2lzZSBhIG5vbi16ZXJvICAgICAgfAorIHwgdmFsdWUgaXMgcmV0dXJuZWQsIGluZGljYXRpbmcgZWl0aGVyIGFuIGV4Y2VwdGlvbiBjb25kaXRpb24gb3IgYW4gICAgICAgICB8CisgfCBpbnRlcm5hbCBlcnJvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImV4Y2VwdGlvbi5oIgorI2luY2x1ZGUgInJlZ19jb25zdGFudC5oIgorI2luY2x1ZGUgImZwdV9lbXUuaCIKKyNpbmNsdWRlICJjb250cm9sX3cuaCIKKyNpbmNsdWRlICJmcHVfc3lzdGVtLmgiCisKK3N0YXRpYworaW50IGFkZF9zdWJfc3BlY2lhbHMoRlBVX1JFRyBjb25zdCAqYSwgdV9jaGFyIHRhZ2EsIHVfY2hhciBzaWduYSwKKwkJICAgICBGUFVfUkVHIGNvbnN0ICpiLCB1X2NoYXIgdGFnYiwgdV9jaGFyIHNpZ25iLAorCQkgICAgIEZQVV9SRUcgKmRlc3QsIGludCBkZXN0c3RuciwgaW50IGNvbnRyb2xfdyk7CisKKy8qCisgIE9wZXJhdGVzIG9uIHN0KDApIGFuZCBzdChuKSwgb3Igb24gc3QoMCkgYW5kIHRlbXBvcmFyeSBkYXRhLgorICBUaGUgZGVzdGluYXRpb24gbXVzdCBiZSBvbmUgb2YgdGhlIHNvdXJjZSBzdCh4KS4KKyAgKi8KK2ludCBGUFVfYWRkKEZQVV9SRUcgY29uc3QgKmIsIHVfY2hhciB0YWdiLCBpbnQgZGVzdHN0bnIsIGludCBjb250cm9sX3cpCit7CisgIEZQVV9SRUcgKmEgPSAmc3QoMCk7CisgIEZQVV9SRUcgKmRlc3QgPSAmc3QoZGVzdHN0bnIpOworICB1X2NoYXIgc2lnbmIgPSBnZXRzaWduKGIpOworICB1X2NoYXIgdGFnYSA9IEZQVV9nZXR0YWcwKCk7CisgIHVfY2hhciBzaWduYSA9IGdldHNpZ24oYSk7CisgIHVfY2hhciBzYXZlZF9zaWduID0gZ2V0c2lnbihkZXN0KTsKKyAgaW50IGRpZmYsIHRhZywgZXhwYSwgZXhwYjsKKyAgCisgIGlmICggISh0YWdhIHwgdGFnYikgKQorICAgIHsKKyAgICAgIGV4cGEgPSBleHBvbmVudChhKTsKKyAgICAgIGV4cGIgPSBleHBvbmVudChiKTsKKworICAgIHZhbGlkX2FkZDoKKyAgICAgIC8qIEJvdGggcmVnaXN0ZXJzIGFyZSB2YWxpZCAqLworICAgICAgaWYgKCEoc2lnbmEgXiBzaWduYikpCisJeworCSAgLyogc2lnbnMgYXJlIHRoZSBzYW1lICovCisJICB0YWcgPSBGUFVfdV9hZGQoYSwgYiwgZGVzdCwgY29udHJvbF93LCBzaWduYSwgZXhwYSwgZXhwYik7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIFRoZSBzaWducyBhcmUgZGlmZmVyZW50LCBzbyBkbyBhIHN1YnRyYWN0aW9uICovCisJICBkaWZmID0gZXhwYSAtIGV4cGI7CisJICBpZiAoIWRpZmYpCisJICAgIHsKKwkgICAgICBkaWZmID0gYS0+c2lnaCAtIGItPnNpZ2g7ICAvKiBUaGlzIHdvcmtzIG9ubHkgaWYgdGhlIG1zIGJpdHMKKwkJCQkJICAgIGFyZSBpZGVudGljYWwuICovCisJICAgICAgaWYgKCFkaWZmKQorCQl7CisJCSAgZGlmZiA9IGEtPnNpZ2wgPiBiLT5zaWdsOworCQkgIGlmICghZGlmZikKKwkJICAgIGRpZmYgPSAtKGEtPnNpZ2wgPCBiLT5zaWdsKTsKKwkJfQorCSAgICB9CisgICAgICAKKwkgIGlmIChkaWZmID4gMCkKKwkgICAgeworCSAgICAgIHRhZyA9IEZQVV91X3N1YihhLCBiLCBkZXN0LCBjb250cm9sX3csIHNpZ25hLCBleHBhLCBleHBiKTsKKwkgICAgfQorCSAgZWxzZSBpZiAoIGRpZmYgPCAwICkKKwkgICAgeworCSAgICAgIHRhZyA9IEZQVV91X3N1YihiLCBhLCBkZXN0LCBjb250cm9sX3csIHNpZ25iLCBleHBiLCBleHBhKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgRlBVX2NvcHlfdG9fcmVnaSgmQ09OU1RfWiwgVEFHX1plcm8sIGRlc3RzdG5yKTsKKwkgICAgICAvKiBzaWduIGRlcGVuZHMgdXBvbiByb3VuZGluZyBtb2RlICovCisJICAgICAgc2V0c2lnbihkZXN0LCAoKGNvbnRyb2xfdyAmIENXX1JDKSAhPSBSQ19ET1dOKQorCQkgICAgICA/IFNJR05fUE9TIDogU0lHTl9ORUcpOworCSAgICAgIHJldHVybiBUQUdfWmVybzsKKwkgICAgfQorCX0KKworICAgICAgaWYgKCB0YWcgPCAwICkKKwl7CisJICBzZXRzaWduKGRlc3QsIHNhdmVkX3NpZ24pOworCSAgcmV0dXJuIHRhZzsKKwl9CisgICAgICBGUFVfc2V0dGFnaShkZXN0c3RuciwgdGFnKTsKKyAgICAgIHJldHVybiB0YWc7CisgICAgfQorCisgIGlmICggdGFnYSA9PSBUQUdfU3BlY2lhbCApCisgICAgdGFnYSA9IEZQVV9TcGVjaWFsKGEpOworICBpZiAoIHRhZ2IgPT0gVEFHX1NwZWNpYWwgKQorICAgIHRhZ2IgPSBGUFVfU3BlY2lhbChiKTsKKworICBpZiAoICgodGFnYSA9PSBUQUdfVmFsaWQpICYmICh0YWdiID09IFRXX0Rlbm9ybWFsKSkKKwkgICAgfHwgKCh0YWdhID09IFRXX0Rlbm9ybWFsKSAmJiAodGFnYiA9PSBUQUdfVmFsaWQpKQorCSAgICB8fCAoKHRhZ2EgPT0gVFdfRGVub3JtYWwpICYmICh0YWdiID09IFRXX0Rlbm9ybWFsKSkgKQorICAgIHsKKyAgICAgIEZQVV9SRUcgeCwgeTsKKworICAgICAgaWYgKCBkZW5vcm1hbF9vcGVyYW5kKCkgPCAwICkKKwlyZXR1cm4gRlBVX0V4Y2VwdGlvbjsKKworICAgICAgRlBVX3RvX2V4cDE2KGEsICZ4KTsKKyAgICAgIEZQVV90b19leHAxNihiLCAmeSk7CisgICAgICBhID0gJng7CisgICAgICBiID0gJnk7CisgICAgICBleHBhID0gZXhwb25lbnQxNihhKTsKKyAgICAgIGV4cGIgPSBleHBvbmVudDE2KGIpOworICAgICAgZ290byB2YWxpZF9hZGQ7CisgICAgfQorCisgIGlmICggKHRhZ2EgPT0gVFdfTmFOKSB8fCAodGFnYiA9PSBUV19OYU4pICkKKyAgICB7CisgICAgICBpZiAoIGRlc3RzdG5yID09IDAgKQorCXJldHVybiByZWFsXzJvcF9OYU4oYiwgdGFnYiwgZGVzdHN0bnIsIGEpOworICAgICAgZWxzZQorCXJldHVybiByZWFsXzJvcF9OYU4oYSwgdGFnYSwgZGVzdHN0bnIsIGEpOworICAgIH0KKworICByZXR1cm4gYWRkX3N1Yl9zcGVjaWFscyhhLCB0YWdhLCBzaWduYSwgYiwgdGFnYiwgc2lnbmIsCisJCQkgIGRlc3QsIGRlc3RzdG5yLCBjb250cm9sX3cpOworfQorCisKKy8qIFN1YnRyYWN0IGIgZnJvbSBhLiAgKGEtYikgLT4gZGVzdCAqLworaW50IEZQVV9zdWIoaW50IGZsYWdzLCBpbnQgcm0sIGludCBjb250cm9sX3cpCit7CisgIEZQVV9SRUcgY29uc3QgKmEsICpiOworICBGUFVfUkVHICpkZXN0OworICB1X2NoYXIgdGFnYSwgdGFnYiwgc2lnbmEsIHNpZ25iLCBzYXZlZF9zaWduLCBzaWduOworICBpbnQgZGlmZiwgdGFnID0gMCwgZXhwYSwgZXhwYiwgZGVzdHN0bnI7CisKKyAgYSA9ICZzdCgwKTsKKyAgdGFnYSA9IEZQVV9nZXR0YWcwKCk7CisKKyAgZGVzdHN0bnIgPSAwOworICBpZiAoIGZsYWdzICYgTE9BREVEICkKKyAgICB7CisgICAgICBiID0gKEZQVV9SRUcgKilybTsKKyAgICAgIHRhZ2IgPSBmbGFncyAmIDB4MGY7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYiA9ICZzdChybSk7CisgICAgICB0YWdiID0gRlBVX2dldHRhZ2kocm0pOworCisgICAgICBpZiAoIGZsYWdzICYgREVTVF9STSApCisJZGVzdHN0bnIgPSBybTsKKyAgICB9CisKKyAgc2lnbmEgPSBnZXRzaWduKGEpOworICBzaWduYiA9IGdldHNpZ24oYik7CisKKyAgaWYgKCBmbGFncyAmIFJFViApCisgICAgeworICAgICAgc2lnbmEgXj0gU0lHTl9ORUc7CisgICAgICBzaWduYiBePSBTSUdOX05FRzsKKyAgICB9CisKKyAgZGVzdCA9ICZzdChkZXN0c3Rucik7CisgIHNhdmVkX3NpZ24gPSBnZXRzaWduKGRlc3QpOworCisgIGlmICggISh0YWdhIHwgdGFnYikgKQorICAgIHsKKyAgICAgIGV4cGEgPSBleHBvbmVudChhKTsKKyAgICAgIGV4cGIgPSBleHBvbmVudChiKTsKKworICAgIHZhbGlkX3N1YnRyYWN0OgorICAgICAgLyogQm90aCByZWdpc3RlcnMgYXJlIHZhbGlkICovCisKKyAgICAgIGRpZmYgPSBleHBhIC0gZXhwYjsKKworICAgICAgaWYgKCFkaWZmKQorCXsKKwkgIGRpZmYgPSBhLT5zaWdoIC0gYi0+c2lnaDsgIC8qIFdvcmtzIG9ubHkgaWYgbXMgYml0cyBhcmUgaWRlbnRpY2FsICovCisJICBpZiAoIWRpZmYpCisJICAgIHsKKwkgICAgICBkaWZmID0gYS0+c2lnbCA+IGItPnNpZ2w7CisJICAgICAgaWYgKCFkaWZmKQorCQlkaWZmID0gLShhLT5zaWdsIDwgYi0+c2lnbCk7CisJICAgIH0KKwl9CisKKyAgICAgIHN3aXRjaCAoICgoKGludClzaWduYSkqMiArIHNpZ25iKSAvIFNJR05fTkVHICkKKwl7CisJY2FzZSAwOiAvKiBQIC0gUCAqLworCWNhc2UgMzogLyogTiAtIE4gKi8KKwkgIGlmIChkaWZmID4gMCkKKwkgICAgeworCSAgICAgIC8qIHxhfCA+IHxifCAqLworCSAgICAgIHRhZyA9IEZQVV91X3N1YihhLCBiLCBkZXN0LCBjb250cm9sX3csIHNpZ25hLCBleHBhLCBleHBiKTsKKwkgICAgfQorCSAgZWxzZSBpZiAoIGRpZmYgPT0gMCApCisJICAgIHsKKwkgICAgICBGUFVfY29weV90b19yZWdpKCZDT05TVF9aLCBUQUdfWmVybywgZGVzdHN0bnIpOworCisJICAgICAgLyogc2lnbiBkZXBlbmRzIHVwb24gcm91bmRpbmcgbW9kZSAqLworCSAgICAgIHNldHNpZ24oZGVzdCwgKChjb250cm9sX3cgJiBDV19SQykgIT0gUkNfRE9XTikKKwkJPyBTSUdOX1BPUyA6IFNJR05fTkVHKTsKKwkgICAgICByZXR1cm4gVEFHX1plcm87CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHNpZ24gPSBzaWduYSBeIFNJR05fTkVHOworCSAgICAgIHRhZyA9IEZQVV91X3N1YihiLCBhLCBkZXN0LCBjb250cm9sX3csIHNpZ24sIGV4cGIsIGV4cGEpOworCSAgICB9CisJICBicmVhazsKKwljYXNlIDE6IC8qIFAgLSBOICovCisJICB0YWcgPSBGUFVfdV9hZGQoYSwgYiwgZGVzdCwgY29udHJvbF93LCBTSUdOX1BPUywgZXhwYSwgZXhwYik7CisJICBicmVhazsKKwljYXNlIDI6IC8qIE4gLSBQICovCisJICB0YWcgPSBGUFVfdV9hZGQoYSwgYiwgZGVzdCwgY29udHJvbF93LCBTSUdOX05FRywgZXhwYSwgZXhwYik7CisJICBicmVhazsKKyNpZmRlZiBQQVJBTk9JRAorCWRlZmF1bHQ6CisJICBFWENFUFRJT04oRVhfSU5URVJOQUx8MHgxMTEpOworCSAgcmV0dXJuIC0xOworI2VuZGlmCisJfQorICAgICAgaWYgKCB0YWcgPCAwICkKKwl7CisJICBzZXRzaWduKGRlc3QsIHNhdmVkX3NpZ24pOworCSAgcmV0dXJuIHRhZzsKKwl9CisgICAgICBGUFVfc2V0dGFnaShkZXN0c3RuciwgdGFnKTsKKyAgICAgIHJldHVybiB0YWc7CisgICAgfQorCisgIGlmICggdGFnYSA9PSBUQUdfU3BlY2lhbCApCisgICAgdGFnYSA9IEZQVV9TcGVjaWFsKGEpOworICBpZiAoIHRhZ2IgPT0gVEFHX1NwZWNpYWwgKQorICAgIHRhZ2IgPSBGUFVfU3BlY2lhbChiKTsKKworICBpZiAoICgodGFnYSA9PSBUQUdfVmFsaWQpICYmICh0YWdiID09IFRXX0Rlbm9ybWFsKSkKKwkgICAgfHwgKCh0YWdhID09IFRXX0Rlbm9ybWFsKSAmJiAodGFnYiA9PSBUQUdfVmFsaWQpKQorCSAgICB8fCAoKHRhZ2EgPT0gVFdfRGVub3JtYWwpICYmICh0YWdiID09IFRXX0Rlbm9ybWFsKSkgKQorICAgIHsKKyAgICAgIEZQVV9SRUcgeCwgeTsKKworICAgICAgaWYgKCBkZW5vcm1hbF9vcGVyYW5kKCkgPCAwICkKKwlyZXR1cm4gRlBVX0V4Y2VwdGlvbjsKKworICAgICAgRlBVX3RvX2V4cDE2KGEsICZ4KTsKKyAgICAgIEZQVV90b19leHAxNihiLCAmeSk7CisgICAgICBhID0gJng7CisgICAgICBiID0gJnk7CisgICAgICBleHBhID0gZXhwb25lbnQxNihhKTsKKyAgICAgIGV4cGIgPSBleHBvbmVudDE2KGIpOworCisgICAgICBnb3RvIHZhbGlkX3N1YnRyYWN0OworICAgIH0KKworICBpZiAoICh0YWdhID09IFRXX05hTikgfHwgKHRhZ2IgPT0gVFdfTmFOKSApCisgICAgeworICAgICAgRlBVX1JFRyBjb25zdCAqZDEsICpkMjsKKyAgICAgIGlmICggZmxhZ3MgJiBSRVYgKQorCXsKKwkgIGQxID0gYjsKKwkgIGQyID0gYTsKKwl9CisgICAgICBlbHNlCisJeworCSAgZDEgPSBhOworCSAgZDIgPSBiOworCX0KKyAgICAgIGlmICggZmxhZ3MgJiBMT0FERUQgKQorCXJldHVybiByZWFsXzJvcF9OYU4oYiwgdGFnYiwgZGVzdHN0bnIsIGQxKTsKKyAgICAgIGlmICggZmxhZ3MgJiBERVNUX1JNICkKKwlyZXR1cm4gcmVhbF8yb3BfTmFOKGEsIHRhZ2EsIGRlc3RzdG5yLCBkMik7CisgICAgICBlbHNlCisJcmV0dXJuIHJlYWxfMm9wX05hTihiLCB0YWdiLCBkZXN0c3RuciwgZDIpOworICAgIH0KKworICAgIHJldHVybiBhZGRfc3ViX3NwZWNpYWxzKGEsIHRhZ2EsIHNpZ25hLCBiLCB0YWdiLCBzaWduYiBeIFNJR05fTkVHLAorCQkJICAgIGRlc3QsIGRlc3RzdG5yLCBjb250cm9sX3cpOworfQorCisKK3N0YXRpYworaW50IGFkZF9zdWJfc3BlY2lhbHMoRlBVX1JFRyBjb25zdCAqYSwgdV9jaGFyIHRhZ2EsIHVfY2hhciBzaWduYSwKKwkJICAgICBGUFVfUkVHIGNvbnN0ICpiLCB1X2NoYXIgdGFnYiwgdV9jaGFyIHNpZ25iLAorCQkgICAgIEZQVV9SRUcgKmRlc3QsIGludCBkZXN0c3RuciwgaW50IGNvbnRyb2xfdykKK3sKKyAgaWYgKCAoKHRhZ2EgPT0gVFdfRGVub3JtYWwpIHx8ICh0YWdiID09IFRXX0Rlbm9ybWFsKSkKKyAgICAgICAmJiAoZGVub3JtYWxfb3BlcmFuZCgpIDwgMCkgKQorICAgIHJldHVybiBGUFVfRXhjZXB0aW9uOworCisgIGlmICh0YWdhID09IFRBR19aZXJvKQorICAgIHsKKyAgICAgIGlmICh0YWdiID09IFRBR19aZXJvKQorCXsKKwkgIC8qIEJvdGggYXJlIHplcm8sIHJlc3VsdCB3aWxsIGJlIHplcm8uICovCisJICB1X2NoYXIgZGlmZmVyZW50X3NpZ25zID0gc2lnbmEgXiBzaWduYjsKKworCSAgRlBVX2NvcHlfdG9fcmVnaShhLCBUQUdfWmVybywgZGVzdHN0bnIpOworCSAgaWYgKCBkaWZmZXJlbnRfc2lnbnMgKQorCSAgICB7CisJICAgICAgLyogU2lnbnMgYXJlIGRpZmZlcmVudC4gKi8KKwkgICAgICAvKiBTaWduIG9mIGFuc3dlciBkZXBlbmRzIHVwb24gcm91bmRpbmcgbW9kZS4gKi8KKwkgICAgICBzZXRzaWduKGRlc3QsICgoY29udHJvbF93ICYgQ1dfUkMpICE9IFJDX0RPV04pCisJCSAgICAgID8gU0lHTl9QT1MgOiBTSUdOX05FRyk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgc2V0c2lnbihkZXN0LCBzaWduYSk7ICAvKiBzaWduYSBtYXkgZGlmZmVyIGZyb20gdGhlIHNpZ24gb2YgYS4gKi8KKwkgIHJldHVybiBUQUdfWmVybzsKKwl9CisgICAgICBlbHNlCisJeworCSAgcmVnX2NvcHkoYiwgZGVzdCk7CisJICBpZiAoICh0YWdiID09IFRXX0Rlbm9ybWFsKSAmJiAoYi0+c2lnaCAmIDB4ODAwMDAwMDApICkKKwkgICAgeworCSAgICAgIC8qIEEgcHNldWRvRGVub3JtYWwsIGNvbnZlcnQgaXQuICovCisJICAgICAgYWRkZXhwb25lbnQoZGVzdCwgMSk7CisJICAgICAgdGFnYiA9IFRBR19WYWxpZDsKKwkgICAgfQorCSAgZWxzZSBpZiAoIHRhZ2IgPiBUQUdfRW1wdHkgKQorCSAgICB0YWdiID0gVEFHX1NwZWNpYWw7CisJICBzZXRzaWduKGRlc3QsIHNpZ25iKTsgIC8qIHNpZ25iIG1heSBkaWZmZXIgZnJvbSB0aGUgc2lnbiBvZiBiLiAqLworCSAgRlBVX3NldHRhZ2koZGVzdHN0bnIsIHRhZ2IpOworCSAgcmV0dXJuIHRhZ2I7CisJfQorICAgIH0KKyAgZWxzZSBpZiAodGFnYiA9PSBUQUdfWmVybykKKyAgICB7CisgICAgICByZWdfY29weShhLCBkZXN0KTsKKyAgICAgIGlmICggKHRhZ2EgPT0gVFdfRGVub3JtYWwpICYmIChhLT5zaWdoICYgMHg4MDAwMDAwMCkgKQorCXsKKwkgIC8qIEEgcHNldWRvRGVub3JtYWwgKi8KKwkgIGFkZGV4cG9uZW50KGRlc3QsIDEpOworCSAgdGFnYSA9IFRBR19WYWxpZDsKKwl9CisgICAgICBlbHNlIGlmICggdGFnYSA+IFRBR19FbXB0eSApCisJdGFnYSA9IFRBR19TcGVjaWFsOworICAgICAgc2V0c2lnbihkZXN0LCBzaWduYSk7ICAvKiBzaWduYSBtYXkgZGlmZmVyIGZyb20gdGhlIHNpZ24gb2YgYS4gKi8KKyAgICAgIEZQVV9zZXR0YWdpKGRlc3RzdG5yLCB0YWdhKTsKKyAgICAgIHJldHVybiB0YWdhOworICAgIH0KKyAgZWxzZSBpZiAodGFnYSA9PSBUV19JbmZpbml0eSkKKyAgICB7CisgICAgICBpZiAoICh0YWdiICE9IFRXX0luZmluaXR5KSB8fCAoc2lnbmEgPT0gc2lnbmIpICkKKwl7CisJICBGUFVfY29weV90b19yZWdpKGEsIFRBR19TcGVjaWFsLCBkZXN0c3Rucik7CisJICBzZXRzaWduKGRlc3QsIHNpZ25hKTsgIC8qIHNpZ25hIG1heSBkaWZmZXIgZnJvbSB0aGUgc2lnbiBvZiBhLiAqLworCSAgcmV0dXJuIHRhZ2E7CisJfQorICAgICAgLyogSW5maW5pdHktSW5maW5pdHkgaXMgdW5kZWZpbmVkLiAqLworICAgICAgcmV0dXJuIGFyaXRoX2ludmFsaWQoZGVzdHN0bnIpOworICAgIH0KKyAgZWxzZSBpZiAodGFnYiA9PSBUV19JbmZpbml0eSkKKyAgICB7CisgICAgICBGUFVfY29weV90b19yZWdpKGIsIFRBR19TcGVjaWFsLCBkZXN0c3Rucik7CisgICAgICBzZXRzaWduKGRlc3QsIHNpZ25iKTsgIC8qIHNpZ25iIG1heSBkaWZmZXIgZnJvbSB0aGUgc2lnbiBvZiBiLiAqLworICAgICAgcmV0dXJuIHRhZ2I7CisgICAgfQorCisjaWZkZWYgUEFSQU5PSUQKKyAgRVhDRVBUSU9OKEVYX0lOVEVSTkFMfDB4MTAxKTsKKyNlbmRpZgorCisgIHJldHVybiBGUFVfRXhjZXB0aW9uOworfQorCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWF0aC1lbXUvcmVnX2NvbXBhcmUuYyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9yZWdfY29tcGFyZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzN2M1YjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWF0aC1lbXUvcmVnX2NvbXBhcmUuYwpAQCAtMCwwICsxLDM4MSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgcmVnX2NvbXBhcmUuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29tcGFyZSB0d28gZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENvcHlyaWdodCAoQykgMTk5MiwxOTkzLDE5OTQsMTk5NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICBXLiBNZXR6ZW50aGVuLCAyMiBQYXJrZXIgU3QsIE9ybW9uZCwgVmljIDMxNjMsIEF1c3RyYWxpYSB8CisgfCAgICAgICAgICAgICAgICAgIEUtbWFpbCAgIGJpbGxtQHN1YnVyYmlhLm5ldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgY29tcGFyZSgpIGlzIHRoZSBjb3JlIEZQVV9SRUcgY29tcGFyaXNvbiBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJmcHVfc3lzdGVtLmgiCisjaW5jbHVkZSAiZXhjZXB0aW9uLmgiCisjaW5jbHVkZSAiZnB1X2VtdS5oIgorI2luY2x1ZGUgImNvbnRyb2xfdy5oIgorI2luY2x1ZGUgInN0YXR1c193LmgiCisKKworc3RhdGljIGludCBjb21wYXJlKEZQVV9SRUcgY29uc3QgKmIsIGludCB0YWdiKQoreworICBpbnQgZGlmZiwgZXhwMCwgZXhwYjsKKyAgdV9jaGFyCSAgCXN0MF90YWc7CisgIEZQVV9SRUcgIAkqc3QwX3B0cjsKKyAgRlBVX1JFRwl4LCB5OworICB1X2NoYXIJCXN0MF9zaWduLCBzaWduYiA9IGdldHNpZ24oYik7CisKKyAgc3QwX3B0ciA9ICZzdCgwKTsKKyAgc3QwX3RhZyA9IEZQVV9nZXR0YWcwKCk7CisgIHN0MF9zaWduID0gZ2V0c2lnbihzdDBfcHRyKTsKKworICBpZiAoIHRhZ2IgPT0gVEFHX1NwZWNpYWwgKQorICAgIHRhZ2IgPSBGUFVfU3BlY2lhbChiKTsKKyAgaWYgKCBzdDBfdGFnID09IFRBR19TcGVjaWFsICkKKyAgICBzdDBfdGFnID0gRlBVX1NwZWNpYWwoc3QwX3B0cik7CisKKyAgaWYgKCAoKHN0MF90YWcgIT0gVEFHX1ZhbGlkKSAmJiAoc3QwX3RhZyAhPSBUV19EZW5vcm1hbCkpCisgICAgICAgfHwgKCh0YWdiICE9IFRBR19WYWxpZCkgJiYgKHRhZ2IgIT0gVFdfRGVub3JtYWwpKSApCisgICAgeworICAgICAgaWYgKCBzdDBfdGFnID09IFRBR19aZXJvICkKKwl7CisJICBpZiAoIHRhZ2IgPT0gVEFHX1plcm8gKSByZXR1cm4gQ09NUF9BX2VxX0I7CisJICBpZiAoIHRhZ2IgPT0gVEFHX1ZhbGlkICkKKwkgICAgcmV0dXJuICgoc2lnbmIgPT0gU0lHTl9QT1MpID8gQ09NUF9BX2x0X0IgOiBDT01QX0FfZ3RfQik7CisJICBpZiAoIHRhZ2IgPT0gVFdfRGVub3JtYWwgKQorCSAgICByZXR1cm4gKChzaWduYiA9PSBTSUdOX1BPUykgPyBDT01QX0FfbHRfQiA6IENPTVBfQV9ndF9CKQorCSAgICB8IENPTVBfRGVub3JtYWw7CisJfQorICAgICAgZWxzZSBpZiAoIHRhZ2IgPT0gVEFHX1plcm8gKQorCXsKKwkgIGlmICggc3QwX3RhZyA9PSBUQUdfVmFsaWQgKQorCSAgICByZXR1cm4gKChzdDBfc2lnbiA9PSBTSUdOX1BPUykgPyBDT01QX0FfZ3RfQiA6IENPTVBfQV9sdF9CKTsKKwkgIGlmICggc3QwX3RhZyA9PSBUV19EZW5vcm1hbCApCisJICAgIHJldHVybiAoKHN0MF9zaWduID09IFNJR05fUE9TKSA/IENPTVBfQV9ndF9CIDogQ09NUF9BX2x0X0IpCisJICAgIHwgQ09NUF9EZW5vcm1hbDsKKwl9CisKKyAgICAgIGlmICggc3QwX3RhZyA9PSBUV19JbmZpbml0eSApCisJeworCSAgaWYgKCAodGFnYiA9PSBUQUdfVmFsaWQpIHx8ICh0YWdiID09IFRBR19aZXJvKSApCisJICAgIHJldHVybiAoKHN0MF9zaWduID09IFNJR05fUE9TKSA/IENPTVBfQV9ndF9CIDogQ09NUF9BX2x0X0IpOworCSAgZWxzZSBpZiAoIHRhZ2IgPT0gVFdfRGVub3JtYWwgKQorCSAgICByZXR1cm4gKChzdDBfc2lnbiA9PSBTSUdOX1BPUykgPyBDT01QX0FfZ3RfQiA6IENPTVBfQV9sdF9CKQorCSAgICAgIHwgQ09NUF9EZW5vcm1hbDsKKwkgIGVsc2UgaWYgKCB0YWdiID09IFRXX0luZmluaXR5ICkKKwkgICAgeworCSAgICAgIC8qIFRoZSA4MDQ4NiBib29rIHNheXMgdGhhdCBpbmZpbml0aWVzIGNhbiBiZSBlcXVhbCEgKi8KKwkgICAgICByZXR1cm4gKHN0MF9zaWduID09IHNpZ25iKSA/IENPTVBfQV9lcV9CIDoKKwkJKChzdDBfc2lnbiA9PSBTSUdOX1BPUykgPyBDT01QX0FfZ3RfQiA6IENPTVBfQV9sdF9CKTsKKwkgICAgfQorCSAgLyogRmFsbCB0aHJvdWdoIHRvIHRoZSBOYU4gY29kZSAqLworCX0KKyAgICAgIGVsc2UgaWYgKCB0YWdiID09IFRXX0luZmluaXR5ICkKKwl7CisJICBpZiAoIChzdDBfdGFnID09IFRBR19WYWxpZCkgfHwgKHN0MF90YWcgPT0gVEFHX1plcm8pICkKKwkgICAgcmV0dXJuICgoc2lnbmIgPT0gU0lHTl9QT1MpID8gQ09NUF9BX2x0X0IgOiBDT01QX0FfZ3RfQik7CisJICBpZiAoIHN0MF90YWcgPT0gVFdfRGVub3JtYWwgKQorCSAgICByZXR1cm4gKChzaWduYiA9PSBTSUdOX1BPUykgPyBDT01QX0FfbHRfQiA6IENPTVBfQV9ndF9CKQorCQl8IENPTVBfRGVub3JtYWw7CisJICAvKiBGYWxsIHRocm91Z2ggdG8gdGhlIE5hTiBjb2RlICovCisJfQorCisgICAgICAvKiBUaGUgb25seSBwb3NzaWJpbGl0eSBub3cgc2hvdWxkIGJlIHRoYXQgb25lIG9mIHRoZSBhcmd1bWVudHMKKwkgaXMgYSBOYU4gKi8KKyAgICAgIGlmICggKHN0MF90YWcgPT0gVFdfTmFOKSB8fCAodGFnYiA9PSBUV19OYU4pICkKKwl7CisJICBpbnQgc2lnbmFsbGluZyA9IDAsIHVuc3VwcG9ydGVkID0gMDsKKwkgIGlmICggc3QwX3RhZyA9PSBUV19OYU4gKQorCSAgICB7CisJICAgICAgc2lnbmFsbGluZyA9IChzdDBfcHRyLT5zaWdoICYgMHhjMDAwMDAwMCkgPT0gMHg4MDAwMDAwMDsKKwkgICAgICB1bnN1cHBvcnRlZCA9ICEoKGV4cG9uZW50KHN0MF9wdHIpID09IEVYUF9PVkVSKQorCQkJICAgICAgJiYgKHN0MF9wdHItPnNpZ2ggJiAweDgwMDAwMDAwKSk7CisJICAgIH0KKwkgIGlmICggdGFnYiA9PSBUV19OYU4gKQorCSAgICB7CisJICAgICAgc2lnbmFsbGluZyB8PSAoYi0+c2lnaCAmIDB4YzAwMDAwMDApID09IDB4ODAwMDAwMDA7CisJICAgICAgdW5zdXBwb3J0ZWQgfD0gISgoZXhwb25lbnQoYikgPT0gRVhQX09WRVIpCisJCQkgICAgICAgJiYgKGItPnNpZ2ggJiAweDgwMDAwMDAwKSk7CisJICAgIH0KKwkgIGlmICggc2lnbmFsbGluZyB8fCB1bnN1cHBvcnRlZCApCisJICAgIHJldHVybiBDT01QX05vX0NvbXAgfCBDT01QX1NOYU4gfCBDT01QX05hTjsKKwkgIGVsc2UKKwkgICAgLyogTmVpdGhlciBpcyBhIHNpZ25hbGluZyBOYU4gKi8KKwkgICAgcmV0dXJuIENPTVBfTm9fQ29tcCB8IENPTVBfTmFOOworCX0KKyAgICAgIAorICAgICAgRVhDRVBUSU9OKEVYX0ludmFsaWQpOworICAgIH0KKyAgCisgIGlmIChzdDBfc2lnbiAhPSBzaWduYikKKyAgICB7CisgICAgICByZXR1cm4gKChzdDBfc2lnbiA9PSBTSUdOX1BPUykgPyBDT01QX0FfZ3RfQiA6IENPTVBfQV9sdF9CKQorCXwgKCAoKHN0MF90YWcgPT0gVFdfRGVub3JtYWwpIHx8ICh0YWdiID09IFRXX0Rlbm9ybWFsKSkgPworCSAgICBDT01QX0Rlbm9ybWFsIDogMCk7CisgICAgfQorCisgIGlmICggKHN0MF90YWcgPT0gVFdfRGVub3JtYWwpIHx8ICh0YWdiID09IFRXX0Rlbm9ybWFsKSApCisgICAgeworICAgICAgRlBVX3RvX2V4cDE2KHN0MF9wdHIsICZ4KTsKKyAgICAgIEZQVV90b19leHAxNihiLCAmeSk7CisgICAgICBzdDBfcHRyID0gJng7CisgICAgICBiID0gJnk7CisgICAgICBleHAwID0gZXhwb25lbnQxNihzdDBfcHRyKTsKKyAgICAgIGV4cGIgPSBleHBvbmVudDE2KGIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGV4cDAgPSBleHBvbmVudChzdDBfcHRyKTsKKyAgICAgIGV4cGIgPSBleHBvbmVudChiKTsKKyAgICB9CisKKyNpZmRlZiBQQVJBTk9JRAorICBpZiAoIShzdDBfcHRyLT5zaWdoICYgMHg4MDAwMDAwMCkpIEVYQ0VQVElPTihFWF9JbnZhbGlkKTsKKyAgaWYgKCEoYi0+c2lnaCAmIDB4ODAwMDAwMDApKSBFWENFUFRJT04oRVhfSW52YWxpZCk7CisjZW5kaWYgLyogUEFSQU5PSUQgKi8KKworICBkaWZmID0gZXhwMCAtIGV4cGI7CisgIGlmICggZGlmZiA9PSAwICkKKyAgICB7CisgICAgICBkaWZmID0gc3QwX3B0ci0+c2lnaCAtIGItPnNpZ2g7ICAvKiBXb3JrcyBvbmx5IGlmIG1zIGJpdHMgYXJlCisJCQkJCSAgICAgIGlkZW50aWNhbCAqLworICAgICAgaWYgKCBkaWZmID09IDAgKQorCXsKKwlkaWZmID0gc3QwX3B0ci0+c2lnbCA+IGItPnNpZ2w7CisJaWYgKCBkaWZmID09IDAgKQorCSAgZGlmZiA9IC0oc3QwX3B0ci0+c2lnbCA8IGItPnNpZ2wpOworCX0KKyAgICB9CisKKyAgaWYgKCBkaWZmID4gMCApCisgICAgeworICAgICAgcmV0dXJuICgoc3QwX3NpZ24gPT0gU0lHTl9QT1MpID8gQ09NUF9BX2d0X0IgOiBDT01QX0FfbHRfQikKKwl8ICggKChzdDBfdGFnID09IFRXX0Rlbm9ybWFsKSB8fCAodGFnYiA9PSBUV19EZW5vcm1hbCkpID8KKwkgICAgQ09NUF9EZW5vcm1hbCA6IDApOworICAgIH0KKyAgaWYgKCBkaWZmIDwgMCApCisgICAgeworICAgICAgcmV0dXJuICgoc3QwX3NpZ24gPT0gU0lHTl9QT1MpID8gQ09NUF9BX2x0X0IgOiBDT01QX0FfZ3RfQikKKwl8ICggKChzdDBfdGFnID09IFRXX0Rlbm9ybWFsKSB8fCAodGFnYiA9PSBUV19EZW5vcm1hbCkpID8KKwkgICAgQ09NUF9EZW5vcm1hbCA6IDApOworICAgIH0KKworICByZXR1cm4gQ09NUF9BX2VxX0IKKyAgICB8ICggKChzdDBfdGFnID09IFRXX0Rlbm9ybWFsKSB8fCAodGFnYiA9PSBUV19EZW5vcm1hbCkpID8KKwlDT01QX0Rlbm9ybWFsIDogMCk7CisKK30KKworCisvKiBUaGlzIGZ1bmN0aW9uIHJlcXVpcmVzIHRoYXQgc3QoMCkgaXMgbm90IGVtcHR5ICovCitpbnQgRlBVX2NvbXBhcmVfc3RfZGF0YShGUFVfUkVHIGNvbnN0ICpsb2FkZWRfZGF0YSwgdV9jaGFyIGxvYWRlZF90YWcpCit7CisgIGludCBmID0gMCwgYzsKKworICBjID0gY29tcGFyZShsb2FkZWRfZGF0YSwgbG9hZGVkX3RhZyk7CisKKyAgaWYgKGMgJiBDT01QX05hTikKKyAgICB7CisgICAgICBFWENFUFRJT04oRVhfSW52YWxpZCk7CisgICAgICBmID0gU1dfQzMgfCBTV19DMiB8IFNXX0MwOworICAgIH0KKyAgZWxzZQorICAgIHN3aXRjaCAoYyAmIDcpCisgICAgICB7CisgICAgICBjYXNlIENPTVBfQV9sdF9COgorCWYgPSBTV19DMDsKKwlicmVhazsKKyAgICAgIGNhc2UgQ09NUF9BX2VxX0I6CisJZiA9IFNXX0MzOworCWJyZWFrOworICAgICAgY2FzZSBDT01QX0FfZ3RfQjoKKwlmID0gMDsKKwlicmVhazsKKyAgICAgIGNhc2UgQ09NUF9Ob19Db21wOgorCWYgPSBTV19DMyB8IFNXX0MyIHwgU1dfQzA7CisJYnJlYWs7CisjaWZkZWYgUEFSQU5PSUQKKyAgICAgIGRlZmF1bHQ6CisJRVhDRVBUSU9OKEVYX0lOVEVSTkFMfDB4MTIxKTsKKwlmID0gU1dfQzMgfCBTV19DMiB8IFNXX0MwOworCWJyZWFrOworI2VuZGlmIC8qIFBBUkFOT0lEICovCisgICAgICB9CisgIHNldGNjKGYpOworICBpZiAoYyAmIENPTVBfRGVub3JtYWwpCisgICAgeworICAgICAgcmV0dXJuIGRlbm9ybWFsX29wZXJhbmQoKSA8IDA7CisgICAgfQorICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGNvbXBhcmVfc3Rfc3QoaW50IG5yKQoreworICBpbnQgZiA9IDAsIGM7CisgIEZQVV9SRUcgKnN0X3B0cjsKKworICBpZiAoICFOT1RfRU1QVFkoMCkgfHwgIU5PVF9FTVBUWShucikgKQorICAgIHsKKyAgICAgIHNldGNjKFNXX0MzIHwgU1dfQzIgfCBTV19DMCk7CisgICAgICAvKiBTdGFjayBmYXVsdCAqLworICAgICAgRVhDRVBUSU9OKEVYX1N0YWNrVW5kZXIpOworICAgICAgcmV0dXJuICEoY29udHJvbF93b3JkICYgQ1dfSW52YWxpZCk7CisgICAgfQorCisgIHN0X3B0ciA9ICZzdChucik7CisgIGMgPSBjb21wYXJlKHN0X3B0ciwgRlBVX2dldHRhZ2kobnIpKTsKKyAgaWYgKGMgJiBDT01QX05hTikKKyAgICB7CisgICAgICBzZXRjYyhTV19DMyB8IFNXX0MyIHwgU1dfQzApOworICAgICAgRVhDRVBUSU9OKEVYX0ludmFsaWQpOworICAgICAgcmV0dXJuICEoY29udHJvbF93b3JkICYgQ1dfSW52YWxpZCk7CisgICAgfQorICBlbHNlCisgICAgc3dpdGNoIChjICYgNykKKyAgICAgIHsKKyAgICAgIGNhc2UgQ09NUF9BX2x0X0I6CisJZiA9IFNXX0MwOworCWJyZWFrOworICAgICAgY2FzZSBDT01QX0FfZXFfQjoKKwlmID0gU1dfQzM7CisJYnJlYWs7CisgICAgICBjYXNlIENPTVBfQV9ndF9COgorCWYgPSAwOworCWJyZWFrOworICAgICAgY2FzZSBDT01QX05vX0NvbXA6CisJZiA9IFNXX0MzIHwgU1dfQzIgfCBTV19DMDsKKwlicmVhazsKKyNpZmRlZiBQQVJBTk9JRAorICAgICAgZGVmYXVsdDoKKwlFWENFUFRJT04oRVhfSU5URVJOQUx8MHgxMjIpOworCWYgPSBTV19DMyB8IFNXX0MyIHwgU1dfQzA7CisJYnJlYWs7CisjZW5kaWYgLyogUEFSQU5PSUQgKi8KKyAgICAgIH0KKyAgc2V0Y2MoZik7CisgIGlmIChjICYgQ09NUF9EZW5vcm1hbCkKKyAgICB7CisgICAgICByZXR1cm4gZGVub3JtYWxfb3BlcmFuZCgpIDwgMDsKKyAgICB9CisgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgY29tcGFyZV91X3N0X3N0KGludCBucikKK3sKKyAgaW50IGYgPSAwLCBjOworICBGUFVfUkVHICpzdF9wdHI7CisKKyAgaWYgKCAhTk9UX0VNUFRZKDApIHx8ICFOT1RfRU1QVFkobnIpICkKKyAgICB7CisgICAgICBzZXRjYyhTV19DMyB8IFNXX0MyIHwgU1dfQzApOworICAgICAgLyogU3RhY2sgZmF1bHQgKi8KKyAgICAgIEVYQ0VQVElPTihFWF9TdGFja1VuZGVyKTsKKyAgICAgIHJldHVybiAhKGNvbnRyb2xfd29yZCAmIENXX0ludmFsaWQpOworICAgIH0KKworICBzdF9wdHIgPSAmc3QobnIpOworICBjID0gY29tcGFyZShzdF9wdHIsIEZQVV9nZXR0YWdpKG5yKSk7CisgIGlmIChjICYgQ09NUF9OYU4pCisgICAgeworICAgICAgc2V0Y2MoU1dfQzMgfCBTV19DMiB8IFNXX0MwKTsKKyAgICAgIGlmIChjICYgQ09NUF9TTmFOKSAgICAgICAvKiBUaGlzIGlzIHRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbgorCQkJCSAgdW4tb3JkZXJlZCBhbmQgb3JkaW5hcnkgY29tcGFyaXNvbnMgKi8KKwl7CisJICBFWENFUFRJT04oRVhfSW52YWxpZCk7CisJICByZXR1cm4gIShjb250cm9sX3dvcmQgJiBDV19JbnZhbGlkKTsKKwl9CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGVsc2UKKyAgICBzd2l0Y2ggKGMgJiA3KQorICAgICAgeworICAgICAgY2FzZSBDT01QX0FfbHRfQjoKKwlmID0gU1dfQzA7CisJYnJlYWs7CisgICAgICBjYXNlIENPTVBfQV9lcV9COgorCWYgPSBTV19DMzsKKwlicmVhazsKKyAgICAgIGNhc2UgQ09NUF9BX2d0X0I6CisJZiA9IDA7CisJYnJlYWs7CisgICAgICBjYXNlIENPTVBfTm9fQ29tcDoKKwlmID0gU1dfQzMgfCBTV19DMiB8IFNXX0MwOworCWJyZWFrOworI2lmZGVmIFBBUkFOT0lECisgICAgICBkZWZhdWx0OgorCUVYQ0VQVElPTihFWF9JTlRFUk5BTHwweDEyMyk7CisJZiA9IFNXX0MzIHwgU1dfQzIgfCBTV19DMDsKKwlicmVhazsKKyNlbmRpZiAvKiBQQVJBTk9JRCAqLyAKKyAgICAgIH0KKyAgc2V0Y2MoZik7CisgIGlmIChjICYgQ09NUF9EZW5vcm1hbCkKKyAgICB7CisgICAgICByZXR1cm4gZGVub3JtYWxfb3BlcmFuZCgpIDwgMDsKKyAgICB9CisgIHJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgZmNvbV9zdCh2b2lkKQoreworICAvKiBmY29tIHN0KGkpICovCisgIGNvbXBhcmVfc3Rfc3QoRlBVX3JtKTsKK30KKworCit2b2lkIGZjb21wc3Qodm9pZCkKK3sKKyAgLyogZmNvbXAgc3QoaSkgKi8KKyAgaWYgKCAhY29tcGFyZV9zdF9zdChGUFVfcm0pICkKKyAgICBGUFVfcG9wKCk7Cit9CisKKwordm9pZCBmY29tcHAodm9pZCkKK3sKKyAgLyogZmNvbXBwICovCisgIGlmIChGUFVfcm0gIT0gMSkKKyAgICB7CisgICAgICBGUFVfaWxsZWdhbCgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgaWYgKCAhY29tcGFyZV9zdF9zdCgxKSApCisgICAgICBwb3Bwb3AoKTsKK30KKworCit2b2lkIGZ1Y29tXyh2b2lkKQoreworICAvKiBmdWNvbSBzdChpKSAqLworICBjb21wYXJlX3Vfc3Rfc3QoRlBVX3JtKTsKKworfQorCisKK3ZvaWQgZnVjb21wKHZvaWQpCit7CisgIC8qIGZ1Y29tcCBzdChpKSAqLworICBpZiAoICFjb21wYXJlX3Vfc3Rfc3QoRlBVX3JtKSApCisgICAgRlBVX3BvcCgpOworfQorCisKK3ZvaWQgZnVjb21wcCh2b2lkKQoreworICAvKiBmdWNvbXBwICovCisgIGlmIChGUFVfcm0gPT0gMSkKKyAgICB7CisgICAgICBpZiAoICFjb21wYXJlX3Vfc3Rfc3QoMSkgKQorCXBvcHBvcCgpOworICAgIH0KKyAgZWxzZQorICAgIEZQVV9pbGxlZ2FsKCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWF0aC1lbXUvcmVnX2NvbnN0YW50LmMgYi9hcmNoL2kzODYvbWF0aC1lbXUvcmVnX2NvbnN0YW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg1MDE1OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9yZWdfY29uc3RhbnQuYwpAQCAtMCwwICsxLDEyMCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgcmVnX2NvbnN0YW50LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQWxsIG9mIHRoZSBjb25zdGFudCBGUFVfUkVHcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENvcHlyaWdodCAoQykgMTk5MiwxOTkzLDE5OTQsMTk5NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICBXLiBNZXR6ZW50aGVuLCAyMiBQYXJrZXIgU3QsIE9ybW9uZCwgVmljIDMxNjMsICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgIEF1c3RyYWxpYS4gIEUtbWFpbCAgIGJpbGxtQHN1YnVyYmlhLm5ldCAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJmcHVfc3lzdGVtLmgiCisjaW5jbHVkZSAiZnB1X2VtdS5oIgorI2luY2x1ZGUgInN0YXR1c193LmgiCisjaW5jbHVkZSAicmVnX2NvbnN0YW50LmgiCisjaW5jbHVkZSAiY29udHJvbF93LmgiCisKKworI2RlZmluZSBNQUtFX1JFRyhzLGUsbCxoKSB7IGwsIGgsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEVYVEVOREVEX0ViaWFzKyhlKSkgfCAoKFNJR05fIyNzICE9IDApKjB4ODAwMCkpIH0KKworRlBVX1JFRyBjb25zdCBDT05TVF8xICAgID0gTUFLRV9SRUcoUE9TLCAwLCAweDAwMDAwMDAwLCAweDgwMDAwMDAwKTsKKyNpZiAwCitGUFVfUkVHIGNvbnN0IENPTlNUXzIgICAgPSBNQUtFX1JFRyhQT1MsIDEsIDB4MDAwMDAwMDAsIDB4ODAwMDAwMDApOworRlBVX1JFRyBjb25zdCBDT05TVF9IQUxGID0gTUFLRV9SRUcoUE9TLCAtMSwgMHgwMDAwMDAwMCwgMHg4MDAwMDAwMCk7CisjZW5kaWYgIC8qICAwICAqLworc3RhdGljIEZQVV9SRUcgY29uc3QgQ09OU1RfTDJUICA9IE1BS0VfUkVHKFBPUywgMSwgMHhjZDFiOGFmZSwgMHhkNDlhNzg0Yik7CitzdGF0aWMgRlBVX1JFRyBjb25zdCBDT05TVF9MMkUgID0gTUFLRV9SRUcoUE9TLCAwLCAweDVjMTdmMGJjLCAweGI4YWEzYjI5KTsKK0ZQVV9SRUcgY29uc3QgQ09OU1RfUEkgICA9IE1BS0VfUkVHKFBPUywgMSwgMHgyMTY4YzIzNSwgMHhjOTBmZGFhMik7CitGUFVfUkVHIGNvbnN0IENPTlNUX1BJMiAgPSBNQUtFX1JFRyhQT1MsIDAsIDB4MjE2OGMyMzUsIDB4YzkwZmRhYTIpOworRlBVX1JFRyBjb25zdCBDT05TVF9QSTQgID0gTUFLRV9SRUcoUE9TLCAtMSwgMHgyMTY4YzIzNSwgMHhjOTBmZGFhMik7CitzdGF0aWMgRlBVX1JFRyBjb25zdCBDT05TVF9MRzIgID0gTUFLRV9SRUcoUE9TLCAtMiwgMHhmYmNmZjc5OSwgMHg5YTIwOWE4NCk7CitzdGF0aWMgRlBVX1JFRyBjb25zdCBDT05TVF9MTjIgID0gTUFLRV9SRUcoUE9TLCAtMSwgMHhkMWNmNzlhYywgMHhiMTcyMTdmNyk7CisKKy8qIEV4dHJhIGJpdHMgdG8gdGFrZSBwaS8yIHRvIG1vcmUgdGhhbiAxMjggYml0cyBwcmVjaXNpb24uICovCitGUFVfUkVHIGNvbnN0IENPTlNUX1BJMmV4dHJhID0gTUFLRV9SRUcoTkVHLCAtNjYsCisJCQkJCSAweGZjOGY4Y2JiLCAweGVjZTY3NWQxKTsKKworLyogT25seSB0aGUgc2lnbiAoYW5kIHRhZykgaXMgdXNlZCBpbiBpbnRlcm5hbCB6ZXJvZXMgKi8KK0ZQVV9SRUcgY29uc3QgQ09OU1RfWiAgICA9IE1BS0VfUkVHKFBPUywgRVhQX1VOREVSLCAweDAsIDB4MCk7CisKKy8qIE9ubHkgdGhlIHNpZ24gYW5kIHNpZ25pZmljYW5kIChhbmQgdGFnKSBhcmUgdXNlZCBpbiBpbnRlcm5hbCBOYU5zICovCisvKiBUaGUgODA0ODYgbmV2ZXIgZ2VuZXJhdGVzIG9uZSBvZiB0aGVzZSAKK0ZQVV9SRUcgY29uc3QgQ09OU1RfU05BTiA9IE1BS0VfUkVHKFBPUywgRVhQX09WRVIsIDB4MDAwMDAwMDEsIDB4ODAwMDAwMDApOworICovCisvKiBUaGlzIGlzIHRoZSByZWFsIGluZGVmaW5pdGUgUU5hTiAqLworRlBVX1JFRyBjb25zdCBDT05TVF9RTmFOID0gTUFLRV9SRUcoTkVHLCBFWFBfT1ZFUiwgMHgwMDAwMDAwMCwgMHhDMDAwMDAwMCk7CisKKy8qIE9ubHkgdGhlIHNpZ24gKGFuZCB0YWcpIGlzIHVzZWQgaW4gaW50ZXJuYWwgaW5maW5pdGllcyAqLworRlBVX1JFRyBjb25zdCBDT05TVF9JTkYgID0gTUFLRV9SRUcoUE9TLCBFWFBfT1ZFUiwgMHgwMDAwMDAwMCwgMHg4MDAwMDAwMCk7CisKKworc3RhdGljIHZvaWQgZmxkX2NvbnN0KEZQVV9SRUcgY29uc3QgKmMsIGludCBhZGosIHVfY2hhciB0YWcpCit7CisgIEZQVV9SRUcgKnN0X25ld19wdHI7CisKKyAgaWYgKCBTVEFDS19PVkVSRkxPVyApCisgICAgeworICAgICAgRlBVX3N0YWNrX292ZXJmbG93KCk7CisgICAgICByZXR1cm47CisgICAgfQorICBwdXNoKCk7CisgIHJlZ19jb3B5KGMsIHN0X25ld19wdHIpOworICBzdF9uZXdfcHRyLT5zaWdsICs9IGFkajsgIC8qIEZvciBhbGwgb3VyIGZsZHh4eCBjb25zdGFudHMsIHdlIGRvbid0IG5lZWQgdG8KKwkJCSAgICAgICBib3Jyb3cgb3IgY2FycnkuICovCisgIEZQVV9zZXR0YWcwKHRhZyk7CisgIGNsZWFyX0MxKCk7Cit9CisKKy8qIEEgZmFzdCB3YXkgdG8gZmluZCBvdXQgd2hldGhlciB4IGlzIG9uZSBvZiBSQ19ET1dOIG9yIFJDX0NIT1AKKyAgIChhbmQgbm90IG9uZSBvZiBSQ19STkQgb3IgUkNfVVApLgorICAgKi8KKyNkZWZpbmUgRE9XTl9PUl9DSE9QKHgpICAoeCAmIFJDX0RPV04pCisKK3N0YXRpYyB2b2lkIGZsZDEoaW50IHJjKQoreworICBmbGRfY29uc3QoJkNPTlNUXzEsIDAsIFRBR19WYWxpZCk7Cit9CisKK3N0YXRpYyB2b2lkIGZsZGwydChpbnQgcmMpCit7CisgIGZsZF9jb25zdCgmQ09OU1RfTDJULCAocmMgPT0gUkNfVVApID8gMSA6IDAsIFRBR19WYWxpZCk7Cit9CisKK3N0YXRpYyB2b2lkIGZsZGwyZShpbnQgcmMpCit7CisgIGZsZF9jb25zdCgmQ09OU1RfTDJFLCBET1dOX09SX0NIT1AocmMpID8gLTEgOiAwLCBUQUdfVmFsaWQpOworfQorCitzdGF0aWMgdm9pZCBmbGRwaShpbnQgcmMpCit7CisgIGZsZF9jb25zdCgmQ09OU1RfUEksIERPV05fT1JfQ0hPUChyYykgPyAtMSA6IDAsIFRBR19WYWxpZCk7Cit9CisKK3N0YXRpYyB2b2lkIGZsZGxnMihpbnQgcmMpCit7CisgIGZsZF9jb25zdCgmQ09OU1RfTEcyLCBET1dOX09SX0NIT1AocmMpID8gLTEgOiAwLCBUQUdfVmFsaWQpOworfQorCitzdGF0aWMgdm9pZCBmbGRsbjIoaW50IHJjKQoreworICBmbGRfY29uc3QoJkNPTlNUX0xOMiwgRE9XTl9PUl9DSE9QKHJjKSA/IC0xIDogMCwgVEFHX1ZhbGlkKTsKK30KKworc3RhdGljIHZvaWQgZmxkeihpbnQgcmMpCit7CisgIGZsZF9jb25zdCgmQ09OU1RfWiwgMCwgVEFHX1plcm8pOworfQorCit0eXBlZGVmIHZvaWQgKCpGVU5DX1JDKShpbnQpOworCitzdGF0aWMgRlVOQ19SQyBjb25zdGFudHNfdGFibGVbXSA9IHsKKyAgZmxkMSwgZmxkbDJ0LCBmbGRsMmUsIGZsZHBpLCBmbGRsZzIsIGZsZGxuMiwgZmxkeiwgKEZVTkNfUkMpRlBVX2lsbGVnYWwKK307CisKK3ZvaWQgZmNvbnN0KHZvaWQpCit7CisgIChjb25zdGFudHNfdGFibGVbRlBVX3JtXSkoY29udHJvbF93b3JkICYgQ1dfUkMpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hdGgtZW11L3JlZ19jb25zdGFudC5oIGIvYXJjaC9pMzg2L21hdGgtZW11L3JlZ19jb25zdGFudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZmZhZWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWF0aC1lbXUvcmVnX2NvbnN0YW50LmgKQEAgLTAsMCArMSwyNSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgcmVnX2NvbnN0YW50LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29weXJpZ2h0IChDKSAxOTkyICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgQXVzdHJhbGlhLiAgRS1tYWlsICAgYmlsbG1AdmF4Yy5jYy5tb25hc2guZWR1LmF1ICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIF9SRUdfQ09OU1RBTlRfSF8KKyNkZWZpbmUgX1JFR19DT05TVEFOVF9IXworCisjaW5jbHVkZSAiZnB1X2VtdS5oIgorCitleHRlcm4gRlBVX1JFRyBjb25zdCBDT05TVF8xOworZXh0ZXJuIEZQVV9SRUcgY29uc3QgQ09OU1RfUEk7CitleHRlcm4gRlBVX1JFRyBjb25zdCBDT05TVF9QSTI7CitleHRlcm4gRlBVX1JFRyBjb25zdCBDT05TVF9QSTJleHRyYTsKK2V4dGVybiBGUFVfUkVHIGNvbnN0IENPTlNUX1BJNDsKK2V4dGVybiBGUFVfUkVHIGNvbnN0IENPTlNUX1o7CitleHRlcm4gRlBVX1JFRyBjb25zdCBDT05TVF9QSU5GOworZXh0ZXJuIEZQVV9SRUcgY29uc3QgQ09OU1RfSU5GOworZXh0ZXJuIEZQVV9SRUcgY29uc3QgQ09OU1RfTUlORjsKK2V4dGVybiBGUFVfUkVHIGNvbnN0IENPTlNUX1FOYU47CisKKyNlbmRpZiAvKiBfUkVHX0NPTlNUQU5UX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWF0aC1lbXUvcmVnX2NvbnZlcnQuYyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9yZWdfY29udmVydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YTI1ODcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWF0aC1lbXUvcmVnX2NvbnZlcnQuYwpAQCAtMCwwICsxLDUzIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICByZWdfY29udmVydC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgQ29udmVydCByZWdpc3RlciByZXByZXNlbnRhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTMsMTk5NCwxOTk2LDE5OTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgQXVzdHJhbGlhIHwKKyB8ICAgICAgICAgICAgICAgICAgRS1tYWlsICAgYmlsbG1Ac3VidXJiaWEubmV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImV4Y2VwdGlvbi5oIgorI2luY2x1ZGUgImZwdV9lbXUuaCIKKworCitpbnQgRlBVX3RvX2V4cDE2KEZQVV9SRUcgY29uc3QgKmEsIEZQVV9SRUcgKngpCit7CisgIGludCBzaWduID0gZ2V0c2lnbihhKTsKKworICAqKGxvbmcgbG9uZyAqKSYoeC0+c2lnbCkgPSAqKGNvbnN0IGxvbmcgbG9uZyAqKSYoYS0+c2lnbCk7CisKKyAgLyogU2V0IHVwIHRoZSBleHBvbmVudCBhcyBhIDE2IGJpdCBxdWFudGl0eS4gKi8KKyAgc2V0ZXhwb25lbnQxNih4LCBleHBvbmVudChhKSk7CisKKyAgaWYgKCBleHBvbmVudDE2KHgpID09IEVYUF9VTkRFUiApCisgICAgeworICAgICAgLyogVGhlIG51bWJlciBpcyBhIGRlLW5vcm1hbCBvciBwc2V1ZG9kZW5vcm1hbC4gKi8KKyAgICAgIC8qIFdlIG9ubHkgZGVhbCB3aXRoIHRoZSBzaWduaWZpY2FuZCBhbmQgZXhwb25lbnQuICovCisKKyAgICAgIGlmICh4LT5zaWdoICYgMHg4MDAwMDAwMCkKKwl7CisJICAvKiBJcyBhIHBzZXVkb2Rlbm9ybWFsLiAqLworCSAgLyogVGhpcyBpcyBub24tODA0ODYgYmVoYXZpb3VyIGJlY2F1c2UgdGhlIG51bWJlcgorCSAgICAgbG9zZXMgaXRzICdkZW5vcm1hbCcgaWRlbnRpdHkuICovCisJICBhZGRleHBvbmVudCh4LCAxKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogSXMgYSBkZW5vcm1hbC4gKi8KKwkgIGFkZGV4cG9uZW50KHgsIDEpOworCSAgRlBVX25vcm1hbGl6ZV9udW8oeCk7CisJfQorICAgIH0KKworICBpZiAoICEoeC0+c2lnaCAmIDB4ODAwMDAwMDApICkKKyAgICB7CisgICAgICBFWENFUFRJT04oRVhfSU5URVJOQUwgfCAweDE4MCk7CisgICAgfQorCisgIHJldHVybiBzaWduOworfQorCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWF0aC1lbXUvcmVnX2RpdmlkZS5jIGIvYXJjaC9pMzg2L21hdGgtZW11L3JlZ19kaXZpZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2VlN2ZmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L3JlZ19kaXZpZGUuYwpAQCAtMCwwICsxLDIwNyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgcmVnX2RpdmlkZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgRGl2aWRlIG9uZSBGUFVfUkVHIGJ5IGFub3RoZXIgYW5kIHB1dCB0aGUgcmVzdWx0IGluIGEgZGVzdGluYXRpb24gRlBVX1JFRy58CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENvcHlyaWdodCAoQykgMTk5NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICBXLiBNZXR6ZW50aGVuLCAyMiBQYXJrZXIgU3QsIE9ybW9uZCwgVmljIDMxNjMsIEF1c3RyYWxpYSB8CisgfCAgICAgICAgICAgICAgICAgIEUtbWFpbCAgIGJpbGxtQGphY29iaS5tYXRocy5tb25hc2guZWR1LmF1ICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgUmV0dXJuIHZhbHVlIGlzIHRoZSB0YWcgb2YgdGhlIGFuc3dlciwgb3ItZWQgd2l0aCBGUFVfRXhjZXB0aW9uIGlmICAgICB8CisgfCAgICBvbmUgd2FzIHJhaXNlZCwgb3IgLTEgb24gaW50ZXJuYWwgZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8IFRoZSBkZXN0aW5hdGlvbiBtYXkgYmUgYW55IEZQVV9SRUcsIGluY2x1ZGluZyBvbmUgb2YgdGhlIHNvdXJjZSBGUFVfUkVHcy4gfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiZXhjZXB0aW9uLmgiCisjaW5jbHVkZSAicmVnX2NvbnN0YW50LmgiCisjaW5jbHVkZSAiZnB1X2VtdS5oIgorI2luY2x1ZGUgImZwdV9zeXN0ZW0uaCIKKworLyoKKyAgRGl2aWRlIG9uZSByZWdpc3RlciBieSBhbm90aGVyIGFuZCBwdXQgdGhlIHJlc3VsdCBpbnRvIGEgdGhpcmQgcmVnaXN0ZXIuCisgICovCitpbnQgRlBVX2RpdihpbnQgZmxhZ3MsIGludCBybSwgaW50IGNvbnRyb2xfdykKK3sKKyAgRlBVX1JFRyB4LCB5OworICBGUFVfUkVHIGNvbnN0ICphLCAqYiwgKnN0MF9wdHIsICpzdF9wdHI7CisgIEZQVV9SRUcgKmRlc3Q7CisgIHVfY2hhciB0YWdhLCB0YWdiLCBzaWduYSwgc2lnbmIsIHNpZ24sIHNhdmVkX3NpZ247CisgIGludCB0YWcsIGRlc3RzdG5yOworCisgIGlmICggZmxhZ3MgJiBERVNUX1JNICkKKyAgICBkZXN0c3RuciA9IHJtOworICBlbHNlCisgICAgZGVzdHN0bnIgPSAwOworCisgIGlmICggZmxhZ3MgJiBSRVYgKQorICAgIHsKKyAgICAgIGIgPSAmc3QoMCk7CisgICAgICBzdDBfcHRyID0gYjsKKyAgICAgIHRhZ2IgPSBGUFVfZ2V0dGFnMCgpOworICAgICAgaWYgKCBmbGFncyAmIExPQURFRCApCisJeworCSAgYSA9IChGUFVfUkVHICopcm07CisJICB0YWdhID0gZmxhZ3MgJiAweDBmOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBhID0gJnN0KHJtKTsKKwkgIHN0X3B0ciA9IGE7CisJICB0YWdhID0gRlBVX2dldHRhZ2kocm0pOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBhID0gJnN0KDApOworICAgICAgc3QwX3B0ciA9IGE7CisgICAgICB0YWdhID0gRlBVX2dldHRhZzAoKTsKKyAgICAgIGlmICggZmxhZ3MgJiBMT0FERUQgKQorCXsKKwkgIGIgPSAoRlBVX1JFRyAqKXJtOworCSAgdGFnYiA9IGZsYWdzICYgMHgwZjsKKwl9CisgICAgICBlbHNlCisJeworCSAgYiA9ICZzdChybSk7CisJICBzdF9wdHIgPSBiOworCSAgdGFnYiA9IEZQVV9nZXR0YWdpKHJtKTsKKwl9CisgICAgfQorCisgIHNpZ25hID0gZ2V0c2lnbihhKTsKKyAgc2lnbmIgPSBnZXRzaWduKGIpOworCisgIHNpZ24gPSBzaWduYSBeIHNpZ25iOworCisgIGRlc3QgPSAmc3QoZGVzdHN0bnIpOworICBzYXZlZF9zaWduID0gZ2V0c2lnbihkZXN0KTsKKworICBpZiAoICEodGFnYSB8IHRhZ2IpICkKKyAgICB7CisgICAgICAvKiBCb3RoIHJlZ3MgVmFsaWQsIHRoaXMgc2hvdWxkIGJlIHRoZSBtb3N0IGNvbW1vbiBjYXNlLiAqLworICAgICAgcmVnX2NvcHkoYSwgJngpOworICAgICAgcmVnX2NvcHkoYiwgJnkpOworICAgICAgc2V0cG9zaXRpdmUoJngpOworICAgICAgc2V0cG9zaXRpdmUoJnkpOworICAgICAgdGFnID0gRlBVX3VfZGl2KCZ4LCAmeSwgZGVzdCwgY29udHJvbF93LCBzaWduKTsKKworICAgICAgaWYgKCB0YWcgPCAwICkKKwlyZXR1cm4gdGFnOworCisgICAgICBGUFVfc2V0dGFnaShkZXN0c3RuciwgdGFnKTsKKyAgICAgIHJldHVybiB0YWc7CisgICAgfQorCisgIGlmICggdGFnYSA9PSBUQUdfU3BlY2lhbCApCisgICAgdGFnYSA9IEZQVV9TcGVjaWFsKGEpOworICBpZiAoIHRhZ2IgPT0gVEFHX1NwZWNpYWwgKQorICAgIHRhZ2IgPSBGUFVfU3BlY2lhbChiKTsKKworICBpZiAoICgodGFnYSA9PSBUQUdfVmFsaWQpICYmICh0YWdiID09IFRXX0Rlbm9ybWFsKSkKKwkgICAgfHwgKCh0YWdhID09IFRXX0Rlbm9ybWFsKSAmJiAodGFnYiA9PSBUQUdfVmFsaWQpKQorCSAgICB8fCAoKHRhZ2EgPT0gVFdfRGVub3JtYWwpICYmICh0YWdiID09IFRXX0Rlbm9ybWFsKSkgKQorICAgIHsKKyAgICAgIGlmICggZGVub3JtYWxfb3BlcmFuZCgpIDwgMCApCisJcmV0dXJuIEZQVV9FeGNlcHRpb247CisKKyAgICAgIEZQVV90b19leHAxNihhLCAmeCk7CisgICAgICBGUFVfdG9fZXhwMTYoYiwgJnkpOworICAgICAgdGFnID0gRlBVX3VfZGl2KCZ4LCAmeSwgZGVzdCwgY29udHJvbF93LCBzaWduKTsKKyAgICAgIGlmICggdGFnIDwgMCApCisJcmV0dXJuIHRhZzsKKworICAgICAgRlBVX3NldHRhZ2koZGVzdHN0bnIsIHRhZyk7CisgICAgICByZXR1cm4gdGFnOworICAgIH0KKyAgZWxzZSBpZiAoICh0YWdhIDw9IFRXX0Rlbm9ybWFsKSAmJiAodGFnYiA8PSBUV19EZW5vcm1hbCkgKQorICAgIHsKKyAgICAgIGlmICggdGFnYiAhPSBUQUdfWmVybyApCisJeworCSAgLyogV2FudCB0byBmaW5kIFplcm8vVmFsaWQgKi8KKwkgIGlmICggdGFnYiA9PSBUV19EZW5vcm1hbCApCisJICAgIHsKKwkgICAgICBpZiAoIGRlbm9ybWFsX29wZXJhbmQoKSA8IDAgKQorCQlyZXR1cm4gRlBVX0V4Y2VwdGlvbjsKKwkgICAgfQorCisJICAvKiBUaGUgcmVzdWx0IGlzIHplcm8uICovCisJICBGUFVfY29weV90b19yZWdpKCZDT05TVF9aLCBUQUdfWmVybywgZGVzdHN0bnIpOworCSAgc2V0c2lnbihkZXN0LCBzaWduKTsKKwkgIHJldHVybiBUQUdfWmVybzsKKwl9CisgICAgICAvKiBXZSBoYXZlIGFuIGV4Y2VwdGlvbiBjb25kaXRpb24sIGVpdGhlciAwLzAgb3IgVmFsaWQvWmVyby4gKi8KKyAgICAgIGlmICggdGFnYSA9PSBUQUdfWmVybyApCisJeworCSAgLyogMC8wICovCisJICByZXR1cm4gYXJpdGhfaW52YWxpZChkZXN0c3Rucik7CisJfQorICAgICAgLyogVmFsaWQvWmVybyAqLworICAgICAgcmV0dXJuIEZQVV9kaXZpZGVfYnlfemVybyhkZXN0c3Ruciwgc2lnbik7CisgICAgfQorICAvKiBNdXN0IGhhdmUgaW5maW5pdGllcywgTmFOcywgZXRjICovCisgIGVsc2UgaWYgKCAodGFnYSA9PSBUV19OYU4pIHx8ICh0YWdiID09IFRXX05hTikgKQorICAgIHsKKyAgICAgIGlmICggZmxhZ3MgJiBMT0FERUQgKQorCXJldHVybiByZWFsXzJvcF9OYU4oKEZQVV9SRUcgKilybSwgZmxhZ3MgJiAweDBmLCAwLCBzdDBfcHRyKTsKKworICAgICAgaWYgKCBmbGFncyAmIERFU1RfUk0gKQorCXsKKwkgIGludCB0YWc7CisJICB0YWcgPSBGUFVfZ2V0dGFnMCgpOworCSAgaWYgKCB0YWcgPT0gVEFHX1NwZWNpYWwgKQorCSAgICB0YWcgPSBGUFVfU3BlY2lhbChzdDBfcHRyKTsKKwkgIHJldHVybiByZWFsXzJvcF9OYU4oc3QwX3B0ciwgdGFnLCBybSwgKGZsYWdzICYgUkVWKSA/IHN0MF9wdHIgOiAmc3Qocm0pKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaW50IHRhZzsKKwkgIHRhZyA9IEZQVV9nZXR0YWdpKHJtKTsKKwkgIGlmICggdGFnID09IFRBR19TcGVjaWFsICkKKwkgICAgdGFnID0gRlBVX1NwZWNpYWwoJnN0KHJtKSk7CisJICByZXR1cm4gcmVhbF8yb3BfTmFOKCZzdChybSksIHRhZywgMCwgKGZsYWdzICYgUkVWKSA/IHN0MF9wdHIgOiAmc3Qocm0pKTsKKwl9CisgICAgfQorICBlbHNlIGlmICh0YWdhID09IFRXX0luZmluaXR5KQorICAgIHsKKyAgICAgIGlmICh0YWdiID09IFRXX0luZmluaXR5KQorCXsKKwkgIC8qIGluZmluaXR5L2luZmluaXR5ICovCisJICByZXR1cm4gYXJpdGhfaW52YWxpZChkZXN0c3Rucik7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIHRhZ2IgbXVzdCBiZSBWYWxpZCBvciBaZXJvICovCisJICBpZiAoICh0YWdiID09IFRXX0Rlbm9ybWFsKSAmJiAoZGVub3JtYWxfb3BlcmFuZCgpIDwgMCkgKQorCSAgICByZXR1cm4gRlBVX0V4Y2VwdGlvbjsKKwkgIAorCSAgLyogSW5maW5pdHkgZGl2aWRlZCBieSBaZXJvIG9yIFZhbGlkIGRvZXMKKwkgICAgIG5vdCByYWlzZSBhbmQgZXhjZXB0aW9uLCBidXQgcmV0dXJucyBJbmZpbml0eSAqLworCSAgRlBVX2NvcHlfdG9fcmVnaShhLCBUQUdfU3BlY2lhbCwgZGVzdHN0bnIpOworCSAgc2V0c2lnbihkZXN0LCBzaWduKTsKKwkgIHJldHVybiB0YWdhOworCX0KKyAgICB9CisgIGVsc2UgaWYgKHRhZ2IgPT0gVFdfSW5maW5pdHkpCisgICAgeworICAgICAgaWYgKCAodGFnYSA9PSBUV19EZW5vcm1hbCkgJiYgKGRlbm9ybWFsX29wZXJhbmQoKSA8IDApICkKKwlyZXR1cm4gRlBVX0V4Y2VwdGlvbjsKKworICAgICAgLyogVGhlIHJlc3VsdCBpcyB6ZXJvLiAqLworICAgICAgRlBVX2NvcHlfdG9fcmVnaSgmQ09OU1RfWiwgVEFHX1plcm8sIGRlc3RzdG5yKTsKKyAgICAgIHNldHNpZ24oZGVzdCwgc2lnbik7CisgICAgICByZXR1cm4gVEFHX1plcm87CisgICAgfQorI2lmZGVmIFBBUkFOT0lECisgIGVsc2UKKyAgICB7CisgICAgICBFWENFUFRJT04oRVhfSU5URVJOQUx8MHgxMDIpOworICAgICAgcmV0dXJuIEZQVV9FeGNlcHRpb247CisgICAgfQorI2VuZGlmIC8qIFBBUkFOT0lEICovIAorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWF0aC1lbXUvcmVnX2xkX3N0ci5jIGIvYXJjaC9pMzg2L21hdGgtZW11L3JlZ19sZF9zdHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDZlZDQxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L3JlZ19sZF9zdHIuYwpAQCAtMCwwICsxLDEzNzAgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgIHJlZ19sZF9zdHIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IEFsbCBvZiB0aGUgZnVuY3Rpb25zIHdoaWNoIHRyYW5zZmVyIGRhdGEgYmV0d2VlbiB1c2VyIG1lbW9yeSBhbmQgRlBVX1JFR3MufAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDb3B5cmlnaHQgKEMpIDE5OTIsMTk5MywxOTk0LDE5OTYsMTk5NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgVy4gTWV0emVudGhlbiwgMjIgUGFya2VyIFN0LCBPcm1vbmQsIFZpYyAzMTYzLCBBdXN0cmFsaWEgfAorIHwgICAgICAgICAgICAgICAgICBFLW1haWwgICBiaWxsbUBzdWJ1cmJpYS5uZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8IE5vdGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgVGhlIGZpbGUgY29udGFpbnMgY29kZSB3aGljaCBhY2Nlc3NlcyB1c2VyIG1lbW9yeS4gICAgICAgICAgICAgICAgICAgICB8CisgfCAgICBFbXVsYXRvciBzdGF0aWMgZGF0YSBtYXkgY2hhbmdlIHdoZW4gdXNlciBtZW1vcnkgaXMgYWNjZXNzZWQsIGR1ZSB0byAgIHwKKyB8ICAgIG90aGVyIHByb2Nlc3NlcyB1c2luZyB0aGUgZW11bGF0b3Igd2hpbGUgc3dhcHBpbmcgaXMgaW4gcHJvZ3Jlc3MuICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiZnB1X2VtdS5oIgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgImZwdV9zeXN0ZW0uaCIKKyNpbmNsdWRlICJleGNlcHRpb24uaCIKKyNpbmNsdWRlICJyZWdfY29uc3RhbnQuaCIKKyNpbmNsdWRlICJjb250cm9sX3cuaCIKKyNpbmNsdWRlICJzdGF0dXNfdy5oIgorCisKKyNkZWZpbmUgRE9VQkxFX0VtYXggMTAyMyAgICAgICAgIC8qIGxhcmdlc3QgdmFsaWQgZXhwb25lbnQgKi8KKyNkZWZpbmUgRE9VQkxFX0ViaWFzIDEwMjMKKyNkZWZpbmUgRE9VQkxFX0VtaW4gKC0xMDIyKSAgICAgIC8qIHNtYWxsZXN0IHZhbGlkIGV4cG9uZW50ICovCisKKyNkZWZpbmUgU0lOR0xFX0VtYXggMTI3ICAgICAgICAgIC8qIGxhcmdlc3QgdmFsaWQgZXhwb25lbnQgKi8KKyNkZWZpbmUgU0lOR0xFX0ViaWFzIDEyNworI2RlZmluZSBTSU5HTEVfRW1pbiAoLTEyNikgICAgICAgLyogc21hbGxlc3QgdmFsaWQgZXhwb25lbnQgKi8KKworCitzdGF0aWMgdV9jaGFyIG5vcm1hbGl6ZV9ub19leGNlcChGUFVfUkVHICpyLCBpbnQgZXhwLCBpbnQgc2lnbikKK3sKKyAgdV9jaGFyIHRhZzsKKworICBzZXRleHBvbmVudDE2KHIsIGV4cCk7CisKKyAgdGFnID0gRlBVX25vcm1hbGl6ZV9udW8ocik7CisgIHN0ZGV4cChyKTsKKyAgaWYgKCBzaWduICkKKyAgICBzZXRuZWdhdGl2ZShyKTsKKworICByZXR1cm4gdGFnOworfQorCisKK2ludCBGUFVfdGFnb2YoRlBVX1JFRyAqcHRyKQoreworICBpbnQgZXhwOworCisgIGV4cCA9IGV4cG9uZW50MTYocHRyKSAmIDB4N2ZmZjsKKyAgaWYgKCBleHAgPT0gMCApCisgICAgeworICAgICAgaWYgKCAhKHB0ci0+c2lnaCB8IHB0ci0+c2lnbCkgKQorCXsKKwkgIHJldHVybiBUQUdfWmVybzsKKwl9CisgICAgICAvKiBUaGUgbnVtYmVyIGlzIGEgZGUtbm9ybWFsIG9yIHBzZXVkb2Rlbm9ybWFsLiAqLworICAgICAgcmV0dXJuIFRBR19TcGVjaWFsOworICAgIH0KKworICBpZiAoIGV4cCA9PSAweDdmZmYgKQorICAgIHsKKyAgICAgIC8qIElzIGFuIEluZmluaXR5LCBhIE5hTiwgb3IgYW4gdW5zdXBwb3J0ZWQgZGF0YSB0eXBlLiAqLworICAgICAgcmV0dXJuIFRBR19TcGVjaWFsOworICAgIH0KKworICBpZiAoICEocHRyLT5zaWdoICYgMHg4MDAwMDAwMCkgKQorICAgIHsKKyAgICAgIC8qIFVuc3VwcG9ydGVkIGRhdGEgdHlwZS4gKi8KKyAgICAgIC8qIFZhbGlkIG51bWJlcnMgaGF2ZSB0aGUgbXMgYml0IHNldCB0byAxLiAqLworICAgICAgLyogVW5ub3JtYWwuICovCisgICAgICByZXR1cm4gVEFHX1NwZWNpYWw7CisgICAgfQorCisgIHJldHVybiBUQUdfVmFsaWQ7Cit9CisKKworLyogR2V0IGEgbG9uZyBkb3VibGUgZnJvbSB1c2VyIG1lbW9yeSAqLworaW50IEZQVV9sb2FkX2V4dGVuZGVkKGxvbmcgZG91YmxlIF9fdXNlciAqcywgaW50IHN0bnIpCit7CisgIEZQVV9SRUcgKnN0aV9wdHIgPSAmc3Qoc3Rucik7CisKKyAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisgIEZQVV9hY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHMsIDEwKTsKKyAgX19jb3B5X2Zyb21fdXNlcihzdGlfcHRyLCBzLCAxMCk7CisgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CisKKyAgcmV0dXJuIEZQVV90YWdvZihzdGlfcHRyKTsKK30KKworCisvKiBHZXQgYSBkb3VibGUgZnJvbSB1c2VyIG1lbW9yeSAqLworaW50IEZQVV9sb2FkX2RvdWJsZShkb3VibGUgX191c2VyICpkZmxvYXQsIEZQVV9SRUcgKmxvYWRlZF9kYXRhKQoreworICBpbnQgZXhwLCB0YWcsIG5lZ2F0aXZlOworICB1bnNpZ25lZCBtNjQsIGw2NDsKKworICBSRV9FTlRSQU5UX0NIRUNLX09GRjsKKyAgRlBVX2FjY2Vzc19vayhWRVJJRllfUkVBRCwgZGZsb2F0LCA4KTsKKyAgRlBVX2dldF91c2VyKG02NCwgMSArICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBkZmxvYXQpOworICBGUFVfZ2V0X3VzZXIobDY0LCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgZGZsb2F0KTsKKyAgUkVfRU5UUkFOVF9DSEVDS19PTjsKKworICBuZWdhdGl2ZSA9IChtNjQgJiAweDgwMDAwMDAwKSA/IFNJR05fTmVnYXRpdmUgOiBTSUdOX1Bvc2l0aXZlOworICBleHAgPSAoKG02NCAmIDB4N2ZmMDAwMDApID4+IDIwKSAtIERPVUJMRV9FYmlhcyArIEVYVEVOREVEX0ViaWFzOworICBtNjQgJj0gMHhmZmZmZjsKKyAgaWYgKCBleHAgPiBET1VCTEVfRW1heCArIEVYVEVOREVEX0ViaWFzICkKKyAgICB7CisgICAgICAvKiBJbmZpbml0eSBvciBOYU4gKi8KKyAgICAgIGlmICgobTY0ID09IDApICYmIChsNjQgPT0gMCkpCisJeworCSAgLyogKy0gaW5maW5pdHkgKi8KKwkgIGxvYWRlZF9kYXRhLT5zaWdoID0gMHg4MDAwMDAwMDsKKwkgIGxvYWRlZF9kYXRhLT5zaWdsID0gMHgwMDAwMDAwMDsKKwkgIGV4cCA9IEVYUF9JbmZpbml0eSArIEVYVEVOREVEX0ViaWFzOworCSAgdGFnID0gVEFHX1NwZWNpYWw7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIE11c3QgYmUgYSBzaWduYWxpbmcgb3IgcXVpZXQgTmFOICovCisJICBleHAgPSBFWFBfTmFOICsgRVhURU5ERURfRWJpYXM7CisJICBsb2FkZWRfZGF0YS0+c2lnaCA9IChtNjQgPDwgMTEpIHwgMHg4MDAwMDAwMDsKKwkgIGxvYWRlZF9kYXRhLT5zaWdoIHw9IGw2NCA+PiAyMTsKKwkgIGxvYWRlZF9kYXRhLT5zaWdsID0gbDY0IDw8IDExOworCSAgdGFnID0gVEFHX1NwZWNpYWw7ICAgIC8qIFRoZSBjYWxsaW5nIGZ1bmN0aW9uIG11c3QgbG9vayBmb3IgTmFOcyAqLworCX0KKyAgICB9CisgIGVsc2UgaWYgKCBleHAgPCBET1VCTEVfRW1pbiArIEVYVEVOREVEX0ViaWFzICkKKyAgICB7CisgICAgICAvKiBaZXJvIG9yIGRlLW5vcm1hbCAqLworICAgICAgaWYgKChtNjQgPT0gMCkgJiYgKGw2NCA9PSAwKSkKKwl7CisJICAvKiBaZXJvICovCisJICByZWdfY29weSgmQ09OU1RfWiwgbG9hZGVkX2RhdGEpOworCSAgZXhwID0gMDsKKwkgIHRhZyA9IFRBR19aZXJvOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBEZS1ub3JtYWwgKi8KKwkgIGxvYWRlZF9kYXRhLT5zaWdoID0gbTY0IDw8IDExOworCSAgbG9hZGVkX2RhdGEtPnNpZ2ggfD0gbDY0ID4+IDIxOworCSAgbG9hZGVkX2RhdGEtPnNpZ2wgPSBsNjQgPDwgMTE7CisKKwkgIHJldHVybiBub3JtYWxpemVfbm9fZXhjZXAobG9hZGVkX2RhdGEsIERPVUJMRV9FbWluLCBuZWdhdGl2ZSkKKwkgICAgfCAoZGVub3JtYWxfb3BlcmFuZCgpIDwgMCA/IEZQVV9FeGNlcHRpb24gOiAwKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbG9hZGVkX2RhdGEtPnNpZ2ggPSAobTY0IDw8IDExKSB8IDB4ODAwMDAwMDA7CisgICAgICBsb2FkZWRfZGF0YS0+c2lnaCB8PSBsNjQgPj4gMjE7CisgICAgICBsb2FkZWRfZGF0YS0+c2lnbCA9IGw2NCA8PCAxMTsKKworICAgICAgdGFnID0gVEFHX1ZhbGlkOworICAgIH0KKworICBzZXRleHBvbmVudDE2KGxvYWRlZF9kYXRhLCBleHAgfCBuZWdhdGl2ZSk7CisKKyAgcmV0dXJuIHRhZzsKK30KKworCisvKiBHZXQgYSBmbG9hdCBmcm9tIHVzZXIgbWVtb3J5ICovCitpbnQgRlBVX2xvYWRfc2luZ2xlKGZsb2F0IF9fdXNlciAqc2luZ2xlLCBGUFVfUkVHICpsb2FkZWRfZGF0YSkKK3sKKyAgdW5zaWduZWQgbTMyOworICBpbnQgZXhwLCB0YWcsIG5lZ2F0aXZlOworCisgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworICBGUFVfYWNjZXNzX29rKFZFUklGWV9SRUFELCBzaW5nbGUsIDQpOworICBGUFVfZ2V0X3VzZXIobTMyLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgc2luZ2xlKTsKKyAgUkVfRU5UUkFOVF9DSEVDS19PTjsKKworICBuZWdhdGl2ZSA9IChtMzIgJiAweDgwMDAwMDAwKSA/IFNJR05fTmVnYXRpdmUgOiBTSUdOX1Bvc2l0aXZlOworCisgIGlmICghKG0zMiAmIDB4N2ZmZmZmZmYpKQorICAgIHsKKyAgICAgIC8qIFplcm8gKi8KKyAgICAgIHJlZ19jb3B5KCZDT05TVF9aLCBsb2FkZWRfZGF0YSk7CisgICAgICBhZGRleHBvbmVudChsb2FkZWRfZGF0YSwgbmVnYXRpdmUpOworICAgICAgcmV0dXJuIFRBR19aZXJvOworICAgIH0KKyAgZXhwID0gKChtMzIgJiAweDdmODAwMDAwKSA+PiAyMykgLSBTSU5HTEVfRWJpYXMgKyBFWFRFTkRFRF9FYmlhczsKKyAgbTMyID0gKG0zMiAmIDB4N2ZmZmZmKSA8PCA4OworICBpZiAoIGV4cCA8IFNJTkdMRV9FbWluICsgRVhURU5ERURfRWJpYXMgKQorICAgIHsKKyAgICAgIC8qIERlLW5vcm1hbHMgKi8KKyAgICAgIGxvYWRlZF9kYXRhLT5zaWdoID0gbTMyOworICAgICAgbG9hZGVkX2RhdGEtPnNpZ2wgPSAwOworCisgICAgICByZXR1cm4gbm9ybWFsaXplX25vX2V4Y2VwKGxvYWRlZF9kYXRhLCBTSU5HTEVfRW1pbiwgbmVnYXRpdmUpCisJfCAoZGVub3JtYWxfb3BlcmFuZCgpIDwgMCA/IEZQVV9FeGNlcHRpb24gOiAwKTsKKyAgICB9CisgIGVsc2UgaWYgKCBleHAgPiBTSU5HTEVfRW1heCArIEVYVEVOREVEX0ViaWFzICkKKyAgICB7CisgICAgLyogSW5maW5pdHkgb3IgTmFOICovCisgICAgICBpZiAoIG0zMiA9PSAwICkKKwl7CisJICAvKiArLSBpbmZpbml0eSAqLworCSAgbG9hZGVkX2RhdGEtPnNpZ2ggPSAweDgwMDAwMDAwOworCSAgbG9hZGVkX2RhdGEtPnNpZ2wgPSAweDAwMDAwMDAwOworCSAgZXhwID0gRVhQX0luZmluaXR5ICsgRVhURU5ERURfRWJpYXM7CisJICB0YWcgPSBUQUdfU3BlY2lhbDsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogTXVzdCBiZSBhIHNpZ25hbGluZyBvciBxdWlldCBOYU4gKi8KKwkgIGV4cCA9IEVYUF9OYU4gKyBFWFRFTkRFRF9FYmlhczsKKwkgIGxvYWRlZF9kYXRhLT5zaWdoID0gbTMyIHwgMHg4MDAwMDAwMDsKKwkgIGxvYWRlZF9kYXRhLT5zaWdsID0gMDsKKwkgIHRhZyA9IFRBR19TcGVjaWFsOyAgLyogVGhlIGNhbGxpbmcgZnVuY3Rpb24gbXVzdCBsb29rIGZvciBOYU5zICovCisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGxvYWRlZF9kYXRhLT5zaWdoID0gbTMyIHwgMHg4MDAwMDAwMDsKKyAgICAgIGxvYWRlZF9kYXRhLT5zaWdsID0gMDsKKyAgICAgIHRhZyA9IFRBR19WYWxpZDsKKyAgICB9CisKKyAgc2V0ZXhwb25lbnQxNihsb2FkZWRfZGF0YSwgZXhwIHwgbmVnYXRpdmUpOyAgLyogU2V0IHRoZSBzaWduLiAqLworCisgIHJldHVybiB0YWc7Cit9CisKKworLyogR2V0IGEgbG9uZyBsb25nIGZyb20gdXNlciBtZW1vcnkgKi8KK2ludCBGUFVfbG9hZF9pbnQ2NChsb25nIGxvbmcgX191c2VyICpfcykKK3sKKyAgbG9uZyBsb25nIHM7CisgIGludCBzaWduOworICBGUFVfUkVHICpzdDBfcHRyID0gJnN0KDApOworCisgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworICBGUFVfYWNjZXNzX29rKFZFUklGWV9SRUFELCBfcywgOCk7CisgIGNvcHlfZnJvbV91c2VyKCZzLF9zLDgpOworICBSRV9FTlRSQU5UX0NIRUNLX09OOworCisgIGlmIChzID09IDApCisgICAgeworICAgICAgcmVnX2NvcHkoJkNPTlNUX1osIHN0MF9wdHIpOworICAgICAgcmV0dXJuIFRBR19aZXJvOworICAgIH0KKworICBpZiAocyA+IDApCisgICAgc2lnbiA9IFNJR05fUG9zaXRpdmU7CisgIGVsc2UKKyAgeworICAgIHMgPSAtczsKKyAgICBzaWduID0gU0lHTl9OZWdhdGl2ZTsKKyAgfQorCisgIHNpZ25pZmljYW5kKHN0MF9wdHIpID0gczsKKworICByZXR1cm4gbm9ybWFsaXplX25vX2V4Y2VwKHN0MF9wdHIsIDYzLCBzaWduKTsKK30KKworCisvKiBHZXQgYSBsb25nIGZyb20gdXNlciBtZW1vcnkgKi8KK2ludCBGUFVfbG9hZF9pbnQzMihsb25nIF9fdXNlciAqX3MsIEZQVV9SRUcgKmxvYWRlZF9kYXRhKQoreworICBsb25nIHM7CisgIGludCBuZWdhdGl2ZTsKKworICBSRV9FTlRSQU5UX0NIRUNLX09GRjsKKyAgRlBVX2FjY2Vzc19vayhWRVJJRllfUkVBRCwgX3MsIDQpOworICBGUFVfZ2V0X3VzZXIocywgX3MpOworICBSRV9FTlRSQU5UX0NIRUNLX09OOworCisgIGlmIChzID09IDApCisgICAgeyByZWdfY29weSgmQ09OU1RfWiwgbG9hZGVkX2RhdGEpOyByZXR1cm4gVEFHX1plcm87IH0KKworICBpZiAocyA+IDApCisgICAgbmVnYXRpdmUgPSBTSUdOX1Bvc2l0aXZlOworICBlbHNlCisgICAgeworICAgICAgcyA9IC1zOworICAgICAgbmVnYXRpdmUgPSBTSUdOX05lZ2F0aXZlOworICAgIH0KKworICBsb2FkZWRfZGF0YS0+c2lnaCA9IHM7CisgIGxvYWRlZF9kYXRhLT5zaWdsID0gMDsKKworICByZXR1cm4gbm9ybWFsaXplX25vX2V4Y2VwKGxvYWRlZF9kYXRhLCAzMSwgbmVnYXRpdmUpOworfQorCisKKy8qIEdldCBhIHNob3J0IGZyb20gdXNlciBtZW1vcnkgKi8KK2ludCBGUFVfbG9hZF9pbnQxNihzaG9ydCBfX3VzZXIgKl9zLCBGUFVfUkVHICpsb2FkZWRfZGF0YSkKK3sKKyAgaW50IHMsIG5lZ2F0aXZlOworCisgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworICBGUFVfYWNjZXNzX29rKFZFUklGWV9SRUFELCBfcywgMik7CisgIC8qIENhc3QgYXMgc2hvcnQgdG8gZ2V0IHRoZSBzaWduIGV4dGVuZGVkLiAqLworICBGUFVfZ2V0X3VzZXIocywgX3MpOworICBSRV9FTlRSQU5UX0NIRUNLX09OOworCisgIGlmIChzID09IDApCisgICAgeyByZWdfY29weSgmQ09OU1RfWiwgbG9hZGVkX2RhdGEpOyByZXR1cm4gVEFHX1plcm87IH0KKworICBpZiAocyA+IDApCisgICAgbmVnYXRpdmUgPSBTSUdOX1Bvc2l0aXZlOworICBlbHNlCisgICAgeworICAgICAgcyA9IC1zOworICAgICAgbmVnYXRpdmUgPSBTSUdOX05lZ2F0aXZlOworICAgIH0KKworICBsb2FkZWRfZGF0YS0+c2lnaCA9IHMgPDwgMTY7CisgIGxvYWRlZF9kYXRhLT5zaWdsID0gMDsKKworICByZXR1cm4gbm9ybWFsaXplX25vX2V4Y2VwKGxvYWRlZF9kYXRhLCAxNSwgbmVnYXRpdmUpOworfQorCisKKy8qIEdldCBhIHBhY2tlZCBiY2QgYXJyYXkgZnJvbSB1c2VyIG1lbW9yeSAqLworaW50IEZQVV9sb2FkX2JjZCh1X2NoYXIgX191c2VyICpzKQoreworICBGUFVfUkVHICpzdDBfcHRyID0gJnN0KDApOworICBpbnQgcG9zOworICB1X2NoYXIgYmNkOworICBsb25nIGxvbmcgbD0wOworICBpbnQgc2lnbjsKKworICBSRV9FTlRSQU5UX0NIRUNLX09GRjsKKyAgRlBVX2FjY2Vzc19vayhWRVJJRllfUkVBRCwgcywgMTApOworICBSRV9FTlRSQU5UX0NIRUNLX09OOworICBmb3IgKCBwb3MgPSA4OyBwb3MgPj0gMDsgcG9zLS0pCisgICAgeworICAgICAgbCAqPSAxMDsKKyAgICAgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworICAgICAgRlBVX2dldF91c2VyKGJjZCwgcytwb3MpOworICAgICAgUkVfRU5UUkFOVF9DSEVDS19PTjsKKyAgICAgIGwgKz0gYmNkID4+IDQ7CisgICAgICBsICo9IDEwOworICAgICAgbCArPSBiY2QgJiAweDBmOworICAgIH0KKyAKKyAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisgIEZQVV9nZXRfdXNlcihzaWduLCBzKzkpOworICBzaWduID0gc2lnbiAmIDB4ODAgPyBTSUdOX05lZ2F0aXZlIDogU0lHTl9Qb3NpdGl2ZTsKKyAgUkVfRU5UUkFOVF9DSEVDS19PTjsKKworICBpZiAoIGwgPT0gMCApCisgICAgeworICAgICAgcmVnX2NvcHkoJkNPTlNUX1osIHN0MF9wdHIpOworICAgICAgYWRkZXhwb25lbnQoc3QwX3B0ciwgc2lnbik7ICAgLyogU2V0IHRoZSBzaWduLiAqLworICAgICAgcmV0dXJuIFRBR19aZXJvOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHNpZ25pZmljYW5kKHN0MF9wdHIpID0gbDsKKyAgICAgIHJldHVybiBub3JtYWxpemVfbm9fZXhjZXAoc3QwX3B0ciwgNjMsIHNpZ24pOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiBQdXQgYSBsb25nIGRvdWJsZSBpbnRvIHVzZXIgbWVtb3J5ICovCitpbnQgRlBVX3N0b3JlX2V4dGVuZGVkKEZQVV9SRUcgKnN0MF9wdHIsIHVfY2hhciBzdDBfdGFnLCBsb25nIGRvdWJsZSBfX3VzZXIgKmQpCit7CisgIC8qCisgICAgVGhlIG9ubHkgZXhjZXB0aW9uIHJhaXNlZCBieSBhbiBhdHRlbXB0IHRvIHN0b3JlIHRvIGFuCisgICAgZXh0ZW5kZWQgZm9ybWF0IGlzIHRoZSBJbnZhbGlkIFN0YWNrIGV4Y2VwdGlvbiwgaS5lLgorICAgIGF0dGVtcHRpbmcgdG8gc3RvcmUgZnJvbSBhbiBlbXB0eSByZWdpc3Rlci4KKyAgICovCisKKyAgaWYgKCBzdDBfdGFnICE9IFRBR19FbXB0eSApCisgICAgeworICAgICAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisgICAgICBGUFVfYWNjZXNzX29rKFZFUklGWV9XUklURSwgZCwgMTApOworCisgICAgICBGUFVfcHV0X3VzZXIoc3QwX3B0ci0+c2lnbCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGQpOworICAgICAgRlBVX3B1dF91c2VyKHN0MF9wdHItPnNpZ2gsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSAoKHVfY2hhciBfX3VzZXIgKilkICsgNCkpOworICAgICAgRlBVX3B1dF91c2VyKGV4cG9uZW50MTYoc3QwX3B0ciksICh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKikgKCh1X2NoYXIgX191c2VyICopZCArIDgpKTsKKyAgICAgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CisKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAvKiBFbXB0eSByZWdpc3RlciAoc3RhY2sgdW5kZXJmbG93KSAqLworICBFWENFUFRJT04oRVhfU3RhY2tVbmRlcik7CisgIGlmICggY29udHJvbF93b3JkICYgQ1dfSW52YWxpZCApCisgICAgeworICAgICAgLyogVGhlIG1hc2tlZCByZXNwb25zZSAqLworICAgICAgLyogUHV0IG91dCB0aGUgUU5hTiBpbmRlZmluaXRlICovCisgICAgICBSRV9FTlRSQU5UX0NIRUNLX09GRjsKKyAgICAgIEZQVV9hY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLGQsMTApOworICAgICAgRlBVX3B1dF91c2VyKDAsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBkKTsKKyAgICAgIEZQVV9wdXRfdXNlcigweGMwMDAwMDAwLCAxICsgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGQpOworICAgICAgRlBVX3B1dF91c2VyKDB4ZmZmZiwgNCArIChzaG9ydCBfX3VzZXIgKikgZCk7CisgICAgICBSRV9FTlRSQU5UX0NIRUNLX09OOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIDA7CisKK30KKworCisvKiBQdXQgYSBkb3VibGUgaW50byB1c2VyIG1lbW9yeSAqLworaW50IEZQVV9zdG9yZV9kb3VibGUoRlBVX1JFRyAqc3QwX3B0ciwgdV9jaGFyIHN0MF90YWcsIGRvdWJsZSBfX3VzZXIgKmRmbG9hdCkKK3sKKyAgdW5zaWduZWQgbG9uZyBsWzJdOworICB1bnNpZ25lZCBsb25nIGluY3JlbWVudCA9IDA7CS8qIGF2b2lkIGdjYyB3YXJuaW5ncyAqLworICBpbnQgcHJlY2lzaW9uX2xvc3M7CisgIGludCBleHA7CisgIEZQVV9SRUcgdG1wOworCisgIGlmICggc3QwX3RhZyA9PSBUQUdfVmFsaWQgKQorICAgIHsKKyAgICAgIHJlZ19jb3B5KHN0MF9wdHIsICZ0bXApOworICAgICAgZXhwID0gZXhwb25lbnQoJnRtcCk7CisKKyAgICAgIGlmICggZXhwIDwgRE9VQkxFX0VtaW4gKSAgICAgLyogSXQgbWF5IGJlIGEgZGVub3JtYWwgKi8KKwl7CisJICBhZGRleHBvbmVudCgmdG1wLCAtRE9VQkxFX0VtaW4gKyA1Mik7ICAvKiBsYXJnZXN0IGV4cCB0byBiZSA1MSAqLworCisJZGVub3JtYWxfYXJnOgorCisJICBpZiAoIChwcmVjaXNpb25fbG9zcyA9IEZQVV9yb3VuZF90b19pbnQoJnRtcCwgc3QwX3RhZykpICkKKwkgICAgeworI2lmZGVmIFBFQ1VMSUFSXzQ4NgorCSAgICAgIC8qIERpZCBpdCByb3VuZCB0byBhIG5vbi1kZW5vcm1hbCA/ICovCisJICAgICAgLyogVGhpcyBiZWhhdmlvdXIgbWlnaHQgYmUgcmVnYXJkZWQgYXMgcGVjdWxpYXIsIGl0IGFwcGVhcnMKKwkJIHRoYXQgdGhlIDgwNDg2IHJvdW5kcyB0byB0aGUgZGVzdCBwcmVjaXNpb24sIHRoZW4KKwkJIGNvbnZlcnRzIHRvIGRlY2lkZSB1bmRlcmZsb3cuICovCisJICAgICAgaWYgKCAhKCh0bXAuc2lnaCA9PSAweDAwMTAwMDAwKSAmJiAodG1wLnNpZ2wgPT0gMCkgJiYKKwkJICAoc3QwX3B0ci0+c2lnbCAmIDB4MDAwMDA3ZmYpKSApCisjZW5kaWYgLyogUEVDVUxJQVJfNDg2ICovCisJCXsKKwkJICBFWENFUFRJT04oRVhfVW5kZXJmbG93KTsKKwkJICAvKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlOiBzZWUgc2VjIDE2LjIuNS4xIG9mCisJCSAgICAgdGhlIDgwNDg2IGJvb2sgKi8KKwkJICBpZiAoICEoY29udHJvbF93b3JkICYgQ1dfVW5kZXJmbG93KSApCisJCSAgICByZXR1cm4gMDsKKwkJfQorCSAgICAgIEVYQ0VQVElPTihwcmVjaXNpb25fbG9zcyk7CisJICAgICAgaWYgKCAhKGNvbnRyb2xfd29yZCAmIENXX1ByZWNpc2lvbikgKQorCQlyZXR1cm4gMDsKKwkgICAgfQorCSAgbFswXSA9IHRtcC5zaWdsOworCSAgbFsxXSA9IHRtcC5zaWdoOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoIHRtcC5zaWdsICYgMHgwMDAwMDdmZiApCisJICAgIHsKKwkgICAgICBwcmVjaXNpb25fbG9zcyA9IDE7CisJICAgICAgc3dpdGNoIChjb250cm9sX3dvcmQgJiBDV19SQykKKwkJeworCQljYXNlIFJDX1JORDoKKwkJICAvKiBSb3VuZGluZyBjYW4gZ2V0IGEgbGl0dGxlIG1lc3N5Li4gKi8KKwkJICBpbmNyZW1lbnQgPSAoKHRtcC5zaWdsICYgMHg3ZmYpID4gMHg0MDApIHwgIC8qIG5lYXJlc3QgKi8KKwkJICAgICgodG1wLnNpZ2wgJiAweGMwMCkgPT0gMHhjMDApOyAgICAgICAgICAgIC8qIG9kZCAtPiBldmVuICovCisJCSAgYnJlYWs7CisJCWNhc2UgUkNfRE9XTjogICAvKiB0b3dhcmRzIC1pbmZpbml0eSAqLworCQkgIGluY3JlbWVudCA9IHNpZ25wb3NpdGl2ZSgmdG1wKSA/IDAgOiB0bXAuc2lnbCAmIDB4N2ZmOworCQkgIGJyZWFrOworCQljYXNlIFJDX1VQOiAgICAgLyogdG93YXJkcyAraW5maW5pdHkgKi8KKwkJICBpbmNyZW1lbnQgPSBzaWducG9zaXRpdmUoJnRtcCkgPyB0bXAuc2lnbCAmIDB4N2ZmIDogMDsKKwkJICBicmVhazsKKwkJY2FzZSBSQ19DSE9QOgorCQkgIGluY3JlbWVudCA9IDA7CisJCSAgYnJlYWs7CisJCX0KKwkgIAorCSAgICAgIC8qIFRydW5jYXRlIHRoZSBtYW50aXNzYSAqLworCSAgICAgIHRtcC5zaWdsICY9IDB4ZmZmZmY4MDA7CisJICAKKwkgICAgICBpZiAoIGluY3JlbWVudCApCisJCXsKKwkJICBpZiAoIHRtcC5zaWdsID49IDB4ZmZmZmY4MDAgKQorCQkgICAgeworCQkgICAgICAvKiB0aGUgc2lnbCBwYXJ0IG92ZXJmbG93cyAqLworCQkgICAgICBpZiAoIHRtcC5zaWdoID09IDB4ZmZmZmZmZmYgKQorCQkJeworCQkJICAvKiBUaGUgc2lnaCBwYXJ0IG92ZXJmbG93cyAqLworCQkJICB0bXAuc2lnaCA9IDB4ODAwMDAwMDA7CisJCQkgIGV4cCsrOworCQkJICBpZiAoZXhwID49IEVYUF9PVkVSKQorCQkJICAgIGdvdG8gb3ZlcmZsb3c7CisJCQl9CisJCSAgICAgIGVsc2UKKwkJCXsKKwkJCSAgdG1wLnNpZ2ggKys7CisJCQl9CisJCSAgICAgIHRtcC5zaWdsID0gMHgwMDAwMDAwMDsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIC8qIFdlIG9ubHkgbmVlZCB0byBpbmNyZW1lbnQgc2lnbCAqLworCQkgICAgICB0bXAuc2lnbCArPSAweDAwMDAwODAwOworCQkgICAgfQorCQl9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgcHJlY2lzaW9uX2xvc3MgPSAwOworCSAgCisJICBsWzBdID0gKHRtcC5zaWdsID4+IDExKSB8ICh0bXAuc2lnaCA8PCAyMSk7CisJICBsWzFdID0gKCh0bXAuc2lnaCA+PiAxMSkgJiAweGZmZmZmKTsKKworCSAgaWYgKCBleHAgPiBET1VCTEVfRW1heCApCisJICAgIHsKKwkgICAgb3ZlcmZsb3c6CisJICAgICAgRVhDRVBUSU9OKEVYX092ZXJmbG93KTsKKwkgICAgICBpZiAoICEoY29udHJvbF93b3JkICYgQ1dfT3ZlcmZsb3cpICkKKwkJcmV0dXJuIDA7CisJICAgICAgc2V0X3ByZWNpc2lvbl9mbGFnX3VwKCk7CisJICAgICAgaWYgKCAhKGNvbnRyb2xfd29yZCAmIENXX1ByZWNpc2lvbikgKQorCQlyZXR1cm4gMDsKKworCSAgICAgIC8qIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2U6IHNlZSBzZWMgMTYuMi41LjEgb2YgdGhlIDgwNDg2IGJvb2sgKi8KKwkgICAgICAvKiBPdmVyZmxvdyB0byBpbmZpbml0eSAqLworCSAgICAgIGxbMF0gPSAweDAwMDAwMDAwOwkvKiBTZXQgdG8gKi8KKwkgICAgICBsWzFdID0gMHg3ZmYwMDAwMDsJLyogKyBJTkYgKi8KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKCBwcmVjaXNpb25fbG9zcyApCisJCXsKKwkJICBpZiAoIGluY3JlbWVudCApCisJCSAgICBzZXRfcHJlY2lzaW9uX2ZsYWdfdXAoKTsKKwkJICBlbHNlCisJCSAgICBzZXRfcHJlY2lzaW9uX2ZsYWdfZG93bigpOworCQl9CisJICAgICAgLyogQWRkIHRoZSBleHBvbmVudCAqLworCSAgICAgIGxbMV0gfD0gKCgoZXhwK0RPVUJMRV9FYmlhcykgJiAweDdmZikgPDwgMjApOworCSAgICB9CisJfQorICAgIH0KKyAgZWxzZSBpZiAoc3QwX3RhZyA9PSBUQUdfWmVybykKKyAgICB7CisgICAgICAvKiBOdW1iZXIgaXMgemVybyAqLworICAgICAgbFswXSA9IDA7CisgICAgICBsWzFdID0gMDsKKyAgICB9CisgIGVsc2UgaWYgKCBzdDBfdGFnID09IFRBR19TcGVjaWFsICkKKyAgICB7CisgICAgICBzdDBfdGFnID0gRlBVX1NwZWNpYWwoc3QwX3B0cik7CisgICAgICBpZiAoIHN0MF90YWcgPT0gVFdfRGVub3JtYWwgKQorCXsKKwkgIC8qIEEgZGVub3JtYWwgd2lsbCBhbHdheXMgdW5kZXJmbG93LiAqLworI2lmbmRlZiBQRUNVTElBUl80ODYKKwkgIC8qIEFuIDgwNDg2IGlzIHN1cHBvc2VkIHRvIGJlIGFibGUgdG8gZ2VuZXJhdGUKKwkgICAgIGEgZGVub3JtYWwgZXhjZXB0aW9uIGhlcmUsIGJ1dC4uLiAqLworCSAgLyogVW5kZXJmbG93IGhhcyBwcmlvcml0eS4gKi8KKwkgIGlmICggY29udHJvbF93b3JkICYgQ1dfVW5kZXJmbG93ICkKKwkgICAgZGVub3JtYWxfb3BlcmFuZCgpOworI2VuZGlmIC8qIFBFQ1VMSUFSXzQ4NiAqLworCSAgcmVnX2NvcHkoc3QwX3B0ciwgJnRtcCk7CisJICBnb3RvIGRlbm9ybWFsX2FyZzsKKwl9CisgICAgICBlbHNlIGlmIChzdDBfdGFnID09IFRXX0luZmluaXR5KQorCXsKKwkgIGxbMF0gPSAwOworCSAgbFsxXSA9IDB4N2ZmMDAwMDA7CisJfQorICAgICAgZWxzZSBpZiAoc3QwX3RhZyA9PSBUV19OYU4pCisJeworCSAgLyogSXMgaXQgcmVhbGx5IGEgTmFOID8gKi8KKwkgIGlmICggKGV4cG9uZW50KHN0MF9wdHIpID09IEVYUF9PVkVSKQorCSAgICAgICAmJiAoc3QwX3B0ci0+c2lnaCAmIDB4ODAwMDAwMDApICkKKwkgICAgeworCSAgICAgIC8qIFNlZSBpZiB3ZSBjYW4gZ2V0IGEgdmFsaWQgTmFOIGZyb20gdGhlIEZQVV9SRUcgKi8KKwkgICAgICBsWzBdID0gKHN0MF9wdHItPnNpZ2wgPj4gMTEpIHwgKHN0MF9wdHItPnNpZ2ggPDwgMjEpOworCSAgICAgIGxbMV0gPSAoKHN0MF9wdHItPnNpZ2ggPj4gMTEpICYgMHhmZmZmZik7CisJICAgICAgaWYgKCAhKHN0MF9wdHItPnNpZ2ggJiAweDQwMDAwMDAwKSApCisJCXsKKwkJICAvKiBJdCBpcyBhIHNpZ25hbGxpbmcgTmFOICovCisJCSAgRVhDRVBUSU9OKEVYX0ludmFsaWQpOworCQkgIGlmICggIShjb250cm9sX3dvcmQgJiBDV19JbnZhbGlkKSApCisJCSAgICByZXR1cm4gMDsKKwkJICBsWzFdIHw9ICgweDQwMDAwMDAwID4+IDExKTsKKwkJfQorCSAgICAgIGxbMV0gfD0gMHg3ZmYwMDAwMDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogSXQgaXMgYW4gdW5zdXBwb3J0ZWQgZGF0YSB0eXBlICovCisJICAgICAgRVhDRVBUSU9OKEVYX0ludmFsaWQpOworCSAgICAgIGlmICggIShjb250cm9sX3dvcmQgJiBDV19JbnZhbGlkKSApCisJCXJldHVybiAwOworCSAgICAgIGxbMF0gPSAwOworCSAgICAgIGxbMV0gPSAweGZmZjgwMDAwOworCSAgICB9CisJfQorICAgIH0KKyAgZWxzZSBpZiAoIHN0MF90YWcgPT0gVEFHX0VtcHR5ICkKKyAgICB7CisgICAgICAvKiBFbXB0eSByZWdpc3RlciAoc3RhY2sgdW5kZXJmbG93KSAqLworICAgICAgRVhDRVBUSU9OKEVYX1N0YWNrVW5kZXIpOworICAgICAgaWYgKCBjb250cm9sX3dvcmQgJiBDV19JbnZhbGlkICkKKwl7CisJICAvKiBUaGUgbWFza2VkIHJlc3BvbnNlICovCisJICAvKiBQdXQgb3V0IHRoZSBRTmFOIGluZGVmaW5pdGUgKi8KKwkgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworCSAgRlBVX2FjY2Vzc19vayhWRVJJRllfV1JJVEUsZGZsb2F0LDgpOworCSAgRlBVX3B1dF91c2VyKDAsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBkZmxvYXQpOworCSAgRlBVX3B1dF91c2VyKDB4ZmZmODAwMDAsIDEgKyAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgZGZsb2F0KTsKKwkgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CisJICByZXR1cm4gMTsKKwl9CisgICAgICBlbHNlCisJcmV0dXJuIDA7CisgICAgfQorICBpZiAoIGdldHNpZ24oc3QwX3B0cikgKQorICAgIGxbMV0gfD0gMHg4MDAwMDAwMDsKKworICBSRV9FTlRSQU5UX0NIRUNLX09GRjsKKyAgRlBVX2FjY2Vzc19vayhWRVJJRllfV1JJVEUsZGZsb2F0LDgpOworICBGUFVfcHV0X3VzZXIobFswXSwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopZGZsb2F0KTsKKyAgRlBVX3B1dF91c2VyKGxbMV0sIDEgKyAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilkZmxvYXQpOworICBSRV9FTlRSQU5UX0NIRUNLX09OOworCisgIHJldHVybiAxOworfQorCisKKy8qIFB1dCBhIGZsb2F0IGludG8gdXNlciBtZW1vcnkgKi8KK2ludCBGUFVfc3RvcmVfc2luZ2xlKEZQVV9SRUcgKnN0MF9wdHIsIHVfY2hhciBzdDBfdGFnLCBmbG9hdCBfX3VzZXIgKnNpbmdsZSkKK3sKKyAgbG9uZyB0ZW1wbCA9IDA7CisgIHVuc2lnbmVkIGxvbmcgaW5jcmVtZW50ID0gMDsgICAgIAkvKiBhdm9pZCBnY2Mgd2FybmluZ3MgKi8KKyAgaW50IHByZWNpc2lvbl9sb3NzOworICBpbnQgZXhwOworICBGUFVfUkVHIHRtcDsKKworICBpZiAoIHN0MF90YWcgPT0gVEFHX1ZhbGlkICkKKyAgICB7CisKKyAgICAgIHJlZ19jb3B5KHN0MF9wdHIsICZ0bXApOworICAgICAgZXhwID0gZXhwb25lbnQoJnRtcCk7CisKKyAgICAgIGlmICggZXhwIDwgU0lOR0xFX0VtaW4gKQorCXsKKwkgIGFkZGV4cG9uZW50KCZ0bXAsIC1TSU5HTEVfRW1pbiArIDIzKTsgIC8qIGxhcmdlc3QgZXhwIHRvIGJlIDIyICovCisKKwlkZW5vcm1hbF9hcmc6CisKKwkgIGlmICggKHByZWNpc2lvbl9sb3NzID0gRlBVX3JvdW5kX3RvX2ludCgmdG1wLCBzdDBfdGFnKSkgKQorCSAgICB7CisjaWZkZWYgUEVDVUxJQVJfNDg2CisJICAgICAgLyogRGlkIGl0IHJvdW5kIHRvIGEgbm9uLWRlbm9ybWFsID8gKi8KKwkgICAgICAvKiBUaGlzIGJlaGF2aW91ciBtaWdodCBiZSByZWdhcmRlZCBhcyBwZWN1bGlhciwgaXQgYXBwZWFycworCQkgdGhhdCB0aGUgODA0ODYgcm91bmRzIHRvIHRoZSBkZXN0IHByZWNpc2lvbiwgdGhlbgorCQkgY29udmVydHMgdG8gZGVjaWRlIHVuZGVyZmxvdy4gKi8KKwkgICAgICBpZiAoICEoKHRtcC5zaWdsID09IDB4MDA4MDAwMDApICYmCisJCSAgKChzdDBfcHRyLT5zaWdoICYgMHgwMDAwMDBmZikgfHwgc3QwX3B0ci0+c2lnbCkpICkKKyNlbmRpZiAvKiBQRUNVTElBUl80ODYgKi8KKwkJeworCQkgIEVYQ0VQVElPTihFWF9VbmRlcmZsb3cpOworCQkgIC8qIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2U6IHNlZSBzZWMgMTYuMi41LjEgb2YKKwkJICAgICB0aGUgODA0ODYgYm9vayAqLworCQkgIGlmICggIShjb250cm9sX3dvcmQgJiBDV19VbmRlcmZsb3cpICkKKwkJICAgIHJldHVybiAwOworCQl9CisJICAgICAgRVhDRVBUSU9OKHByZWNpc2lvbl9sb3NzKTsKKwkgICAgICBpZiAoICEoY29udHJvbF93b3JkICYgQ1dfUHJlY2lzaW9uKSApCisJCXJldHVybiAwOworCSAgICB9CisJICB0ZW1wbCA9IHRtcC5zaWdsOworICAgICAgfQorICAgICAgZWxzZQorCXsKKwkgIGlmICggdG1wLnNpZ2wgfCAodG1wLnNpZ2ggJiAweDAwMDAwMGZmKSApCisJICAgIHsKKwkgICAgICB1bnNpZ25lZCBsb25nIHNpZ2ggPSB0bXAuc2lnaDsKKwkgICAgICB1bnNpZ25lZCBsb25nIHNpZ2wgPSB0bXAuc2lnbDsKKwkgICAgICAKKwkgICAgICBwcmVjaXNpb25fbG9zcyA9IDE7CisJICAgICAgc3dpdGNoIChjb250cm9sX3dvcmQgJiBDV19SQykKKwkJeworCQljYXNlIFJDX1JORDoKKwkJICBpbmNyZW1lbnQgPSAoKHNpZ2ggJiAweGZmKSA+IDB4ODApICAgICAgIC8qIG1vcmUgdGhhbiBoYWxmICovCisJCSAgICB8fCAoKChzaWdoICYgMHhmZikgPT0gMHg4MCkgJiYgc2lnbCkgICAvKiBtb3JlIHRoYW4gaGFsZiAqLworCQkgICAgfHwgKChzaWdoICYgMHgxODApID09IDB4MTgwKTsgICAgICAgIC8qIHJvdW5kIHRvIGV2ZW4gKi8KKwkJICBicmVhazsKKwkJY2FzZSBSQ19ET1dOOiAgIC8qIHRvd2FyZHMgLWluZmluaXR5ICovCisJCSAgaW5jcmVtZW50ID0gc2lnbnBvc2l0aXZlKCZ0bXApCisJCSAgICA/IDAgOiAoc2lnbCB8IChzaWdoICYgMHhmZikpOworCQkgIGJyZWFrOworCQljYXNlIFJDX1VQOiAgICAgLyogdG93YXJkcyAraW5maW5pdHkgKi8KKwkJICBpbmNyZW1lbnQgPSBzaWducG9zaXRpdmUoJnRtcCkKKwkJICAgID8gKHNpZ2wgfCAoc2lnaCAmIDB4ZmYpKSA6IDA7CisJCSAgYnJlYWs7CisJCWNhc2UgUkNfQ0hPUDoKKwkJICBpbmNyZW1lbnQgPSAwOworCQkgIGJyZWFrOworCQl9CisJICAKKwkgICAgICAvKiBUcnVuY2F0ZSBwYXJ0IG9mIHRoZSBtYW50aXNzYSAqLworCSAgICAgIHRtcC5zaWdsID0gMDsKKwkgIAorCSAgICAgIGlmIChpbmNyZW1lbnQpCisJCXsKKwkJICBpZiAoIHNpZ2ggPj0gMHhmZmZmZmYwMCApCisJCSAgICB7CisJCSAgICAgIC8qIFRoZSBzaWdoIHBhcnQgb3ZlcmZsb3dzICovCisJCSAgICAgIHRtcC5zaWdoID0gMHg4MDAwMDAwMDsKKwkJICAgICAgZXhwKys7CisJCSAgICAgIGlmICggZXhwID49IEVYUF9PVkVSICkKKwkJCWdvdG8gb3ZlcmZsb3c7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICB0bXAuc2lnaCAmPSAweGZmZmZmZjAwOworCQkgICAgICB0bXAuc2lnaCArPSAweDEwMDsKKwkJICAgIH0KKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIHRtcC5zaWdoICY9IDB4ZmZmZmZmMDA7ICAvKiBGaW5pc2ggdGhlIHRydW5jYXRpb24gKi8KKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIHByZWNpc2lvbl9sb3NzID0gMDsKKyAgICAgIAorCSAgdGVtcGwgPSAodG1wLnNpZ2ggPj4gOCkgJiAweDAwN2ZmZmZmOworCisJICBpZiAoIGV4cCA+IFNJTkdMRV9FbWF4ICkKKwkgICAgeworCSAgICBvdmVyZmxvdzoKKwkgICAgICBFWENFUFRJT04oRVhfT3ZlcmZsb3cpOworCSAgICAgIGlmICggIShjb250cm9sX3dvcmQgJiBDV19PdmVyZmxvdykgKQorCQlyZXR1cm4gMDsKKwkgICAgICBzZXRfcHJlY2lzaW9uX2ZsYWdfdXAoKTsKKwkgICAgICBpZiAoICEoY29udHJvbF93b3JkICYgQ1dfUHJlY2lzaW9uKSApCisJCXJldHVybiAwOworCisJICAgICAgLyogVGhpcyBpcyBhIHNwZWNpYWwgY2FzZTogc2VlIHNlYyAxNi4yLjUuMSBvZiB0aGUgODA0ODYgYm9vay4gKi8KKwkgICAgICAvKiBNYXNrZWQgcmVzcG9uc2UgaXMgb3ZlcmZsb3cgdG8gaW5maW5pdHkuICovCisJICAgICAgdGVtcGwgPSAweDdmODAwMDAwOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoIHByZWNpc2lvbl9sb3NzICkKKwkJeworCQkgIGlmICggaW5jcmVtZW50ICkKKwkJICAgIHNldF9wcmVjaXNpb25fZmxhZ191cCgpOworCQkgIGVsc2UKKwkJICAgIHNldF9wcmVjaXNpb25fZmxhZ19kb3duKCk7CisJCX0KKwkgICAgICAvKiBBZGQgdGhlIGV4cG9uZW50ICovCisJICAgICAgdGVtcGwgfD0gKChleHArU0lOR0xFX0ViaWFzKSAmIDB4ZmYpIDw8IDIzOworCSAgICB9CisJfQorICAgIH0KKyAgZWxzZSBpZiAoc3QwX3RhZyA9PSBUQUdfWmVybykKKyAgICB7CisgICAgICB0ZW1wbCA9IDA7CisgICAgfQorICBlbHNlIGlmICggc3QwX3RhZyA9PSBUQUdfU3BlY2lhbCApCisgICAgeworICAgICAgc3QwX3RhZyA9IEZQVV9TcGVjaWFsKHN0MF9wdHIpOworICAgICAgaWYgKHN0MF90YWcgPT0gVFdfRGVub3JtYWwpCisJeworCSAgcmVnX2NvcHkoc3QwX3B0ciwgJnRtcCk7CisKKwkgIC8qIEEgZGVub3JtYWwgd2lsbCBhbHdheXMgdW5kZXJmbG93LiAqLworI2lmbmRlZiBQRUNVTElBUl80ODYKKwkgIC8qIEFuIDgwNDg2IGlzIHN1cHBvc2VkIHRvIGJlIGFibGUgdG8gZ2VuZXJhdGUKKwkgICAgIGEgZGVub3JtYWwgZXhjZXB0aW9uIGhlcmUsIGJ1dC4uLiAqLworCSAgLyogVW5kZXJmbG93IGhhcyBwcmlvcml0eS4gKi8KKwkgIGlmICggY29udHJvbF93b3JkICYgQ1dfVW5kZXJmbG93ICkKKwkgICAgZGVub3JtYWxfb3BlcmFuZCgpOworI2VuZGlmIC8qIFBFQ1VMSUFSXzQ4NiAqLyAKKwkgIGdvdG8gZGVub3JtYWxfYXJnOworCX0KKyAgICAgIGVsc2UgaWYgKHN0MF90YWcgPT0gVFdfSW5maW5pdHkpCisJeworCSAgdGVtcGwgPSAweDdmODAwMDAwOworCX0KKyAgICAgIGVsc2UgaWYgKHN0MF90YWcgPT0gVFdfTmFOKQorCXsKKwkgIC8qIElzIGl0IHJlYWxseSBhIE5hTiA/ICovCisJICBpZiAoIChleHBvbmVudChzdDBfcHRyKSA9PSBFWFBfT1ZFUikgJiYgKHN0MF9wdHItPnNpZ2ggJiAweDgwMDAwMDAwKSApCisJICAgIHsKKwkgICAgICAvKiBTZWUgaWYgd2UgY2FuIGdldCBhIHZhbGlkIE5hTiBmcm9tIHRoZSBGUFVfUkVHICovCisJICAgICAgdGVtcGwgPSBzdDBfcHRyLT5zaWdoID4+IDg7CisJICAgICAgaWYgKCAhKHN0MF9wdHItPnNpZ2ggJiAweDQwMDAwMDAwKSApCisJCXsKKwkJICAvKiBJdCBpcyBhIHNpZ25hbGxpbmcgTmFOICovCisJCSAgRVhDRVBUSU9OKEVYX0ludmFsaWQpOworCQkgIGlmICggIShjb250cm9sX3dvcmQgJiBDV19JbnZhbGlkKSApCisJCSAgICByZXR1cm4gMDsKKwkJICB0ZW1wbCB8PSAoMHg0MDAwMDAwMCA+PiA4KTsKKwkJfQorCSAgICAgIHRlbXBsIHw9IDB4N2Y4MDAwMDA7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIEl0IGlzIGFuIHVuc3VwcG9ydGVkIGRhdGEgdHlwZSAqLworCSAgICAgIEVYQ0VQVElPTihFWF9JbnZhbGlkKTsKKwkgICAgICBpZiAoICEoY29udHJvbF93b3JkICYgQ1dfSW52YWxpZCkgKQorCQlyZXR1cm4gMDsKKwkgICAgICB0ZW1wbCA9IDB4ZmZjMDAwMDA7CisJICAgIH0KKwl9CisjaWZkZWYgUEFSQU5PSUQKKyAgICAgIGVsc2UKKwl7CisJICBFWENFUFRJT04oRVhfSU5URVJOQUx8MHgxNjQpOworCSAgcmV0dXJuIDA7CisJfQorI2VuZGlmCisgICAgfQorICBlbHNlIGlmICggc3QwX3RhZyA9PSBUQUdfRW1wdHkgKQorICAgIHsKKyAgICAgIC8qIEVtcHR5IHJlZ2lzdGVyIChzdGFjayB1bmRlcmZsb3cpICovCisgICAgICBFWENFUFRJT04oRVhfU3RhY2tVbmRlcik7CisgICAgICBpZiAoIGNvbnRyb2xfd29yZCAmIEVYX0ludmFsaWQgKQorCXsKKwkgIC8qIFRoZSBtYXNrZWQgcmVzcG9uc2UgKi8KKwkgIC8qIFB1dCBvdXQgdGhlIFFOYU4gaW5kZWZpbml0ZSAqLworCSAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisJICBGUFVfYWNjZXNzX29rKFZFUklGWV9XUklURSxzaW5nbGUsNCk7CisJICBGUFVfcHV0X3VzZXIoMHhmZmMwMDAwMCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIHNpbmdsZSk7CisJICBSRV9FTlRSQU5UX0NIRUNLX09OOworCSAgcmV0dXJuIDE7CisJfQorICAgICAgZWxzZQorCXJldHVybiAwOworICAgIH0KKyNpZmRlZiBQQVJBTk9JRAorICBlbHNlCisgICAgeworICAgICAgRVhDRVBUSU9OKEVYX0lOVEVSTkFMfDB4MTYzKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyNlbmRpZgorICBpZiAoIGdldHNpZ24oc3QwX3B0cikgKQorICAgIHRlbXBsIHw9IDB4ODAwMDAwMDA7CisKKyAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisgIEZQVV9hY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLHNpbmdsZSw0KTsKKyAgRlBVX3B1dF91c2VyKHRlbXBsLCh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBzaW5nbGUpOworICBSRV9FTlRSQU5UX0NIRUNLX09OOworCisgIHJldHVybiAxOworfQorCisKKy8qIFB1dCBhIGxvbmcgbG9uZyBpbnRvIHVzZXIgbWVtb3J5ICovCitpbnQgRlBVX3N0b3JlX2ludDY0KEZQVV9SRUcgKnN0MF9wdHIsIHVfY2hhciBzdDBfdGFnLCBsb25nIGxvbmcgX191c2VyICpkKQoreworICBGUFVfUkVHIHQ7CisgIGxvbmcgbG9uZyB0bGw7CisgIGludCBwcmVjaXNpb25fbG9zczsKKworICBpZiAoIHN0MF90YWcgPT0gVEFHX0VtcHR5ICkKKyAgICB7CisgICAgICAvKiBFbXB0eSByZWdpc3RlciAoc3RhY2sgdW5kZXJmbG93KSAqLworICAgICAgRVhDRVBUSU9OKEVYX1N0YWNrVW5kZXIpOworICAgICAgZ290byBpbnZhbGlkX29wZXJhbmQ7CisgICAgfQorICBlbHNlIGlmICggc3QwX3RhZyA9PSBUQUdfU3BlY2lhbCApCisgICAgeworICAgICAgc3QwX3RhZyA9IEZQVV9TcGVjaWFsKHN0MF9wdHIpOworICAgICAgaWYgKCAoc3QwX3RhZyA9PSBUV19JbmZpbml0eSkgfHwKKwkgICAoc3QwX3RhZyA9PSBUV19OYU4pICkKKwl7CisJICBFWENFUFRJT04oRVhfSW52YWxpZCk7CisJICBnb3RvIGludmFsaWRfb3BlcmFuZDsKKwl9CisgICAgfQorCisgIHJlZ19jb3B5KHN0MF9wdHIsICZ0KTsKKyAgcHJlY2lzaW9uX2xvc3MgPSBGUFVfcm91bmRfdG9faW50KCZ0LCBzdDBfdGFnKTsKKyAgKChsb25nICopJnRsbClbMF0gPSB0LnNpZ2w7CisgICgobG9uZyAqKSZ0bGwpWzFdID0gdC5zaWdoOworICBpZiAoIChwcmVjaXNpb25fbG9zcyA9PSAxKSB8fAorICAgICAgKCh0LnNpZ2ggJiAweDgwMDAwMDAwKSAmJgorICAgICAgICEoKHQuc2lnaCA9PSAweDgwMDAwMDAwKSAmJiAodC5zaWdsID09IDApICYmCisJIHNpZ25uZWdhdGl2ZSgmdCkpKSApCisgICAgeworICAgICAgRVhDRVBUSU9OKEVYX0ludmFsaWQpOworICAgICAgLyogVGhpcyBpcyBhIHNwZWNpYWwgY2FzZTogc2VlIHNlYyAxNi4yLjUuMSBvZiB0aGUgODA0ODYgYm9vayAqLworICAgIGludmFsaWRfb3BlcmFuZDoKKyAgICAgIGlmICggY29udHJvbF93b3JkICYgRVhfSW52YWxpZCApCisJeworCSAgLyogUHJvZHVjZSBzb21ldGhpbmcgbGlrZSBRTmFOICJpbmRlZmluaXRlIiAqLworCSAgdGxsID0gMHg4MDAwMDAwMDAwMDAwMDAwTEw7CisJfQorICAgICAgZWxzZQorCXJldHVybiAwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICggcHJlY2lzaW9uX2xvc3MgKQorCXNldF9wcmVjaXNpb25fZmxhZyhwcmVjaXNpb25fbG9zcyk7CisgICAgICBpZiAoIHNpZ25uZWdhdGl2ZSgmdCkgKQorCXRsbCA9IC0gdGxsOworICAgIH0KKworICBSRV9FTlRSQU5UX0NIRUNLX09GRjsKKyAgRlBVX2FjY2Vzc19vayhWRVJJRllfV1JJVEUsZCw4KTsKKyAgY29weV90b191c2VyKGQsICZ0bGwsIDgpOworICBSRV9FTlRSQU5UX0NIRUNLX09OOworCisgIHJldHVybiAxOworfQorCisKKy8qIFB1dCBhIGxvbmcgaW50byB1c2VyIG1lbW9yeSAqLworaW50IEZQVV9zdG9yZV9pbnQzMihGUFVfUkVHICpzdDBfcHRyLCB1X2NoYXIgc3QwX3RhZywgbG9uZyBfX3VzZXIgKmQpCit7CisgIEZQVV9SRUcgdDsKKyAgaW50IHByZWNpc2lvbl9sb3NzOworCisgIGlmICggc3QwX3RhZyA9PSBUQUdfRW1wdHkgKQorICAgIHsKKyAgICAgIC8qIEVtcHR5IHJlZ2lzdGVyIChzdGFjayB1bmRlcmZsb3cpICovCisgICAgICBFWENFUFRJT04oRVhfU3RhY2tVbmRlcik7CisgICAgICBnb3RvIGludmFsaWRfb3BlcmFuZDsKKyAgICB9CisgIGVsc2UgaWYgKCBzdDBfdGFnID09IFRBR19TcGVjaWFsICkKKyAgICB7CisgICAgICBzdDBfdGFnID0gRlBVX1NwZWNpYWwoc3QwX3B0cik7CisgICAgICBpZiAoIChzdDBfdGFnID09IFRXX0luZmluaXR5KSB8fAorCSAgIChzdDBfdGFnID09IFRXX05hTikgKQorCXsKKwkgIEVYQ0VQVElPTihFWF9JbnZhbGlkKTsKKwkgIGdvdG8gaW52YWxpZF9vcGVyYW5kOworCX0KKyAgICB9CisKKyAgcmVnX2NvcHkoc3QwX3B0ciwgJnQpOworICBwcmVjaXNpb25fbG9zcyA9IEZQVV9yb3VuZF90b19pbnQoJnQsIHN0MF90YWcpOworICBpZiAodC5zaWdoIHx8CisgICAgICAoKHQuc2lnbCAmIDB4ODAwMDAwMDApICYmCisgICAgICAgISgodC5zaWdsID09IDB4ODAwMDAwMDApICYmIHNpZ25uZWdhdGl2ZSgmdCkpKSApCisgICAgeworICAgICAgRVhDRVBUSU9OKEVYX0ludmFsaWQpOworICAgICAgLyogVGhpcyBpcyBhIHNwZWNpYWwgY2FzZTogc2VlIHNlYyAxNi4yLjUuMSBvZiB0aGUgODA0ODYgYm9vayAqLworICAgIGludmFsaWRfb3BlcmFuZDoKKyAgICAgIGlmICggY29udHJvbF93b3JkICYgRVhfSW52YWxpZCApCisJeworCSAgLyogUHJvZHVjZSBzb21ldGhpbmcgbGlrZSBRTmFOICJpbmRlZmluaXRlIiAqLworCSAgdC5zaWdsID0gMHg4MDAwMDAwMDsKKwl9CisgICAgICBlbHNlCisJcmV0dXJuIDA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCBwcmVjaXNpb25fbG9zcyApCisJc2V0X3ByZWNpc2lvbl9mbGFnKHByZWNpc2lvbl9sb3NzKTsKKyAgICAgIGlmICggc2lnbm5lZ2F0aXZlKCZ0KSApCisJdC5zaWdsID0gLShsb25nKXQuc2lnbDsKKyAgICB9CisKKyAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisgIEZQVV9hY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLGQsNCk7CisgIEZQVV9wdXRfdXNlcih0LnNpZ2wsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBkKTsKKyAgUkVfRU5UUkFOVF9DSEVDS19PTjsKKworICByZXR1cm4gMTsKK30KKworCisvKiBQdXQgYSBzaG9ydCBpbnRvIHVzZXIgbWVtb3J5ICovCitpbnQgRlBVX3N0b3JlX2ludDE2KEZQVV9SRUcgKnN0MF9wdHIsIHVfY2hhciBzdDBfdGFnLCBzaG9ydCBfX3VzZXIgKmQpCit7CisgIEZQVV9SRUcgdDsKKyAgaW50IHByZWNpc2lvbl9sb3NzOworCisgIGlmICggc3QwX3RhZyA9PSBUQUdfRW1wdHkgKQorICAgIHsKKyAgICAgIC8qIEVtcHR5IHJlZ2lzdGVyIChzdGFjayB1bmRlcmZsb3cpICovCisgICAgICBFWENFUFRJT04oRVhfU3RhY2tVbmRlcik7CisgICAgICBnb3RvIGludmFsaWRfb3BlcmFuZDsKKyAgICB9CisgIGVsc2UgaWYgKCBzdDBfdGFnID09IFRBR19TcGVjaWFsICkKKyAgICB7CisgICAgICBzdDBfdGFnID0gRlBVX1NwZWNpYWwoc3QwX3B0cik7CisgICAgICBpZiAoIChzdDBfdGFnID09IFRXX0luZmluaXR5KSB8fAorCSAgIChzdDBfdGFnID09IFRXX05hTikgKQorCXsKKwkgIEVYQ0VQVElPTihFWF9JbnZhbGlkKTsKKwkgIGdvdG8gaW52YWxpZF9vcGVyYW5kOworCX0KKyAgICB9CisKKyAgcmVnX2NvcHkoc3QwX3B0ciwgJnQpOworICBwcmVjaXNpb25fbG9zcyA9IEZQVV9yb3VuZF90b19pbnQoJnQsIHN0MF90YWcpOworICBpZiAodC5zaWdoIHx8CisgICAgICAoKHQuc2lnbCAmIDB4ZmZmZjgwMDApICYmCisgICAgICAgISgodC5zaWdsID09IDB4ODAwMCkgJiYgc2lnbm5lZ2F0aXZlKCZ0KSkpICkKKyAgICB7CisgICAgICBFWENFUFRJT04oRVhfSW52YWxpZCk7CisgICAgICAvKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlOiBzZWUgc2VjIDE2LjIuNS4xIG9mIHRoZSA4MDQ4NiBib29rICovCisgICAgaW52YWxpZF9vcGVyYW5kOgorICAgICAgaWYgKCBjb250cm9sX3dvcmQgJiBFWF9JbnZhbGlkICkKKwl7CisJICAvKiBQcm9kdWNlIHNvbWV0aGluZyBsaWtlIFFOYU4gImluZGVmaW5pdGUiICovCisJICB0LnNpZ2wgPSAweDgwMDA7CisJfQorICAgICAgZWxzZQorCXJldHVybiAwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICggcHJlY2lzaW9uX2xvc3MgKQorCXNldF9wcmVjaXNpb25fZmxhZyhwcmVjaXNpb25fbG9zcyk7CisgICAgICBpZiAoIHNpZ25uZWdhdGl2ZSgmdCkgKQorCXQuc2lnbCA9IC10LnNpZ2w7CisgICAgfQorCisgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworICBGUFVfYWNjZXNzX29rKFZFUklGWV9XUklURSxkLDIpOworICBGUFVfcHV0X3VzZXIoKHNob3J0KXQuc2lnbCwgZCk7CisgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CisKKyAgcmV0dXJuIDE7Cit9CisKKworLyogUHV0IGEgcGFja2VkIGJjZCBhcnJheSBpbnRvIHVzZXIgbWVtb3J5ICovCitpbnQgRlBVX3N0b3JlX2JjZChGUFVfUkVHICpzdDBfcHRyLCB1X2NoYXIgc3QwX3RhZywgdV9jaGFyIF9fdXNlciAqZCkKK3sKKyAgRlBVX1JFRyB0OworICB1bnNpZ25lZCBsb25nIGxvbmcgbGw7CisgIHVfY2hhciBiOworICBpbnQgaSwgcHJlY2lzaW9uX2xvc3M7CisgIHVfY2hhciBzaWduID0gKGdldHNpZ24oc3QwX3B0cikgPT0gU0lHTl9ORUcpID8gMHg4MCA6IDA7CisKKyAgaWYgKCBzdDBfdGFnID09IFRBR19FbXB0eSApCisgICAgeworICAgICAgLyogRW1wdHkgcmVnaXN0ZXIgKHN0YWNrIHVuZGVyZmxvdykgKi8KKyAgICAgIEVYQ0VQVElPTihFWF9TdGFja1VuZGVyKTsKKyAgICAgIGdvdG8gaW52YWxpZF9vcGVyYW5kOworICAgIH0KKyAgZWxzZSBpZiAoIHN0MF90YWcgPT0gVEFHX1NwZWNpYWwgKQorICAgIHsKKyAgICAgIHN0MF90YWcgPSBGUFVfU3BlY2lhbChzdDBfcHRyKTsKKyAgICAgIGlmICggKHN0MF90YWcgPT0gVFdfSW5maW5pdHkpIHx8CisJICAgKHN0MF90YWcgPT0gVFdfTmFOKSApCisJeworCSAgRVhDRVBUSU9OKEVYX0ludmFsaWQpOworCSAgZ290byBpbnZhbGlkX29wZXJhbmQ7CisJfQorICAgIH0KKworICByZWdfY29weShzdDBfcHRyLCAmdCk7CisgIHByZWNpc2lvbl9sb3NzID0gRlBVX3JvdW5kX3RvX2ludCgmdCwgc3QwX3RhZyk7CisgIGxsID0gc2lnbmlmaWNhbmQoJnQpOworCisgIC8qIENoZWNrIGZvciBvdmVyZmxvdywgYnkgY29tcGFyaW5nIHdpdGggOTk5OTk5OTk5OTk5OTk5OTk5IGRlY2ltYWwuICovCisgIGlmICggKHQuc2lnaCA+IDB4MGRlMGI2YjMpIHx8CisgICAgICAoKHQuc2lnaCA9PSAweDBkZTBiNmIzKSAmJiAodC5zaWdsID4gMHhhNzYzZmZmZikpICkKKyAgICB7CisgICAgICBFWENFUFRJT04oRVhfSW52YWxpZCk7CisgICAgICAvKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlOiBzZWUgc2VjIDE2LjIuNS4xIG9mIHRoZSA4MDQ4NiBib29rICovCisgICAgaW52YWxpZF9vcGVyYW5kOgorICAgICAgaWYgKCBjb250cm9sX3dvcmQgJiBDV19JbnZhbGlkICkKKwl7CisJICAvKiBQcm9kdWNlIHRoZSBRTmFOICJpbmRlZmluaXRlIiAqLworCSAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisJICBGUFVfYWNjZXNzX29rKFZFUklGWV9XUklURSxkLDEwKTsKKwkgIGZvciAoIGkgPSAwOyBpIDwgNzsgaSsrKQorCSAgICBGUFVfcHV0X3VzZXIoMCwgZCtpKTsgLyogVGhlc2UgYnl0ZXMgInVuZGVmaW5lZCIgKi8KKwkgIEZQVV9wdXRfdXNlcigweGMwLCBkKzcpOyAvKiBUaGlzIGJ5dGUgInVuZGVmaW5lZCIgKi8KKwkgIEZQVV9wdXRfdXNlcigweGZmLCBkKzgpOworCSAgRlBVX3B1dF91c2VyKDB4ZmYsIGQrOSk7CisJICBSRV9FTlRSQU5UX0NIRUNLX09OOworCSAgcmV0dXJuIDE7CisJfQorICAgICAgZWxzZQorCXJldHVybiAwOworICAgIH0KKyAgZWxzZSBpZiAoIHByZWNpc2lvbl9sb3NzICkKKyAgICB7CisgICAgICAvKiBQcmVjaXNpb24gbG9zcyBkb2Vzbid0IHN0b3AgdGhlIGRhdGEgdHJhbnNmZXIgKi8KKyAgICAgIHNldF9wcmVjaXNpb25fZmxhZyhwcmVjaXNpb25fbG9zcyk7CisgICAgfQorCisgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworICBGUFVfYWNjZXNzX29rKFZFUklGWV9XUklURSxkLDEwKTsKKyAgUkVfRU5UUkFOVF9DSEVDS19PTjsKKyAgZm9yICggaSA9IDA7IGkgPCA5OyBpKyspCisgICAgeworICAgICAgYiA9IEZQVV9kaXZfc21hbGwoJmxsLCAxMCk7CisgICAgICBiIHw9IChGUFVfZGl2X3NtYWxsKCZsbCwgMTApKSA8PCA0OworICAgICAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisgICAgICBGUFVfcHV0X3VzZXIoYiwgZCtpKTsKKyAgICAgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CisgICAgfQorICBSRV9FTlRSQU5UX0NIRUNLX09GRjsKKyAgRlBVX3B1dF91c2VyKHNpZ24sIGQrOSk7CisgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CisKKyAgcmV0dXJuIDE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogciBnZXRzIG1hbmdsZWQgc3VjaCB0aGF0IHNpZyBpcyBpbnQsIHNpZ246IAorICAgaXQgaXMgTk9UIG5vcm1hbGl6ZWQgKi8KKy8qIFRoZSByZXR1cm4gdmFsdWUgKGluIGVheCkgaXMgemVybyBpZiB0aGUgcmVzdWx0IGlzIGV4YWN0LAorICAgaWYgYml0cyBhcmUgY2hhbmdlZCBkdWUgdG8gcm91bmRpbmcsIHRydW5jYXRpb24sIGV0YywgdGhlbgorICAgYSBub24temVybyB2YWx1ZSBpcyByZXR1cm5lZCAqLworLyogT3ZlcmZsb3cgaXMgc2lnbmFsbGVkIGJ5IGEgbm9uLXplcm8gcmV0dXJuIHZhbHVlIChpbiBlYXgpLgorICAgSW4gdGhlIGNhc2Ugb2Ygb3ZlcmZsb3csIHRoZSByZXR1cm5lZCBzaWduaWZpY2FuZCBhbHdheXMgaGFzIHRoZQorICAgbGFyZ2VzdCBwb3NzaWJsZSB2YWx1ZSAqLworaW50IEZQVV9yb3VuZF90b19pbnQoRlBVX1JFRyAqciwgdV9jaGFyIHRhZykKK3sKKyAgdV9jaGFyICAgICB2ZXJ5X2JpZzsKKyAgdW5zaWduZWQgZWF4OworCisgIGlmICh0YWcgPT0gVEFHX1plcm8pCisgICAgeworICAgICAgLyogTWFrZSBzdXJlIHRoYXQgemVybyBpcyByZXR1cm5lZCAqLworICAgICAgc2lnbmlmaWNhbmQocikgPSAwOworICAgICAgcmV0dXJuIDA7ICAgICAgICAvKiBvLmsuICovCisgICAgfQorCisgIGlmIChleHBvbmVudChyKSA+IDYzKQorICAgIHsKKyAgICAgIHItPnNpZ2wgPSByLT5zaWdoID0gfjA7ICAgICAgLyogVGhlIGxhcmdlc3QgcmVwcmVzZW50YWJsZSBudW1iZXIgKi8KKyAgICAgIHJldHVybiAxOyAgICAgICAgLyogb3ZlcmZsb3cgKi8KKyAgICB9CisKKyAgZWF4ID0gRlBVX3NocnhzKCZyLT5zaWdsLCA2MyAtIGV4cG9uZW50KHIpKTsKKyAgdmVyeV9iaWcgPSAhKH4oci0+c2lnaCkgfCB+KHItPnNpZ2wpKTsgIC8qIHRlc3QgZm9yIDB4ZmZmLi4uZmZmICovCisjZGVmaW5lCWhhbGZfb3JfbW9yZQkoZWF4ICYgMHg4MDAwMDAwMCkKKyNkZWZpbmUJZnJhY19wYXJ0CShlYXgpCisjZGVmaW5lIG1vcmVfdGhhbl9oYWxmICAoKGVheCAmIDB4ODAwMDAwMDEpID09IDB4ODAwMDAwMDEpCisgIHN3aXRjaCAoY29udHJvbF93b3JkICYgQ1dfUkMpCisgICAgeworICAgIGNhc2UgUkNfUk5EOgorICAgICAgaWYgKCBtb3JlX3RoYW5faGFsZiAgICAgICAgICAgICAgIAkvKiBuZWFyZXN0ICovCisJICB8fCAoaGFsZl9vcl9tb3JlICYmIChyLT5zaWdsICYgMSkpICkJLyogb2RkIC0+IGV2ZW4gKi8KKwl7CisJICBpZiAoIHZlcnlfYmlnICkgcmV0dXJuIDE7ICAgICAgICAvKiBvdmVyZmxvdyAqLworCSAgc2lnbmlmaWNhbmQocikgKys7CisJICByZXR1cm4gUFJFQ0lTSU9OX0xPU1RfVVA7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBSQ19ET1dOOgorICAgICAgaWYgKGZyYWNfcGFydCAmJiBnZXRzaWduKHIpKQorCXsKKwkgIGlmICggdmVyeV9iaWcgKSByZXR1cm4gMTsgICAgICAgIC8qIG92ZXJmbG93ICovCisJICBzaWduaWZpY2FuZChyKSArKzsKKwkgIHJldHVybiBQUkVDSVNJT05fTE9TVF9VUDsKKwl9CisgICAgICBicmVhazsKKyAgICBjYXNlIFJDX1VQOgorICAgICAgaWYgKGZyYWNfcGFydCAmJiAhZ2V0c2lnbihyKSkKKwl7CisJICBpZiAoIHZlcnlfYmlnICkgcmV0dXJuIDE7ICAgICAgICAvKiBvdmVyZmxvdyAqLworCSAgc2lnbmlmaWNhbmQocikgKys7CisJICByZXR1cm4gUFJFQ0lTSU9OX0xPU1RfVVA7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBSQ19DSE9QOgorICAgICAgYnJlYWs7CisgICAgfQorCisgIHJldHVybiBlYXggPyBQUkVDSVNJT05fTE9TVF9ET1dOIDogMDsKKworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3VfY2hhciBfX3VzZXIgKmZsZGVudihmcHVfYWRkcl9tb2RlcyBhZGRyX21vZGVzLCB1X2NoYXIgX191c2VyICpzKQoreworICB1bnNpZ25lZCBzaG9ydCB0YWdfd29yZCA9IDA7CisgIHVfY2hhciB0YWc7CisgIGludCBpOworCisgIGlmICggKGFkZHJfbW9kZXMuZGVmYXVsdF9tb2RlID09IFZNODYpIHx8CisgICAgICAoKGFkZHJfbW9kZXMuZGVmYXVsdF9tb2RlID09IFBNMTYpCisgICAgICBeIChhZGRyX21vZGVzLm92ZXJyaWRlLm9wZXJhbmRfc2l6ZSA9PSBPUF9TSVpFX1BSRUZJWCkpICkKKyAgICB7CisgICAgICBSRV9FTlRSQU5UX0NIRUNLX09GRjsKKyAgICAgIEZQVV9hY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHMsIDB4MGUpOworICAgICAgRlBVX2dldF91c2VyKGNvbnRyb2xfd29yZCwgKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKSBzKTsKKyAgICAgIEZQVV9nZXRfdXNlcihwYXJ0aWFsX3N0YXR1cywgKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKSAocysyKSk7CisgICAgICBGUFVfZ2V0X3VzZXIodGFnX3dvcmQsICh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKikgKHMrNCkpOworICAgICAgRlBVX2dldF91c2VyKGluc3RydWN0aW9uX2FkZHJlc3Mub2Zmc2V0LCAodW5zaWduZWQgc2hvcnQgX191c2VyICopIChzKzYpKTsKKyAgICAgIEZQVV9nZXRfdXNlcihpbnN0cnVjdGlvbl9hZGRyZXNzLnNlbGVjdG9yLCAodW5zaWduZWQgc2hvcnQgX191c2VyICopIChzKzgpKTsKKyAgICAgIEZQVV9nZXRfdXNlcihvcGVyYW5kX2FkZHJlc3Mub2Zmc2V0LCAodW5zaWduZWQgc2hvcnQgX191c2VyICopIChzKzB4MGEpKTsKKyAgICAgIEZQVV9nZXRfdXNlcihvcGVyYW5kX2FkZHJlc3Muc2VsZWN0b3IsICh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKikgKHMrMHgwYykpOworICAgICAgUkVfRU5UUkFOVF9DSEVDS19PTjsKKyAgICAgIHMgKz0gMHgwZTsKKyAgICAgIGlmICggYWRkcl9tb2Rlcy5kZWZhdWx0X21vZGUgPT0gVk04NiApCisJeworCSAgaW5zdHJ1Y3Rpb25fYWRkcmVzcy5vZmZzZXQKKwkgICAgKz0gKGluc3RydWN0aW9uX2FkZHJlc3Muc2VsZWN0b3IgJiAweGYwMDApIDw8IDQ7CisJICBvcGVyYW5kX2FkZHJlc3Mub2Zmc2V0ICs9IChvcGVyYW5kX2FkZHJlc3Muc2VsZWN0b3IgJiAweGYwMDApIDw8IDQ7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworICAgICAgRlBVX2FjY2Vzc19vayhWRVJJRllfUkVBRCwgcywgMHgxYyk7CisgICAgICBGUFVfZ2V0X3VzZXIoY29udHJvbF93b3JkLCAodW5zaWduZWQgc2hvcnQgX191c2VyICopIHMpOworICAgICAgRlBVX2dldF91c2VyKHBhcnRpYWxfc3RhdHVzLCAodW5zaWduZWQgc2hvcnQgX191c2VyICopIChzKzQpKTsKKyAgICAgIEZQVV9nZXRfdXNlcih0YWdfd29yZCwgKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKSAocys4KSk7CisgICAgICBGUFVfZ2V0X3VzZXIoaW5zdHJ1Y3Rpb25fYWRkcmVzcy5vZmZzZXQsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSAocysweDBjKSk7CisgICAgICBGUFVfZ2V0X3VzZXIoaW5zdHJ1Y3Rpb25fYWRkcmVzcy5zZWxlY3RvciwgKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKSAocysweDEwKSk7CisgICAgICBGUFVfZ2V0X3VzZXIoaW5zdHJ1Y3Rpb25fYWRkcmVzcy5vcGNvZGUsICh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKikgKHMrMHgxMikpOworICAgICAgRlBVX2dldF91c2VyKG9wZXJhbmRfYWRkcmVzcy5vZmZzZXQsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSAocysweDE0KSk7CisgICAgICBGUFVfZ2V0X3VzZXIob3BlcmFuZF9hZGRyZXNzLnNlbGVjdG9yLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgKHMrMHgxOCkpOworICAgICAgUkVfRU5UUkFOVF9DSEVDS19PTjsKKyAgICAgIHMgKz0gMHgxYzsKKyAgICB9CisKKyNpZmRlZiBQRUNVTElBUl80ODYKKyAgY29udHJvbF93b3JkICY9IH4weGUwODA7CisjZW5kaWYgLyogUEVDVUxJQVJfNDg2ICovIAorCisgIHRvcCA9IChwYXJ0aWFsX3N0YXR1cyA+PiBTV19Ub3BfU2hpZnQpICYgNzsKKworICBpZiAoIHBhcnRpYWxfc3RhdHVzICYgfmNvbnRyb2xfd29yZCAmIENXX0V4Y2VwdGlvbnMgKQorICAgIHBhcnRpYWxfc3RhdHVzIHw9IChTV19TdW1tYXJ5IHwgU1dfQmFja3dhcmQpOworICBlbHNlCisgICAgcGFydGlhbF9zdGF0dXMgJj0gfihTV19TdW1tYXJ5IHwgU1dfQmFja3dhcmQpOworCisgIGZvciAoIGkgPSAwOyBpIDwgODsgaSsrICkKKyAgICB7CisgICAgICB0YWcgPSB0YWdfd29yZCAmIDM7CisgICAgICB0YWdfd29yZCA+Pj0gMjsKKworICAgICAgaWYgKCB0YWcgPT0gVEFHX0VtcHR5ICkKKwkvKiBOZXcgdGFnIGlzIGVtcHR5LiAgQWNjZXB0IGl0ICovCisJRlBVX3NldHRhZyhpLCBUQUdfRW1wdHkpOworICAgICAgZWxzZSBpZiAoIEZQVV9nZXR0YWcoaSkgPT0gVEFHX0VtcHR5ICkKKwl7CisJICAvKiBPbGQgdGFnIGlzIGVtcHR5IGFuZCBuZXcgdGFnIGlzIG5vdCBlbXB0eS4gIE5ldyB0YWcgaXMgZGV0ZXJtaW5lZAorCSAgICAgYnkgb2xkIHJlZyBjb250ZW50cyAqLworCSAgaWYgKCBleHBvbmVudCgmZnB1X3JlZ2lzdGVyKGkpKSA9PSAtIEVYVEVOREVEX0ViaWFzICkKKwkgICAgeworCSAgICAgIGlmICggIShmcHVfcmVnaXN0ZXIoaSkuc2lnbCB8IGZwdV9yZWdpc3RlcihpKS5zaWdoKSApCisJCUZQVV9zZXR0YWcoaSwgVEFHX1plcm8pOworCSAgICAgIGVsc2UKKwkJRlBVX3NldHRhZyhpLCBUQUdfU3BlY2lhbCk7CisJICAgIH0KKwkgIGVsc2UgaWYgKCBleHBvbmVudCgmZnB1X3JlZ2lzdGVyKGkpKSA9PSAweDdmZmYgLSBFWFRFTkRFRF9FYmlhcyApCisJICAgIHsKKwkgICAgICBGUFVfc2V0dGFnKGksIFRBR19TcGVjaWFsKTsKKwkgICAgfQorCSAgZWxzZSBpZiAoIGZwdV9yZWdpc3RlcihpKS5zaWdoICYgMHg4MDAwMDAwMCApCisJICAgIEZQVV9zZXR0YWcoaSwgVEFHX1ZhbGlkKTsKKwkgIGVsc2UKKwkgICAgRlBVX3NldHRhZyhpLCBUQUdfU3BlY2lhbCk7ICAgLyogQW4gVW4tbm9ybWFsICovCisgIAl9CisgICAgICAvKiBFbHNlIG9sZCB0YWcgaXMgbm90IGVtcHR5IGFuZCBuZXcgdGFnIGlzIG5vdCBlbXB0eS4gIE9sZCB0YWcKKwkgcmVtYWlucyBjb3JyZWN0ICovCisgICAgfQorCisgIHJldHVybiBzOworfQorCisKK3ZvaWQgZnJzdG9yKGZwdV9hZGRyX21vZGVzIGFkZHJfbW9kZXMsIHVfY2hhciBfX3VzZXIgKmRhdGFfYWRkcmVzcykKK3sKKyAgaW50IGksIHJlZ25yOworICB1X2NoYXIgX191c2VyICpzID0gZmxkZW52KGFkZHJfbW9kZXMsIGRhdGFfYWRkcmVzcyk7CisgIGludCBvZmZzZXQgPSAodG9wICYgNykgKiAxMCwgb3RoZXIgPSA4MCAtIG9mZnNldDsKKworICAvKiBDb3B5IGFsbCByZWdpc3RlcnMgaW4gc3RhY2sgb3JkZXIuICovCisgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworICBGUFVfYWNjZXNzX29rKFZFUklGWV9SRUFELHMsODApOworICBfX2NvcHlfZnJvbV91c2VyKHJlZ2lzdGVyX2Jhc2Urb2Zmc2V0LCBzLCBvdGhlcik7CisgIGlmICggb2Zmc2V0ICkKKyAgICBfX2NvcHlfZnJvbV91c2VyKHJlZ2lzdGVyX2Jhc2UsIHMrb3RoZXIsIG9mZnNldCk7CisgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CisKKyAgZm9yICggaSA9IDA7IGkgPCA4OyBpKysgKQorICAgIHsKKyAgICAgIHJlZ25yID0gKGkrdG9wKSAmIDc7CisgICAgICBpZiAoIEZQVV9nZXR0YWcocmVnbnIpICE9IFRBR19FbXB0eSApCisJLyogVGhlIGxvYWRlZCBkYXRhIG92ZXItcmlkZXMgYWxsIG90aGVyIGNhc2VzLiAqLworCUZQVV9zZXR0YWcocmVnbnIsIEZQVV90YWdvZigmc3QoaSkpKTsKKyAgICB9CisKK30KKworCit1X2NoYXIgX191c2VyICpmc3RlbnYoZnB1X2FkZHJfbW9kZXMgYWRkcl9tb2RlcywgdV9jaGFyIF9fdXNlciAqZCkKK3sKKyAgaWYgKCAoYWRkcl9tb2Rlcy5kZWZhdWx0X21vZGUgPT0gVk04NikgfHwKKyAgICAgICgoYWRkcl9tb2Rlcy5kZWZhdWx0X21vZGUgPT0gUE0xNikKKyAgICAgIF4gKGFkZHJfbW9kZXMub3ZlcnJpZGUub3BlcmFuZF9zaXplID09IE9QX1NJWkVfUFJFRklYKSkgKQorICAgIHsKKyAgICAgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworICAgICAgRlBVX2FjY2Vzc19vayhWRVJJRllfV1JJVEUsZCwxNCk7CisjaWZkZWYgUEVDVUxJQVJfNDg2CisgICAgICBGUFVfcHV0X3VzZXIoY29udHJvbF93b3JkICYgfjB4ZTA4MCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGQpOworI2Vsc2UKKyAgICAgIEZQVV9wdXRfdXNlcihjb250cm9sX3dvcmQsICh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKikgZCk7CisjZW5kaWYgLyogUEVDVUxJQVJfNDg2ICovCisgICAgICBGUFVfcHV0X3VzZXIoc3RhdHVzX3dvcmQoKSwgKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKSAoZCsyKSk7CisgICAgICBGUFVfcHV0X3VzZXIoZnB1X3RhZ193b3JkLCAodW5zaWduZWQgc2hvcnQgX191c2VyICopIChkKzQpKTsKKyAgICAgIEZQVV9wdXRfdXNlcihpbnN0cnVjdGlvbl9hZGRyZXNzLm9mZnNldCwgKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKSAoZCs2KSk7CisgICAgICBGUFVfcHV0X3VzZXIob3BlcmFuZF9hZGRyZXNzLm9mZnNldCwgKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKSAoZCsweDBhKSk7CisgICAgICBpZiAoIGFkZHJfbW9kZXMuZGVmYXVsdF9tb2RlID09IFZNODYgKQorCXsKKwkgIEZQVV9wdXRfdXNlcigoaW5zdHJ1Y3Rpb25fYWRkcmVzcy5vZmZzZXQgJiAweGYwMDAwKSA+PiA0LAorCQkgICAgICAodW5zaWduZWQgc2hvcnQgX191c2VyICopIChkKzgpKTsKKwkgIEZQVV9wdXRfdXNlcigob3BlcmFuZF9hZGRyZXNzLm9mZnNldCAmIDB4ZjAwMDApID4+IDQsCisJCSAgICAgICh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKikgKGQrMHgwYykpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBGUFVfcHV0X3VzZXIoaW5zdHJ1Y3Rpb25fYWRkcmVzcy5zZWxlY3RvciwgKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKSAoZCs4KSk7CisJICBGUFVfcHV0X3VzZXIob3BlcmFuZF9hZGRyZXNzLnNlbGVjdG9yLCAodW5zaWduZWQgc2hvcnQgX191c2VyICopIChkKzB4MGMpKTsKKwl9CisgICAgICBSRV9FTlRSQU5UX0NIRUNLX09OOworICAgICAgZCArPSAweDBlOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworICAgICAgRlBVX2FjY2Vzc19vayhWRVJJRllfV1JJVEUsIGQsIDcqNCk7CisjaWZkZWYgUEVDVUxJQVJfNDg2CisgICAgICBjb250cm9sX3dvcmQgJj0gfjB4ZTA4MDsKKyAgICAgIC8qIEFuIDgwNDg2IHNldHMgbmVhcmx5IGFsbCBvZiB0aGUgcmVzZXJ2ZWQgYml0cyB0byAxLiAqLworICAgICAgY29udHJvbF93b3JkIHw9IDB4ZmZmZjAwNDA7CisgICAgICBwYXJ0aWFsX3N0YXR1cyA9IHN0YXR1c193b3JkKCkgfCAweGZmZmYwMDAwOworICAgICAgZnB1X3RhZ193b3JkIHw9IDB4ZmZmZjAwMDA7CisgICAgICBJMzg3LnNvZnQuZmNzICY9IH4weGY4MDAwMDAwOworICAgICAgSTM4Ny5zb2Z0LmZvcyB8PSAweGZmZmYwMDAwOworI2VuZGlmIC8qIFBFQ1VMSUFSXzQ4NiAqLworICAgICAgX19jb3B5X3RvX3VzZXIoZCwgJmNvbnRyb2xfd29yZCwgNyo0KTsKKyAgICAgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CisgICAgICBkICs9IDB4MWM7CisgICAgfQorICAKKyAgY29udHJvbF93b3JkIHw9IENXX0V4Y2VwdGlvbnM7CisgIHBhcnRpYWxfc3RhdHVzICY9IH4oU1dfU3VtbWFyeSB8IFNXX0JhY2t3YXJkKTsKKworICByZXR1cm4gZDsKK30KKworCit2b2lkIGZzYXZlKGZwdV9hZGRyX21vZGVzIGFkZHJfbW9kZXMsIHVfY2hhciBfX3VzZXIgKmRhdGFfYWRkcmVzcykKK3sKKyAgdV9jaGFyIF9fdXNlciAqZDsKKyAgaW50IG9mZnNldCA9ICh0b3AgJiA3KSAqIDEwLCBvdGhlciA9IDgwIC0gb2Zmc2V0OworCisgIGQgPSBmc3RlbnYoYWRkcl9tb2RlcywgZGF0YV9hZGRyZXNzKTsKKworICBSRV9FTlRSQU5UX0NIRUNLX09GRjsKKyAgRlBVX2FjY2Vzc19vayhWRVJJRllfV1JJVEUsZCw4MCk7CisKKyAgLyogQ29weSBhbGwgcmVnaXN0ZXJzIGluIHN0YWNrIG9yZGVyLiAqLworICBfX2NvcHlfdG9fdXNlcihkLCByZWdpc3Rlcl9iYXNlK29mZnNldCwgb3RoZXIpOworICBpZiAoIG9mZnNldCApCisgICAgX19jb3B5X3RvX3VzZXIoZCtvdGhlciwgcmVnaXN0ZXJfYmFzZSwgb2Zmc2V0KTsKKyAgUkVfRU5UUkFOVF9DSEVDS19PTjsKKworICBmaW5pdCgpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWF0aC1lbXUvcmVnX211bC5jIGIvYXJjaC9pMzg2L21hdGgtZW11L3JlZ19tdWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGY1MGI2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L3JlZ19tdWwuYwpAQCAtMCwwICsxLDEzMiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgcmVnX211bC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgTXVsdGlwbHkgb25lIEZQVV9SRUcgYnkgYW5vdGhlciwgcHV0IHRoZSByZXN1bHQgaW4gYSBkZXN0aW5hdGlvbiBGUFVfUkVHLiB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENvcHlyaWdodCAoQykgMTk5MiwxOTkzLDE5OTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICBXLiBNZXR6ZW50aGVuLCAyMiBQYXJrZXIgU3QsIE9ybW9uZCwgVmljIDMxNjMsIEF1c3RyYWxpYSB8CisgfCAgICAgICAgICAgICAgICAgIEUtbWFpbCAgIGJpbGxtQHN1YnVyYmlhLm5ldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgUmV0dXJucyB0aGUgdGFnIG9mIHRoZSByZXN1bHQgaWYgbm8gZXhjZXB0aW9ucyBvciBlcnJvcnMgb2NjdXJyZWQuICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCBUaGUgZGVzdGluYXRpb24gbWF5IGJlIGFueSBGUFVfUkVHLCBpbmNsdWRpbmcgb25lIG9mIHRoZSBzb3VyY2UgRlBVX1JFR3MuIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImZwdV9lbXUuaCIKKyNpbmNsdWRlICJleGNlcHRpb24uaCIKKyNpbmNsdWRlICJyZWdfY29uc3RhbnQuaCIKKyNpbmNsdWRlICJmcHVfc3lzdGVtLmgiCisKKworLyoKKyAgTXVsdGlwbHkgdHdvIHJlZ2lzdGVycyB0byBnaXZlIGEgcmVnaXN0ZXIgcmVzdWx0LgorICBUaGUgc291cmNlcyBhcmUgc3QoZGVzdHN0bnIpIGFuZCAoYix0YWdiLHNpZ25iKS4KKyAgVGhlIGRlc3RpbmF0aW9uIGlzIHN0KGRlc3RzdG5yKS4KKyAgKi8KKy8qIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCB3aXRoIG5vbi1lbXB0eSBzb3VyY2UgcmVnaXN0ZXJzICovCitpbnQgRlBVX211bChGUFVfUkVHIGNvbnN0ICpiLCB1X2NoYXIgdGFnYiwgaW50IGRlc3RzdG5yLCBpbnQgY29udHJvbF93KQoreworICBGUFVfUkVHICphID0gJnN0KGRlc3RzdG5yKTsKKyAgRlBVX1JFRyAqZGVzdCA9IGE7CisgIHVfY2hhciB0YWdhID0gRlBVX2dldHRhZ2koZGVzdHN0bnIpOworICB1X2NoYXIgc2F2ZWRfc2lnbiA9IGdldHNpZ24oZGVzdCk7CisgIHVfY2hhciBzaWduID0gKGdldHNpZ24oYSkgXiBnZXRzaWduKGIpKTsKKyAgaW50IHRhZzsKKworCisgIGlmICggISh0YWdhIHwgdGFnYikgKQorICAgIHsKKyAgICAgIC8qIEJvdGggcmVncyBWYWxpZCwgdGhpcyBzaG91bGQgYmUgdGhlIG1vc3QgY29tbW9uIGNhc2UuICovCisKKyAgICAgIHRhZyA9IEZQVV91X211bChhLCBiLCBkZXN0LCBjb250cm9sX3csIHNpZ24sIGV4cG9uZW50KGEpICsgZXhwb25lbnQoYikpOworICAgICAgaWYgKCB0YWcgPCAwICkKKwl7CisJICBzZXRzaWduKGRlc3QsIHNhdmVkX3NpZ24pOworCSAgcmV0dXJuIHRhZzsKKwl9CisgICAgICBGUFVfc2V0dGFnaShkZXN0c3RuciwgdGFnKTsKKyAgICAgIHJldHVybiB0YWc7CisgICAgfQorCisgIGlmICggdGFnYSA9PSBUQUdfU3BlY2lhbCApCisgICAgdGFnYSA9IEZQVV9TcGVjaWFsKGEpOworICBpZiAoIHRhZ2IgPT0gVEFHX1NwZWNpYWwgKQorICAgIHRhZ2IgPSBGUFVfU3BlY2lhbChiKTsKKworICBpZiAoICgodGFnYSA9PSBUQUdfVmFsaWQpICYmICh0YWdiID09IFRXX0Rlbm9ybWFsKSkKKwkgICAgfHwgKCh0YWdhID09IFRXX0Rlbm9ybWFsKSAmJiAodGFnYiA9PSBUQUdfVmFsaWQpKQorCSAgICB8fCAoKHRhZ2EgPT0gVFdfRGVub3JtYWwpICYmICh0YWdiID09IFRXX0Rlbm9ybWFsKSkgKQorICAgIHsKKyAgICAgIEZQVV9SRUcgeCwgeTsKKyAgICAgIGlmICggZGVub3JtYWxfb3BlcmFuZCgpIDwgMCApCisJcmV0dXJuIEZQVV9FeGNlcHRpb247CisKKyAgICAgIEZQVV90b19leHAxNihhLCAmeCk7CisgICAgICBGUFVfdG9fZXhwMTYoYiwgJnkpOworICAgICAgdGFnID0gRlBVX3VfbXVsKCZ4LCAmeSwgZGVzdCwgY29udHJvbF93LCBzaWduLAorCQkgICAgICBleHBvbmVudDE2KCZ4KSArIGV4cG9uZW50MTYoJnkpKTsKKyAgICAgIGlmICggdGFnIDwgMCApCisJeworCSAgc2V0c2lnbihkZXN0LCBzYXZlZF9zaWduKTsKKwkgIHJldHVybiB0YWc7CisJfQorICAgICAgRlBVX3NldHRhZ2koZGVzdHN0bnIsIHRhZyk7CisgICAgICByZXR1cm4gdGFnOworICAgIH0KKyAgZWxzZSBpZiAoICh0YWdhIDw9IFRXX0Rlbm9ybWFsKSAmJiAodGFnYiA8PSBUV19EZW5vcm1hbCkgKQorICAgIHsKKyAgICAgIGlmICggKCh0YWdiID09IFRXX0Rlbm9ybWFsKSB8fCAodGFnYSA9PSBUV19EZW5vcm1hbCkpCisJICAgJiYgKGRlbm9ybWFsX29wZXJhbmQoKSA8IDApICkKKwlyZXR1cm4gRlBVX0V4Y2VwdGlvbjsKKworICAgICAgLyogTXVzdCBoYXZlIGVpdGhlciBib3RoIGFyZ3VtZW50cyA9PSB6ZXJvLCBvcgorCSBvbmUgdmFsaWQgYW5kIHRoZSBvdGhlciB6ZXJvLgorCSBUaGUgcmVzdWx0IGlzIHRoZXJlZm9yZSB6ZXJvLiAqLworICAgICAgRlBVX2NvcHlfdG9fcmVnaSgmQ09OU1RfWiwgVEFHX1plcm8sIGRlc3RzdG5yKTsKKyAgICAgIC8qIFRoZSA4MDQ4NiBib29rIHNheXMgdGhhdCB0aGUgYW5zd2VyIGlzICswLCBidXQgYSByZWFsCisJIDgwNDg2IGJlaGF2ZXMgdGhpcyB3YXkuCisJIElFRUUtNzU0IGFwcGFyZW50bHkgc2F5cyBpdCBzaG91bGQgYmUgdGhpcyB3YXkuICovCisgICAgICBzZXRzaWduKGRlc3QsIHNpZ24pOworICAgICAgcmV0dXJuIFRBR19aZXJvOworICAgIH0KKyAgICAgIC8qIE11c3QgaGF2ZSBpbmZpbml0aWVzLCBOYU5zLCBldGMgKi8KKyAgZWxzZSBpZiAoICh0YWdhID09IFRXX05hTikgfHwgKHRhZ2IgPT0gVFdfTmFOKSApCisgICAgeworICAgICAgcmV0dXJuIHJlYWxfMm9wX05hTihiLCB0YWdiLCBkZXN0c3RuciwgJnN0KDApKTsKKyAgICB9CisgIGVsc2UgaWYgKCAoKHRhZ2EgPT0gVFdfSW5maW5pdHkpICYmICh0YWdiID09IFRBR19aZXJvKSkKKwkgICAgfHwgKCh0YWdiID09IFRXX0luZmluaXR5KSAmJiAodGFnYSA9PSBUQUdfWmVybykpICkKKyAgICB7CisgICAgICByZXR1cm4gYXJpdGhfaW52YWxpZChkZXN0c3Rucik7ICAvKiBaZXJvKkluZmluaXR5IGlzIGludmFsaWQgKi8KKyAgICB9CisgIGVsc2UgaWYgKCAoKHRhZ2EgPT0gVFdfRGVub3JtYWwpIHx8ICh0YWdiID09IFRXX0Rlbm9ybWFsKSkKKwkgICAgJiYgKGRlbm9ybWFsX29wZXJhbmQoKSA8IDApICkKKyAgICB7CisgICAgICByZXR1cm4gRlBVX0V4Y2VwdGlvbjsKKyAgICB9CisgIGVsc2UgaWYgKHRhZ2EgPT0gVFdfSW5maW5pdHkpCisgICAgeworICAgICAgRlBVX2NvcHlfdG9fcmVnaShhLCBUQUdfU3BlY2lhbCwgZGVzdHN0bnIpOworICAgICAgc2V0c2lnbihkZXN0LCBzaWduKTsKKyAgICAgIHJldHVybiBUQUdfU3BlY2lhbDsKKyAgICB9CisgIGVsc2UgaWYgKHRhZ2IgPT0gVFdfSW5maW5pdHkpCisgICAgeworICAgICAgRlBVX2NvcHlfdG9fcmVnaShiLCBUQUdfU3BlY2lhbCwgZGVzdHN0bnIpOworICAgICAgc2V0c2lnbihkZXN0LCBzaWduKTsKKyAgICAgIHJldHVybiBUQUdfU3BlY2lhbDsKKyAgICB9CisKKyNpZmRlZiBQQVJBTk9JRAorICBlbHNlCisgICAgeworICAgICAgRVhDRVBUSU9OKEVYX0lOVEVSTkFMfDB4MTAyKTsKKyAgICAgIHJldHVybiBGUFVfRXhjZXB0aW9uOworICAgIH0KKyNlbmRpZiAvKiBQQVJBTk9JRCAqLyAKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hdGgtZW11L3JlZ19ub3JtLlMgYi9hcmNoL2kzODYvbWF0aC1lbXUvcmVnX25vcm0uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjYzNTJlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L3JlZ19ub3JtLlMKQEAgLTAsMCArMSwxNDcgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgIHJlZ19ub3JtLlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENvcHlyaWdodCAoQykgMTk5MiwxOTkzLDE5OTQsMTk5NSwxOTk3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgQXVzdHJhbGlhLiAgRS1tYWlsIGJpbGxtQHN1YnVyYmlhLm5ldCAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgTm9ybWFsaXplIHRoZSB2YWx1ZSBpbiBhIEZQVV9SRUcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENhbGwgZnJvbSBDIGFzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgaW50IEZQVV9ub3JtYWxpemUoRlBVX1JFRyAqbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgIGludCBGUFVfbm9ybWFsaXplX251byhGUFVfUkVHICpuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICBSZXR1cm4gdmFsdWUgaXMgdGhlIHRhZyBvZiB0aGUgYW5zd2VyLCBvci1lZCB3aXRoIEZQVV9FeGNlcHRpb24gaWYgICAgIHwKKyB8ICAgIG9uZSB3YXMgcmFpc2VkLCBvciAtMSBvbiBpbnRlcm5hbCBlcnJvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJmcHVfZW11LmgiCisKKworLnRleHQKK0VOVFJZKEZQVV9ub3JtYWxpemUpCisJcHVzaGwJJWVicAorCW1vdmwJJWVzcCwlZWJwCisJcHVzaGwJJWVieAorCisJbW92bAlQQVJBTTEsJWVieAorCisJbW92bAlTSUdIKCVlYngpLCVlZHgKKwltb3ZsCVNJR0woJWVieCksJWVheAorCisJb3JsCSVlZHgsJWVkeAkvKiBtcyBiaXRzICovCisJanMJTF9kb25lCQkvKiBBbHJlYWR5IG5vcm1hbGl6ZWQgKi8KKwlqbnoJTF9zaGlmdF8xCS8qIFNoaWZ0IGxlZnQgMSAtIDMxIGJpdHMgKi8KKworCW9ybAklZWF4LCVlYXgKKwlqeglMX3plcm8JCS8qIFRoZSBjb250ZW50cyBhcmUgemVybyAqLworCisJbW92bAklZWF4LCVlZHgKKwl4b3JsCSVlYXgsJWVheAorCXN1YncJJDMyLEVYUCglZWJ4KQkvKiBUaGlzIGNhbiBjYXVzZSBhbiB1bmRlcmZsb3cgKi8KKworLyogV2UgbmVlZCB0byBzaGlmdCBsZWZ0IGJ5IDEgLSAzMSBiaXRzICovCitMX3NoaWZ0XzE6CisJYnNybAklZWR4LCVlY3gJLyogZ2V0IHRoZSByZXF1aXJlZCBzaGlmdCBpbiAlZWN4ICovCisJc3VibAkkMzEsJWVjeAorCW5lZ2wJJWVjeAorCXNobGQJJWNsLCVlYXgsJWVkeAorCXNobAklY2wsJWVheAorCXN1YncJJWN4LEVYUCglZWJ4KQkvKiBUaGlzIGNhbiBjYXVzZSBhbiB1bmRlcmZsb3cgKi8KKworCW1vdmwJJWVkeCxTSUdIKCVlYngpCisJbW92bAklZWF4LFNJR0woJWVieCkKKworTF9kb25lOgorCWNtcHcJRVhQX09WRVIsRVhQKCVlYngpCisJamdlCUxfb3ZlcmZsb3cKKworCWNtcHcJRVhQX1VOREVSLEVYUCglZWJ4KQorCWpsZQlMX3VuZGVyZmxvdworCitMX2V4aXRfdmFsaWQ6CisJbW92bAlUQUdfVmFsaWQsJWVheAorCisJLyogQ29udmVydCB0aGUgZXhwb25lbnQgdG8gODB4ODcgZm9ybS4gKi8KKwlhZGR3CUVYVEVOREVEX0ViaWFzLEVYUCglZWJ4KQorCWFuZHcJJDB4N2ZmZixFWFAoJWVieCkKKworTF9leGl0OgorCXBvcGwJJWVieAorCWxlYXZlCisJcmV0CisKKworTF96ZXJvOgorCW1vdncJJDAsRVhQKCVlYngpCisJbW92bAlUQUdfWmVybywlZWF4CisJam1wCUxfZXhpdAorCitMX3VuZGVyZmxvdzoKKwkvKiBDb252ZXJ0IHRoZSBleHBvbmVudCB0byA4MHg4NyBmb3JtLiAqLworCWFkZHcJRVhURU5ERURfRWJpYXMsRVhQKCVlYngpCisJcHVzaAklZWJ4CisJY2FsbAlhcml0aF91bmRlcmZsb3cKKwlwb3AJJWVieAorCWptcAlMX2V4aXQKKworTF9vdmVyZmxvdzoKKwkvKiBDb252ZXJ0IHRoZSBleHBvbmVudCB0byA4MHg4NyBmb3JtLiAqLworCWFkZHcJRVhURU5ERURfRWJpYXMsRVhQKCVlYngpCisJcHVzaAklZWJ4CisJY2FsbAlhcml0aF9vdmVyZmxvdworCXBvcAklZWJ4CisJam1wCUxfZXhpdAorCisKKworLyogTm9ybWFsaXNlIHdpdGhvdXQgcmVwb3J0aW5nIHVuZGVyZmxvdyBvciBvdmVyZmxvdyAqLworRU5UUlkoRlBVX25vcm1hbGl6ZV9udW8pCisJcHVzaGwJJWVicAorCW1vdmwJJWVzcCwlZWJwCisJcHVzaGwJJWVieAorCisJbW92bAlQQVJBTTEsJWVieAorCisJbW92bAlTSUdIKCVlYngpLCVlZHgKKwltb3ZsCVNJR0woJWVieCksJWVheAorCisJb3JsCSVlZHgsJWVkeAkvKiBtcyBiaXRzICovCisJanMJTF9leGl0X251b192YWxpZAkvKiBBbHJlYWR5IG5vcm1hbGl6ZWQgKi8KKwlqbnoJTF9udW9fc2hpZnRfMQkvKiBTaGlmdCBsZWZ0IDEgLSAzMSBiaXRzICovCisKKwlvcmwJJWVheCwlZWF4CisJanoJTF9leGl0X251b196ZXJvCQkvKiBUaGUgY29udGVudHMgYXJlIHplcm8gKi8KKworCW1vdmwJJWVheCwlZWR4CisJeG9ybAklZWF4LCVlYXgKKwlzdWJ3CSQzMixFWFAoJWVieCkJLyogVGhpcyBjYW4gY2F1c2UgYW4gdW5kZXJmbG93ICovCisKKy8qIFdlIG5lZWQgdG8gc2hpZnQgbGVmdCBieSAxIC0gMzEgYml0cyAqLworTF9udW9fc2hpZnRfMToKKwlic3JsCSVlZHgsJWVjeAkvKiBnZXQgdGhlIHJlcXVpcmVkIHNoaWZ0IGluICVlY3ggKi8KKwlzdWJsCSQzMSwlZWN4CisJbmVnbAklZWN4CisJc2hsZAklY2wsJWVheCwlZWR4CisJc2hsCSVjbCwlZWF4CisJc3VidwklY3gsRVhQKCVlYngpCS8qIFRoaXMgY2FuIGNhdXNlIGFuIHVuZGVyZmxvdyAqLworCisJbW92bAklZWR4LFNJR0goJWVieCkKKwltb3ZsCSVlYXgsU0lHTCglZWJ4KQorCitMX2V4aXRfbnVvX3ZhbGlkOgorCW1vdmwJVEFHX1ZhbGlkLCVlYXgKKworCXBvcGwJJWVieAorCWxlYXZlCisJcmV0CisKK0xfZXhpdF9udW9femVybzoKKwltb3ZsCVRBR19aZXJvLCVlYXgKKwltb3Z3CUVYUF9VTkRFUixFWFAoJWVieCkKKworCXBvcGwJJWVieAorCWxlYXZlCisJcmV0CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWF0aC1lbXUvcmVnX3JvdW5kLlMgYi9hcmNoL2kzODYvbWF0aC1lbXUvcmVnX3JvdW5kLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFkNGU0OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9yZWdfcm91bmQuUwpAQCAtMCwwICsxLDcwOCBAQAorCS5maWxlICJyZWdfcm91bmQuUyIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgIHJlZ19yb3VuZC5TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IFJvdW5kaW5nL3RydW5jYXRpb24vZXRjIGZvciBGUFUgYmFzaWMgYXJpdGhtZXRpYyBmdW5jdGlvbnMuICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDb3B5cmlnaHQgKEMpIDE5OTMsMTk5NSwxOTk3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICBXLiBNZXR6ZW50aGVuLCAyMiBQYXJrZXIgU3QsIE9ybW9uZCwgVmljIDMxNjMsICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgIEF1c3RyYWxpYS4gIEUtbWFpbCBiaWxsbUBzdWJ1cmJpYS5uZXQgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IFRoaXMgY29kZSBoYXMgZm91ciBwb3NzaWJsZSBlbnRyeSBwb2ludHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgVGhlIGZvbGxvd2luZyBtdXN0IGJlIGVudGVyZWQgYnkgYSBqbXAgaW5zdHJ1Y3Rpb246ICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgIGZwdV9yZWdfcm91bmQsIGZwdV9yZWdfcm91bmRfc3FydCwgYW5kIGZwdV9Bcml0aF9leGl0LiAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgVGhlIEZQVV9yb3VuZCBlbnRyeSBwb2ludCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IEMgY29kZS4gICAgICAgICAgICAgICB8CisgfCBGcm9tIEMsIGNhbGwgYXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICBpbnQgRlBVX3JvdW5kKEZQVV9SRUcgKmFyZywgdW5zaWduZWQgaW50IGV4dGVudCwgdW5zaWduZWQgaW50IGNvbnRyb2xfdykgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICBSZXR1cm4gdmFsdWUgaXMgdGhlIHRhZyBvZiB0aGUgYW5zd2VyLCBvci1lZCB3aXRoIEZQVV9FeGNlcHRpb24gaWYgICAgIHwKKyB8ICAgIG9uZSB3YXMgcmFpc2VkLCBvciAtMSBvbiBpbnRlcm5hbCBlcnJvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBGb3IgY29ycmVjdCAidXAiIGFuZCAiZG93biIgcm91bmRpbmcsIHRoZSBhcmd1bWVudCBtdXN0IGhhdmUgdGhlIGNvcnJlY3QgIHwKKyB8IHNpZ24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgRm91ciBlbnRyeSBwb2ludHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IE5lZWRlZCBieSBib3RoIHRoZSBmcHVfcmVnX3JvdW5kIGFuZCBmcHVfcmVnX3JvdW5kX3NxcnQgZW50cnkgcG9pbnRzOiAgICAgfAorIHwgICVlYXg6JWVieCAgNjQgYml0IHNpZ25pZmljYW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgJWVkeCAgICAgICAzMiBiaXQgZXh0ZW5zaW9uIG9mIHRoZSBzaWduaWZpY2FuZCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAlZWRpICAgICAgIHBvaW50ZXIgdG8gYW4gRlBVX1JFRyBmb3IgdGhlIHJlc3VsdCB0byBiZSBzdG9yZWQgICAgICAgICAgICAgfAorIHwgIHN0YWNrICAgICAgY2FsbGluZyBmdW5jdGlvbiBtdXN0IGhhdmUgc2V0IHVwIGEgQyBzdGFjayBmcmFtZSBhbmQgICAgICAgICB8CisgfCAgICAgICAgICAgICBwdXNoZWQgJWVzaSwgJWVkaSwgYW5kICVlYnggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgTmVlZGVkIGp1c3QgZm9yIHRoZSBmcHVfcmVnX3JvdW5kX3NxcnQgZW50cnkgcG9pbnQ6ICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgJWN4ICBBIGNvbnRyb2wgd29yZCBpbiB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlIEZQVSBjb250cm9sIHdvcmQuICAgICAgICAgIHwKKyB8IE90aGVyd2lzZSwgUEFSQU00IG11c3QgZ2l2ZSBzdWNoIGEgdmFsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IFRoZSBzaWduaWZpY2FuZCBhbmQgaXRzIGV4dGVuc2lvbiBhcmUgYXNzdW1lZCB0byBiZSBleGFjdCBpbiB0aGUgICAgICAgICAgfAorIHwgZm9sbG93aW5nIHNlbnNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgIElmIHRoZSBzaWduaWZpY2FuZCBieSBpdHNlbGYgaXMgdGhlIGV4YWN0IHJlc3VsdCB0aGVuIHRoZSBzaWduaWZpY2FuZCAgIHwKKyB8ICAgZXh0ZW5zaW9uICglZWR4KSBtdXN0IGNvbnRhaW4gMCwgb3RoZXJ3aXNlIHRoZSBzaWduaWZpY2FuZCBleHRlbnNpb24gICAgfAorIHwgICBtdXN0IGJlIG5vbi16ZXJvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgIElmIHRoZSBzaWduaWZpY2FuZCBleHRlbnNpb24gaXMgbm9uLXplcm8gdGhlbiB0aGUgc2lnbmlmaWNhbmQgaXMgICAgICAgIHwKKyB8ICAgc21hbGxlciB0aGFuIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGNvcnJlY3QgZXhhY3QgcmVzdWx0IGJ5IGFuIGFtb3VudCAgICAgfAorIHwgICBncmVhdGVyIHRoYW4gemVybyBhbmQgbGVzcyB0aGFuIG9uZSBscyBiaXQgb2YgdGhlIHNpZ25pZmljYW5kLiAgICAgICAgICB8CisgfCAgIFRoZSBzaWduaWZpY2FuZCBleHRlbnNpb24gaXMgb25seSByZXF1aXJlZCB0byBoYXZlIHRocmVlIHBvc3NpYmxlICAgICAgIHwKKyB8ICAgbm9uLXplcm8gdmFsdWVzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgbGVzcyB0aGFuIDB4ODAwMDAwMDAgIDw9PiB0aGUgc2lnbmlmaWNhbmQgaXMgbGVzcyB0aGFuIDEvMiBhbiBscyAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdCBzbWFsbGVyIHRoYW4gdGhlIG1hZ25pdHVkZSBvZiB0aGUgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSBleGFjdCByZXN1bHQuICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICBleGFjdGx5IDB4ODAwMDAwMDAgIDw9PiB0aGUgc2lnbmlmaWNhbmQgaXMgZXhhY3RseSAxLzIgYW4gbHMgYml0ICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtYWxsZXIgdGhhbiB0aGUgbWFnbml0dWRlIG9mIHRoZSB0cnVlICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3QgcmVzdWx0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgZ3JlYXRlciB0aGFuIDB4ODAwMDAwMDAgIDw9PiB0aGUgc2lnbmlmaWNhbmQgaXMgbW9yZSB0aGFuIDEvMiBhbiBscyAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdCBzbWFsbGVyIHRoYW4gdGhlIG1hZ25pdHVkZSBvZiB0aGUgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSBleGFjdCByZXN1bHQuICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgIFRoZSBjb2RlIGluIHRoaXMgbW9kdWxlIGhhcyBiZWNvbWUgcXVpdGUgY29tcGxleCwgYnV0IGl0IHNob3VsZCBoYW5kbGUgICB8CisgfCAgYWxsIG9mIHRoZSBGUFUgZmxhZ3Mgd2hpY2ggYXJlIHNldCBhdCB0aGlzIHN0YWdlIG9mIHRoZSBiYXNpYyBhcml0aG1ldGljIHwKKyB8ICBjb21wdXRhdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgIFRoZXJlIGFyZSBhIGZldyByYXJlIGNhc2VzIHdoZXJlIHRoZSByZXN1bHRzIGFyZSBub3Qgc2V0IGlkZW50aWNhbGx5IHRvICB8CisgfCAgYSByZWFsIEZQVS4gVGhlc2UgcmVxdWlyZSBhIGJpdCBtb3JlIHRob3VnaHQgYmVjYXVzZSBhdCB0aGlzIHN0YWdlIHRoZSAgIHwKKyB8ICByZXN1bHRzIG9mIHRoZSBjb2RlIGhlcmUgYXBwZWFyIHRvIGJlIG1vcmUgY29uc2lzdGVudC4uLiAgICAgICAgICAgICAgICAgfAorIHwgIFRoaXMgbWF5IGJlIGNoYW5nZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworI2luY2x1ZGUgImZwdV9lbXUuaCIKKyNpbmNsdWRlICJleGNlcHRpb24uaCIKKyNpbmNsdWRlICJjb250cm9sX3cuaCIKKworLyogRmxhZ3MgZm9yIEZQVV9iaXRzX2xvc3QgKi8KKyNkZWZpbmUJTE9TVF9ET1dOCSQxCisjZGVmaW5lCUxPU1RfVVAJCSQyCisKKy8qIEZsYWdzIGZvciBGUFVfZGVub3JtYWwgKi8KKyNkZWZpbmUJREVOT1JNQUwJJDEKKyNkZWZpbmUJVU5NQVNLRURfVU5ERVJGTE9XICQyCisKKworI2lmbmRlZiBOT05fUkVFTlRSQU5UX0ZQVQorLyoJTWFrZSB0aGUgY29kZSByZS1lbnRyYW50IGJ5IHB1dHRpbmcKKwlsb2NhbCBzdG9yYWdlIG9uIHRoZSBzdGFjazogKi8KKyNkZWZpbmUgRlBVX2JpdHNfbG9zdAkoJWVzcCkKKyNkZWZpbmUgRlBVX2Rlbm9ybWFsCTEoJWVzcCkKKworI2Vsc2UKKy8qCU5vdCByZS1lbnRyYW50LCBzbyB3ZSBjYW4gZ2FpbiBzcGVlZCBieSBwdXR0aW5nCisJbG9jYWwgc3RvcmFnZSBpbiBhIHN0YXRpYyBhcmVhOiAqLworLmRhdGEKKwkuYWxpZ24gNCwwCitGUFVfYml0c19sb3N0OgorCS5ieXRlCTAKK0ZQVV9kZW5vcm1hbDoKKwkuYnl0ZQkwCisjZW5kaWYgLyogTk9OX1JFRU5UUkFOVF9GUFUgKi8KKworCisudGV4dAorLmdsb2JsIGZwdV9yZWdfcm91bmQKKy5nbG9ibCBmcHVfQXJpdGhfZXhpdAorCisvKiBFbnRyeSBwb2ludCB3aGVuIGNhbGxlZCBmcm9tIEMgKi8KK0VOVFJZKEZQVV9yb3VuZCkKKwlwdXNobAklZWJwCisJbW92bAklZXNwLCVlYnAKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCXB1c2hsCSVlYngKKworCW1vdmwJUEFSQU0xLCVlZGkKKwltb3ZsCVNJR0goJWVkaSksJWVheAorCW1vdmwJU0lHTCglZWRpKSwlZWJ4CisJbW92bAlQQVJBTTIsJWVkeAorCitmcHVfcmVnX3JvdW5kOgkJCS8qIE5vcm1hbCBlbnRyeSBwb2ludCAqLworCW1vdmwJUEFSQU00LCVlY3gKKworI2lmbmRlZiBOT05fUkVFTlRSQU5UX0ZQVQorCXB1c2hsCSVlYngJCS8qIGFkanVzdCB0aGUgc3RhY2sgcG9pbnRlciAqLworI2VuZGlmIC8qIE5PTl9SRUVOVFJBTlRfRlBVICovIAorCisjaWZkZWYgUEFSQU5PSUQKKy8qIENhbm5vdCB1c2UgdGhpcyBoZXJlIHlldCAqLworLyoJb3JsCSVlYXgsJWVheCAqLworLyoJam5zCUxfZW50cnlfYnVnZ2VkICovCisjZW5kaWYgLyogUEFSQU5PSUQgKi8KKworCWNtcHcJRVhQX1VOREVSLEVYUCglZWRpKQorCWpsZQlMX01ha2VfZGVub3JtCQkJLyogVGhlIG51bWJlciBpcyBhIGRlLW5vcm1hbCAqLworCisJbW92YgkkMCxGUFVfZGVub3JtYWwJCQkvKiAwIC0+IG5vdCBhIGRlLW5vcm1hbCAqLworCitEZW5vcm1fZG9uZToKKwltb3ZiCSQwLEZQVV9iaXRzX2xvc3QJCS8qIE5vIGJpdHMgeWV0IGxvc3QgaW4gcm91bmRpbmcgKi8KKworCW1vdmwJJWVjeCwlZXNpCisJYW5kbAlDV19QQywlZWN4CisJY21wbAlQUl82NF9CSVRTLCVlY3gKKwlqZQlMUm91bmRfVG9fNjQKKworCWNtcGwJUFJfNTNfQklUUywlZWN4CisJamUJTFJvdW5kX1RvXzUzCisKKwljbXBsCVBSXzI0X0JJVFMsJWVjeAorCWplCUxSb3VuZF9Ub18yNAorCisjaWZkZWYgUEVDVUxJQVJfNDg2CisvKiBXaXRoIHRoZSBwcmVjaXNpb24gY29udHJvbCBiaXRzIHNldCB0byAwMSAiKHJlc2VydmVkKSIsIGEgcmVhbCA4MDQ4NgorICAgYmVoYXZlcyBhcyBpZiB0aGUgcHJlY2lzaW9uIGNvbnRyb2wgYml0cyB3ZXJlIHNldCB0byAxMSAiNjQgYml0cyIgKi8KKwljbXBsCVBSX1JFU0VSVkVEX0JJVFMsJWVjeAorCWplCUxSb3VuZF9Ub182NAorI2lmZGVmIFBBUkFOT0lECisJam1wCUxfYnVnZ2VkX2Rlbm9ybV80ODYKKyNlbmRpZiAvKiBQQVJBTk9JRCAqLyAKKyNlbHNlCisjaWZkZWYgUEFSQU5PSUQKKwlqbXAJTF9idWdnZWRfZGVub3JtCS8qIFRoZXJlIGlzIG5vIGJ1ZywganVzdCBhIGJhZCBjb250cm9sIHdvcmQgKi8KKyNlbmRpZiAvKiBQQVJBTk9JRCAqLyAKKyNlbmRpZiAvKiBQRUNVTElBUl80ODYgKi8KKworCisvKiBSb3VuZCBldGMgdG8gMjQgYml0IHByZWNpc2lvbiAqLworTFJvdW5kX1RvXzI0OgorCW1vdmwJJWVzaSwlZWN4CisJYW5kbAlDV19SQywlZWN4CisJY21wbAlSQ19STkQsJWVjeAorCWplCUxSb3VuZF9uZWFyZXN0XzI0CisKKwljbXBsCVJDX0NIT1AsJWVjeAorCWplCUxDaGVja190cnVuY2F0ZV8yNAorCisJY21wbAlSQ19VUCwlZWN4CQkvKiBUb3dhcmRzICtpbmZpbml0eSAqLworCWplCUxVcF8yNAorCisJY21wbAlSQ19ET1dOLCVlY3gJCS8qIFRvd2FyZHMgLWluZmluaXR5ICovCisJamUJTERvd25fMjQKKworI2lmZGVmIFBBUkFOT0lECisJam1wCUxfYnVnZ2VkX3JvdW5kMjQKKyNlbmRpZiAvKiBQQVJBTk9JRCAqLyAKKworTFVwXzI0OgorCWNtcGIJU0lHTl9QT1MsUEFSQU01CisJam5lCUxDaGVja190cnVuY2F0ZV8yNAkvKiBJZiBuZWdhdGl2ZSB0aGVuICB1cD09dHJ1bmNhdGUgKi8KKworCWptcAlMQ2hlY2tfMjRfcm91bmRfdXAKKworTERvd25fMjQ6CisJY21wYglTSUdOX1BPUyxQQVJBTTUKKwlqZQlMQ2hlY2tfdHJ1bmNhdGVfMjQJLyogSWYgcG9zaXRpdmUgdGhlbiAgZG93bj09dHJ1bmNhdGUgKi8KKworTENoZWNrXzI0X3JvdW5kX3VwOgorCW1vdmwJJWVheCwlZWN4CisJYW5kbAkkMHgwMDAwMDBmZiwlZWN4CisJb3JsCSVlYngsJWVjeAorCW9ybAklZWR4LCVlY3gKKwlqbnoJTERvXzI0X3JvdW5kX3VwCisJam1wCUxfUmVfbm9ybWFsaXNlCisKK0xSb3VuZF9uZWFyZXN0XzI0OgorCS8qIERvIHJvdW5kaW5nIG9mIHRoZSAyNHRoIGJpdCBpZiBuZWVkZWQgKG5lYXJlc3Qgb3IgZXZlbikgKi8KKwltb3ZsCSVlYXgsJWVjeAorCWFuZGwJJDB4MDAwMDAwZmYsJWVjeAorCWNtcGwJJDB4MDAwMDAwODAsJWVjeAorCWpjCUxDaGVja190cnVuY2F0ZV8yNAkvKiBsZXNzIHRoYW4gaGFsZiwgbm8gaW5jcmVtZW50IG5lZWRlZCAqLworCisJam5lCUxHcmVhdGVyX0hhbGZfMjQJLyogZ3JlYXRlciB0aGFuIGhhbGYsIGluY3JlbWVudCBuZWVkZWQgKi8KKworCS8qIFBvc3NpYmx5IGhhbGYsIHdlIG5lZWQgdG8gY2hlY2sgdGhlIGxzIGJpdHMgKi8KKwlvcmwJJWVieCwlZWJ4CisJam56CUxHcmVhdGVyX0hhbGZfMjQJLyogZ3JlYXRlciB0aGFuIGhhbGYsIGluY3JlbWVudCBuZWVkZWQgKi8KKworCW9ybAklZWR4LCVlZHgKKwlqbnoJTEdyZWF0ZXJfSGFsZl8yNAkvKiBncmVhdGVyIHRoYW4gaGFsZiwgaW5jcmVtZW50IG5lZWRlZCAqLworCisJLyogRXhhY3RseSBoYWxmLCBpbmNyZW1lbnQgb25seSBpZiAyNHRoIGJpdCBpcyAxIChyb3VuZCB0byBldmVuKSAqLworCXRlc3RsCSQweDAwMDAwMTAwLCVlYXgKKwlqeglMRG9fdHJ1bmNhdGVfMjQKKworTEdyZWF0ZXJfSGFsZl8yNDoJCQkvKiBSb3VuZGluZzogaW5jcmVtZW50IGF0IHRoZSAyNHRoIGJpdCAqLworTERvXzI0X3JvdW5kX3VwOgorCWFuZGwJJDB4ZmZmZmZmMDAsJWVheAkvKiBUcnVuY2F0ZSB0byAyNCBiaXRzICovCisJeG9ybAklZWJ4LCVlYngKKwltb3ZiCUxPU1RfVVAsRlBVX2JpdHNfbG9zdAorCWFkZGwJJDB4MDAwMDAxMDAsJWVheAorCWptcAlMQ2hlY2tfUm91bmRfT3ZlcmZsb3cKKworTENoZWNrX3RydW5jYXRlXzI0OgorCW1vdmwJJWVheCwlZWN4CisJYW5kbAkkMHgwMDAwMDBmZiwlZWN4CisJb3JsCSVlYngsJWVjeAorCW9ybAklZWR4LCVlY3gKKwlqeglMX1JlX25vcm1hbGlzZQkJLyogTm8gdHJ1bmNhdGlvbiBuZWVkZWQgKi8KKworTERvX3RydW5jYXRlXzI0OgorCWFuZGwJJDB4ZmZmZmZmMDAsJWVheAkvKiBUcnVuY2F0ZSB0byAyNCBiaXRzICovCisJeG9ybAklZWJ4LCVlYngKKwltb3ZiCUxPU1RfRE9XTixGUFVfYml0c19sb3N0CisJam1wCUxfUmVfbm9ybWFsaXNlCisKKworLyogUm91bmQgZXRjIHRvIDUzIGJpdCBwcmVjaXNpb24gKi8KK0xSb3VuZF9Ub181MzoKKwltb3ZsCSVlc2ksJWVjeAorCWFuZGwJQ1dfUkMsJWVjeAorCWNtcGwJUkNfUk5ELCVlY3gKKwlqZQlMUm91bmRfbmVhcmVzdF81MworCisJY21wbAlSQ19DSE9QLCVlY3gKKwlqZQlMQ2hlY2tfdHJ1bmNhdGVfNTMKKworCWNtcGwJUkNfVVAsJWVjeAkJLyogVG93YXJkcyAraW5maW5pdHkgKi8KKwlqZQlMVXBfNTMKKworCWNtcGwJUkNfRE9XTiwlZWN4CQkvKiBUb3dhcmRzIC1pbmZpbml0eSAqLworCWplCUxEb3duXzUzCisKKyNpZmRlZiBQQVJBTk9JRAorCWptcAlMX2J1Z2dlZF9yb3VuZDUzCisjZW5kaWYgLyogUEFSQU5PSUQgKi8gCisKK0xVcF81MzoKKwljbXBiCVNJR05fUE9TLFBBUkFNNQorCWpuZQlMQ2hlY2tfdHJ1bmNhdGVfNTMJLyogSWYgbmVnYXRpdmUgdGhlbiAgdXA9PXRydW5jYXRlICovCisKKwlqbXAJTENoZWNrXzUzX3JvdW5kX3VwCisKK0xEb3duXzUzOgorCWNtcGIJU0lHTl9QT1MsUEFSQU01CisJamUJTENoZWNrX3RydW5jYXRlXzUzCS8qIElmIHBvc2l0aXZlIHRoZW4gIGRvd249PXRydW5jYXRlICovCisKK0xDaGVja181M19yb3VuZF91cDoKKwltb3ZsCSVlYngsJWVjeAorCWFuZGwJJDB4MDAwMDA3ZmYsJWVjeAorCW9ybAklZWR4LCVlY3gKKwlqbnoJTERvXzUzX3JvdW5kX3VwCisJam1wCUxfUmVfbm9ybWFsaXNlCisKK0xSb3VuZF9uZWFyZXN0XzUzOgorCS8qIERvIHJvdW5kaW5nIG9mIHRoZSA1M3JkIGJpdCBpZiBuZWVkZWQgKG5lYXJlc3Qgb3IgZXZlbikgKi8KKwltb3ZsCSVlYngsJWVjeAorCWFuZGwJJDB4MDAwMDA3ZmYsJWVjeAorCWNtcGwJJDB4MDAwMDA0MDAsJWVjeAorCWpjCUxDaGVja190cnVuY2F0ZV81MwkvKiBsZXNzIHRoYW4gaGFsZiwgbm8gaW5jcmVtZW50IG5lZWRlZCAqLworCisJam56CUxHcmVhdGVyX0hhbGZfNTMJLyogZ3JlYXRlciB0aGFuIGhhbGYsIGluY3JlbWVudCBuZWVkZWQgKi8KKworCS8qIFBvc3NpYmx5IGhhbGYsIHdlIG5lZWQgdG8gY2hlY2sgdGhlIGxzIGJpdHMgKi8KKwlvcmwJJWVkeCwlZWR4CisJam56CUxHcmVhdGVyX0hhbGZfNTMJLyogZ3JlYXRlciB0aGFuIGhhbGYsIGluY3JlbWVudCBuZWVkZWQgKi8KKworCS8qIEV4YWN0bHkgaGFsZiwgaW5jcmVtZW50IG9ubHkgaWYgNTNyZCBiaXQgaXMgMSAocm91bmQgdG8gZXZlbikgKi8KKwl0ZXN0bAkkMHgwMDAwMDgwMCwlZWJ4CisJanoJTFRydW5jYXRlXzUzCisKK0xHcmVhdGVyX0hhbGZfNTM6CQkJLyogUm91bmRpbmc6IGluY3JlbWVudCBhdCB0aGUgNTNyZCBiaXQgKi8KK0xEb181M19yb3VuZF91cDoKKwltb3ZiCUxPU1RfVVAsRlBVX2JpdHNfbG9zdAorCWFuZGwJJDB4ZmZmZmY4MDAsJWVieAkvKiBUcnVuY2F0ZSB0byA1MyBiaXRzICovCisJYWRkbAkkMHgwMDAwMDgwMCwlZWJ4CisJYWRjbAkkMCwlZWF4CisJam1wCUxDaGVja19Sb3VuZF9PdmVyZmxvdworCitMQ2hlY2tfdHJ1bmNhdGVfNTM6CisJbW92bAklZWJ4LCVlY3gKKwlhbmRsCSQweDAwMDAwN2ZmLCVlY3gKKwlvcmwJJWVkeCwlZWN4CisJanoJTF9SZV9ub3JtYWxpc2UKKworTFRydW5jYXRlXzUzOgorCW1vdmIJTE9TVF9ET1dOLEZQVV9iaXRzX2xvc3QKKwlhbmRsCSQweGZmZmZmODAwLCVlYngJLyogVHJ1bmNhdGUgdG8gNTMgYml0cyAqLworCWptcAlMX1JlX25vcm1hbGlzZQorCisKKy8qIFJvdW5kIGV0YyB0byA2NCBiaXQgcHJlY2lzaW9uICovCitMUm91bmRfVG9fNjQ6CisJbW92bAklZXNpLCVlY3gKKwlhbmRsCUNXX1JDLCVlY3gKKwljbXBsCVJDX1JORCwlZWN4CisJamUJTFJvdW5kX25lYXJlc3RfNjQKKworCWNtcGwJUkNfQ0hPUCwlZWN4CisJamUJTENoZWNrX3RydW5jYXRlXzY0CisKKwljbXBsCVJDX1VQLCVlY3gJCS8qIFRvd2FyZHMgK2luZmluaXR5ICovCisJamUJTFVwXzY0CisKKwljbXBsCVJDX0RPV04sJWVjeAkJLyogVG93YXJkcyAtaW5maW5pdHkgKi8KKwlqZQlMRG93bl82NAorCisjaWZkZWYgUEFSQU5PSUQKKwlqbXAJTF9idWdnZWRfcm91bmQ2NAorI2VuZGlmIC8qIFBBUkFOT0lEICovIAorCitMVXBfNjQ6CisJY21wYglTSUdOX1BPUyxQQVJBTTUKKwlqbmUJTENoZWNrX3RydW5jYXRlXzY0CS8qIElmIG5lZ2F0aXZlIHRoZW4gIHVwPT10cnVuY2F0ZSAqLworCisJb3JsCSVlZHgsJWVkeAorCWpueglMRG9fNjRfcm91bmRfdXAKKwlqbXAJTF9SZV9ub3JtYWxpc2UKKworTERvd25fNjQ6CisJY21wYglTSUdOX1BPUyxQQVJBTTUKKwlqZQlMQ2hlY2tfdHJ1bmNhdGVfNjQJLyogSWYgcG9zaXRpdmUgdGhlbiAgZG93bj09dHJ1bmNhdGUgKi8KKworCW9ybAklZWR4LCVlZHgKKwlqbnoJTERvXzY0X3JvdW5kX3VwCisJam1wCUxfUmVfbm9ybWFsaXNlCisKK0xSb3VuZF9uZWFyZXN0XzY0OgorCWNtcGwJJDB4ODAwMDAwMDAsJWVkeAorCWpjCUxDaGVja190cnVuY2F0ZV82NAorCisJam5lCUxEb182NF9yb3VuZF91cAorCisJLyogTm93IHRlc3QgZm9yIHJvdW5kLXRvLWV2ZW4gKi8KKwl0ZXN0YgkkMSwlYmwKKwlqeglMQ2hlY2tfdHJ1bmNhdGVfNjQKKworTERvXzY0X3JvdW5kX3VwOgorCW1vdmIJTE9TVF9VUCxGUFVfYml0c19sb3N0CisJYWRkbAkkMSwlZWJ4CisJYWRjbAkkMCwlZWF4CisKK0xDaGVja19Sb3VuZF9PdmVyZmxvdzoKKwlqbmMJTF9SZV9ub3JtYWxpc2UKKworCS8qIE92ZXJmbG93LCBhZGp1c3QgdGhlIHJlc3VsdCAoc2lnbmlmaWNhbmQgdG8gMS4wKSAqLworCXJjcmwJJDEsJWVheAorCXJjcmwJJDEsJWVieAorCWluY3cJRVhQKCVlZGkpCisJam1wCUxfUmVfbm9ybWFsaXNlCisKK0xDaGVja190cnVuY2F0ZV82NDoKKwlvcmwJJWVkeCwlZWR4CisJanoJTF9SZV9ub3JtYWxpc2UKKworTFRydW5jYXRlXzY0OgorCW1vdmIJTE9TVF9ET1dOLEZQVV9iaXRzX2xvc3QKKworTF9SZV9ub3JtYWxpc2U6CisJdGVzdGIJJDB4ZmYsRlBVX2Rlbm9ybWFsCisJam56CU5vcm1hbGlzZV9yZXN1bHQKKworTF9Ob3JtYWxpc2VkOgorCW1vdmwJVEFHX1ZhbGlkLCVlZHgKKworTF9kZU5vcm1hbGlzZWQ6CisJY21wYglMT1NUX1VQLEZQVV9iaXRzX2xvc3QKKwlqZQlMX3ByZWNpc2lvbl9sb3N0X3VwCisKKwljbXBiCUxPU1RfRE9XTixGUFVfYml0c19sb3N0CisJamUJTF9wcmVjaXNpb25fbG9zdF9kb3duCisKK0xfbm9fcHJlY2lzaW9uX2xvc3M6CisJLyogc3RvcmUgdGhlIHJlc3VsdCAqLworCitMX1N0b3JlX3NpZ25pZmljYW5kOgorCW1vdmwJJWVheCxTSUdIKCVlZGkpCisJbW92bAklZWJ4LFNJR0woJWVkaSkKKworCWNtcHcJRVhQX09WRVIsRVhQKCVlZGkpCisJamdlCUxfb3ZlcmZsb3cKKworCW1vdmwJJWVkeCwlZWF4CisKKwkvKiBDb252ZXJ0IHRoZSBleHBvbmVudCB0byA4MHg4NyBmb3JtLiAqLworCWFkZHcJRVhURU5ERURfRWJpYXMsRVhQKCVlZGkpCisJYW5kdwkkMHg3ZmZmLEVYUCglZWRpKQorCitmcHVfcmVnX3JvdW5kX3NpZ25lZF9zcGVjaWFsX2V4aXQ6CisKKwljbXBiCVNJR05fUE9TLFBBUkFNNQorCWplCWZwdV9yZWdfcm91bmRfc3BlY2lhbF9leGl0CisKKwlvcncJJDB4ODAwMCxFWFAoJWVkaSkJLyogTmVnYXRpdmUgc2lnbiBmb3IgdGhlIHJlc3VsdC4gKi8KKworZnB1X3JlZ19yb3VuZF9zcGVjaWFsX2V4aXQ6CisKKyNpZm5kZWYgTk9OX1JFRU5UUkFOVF9GUFUKKwlwb3BsCSVlYngJCS8qIGFkanVzdCB0aGUgc3RhY2sgcG9pbnRlciAqLworI2VuZGlmIC8qIE5PTl9SRUVOVFJBTlRfRlBVICovIAorCitmcHVfQXJpdGhfZXhpdDoKKwlwb3BsCSVlYngKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlsZWF2ZQorCXJldAorCisKKy8qCisgKiBTZXQgdGhlIEZQVSBzdGF0dXMgZmxhZ3MgdG8gcmVwcmVzZW50IHByZWNpc2lvbiBsb3NzIGR1ZSB0bworICogcm91bmQtdXAuCisgKi8KK0xfcHJlY2lzaW9uX2xvc3RfdXA6CisJcHVzaAklZWR4CisJcHVzaAklZWF4CisJY2FsbAlzZXRfcHJlY2lzaW9uX2ZsYWdfdXAKKwlwb3BsCSVlYXgKKwlwb3BsCSVlZHgKKwlqbXAJTF9ub19wcmVjaXNpb25fbG9zcworCisvKgorICogU2V0IHRoZSBGUFUgc3RhdHVzIGZsYWdzIHRvIHJlcHJlc2VudCBwcmVjaXNpb24gbG9zcyBkdWUgdG8KKyAqIHRydW5jYXRpb24uCisgKi8KK0xfcHJlY2lzaW9uX2xvc3RfZG93bjoKKwlwdXNoCSVlZHgKKwlwdXNoCSVlYXgKKwljYWxsCXNldF9wcmVjaXNpb25fZmxhZ19kb3duCisJcG9wbAklZWF4CisJcG9wbAklZWR4CisJam1wCUxfbm9fcHJlY2lzaW9uX2xvc3MKKworCisvKgorICogVGhlIG51bWJlciBpcyBhIGRlbm9ybWFsICh3aGljaCBtaWdodCBnZXQgcm91bmRlZCB1cCB0byBhIG5vcm1hbCkKKyAqIFNoaWZ0IHRoZSBudW1iZXIgcmlnaHQgdGhlIHJlcXVpcmVkIG51bWJlciBvZiBiaXRzLCB3aGljaCB3aWxsCisgKiBoYXZlIHRvIGJlIHVuZG9uZSBsYXRlci4uLgorICovCitMX01ha2VfZGVub3JtOgorCS8qIFRoZSBhY3Rpb24gdG8gYmUgdGFrZW4gZGVwZW5kcyB1cG9uIHdoZXRoZXIgdGhlIHVuZGVyZmxvdworCSAgIGV4Y2VwdGlvbiBpcyBtYXNrZWQgKi8KKwl0ZXN0YglDV19VbmRlcmZsb3csJWNsCQkvKiBVbmRlcmZsb3cgbWFzay4gKi8KKwlqeglVbm1hc2tlZF91bmRlcmZsb3cJCS8qIERvIG5vdCBtYWtlIGEgZGVub3JtYWwuICovCisKKwltb3ZiCURFTk9STUFMLEZQVV9kZW5vcm1hbAorCisJcHVzaGwJJWVjeAkJLyogU2F2ZSAqLworCW1vdncJRVhQX1VOREVSKzEsJWN4CisJc3VidwlFWFAoJWVkaSksJWN4CisKKwljbXB3CSQ2NCwlY3gJLyogc2hyZCBvbmx5IHdvcmtzIGZvciAwLi4zMSBiaXRzICovCisJam5jCURlbm9ybV9zaGlmdF9tb3JlX3RoYW5fNjMKKworCWNtcHcJJDMyLCVjeAkvKiBzaHJkIG9ubHkgd29ya3MgZm9yIDAuLjMxIGJpdHMgKi8KKwlqbmMJRGVub3JtX3NoaWZ0X21vcmVfdGhhbl8zMgorCisvKgorICogV2UgZ290IGhlcmUgd2l0aG91dCBqdW1wcyBieSBhc3N1bWluZyB0aGF0IHRoZSBtb3N0IGNvbW1vbiByZXF1aXJlbWVudAorICogICBpcyBmb3IgYSBzbWFsbCBkZS1ub3JtYWxpc2luZyBzaGlmdC4KKyAqIFNoaWZ0IGJ5IFsxLi4zMV0gYml0cworICovCisJYWRkdwklY3gsRVhQKCVlZGkpCisJb3JsCSVlZHgsJWVkeAkvKiBleHRlbnNpb24gKi8KKwlzZXRuZQklY2gJCS8qIFNhdmUgd2hldGhlciAlZWR4IGlzIG5vbi16ZXJvICovCisJeG9ybAklZWR4LCVlZHgKKwlzaHJkCSVjbCwlZWJ4LCVlZHgKKwlzaHJkCSVjbCwlZWF4LCVlYngKKwlzaHIJJWNsLCVlYXgKKwlvcmIJJWNoLCVkbAorCXBvcGwJJWVjeAorCWptcAlEZW5vcm1fZG9uZQorCisvKiBTaGlmdCBieSBbMzIuLjYzXSBiaXRzICovCitEZW5vcm1fc2hpZnRfbW9yZV90aGFuXzMyOgorCWFkZHcJJWN4LEVYUCglZWRpKQorCXN1YmIJJDMyLCVjbAorCW9ybAklZWR4LCVlZHgKKwlzZXRuZQklY2gKKwlvcmIJJWNoLCVibAorCXhvcmwJJWVkeCwlZWR4CisJc2hyZAklY2wsJWVieCwlZWR4CisJc2hyZAklY2wsJWVheCwlZWJ4CisJc2hyCSVjbCwlZWF4CisJb3JsCSVlZHgsJWVkeAkJLyogdGVzdCB0aGVzZSAzMiBiaXRzICovCisJc2V0bmUJJWNsCisJb3JiCSVjaCwlYmwKKwlvcmIJJWNsLCVibAorCW1vdmwJJWVieCwlZWR4CisJbW92bAklZWF4LCVlYngKKwl4b3JsCSVlYXgsJWVheAorCXBvcGwJJWVjeAorCWptcAlEZW5vcm1fZG9uZQorCisvKiBTaGlmdCBieSBbNjQuLikgYml0cyAqLworRGVub3JtX3NoaWZ0X21vcmVfdGhhbl82MzoKKwljbXB3CSQ2NCwlY3gKKwlqbmUJRGVub3JtX3NoaWZ0X21vcmVfdGhhbl82NAorCisvKiBFeGFjdGx5IDY0IGJpdCBzaGlmdCAqLworCWFkZHcJJWN4LEVYUCglZWRpKQorCXhvcmwJJWVjeCwlZWN4CisJb3JsCSVlZHgsJWVkeAorCXNldG5lCSVjbAorCW9ybAklZWJ4LCVlYngKKwlzZXRuZQklY2gKKwlvcmIJJWNoLCVjbAorCW9yYgklY2wsJWFsCisJbW92bAklZWF4LCVlZHgKKwl4b3JsCSVlYXgsJWVheAorCXhvcmwJJWVieCwlZWJ4CisJcG9wbAklZWN4CisJam1wCURlbm9ybV9kb25lCisKK0Rlbm9ybV9zaGlmdF9tb3JlX3RoYW5fNjQ6CisJbW92dwlFWFBfVU5ERVIrMSxFWFAoJWVkaSkKKy8qIFRoaXMgaXMgZWFzeSwgJWVheCBtdXN0IGJlIG5vbi16ZXJvLCBzby4uICovCisJbW92bAkkMSwlZWR4CisJeG9ybAklZWF4LCVlYXgKKwl4b3JsCSVlYngsJWVieAorCXBvcGwJJWVjeAorCWptcAlEZW5vcm1fZG9uZQorCisKK1VubWFza2VkX3VuZGVyZmxvdzoKKwltb3ZiCVVOTUFTS0VEX1VOREVSRkxPVyxGUFVfZGVub3JtYWwKKwlqbXAJRGVub3JtX2RvbmUKKworCisvKiBVbmRvIHRoZSBkZS1ub3JtYWxpc2F0aW9uLiAqLworTm9ybWFsaXNlX3Jlc3VsdDoKKwljbXBiCVVOTUFTS0VEX1VOREVSRkxPVyxGUFVfZGVub3JtYWwKKwlqZQlTaWduYWxfdW5kZXJmbG93CisKKy8qIFRoZSBudW1iZXIgbXVzdCBiZSBhIGRlbm9ybWFsIGlmIHdlIGdvdCBoZXJlLiAqLworI2lmZGVmIFBBUkFOT0lECisJLyogQnV0IGNoZWNrIGl0Li4uIGp1c3QgaW4gY2FzZS4gKi8KKwljbXB3CUVYUF9VTkRFUisxLEVYUCglZWRpKQorCWpuZQlMX25vcm1fYnVnZ2VkCisjZW5kaWYgLyogUEFSQU5PSUQgKi8KKworI2lmZGVmIFBFQ1VMSUFSXzQ4NgorCS8qCisJICogVGhpcyBpbXBsZW1lbnRzIGEgc3BlY2lhbCBmZWF0dXJlIG9mIDgwNDg2IGJlaGF2aW91ci4KKwkgKiBVbmRlcmZsb3cgd2lsbCBiZSBzaWduYWxsZWQgZXZlbiBpZiB0aGUgbnVtYmVyIGlzCisJICogbm90IGEgZGVub3JtYWwgYWZ0ZXIgcm91bmRpbmcuCisJICogVGhpcyBkaWZmZXJlbmNlIG9jY3VycyBvbmx5IGZvciBtYXNrZWQgdW5kZXJmbG93LCBhbmQgbm90CisJICogaW4gdGhlIHVubWFza2VkIGNhc2UuCisJICogQWN0dWFsIDgwNDg2IGJlaGF2aW91ciBkaWZmZXJzIGZyb20gdGhpcyBpbiBzb21lIGNpcmN1bXN0YW5jZXMuCisJICovCisJb3JsCSVlYXgsJWVheAkJLyogbXMgYml0cyAqLworCWpzCUxQc2V1ZG9EZW5vcm1hbAkJLyogV2lsbCBiZSBtYXNrZWQgdW5kZXJmbG93ICovCisjZWxzZQorCW9ybAklZWF4LCVlYXgJCS8qIG1zIGJpdHMgKi8KKwlqcwlMX05vcm1hbGlzZWQJCS8qIE5vIGxvbmdlciBhIGRlbm9ybWFsICovCisjZW5kaWYgLyogUEVDVUxJQVJfNDg2ICovIAorCisJam56CUxEZW5vcm1hbF9hZGpfZXhwb25lbnQKKworCW9ybAklZWJ4LCVlYngKKwlqeglMX3VuZGVyZmxvd190b196ZXJvCS8qIFRoZSBjb250ZW50cyBhcmUgemVybyAqLworCitMRGVub3JtYWxfYWRqX2V4cG9uZW50OgorCWRlY3cJRVhQKCVlZGkpCisKK0xQc2V1ZG9EZW5vcm1hbDoKKwl0ZXN0YgkkMHhmZixGUFVfYml0c19sb3N0CS8qIGJpdHMgbG9zdCA9PSB1bmRlcmZsb3cgKi8KKwltb3ZsCVRBR19TcGVjaWFsLCVlZHgKKwlqeglMX2RlTm9ybWFsaXNlZAorCisJLyogVGhlcmUgbXVzdCBiZSBhIG1hc2tlZCB1bmRlcmZsb3cgKi8KKwlwdXNoCSVlYXgKKwlwdXNobAlFWF9VbmRlcmZsb3cKKwljYWxsCUVYQ0VQVElPTgorCXBvcGwJJWVheAorCXBvcGwJJWVheAorCW1vdmwJVEFHX1NwZWNpYWwsJWVkeAorCWptcAlMX2RlTm9ybWFsaXNlZAorCisKKy8qCisgKiBUaGUgb3BlcmF0aW9ucyByZXN1bHRlZCBpbiBhIG51bWJlciB0b28gc21hbGwgdG8gcmVwcmVzZW50LgorICogTWFza2VkIHJlc3BvbnNlLgorICovCitMX3VuZGVyZmxvd190b196ZXJvOgorCXB1c2gJJWVheAorCWNhbGwJc2V0X3ByZWNpc2lvbl9mbGFnX2Rvd24KKwlwb3BsCSVlYXgKKworCXB1c2gJJWVheAorCXB1c2hsCUVYX1VuZGVyZmxvdworCWNhbGwJRVhDRVBUSU9OCisJcG9wbAklZWF4CisJcG9wbAklZWF4CisKKy8qIFJlZHVjZSB0aGUgZXhwb25lbnQgdG8gRVhQX1VOREVSICovCisJbW92dwlFWFBfVU5ERVIsRVhQKCVlZGkpCisJbW92bAlUQUdfWmVybywlZWR4CisJam1wCUxfU3RvcmVfc2lnbmlmaWNhbmQKKworCisvKiBUaGUgb3BlcmF0aW9ucyByZXN1bHRlZCBpbiBhIG51bWJlciB0b28gbGFyZ2UgdG8gcmVwcmVzZW50LiAqLworTF9vdmVyZmxvdzoKKwlhZGR3CUVYVEVOREVEX0ViaWFzLEVYUCglZWRpKQkvKiBTZXQgZm9yIHVubWFza2VkIHJlc3BvbnNlLiAqLworCXB1c2gJJWVkaQorCWNhbGwJYXJpdGhfb3ZlcmZsb3cKKwlwb3AJJWVkaQorCWptcAlmcHVfcmVnX3JvdW5kX3NpZ25lZF9zcGVjaWFsX2V4aXQKKworCitTaWduYWxfdW5kZXJmbG93OgorCS8qIFRoZSBudW1iZXIgbWF5IGhhdmUgYmVlbiBjaGFuZ2VkIHRvIGEgbm9uLWRlbm9ybWFsICovCisJLyogYnkgdGhlIHJvdW5kaW5nIG9wZXJhdGlvbnMuICovCisJY21wdwlFWFBfVU5ERVIsRVhQKCVlZGkpCisJamxlCURvX3VubWFza2VkX3VuZGVyZmxvdworCisJam1wCUxfTm9ybWFsaXNlZAorCitEb191bm1hc2tlZF91bmRlcmZsb3c6CisJLyogSW5jcmVhc2UgdGhlIGV4cG9uZW50IGJ5IHRoZSBtYWdpYyBudW1iZXIgKi8KKwlhZGR3CSQoMyooMTw8MTMpKSxFWFAoJWVkaSkKKwlwdXNoCSVlYXgKKwlwdXNobAlFWF9VbmRlcmZsb3cKKwljYWxsCUVYQ0VQVElPTgorCXBvcGwJJWVheAorCXBvcGwJJWVheAorCWptcAlMX05vcm1hbGlzZWQKKworCisjaWZkZWYgUEFSQU5PSUQKKyNpZmRlZiBQRUNVTElBUl80ODYKK0xfYnVnZ2VkX2Rlbm9ybV80ODY6CisJcHVzaGwJRVhfSU5URVJOQUx8MHgyMzYKKwljYWxsCUVYQ0VQVElPTgorCXBvcGwJJWVieAorCWptcAlMX2V4Y2VwdGlvbl9leGl0CisjZWxzZQorTF9idWdnZWRfZGVub3JtOgorCXB1c2hsCUVYX0lOVEVSTkFMfDB4MjMwCisJY2FsbAlFWENFUFRJT04KKwlwb3BsCSVlYngKKwlqbXAJTF9leGNlcHRpb25fZXhpdAorI2VuZGlmIC8qIFBFQ1VMSUFSXzQ4NiAqLyAKKworTF9idWdnZWRfcm91bmQyNDoKKwlwdXNobAlFWF9JTlRFUk5BTHwweDIzMQorCWNhbGwJRVhDRVBUSU9OCisJcG9wbAklZWJ4CisJam1wCUxfZXhjZXB0aW9uX2V4aXQKKworTF9idWdnZWRfcm91bmQ1MzoKKwlwdXNobAlFWF9JTlRFUk5BTHwweDIzMgorCWNhbGwJRVhDRVBUSU9OCisJcG9wbAklZWJ4CisJam1wCUxfZXhjZXB0aW9uX2V4aXQKKworTF9idWdnZWRfcm91bmQ2NDoKKwlwdXNobAlFWF9JTlRFUk5BTHwweDIzMworCWNhbGwJRVhDRVBUSU9OCisJcG9wbAklZWJ4CisJam1wCUxfZXhjZXB0aW9uX2V4aXQKKworTF9ub3JtX2J1Z2dlZDoKKwlwdXNobAlFWF9JTlRFUk5BTHwweDIzNAorCWNhbGwJRVhDRVBUSU9OCisJcG9wbAklZWJ4CisJam1wCUxfZXhjZXB0aW9uX2V4aXQKKworTF9lbnRyeV9idWdnZWQ6CisJcHVzaGwJRVhfSU5URVJOQUx8MHgyMzUKKwljYWxsCUVYQ0VQVElPTgorCXBvcGwJJWVieAorTF9leGNlcHRpb25fZXhpdDoKKwltb3YJJC0xLCVlYXgKKwlqbXAJZnB1X3JlZ19yb3VuZF9zcGVjaWFsX2V4aXQKKyNlbmRpZiAvKiBQQVJBTk9JRCAqLyAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYXRoLWVtdS9yZWdfdV9hZGQuUyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9yZWdfdV9hZGQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2M0YzI0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L3JlZ191X2FkZC5TCkBAIC0wLDAgKzEsMTY3IEBACisJLmZpbGUJInJlZ191X2FkZC5TIgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgcmVnX3VfYWRkLlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQWRkIHR3byB2YWxpZCAoVEFHX1ZhbGlkKSBGUFVfUkVHIG51bWJlcnMsIG9mIHRoZSBzYW1lIHNpZ24sIGFuZCBwdXQgdGhlICB8CisgfCAgIHJlc3VsdCBpbiBhIGRlc3RpbmF0aW9uIEZQVV9SRUcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTMsMTk5NSwxOTk3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgQXVzdHJhbGlhIHwKKyB8ICAgICAgICAgICAgICAgICAgRS1tYWlsICAgYmlsbG1Ac3VidXJiaWEubmV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDYWxsIGZyb20gQyBhczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgaW50ICBGUFVfdV9hZGQoRlBVX1JFRyAqYXJnMSwgRlBVX1JFRyAqYXJnMiwgRlBVX1JFRyAqYW5zdywgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29udHJvbF93KSAgICAgICAgICAgICB8CisgfCAgICBSZXR1cm4gdmFsdWUgaXMgdGhlIHRhZyBvZiB0aGUgYW5zd2VyLCBvci1lZCB3aXRoIEZQVV9FeGNlcHRpb24gaWYgICAgIHwKKyB8ICAgIG9uZSB3YXMgcmFpc2VkLCBvciAtMSBvbiBpbnRlcm5hbCBlcnJvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgfCAgICBLZXJuZWwgYWRkaXRpb24gcm91dGluZSBGUFVfdV9hZGQocmVnICphcmcxLCByZWcgKmFyZzIsIHJlZyAqYW5zdykuCisgfCAgICBUYWtlcyB0d28gdmFsaWQgcmVnIGYucC4gbnVtYmVycyAoVEFHX1ZhbGlkKSwgd2hpY2ggYXJlCisgfCAgICB0cmVhdGVkIGFzIHVuc2lnbmVkIG51bWJlcnMsCisgfCAgICBhbmQgcmV0dXJucyB0aGVpciBzdW0gYXMgYSBUQUdfVmFsaWQgb3IgVEFHX1NwZWNpYWwgZi5wLiBudW1iZXIuCisgfCAgICBUaGUgcmV0dXJuZWQgbnVtYmVyIGlzIG5vcm1hbGl6ZWQuCisgfCAgICBCYXNpYyBjaGVja3MgYXJlIHBlcmZvcm1lZCBpZiBQQVJBTk9JRCBpcyBkZWZpbmVkLgorICovCisKKyNpbmNsdWRlICJleGNlcHRpb24uaCIKKyNpbmNsdWRlICJmcHVfZW11LmgiCisjaW5jbHVkZSAiY29udHJvbF93LmgiCisKKy50ZXh0CitFTlRSWShGUFVfdV9hZGQpCisJcHVzaGwJJWVicAorCW1vdmwJJWVzcCwlZWJwCisJcHVzaGwJJWVzaQorCXB1c2hsCSVlZGkKKwlwdXNobAklZWJ4CisKKwltb3ZsCVBBUkFNMSwlZXNpCQkvKiBzb3VyY2UgMSAqLworCW1vdmwJUEFSQU0yLCVlZGkJCS8qIHNvdXJjZSAyICovCisKKwltb3ZsCVBBUkFNNiwlZWN4CisJbW92bAklZWN4LCVlZHgKKwlzdWJsCVBBUkFNNywlZWN4CQkJLyogZXhwMSAtIGV4cDIgKi8KKwlqZ2UJTF9hcmcxX2xhcmdlcgorCisJLyogbnVtMSBpcyBzbWFsbGVyICovCisJbW92bAlTSUdMKCVlc2kpLCVlYngKKwltb3ZsCVNJR0goJWVzaSksJWVheAorCisJbW92bAklZWRpLCVlc2kKKwltb3ZsCVBBUkFNNywlZWR4CisJbmVndwklY3gKKwlqbXAJTF9hY2N1bV9sb2FkZWQKKworTF9hcmcxX2xhcmdlcjoKKwkvKiBudW0xIGhhcyBsYXJnZXIgb3IgZXF1YWwgZXhwb25lbnQgKi8KKwltb3ZsCVNJR0woJWVkaSksJWVieAorCW1vdmwJU0lHSCglZWRpKSwlZWF4CisKK0xfYWNjdW1fbG9hZGVkOgorCW1vdmwJUEFSQU0zLCVlZGkJCS8qIGRlc3RpbmF0aW9uICovCisJbW92dwklZHgsRVhQKCVlZGkpCQkvKiBDb3B5IGV4cG9uZW50IHRvIGRlc3RpbmF0aW9uICovCisKKwl4b3JsCSVlZHgsJWVkeAkJLyogY2xlYXIgdGhlIGV4dGVuc2lvbiAqLworCisjaWZkZWYgUEFSQU5PSUQKKwl0ZXN0bAkkMHg4MDAwMDAwMCwlZWF4CisJamUJTF9idWdnZWQKKworCXRlc3RsCSQweDgwMDAwMDAwLFNJR0goJWVzaSkKKwlqZQlMX2J1Z2dlZAorI2VuZGlmIC8qIFBBUkFOT0lEICovCisKKy8qIFRoZSBudW1iZXIgdG8gYmUgc2hpZnRlZCBpcyBpbiAlZWF4OiVlYng6JWVkeCAqLworCWNtcHcJJDMyLCVjeAkJLyogc2hyZCBvbmx5IHdvcmtzIGZvciAwLi4zMSBiaXRzICovCisJam5jCUxfbW9yZV90aGFuXzMxCisKKy8qIGxlc3MgdGhhbiAzMiBiaXRzICovCisJc2hyZAklY2wsJWVieCwlZWR4CisJc2hyZAklY2wsJWVheCwlZWJ4CisJc2hyCSVjbCwlZWF4CisJam1wCUxfc2hpZnRfZG9uZQorCitMX21vcmVfdGhhbl8zMToKKwljbXB3CSQ2NCwlY3gKKwlqbmMJTF9tb3JlX3RoYW5fNjMKKworCXN1YmIJJDMyLCVjbAorCWp6CUxfZXhhY3RseV8zMgorCisJc2hyZAklY2wsJWVheCwlZWR4CisJc2hyCSVjbCwlZWF4CisJb3JsCSVlYngsJWVieAorCWp6CUxfbW9yZV8zMV9ub19sb3cJLyogbm9uZSBvZiB0aGUgbG93ZXN0IGJpdHMgaXMgc2V0ICovCisKKwlvcmwJJDEsJWVkeAkJCS8qIHJlY29yZCB0aGUgZmFjdCBpbiB0aGUgZXh0ZW5zaW9uICovCisKK0xfbW9yZV8zMV9ub19sb3c6CisJbW92bAklZWF4LCVlYngKKwl4b3JsCSVlYXgsJWVheAorCWptcAlMX3NoaWZ0X2RvbmUKKworTF9leGFjdGx5XzMyOgorCW1vdmwJJWVieCwlZWR4CisJbW92bAklZWF4LCVlYngKKwl4b3JsCSVlYXgsJWVheAorCWptcAlMX3NoaWZ0X2RvbmUKKworTF9tb3JlX3RoYW5fNjM6CisJY21wdwkkNjUsJWN4CisJam5jCUxfbW9yZV90aGFuXzY0CisKKwltb3ZsCSVlYXgsJWVkeAorCW9ybAklZWJ4LCVlYngKKwlqeglMX21vcmVfNjNfbm9fbG93CisKKwlvcmwJJDEsJWVkeAorCWptcAlMX21vcmVfNjNfbm9fbG93CisKK0xfbW9yZV90aGFuXzY0OgorCW1vdmwJJDEsJWVkeAkJLyogVGhlIHNoaWZ0ZWQgbnIgYWx3YXlzIGF0IGxlYXN0IG9uZSAnMScgKi8KKworTF9tb3JlXzYzX25vX2xvdzoKKwl4b3JsCSVlYngsJWVieAorCXhvcmwJJWVheCwlZWF4CisKK0xfc2hpZnRfZG9uZToKKwkvKiBOb3cgZG8gdGhlIGFkZGl0aW9uICovCisJYWRkbAlTSUdMKCVlc2kpLCVlYngKKwlhZGNsCVNJR0goJWVzaSksJWVheAorCWpuYwlMX3JvdW5kX3RoZV9yZXN1bHQKKworCS8qIE92ZXJmbG93LCBhZGp1c3QgdGhlIHJlc3VsdCAqLworCXJjcmwJJDEsJWVheAorCXJjcmwJJDEsJWVieAorCXJjcmwJJDEsJWVkeAorCWpuYwlMX25vX2JpdF9sb3N0CisKKwlvcmwJJDEsJWVkeAorCitMX25vX2JpdF9sb3N0OgorCWluY3cJRVhQKCVlZGkpCisKK0xfcm91bmRfdGhlX3Jlc3VsdDoKKwlqbXAJZnB1X3JlZ19yb3VuZAkvKiBSb3VuZCB0aGUgcmVzdWx0ICovCisKKworCisjaWZkZWYgUEFSQU5PSUQKKy8qIElmIHdlIGV2ZXIgZ2V0IGhlcmUgdGhlbiB3ZSBoYXZlIHByb2JsZW1zISAqLworTF9idWdnZWQ6CisJcHVzaGwJRVhfSU5URVJOQUx8MHgyMDEKKwljYWxsCUVYQ0VQVElPTgorCXBvcAklZWJ4CisJbW92bAkkLTEsJWVheAorCWptcAlMX2V4aXQKKworTF9leGl0OgorCXBvcGwJJWVieAorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCWxlYXZlCisJcmV0CisjZW5kaWYgLyogUEFSQU5PSUQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYXRoLWVtdS9yZWdfdV9kaXYuUyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9yZWdfdV9kaXYuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzAwNjU0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L3JlZ191X2Rpdi5TCkBAIC0wLDAgKzEsNDcxIEBACisJLmZpbGUJInJlZ191X2Rpdi5TIgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgcmVnX3VfZGl2LlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgRGl2aWRlIG9uZSBGUFVfUkVHIGJ5IGFub3RoZXIgYW5kIHB1dCB0aGUgcmVzdWx0IGluIGEgZGVzdGluYXRpb24gRlBVX1JFRy58CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENvcHlyaWdodCAoQykgMTk5MiwxOTkzLDE5OTUsMTk5NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICBXLiBNZXR6ZW50aGVuLCAyMiBQYXJrZXIgU3QsIE9ybW9uZCwgVmljIDMxNjMsIEF1c3RyYWxpYSB8CisgfCAgICAgICAgICAgICAgICAgIEUtbWFpbCAgIGJpbGxtQHN1YnVyYmlhLm5ldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgQ2FsbCBmcm9tIEMgYXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICBpbnQgRlBVX3VfZGl2KEZQVV9SRUcgKmEsIEZQVV9SRUcgKmIsIEZQVV9SRUcgKmRlc3QsICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjb250cm9sX3dvcmQsIGNoYXIgKnNpZ24pICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgRG9lcyBub3QgY29tcHV0ZSB0aGUgZGVzdGluYXRpb24gZXhwb25lbnQsIGJ1dCBkb2VzIGFkanVzdCBpdC4gICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgUmV0dXJuIHZhbHVlIGlzIHRoZSB0YWcgb2YgdGhlIGFuc3dlciwgb3ItZWQgd2l0aCBGUFVfRXhjZXB0aW9uIGlmICAgICB8CisgfCAgICBvbmUgd2FzIHJhaXNlZCwgb3IgLTEgb24gaW50ZXJuYWwgZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImV4Y2VwdGlvbi5oIgorI2luY2x1ZGUgImZwdV9lbXUuaCIKKyNpbmNsdWRlICJjb250cm9sX3cuaCIKKworCisvKiAjZGVmaW5lCWRTSUdMKHgpCSh4KSAqLworLyogI2RlZmluZQlkU0lHSCh4KQk0KHgpICovCisKKworI2lmbmRlZiBOT05fUkVFTlRSQU5UX0ZQVQorLyoKKwlMb2NhbCBzdG9yYWdlIG9uIHRoZSBzdGFjazoKKwlSZXN1bHQ6CQlGUFVfYWNjdW1fMzpGUFVfYWNjdW1fMjpGUFVfYWNjdW1fMTpGUFVfYWNjdW1fMAorCU92ZXJmbG93IGZsYWc6CW92ZmxfZmxhZworICovCisjZGVmaW5lIEZQVV9hY2N1bV8zCS00KCVlYnApCisjZGVmaW5lIEZQVV9hY2N1bV8yCS04KCVlYnApCisjZGVmaW5lIEZQVV9hY2N1bV8xCS0xMiglZWJwKQorI2RlZmluZSBGUFVfYWNjdW1fMAktMTYoJWVicCkKKyNkZWZpbmUgRlBVX3Jlc3VsdF8xCS0yMCglZWJwKQorI2RlZmluZSBGUFVfcmVzdWx0XzIJLTI0KCVlYnApCisjZGVmaW5lIEZQVV9vdmZsX2ZsYWcJLTI4KCVlYnApCisKKyNlbHNlCisuZGF0YQorLyoKKwlMb2NhbCBzdG9yYWdlIGluIGEgc3RhdGljIGFyZWE6CisJUmVzdWx0OgkJRlBVX2FjY3VtXzM6RlBVX2FjY3VtXzI6RlBVX2FjY3VtXzE6RlBVX2FjY3VtXzAKKwlPdmVyZmxvdyBmbGFnOglvdmZsX2ZsYWcKKyAqLworCS5hbGlnbiA0LDAKK0ZQVV9hY2N1bV8zOgorCS5sb25nCTAKK0ZQVV9hY2N1bV8yOgorCS5sb25nCTAKK0ZQVV9hY2N1bV8xOgorCS5sb25nCTAKK0ZQVV9hY2N1bV8wOgorCS5sb25nCTAKK0ZQVV9yZXN1bHRfMToKKwkubG9uZwkwCitGUFVfcmVzdWx0XzI6CisJLmxvbmcJMAorRlBVX292ZmxfZmxhZzoKKwkuYnl0ZQkwCisjZW5kaWYgLyogTk9OX1JFRU5UUkFOVF9GUFUgKi8KKworI2RlZmluZSBSRUdBCVBBUkFNMQorI2RlZmluZSBSRUdCCVBBUkFNMgorI2RlZmluZSBERVNUCVBBUkFNMworCisudGV4dAorRU5UUlkoRlBVX3VfZGl2KQorCXB1c2hsCSVlYnAKKwltb3ZsCSVlc3AsJWVicAorI2lmbmRlZiBOT05fUkVFTlRSQU5UX0ZQVQorCXN1YmwJJDI4LCVlc3AKKyNlbmRpZiAvKiBOT05fUkVFTlRSQU5UX0ZQVSAqLworCisJcHVzaGwJJWVzaQorCXB1c2hsCSVlZGkKKwlwdXNobAklZWJ4CisKKwltb3ZsCVJFR0EsJWVzaQorCW1vdmwJUkVHQiwlZWJ4CisJbW92bAlERVNULCVlZGkKKworCW1vdnN3bAlFWFAoJWVzaSksJWVkeAorCW1vdnN3bAlFWFAoJWVieCksJWVheAorCXN1YmwJJWVheCwlZWR4CisJYWRkbAlFWFBfQklBUywlZWR4CisKKwkvKiBBIGRlbm9ybWFsIGFuZCBhIGxhcmdlIG51bWJlciBjYW4gY2F1c2UgYW4gZXhwb25lbnQgdW5kZXJmbG93ICovCisJY21wbAlFWFBfV0FZX1VOREVSLCVlZHgKKwlqZwl4RXhwX25vdF91bmRlcmZsb3cKKworCS8qIFNldCB0byBhIHJlYWxseSBsb3cgdmFsdWUgYWxsb3cgY29ycmVjdCBoYW5kbGluZyAqLworCW1vdmwJRVhQX1dBWV9VTkRFUiwlZWR4CisKK3hFeHBfbm90X3VuZGVyZmxvdzoKKworCW1vdncgICAgJWR4LEVYUCglZWRpKQorCisjaWZkZWYgUEFSQU5PSUQKKy8qCXRlc3RsCSQweDgwMDAwMDAwLCBTSUdIKCVlc2kpCS8vIERpdmlkZW5kICovCisvKglqZQlMX2J1Z2dlZCAqLworCXRlc3RsCSQweDgwMDAwMDAwLCBTSUdIKCVlYngpCS8qIERpdmlzb3IgKi8KKwlqZQlMX2J1Z2dlZAorI2VuZGlmIC8qIFBBUkFOT0lEICovIAorCisvKiBDaGVjayBpZiB0aGUgZGl2aXNvciBjYW4gYmUgdHJlYXRlZCBhcyBoYXZpbmcganVzdCAzMiBiaXRzICovCisJY21wbAkkMCxTSUdMKCVlYngpCisJam56CUxfRnVsbF9EaXZpc2lvbgkvKiBDYW4ndCBkbyBhIHF1aWNrIGRpdmlkZSAqLworCisvKiBXZSBzaG91bGQgYmUgYWJsZSB0byB6aXAgdGhyb3VnaCB0aGUgZGl2aXNpb24gaGVyZSAqLworCW1vdmwJU0lHSCglZWJ4KSwlZWN4CS8qIFRoZSBkaXZpc29yICovCisJbW92bAlTSUdIKCVlc2kpLCVlZHgJLyogRGl2aWRlbmQgKi8KKwltb3ZsCVNJR0woJWVzaSksJWVheAkvKiBEaXZpZGVuZCAqLworCisJY21wbAklZWN4LCVlZHgKKwlzZXRhZWIJRlBVX292ZmxfZmxhZwkvKiBLZWVwIGEgcmVjb3JkICovCisJamIJTF9ub19hZGp1c3QKKworCXN1YmwJJWVjeCwlZWR4CS8qIFByZXZlbnQgdGhlIG92ZXJmbG93ICovCisKK0xfbm9fYWRqdXN0OgorCS8qIERpdmlkZSB0aGUgNjQgYml0IG51bWJlciBieSB0aGUgMzIgYml0IGRlbm9taW5hdG9yICovCisJZGl2bAklZWN4CisJbW92bAklZWF4LEZQVV9yZXN1bHRfMgorCisJLyogV29yayBvbiB0aGUgcmVtYWluZGVyIG9mIHRoZSBmaXJzdCBkaXZpc2lvbiAqLworCXhvcmwJJWVheCwlZWF4CisJZGl2bAklZWN4CisJbW92bAklZWF4LEZQVV9yZXN1bHRfMQorCisJLyogV29yayBvbiB0aGUgcmVtYWluZGVyIG9mIHRoZSA2NCBiaXQgZGl2aXNpb24gKi8KKwl4b3JsCSVlYXgsJWVheAorCWRpdmwJJWVjeAorCisJdGVzdGIJJDI1NSxGUFVfb3ZmbF9mbGFnCS8qIHdhcyB0aGUgbnVtID4gZGVub20gPyAqLworCWplCUxfbm9fb3ZlcmZsb3cKKworCS8qIERvIHRoZSBzaGlmdGluZyBoZXJlICovCisJLyogaW5jcmVhc2UgdGhlIGV4cG9uZW50ICovCisJaW5jdwlFWFAoJWVkaSkKKworCS8qIHNoaWZ0IHRoZSBtYW50aXNzYSByaWdodCBvbmUgYml0ICovCisJc3RjCQkJLyogVG8gc2V0IHRoZSBtcyBiaXQgKi8KKwlyY3JsCUZQVV9yZXN1bHRfMgorCXJjcmwJRlBVX3Jlc3VsdF8xCisJcmNybAklZWF4CisKK0xfbm9fb3ZlcmZsb3c6CisJam1wCUxSb3VuZF9wcmVjaXNpb24JLyogRG8gdGhlIHJvdW5kaW5nIGFzIHJlcXVpcmVkICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgRGl2aWRlOiAgIFJldHVybiAgYXJnMS9hcmcyIHRvIGFyZzMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgIFRoaXMgcm91dGluZSBkb2VzIG5vdCB1c2UgdGhlIGV4cG9uZW50cyBvZiBhcmcxIGFuZCBhcmcyLCBidXQgZG9lcyAgICAgICB8CisgfCAgYWRqdXN0IHRoZSBleHBvbmVudCBvZiBhcmczLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgIFRoZSBtYXhpbXVtIHJldHVybmVkIHZhbHVlIGlzIChpZ25vcmluZyBleHBvbmVudHMpICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgIC5mZmZmZmZmZiBmZmZmZmZmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tICA9ICAxLmZmZmZmZmZmIGZmZmZmZmZlICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAuODAwMDAwMDAgMDAwMDAwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBhbmQgdGhlIG1pbmltdW0gaXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgLjgwMDAwMDAwIDAwMDAwMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0gID0gIC44MDAwMDAwMCAwMDAwMDAwMSAgIChyb3VuZGVkKSAgICAgICB8CisgfCAgICAgICAgICAgICAgIC5mZmZmZmZmZiBmZmZmZmZmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKK0xfRnVsbF9EaXZpc2lvbjoKKwkvKiBTYXZlIGV4dGVuZGVkIGRpdmlkZW5kIGluIGxvY2FsIHJlZ2lzdGVyICovCisJbW92bAlTSUdMKCVlc2kpLCVlYXgKKwltb3ZsCSVlYXgsRlBVX2FjY3VtXzIKKwltb3ZsCVNJR0goJWVzaSksJWVheAorCW1vdmwJJWVheCxGUFVfYWNjdW1fMworCXhvcmwJJWVheCwlZWF4CisJbW92bAklZWF4LEZQVV9hY2N1bV8xCS8qIHplcm8gdGhlIGV4dGVuc2lvbiAqLworCW1vdmwJJWVheCxGUFVfYWNjdW1fMAkvKiB6ZXJvIHRoZSBleHRlbnNpb24gKi8KKworCW1vdmwJU0lHTCglZXNpKSwlZWF4CS8qIEdldCB0aGUgY3VycmVudCBudW0gKi8KKwltb3ZsCVNJR0goJWVzaSksJWVkeAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogSW5pdGlhbGl6YXRpb24gZG9uZS4KKyAgIERvIHRoZSBmaXJzdCAzMiBiaXRzLiAqLworCisJbW92YgkkMCxGUFVfb3ZmbF9mbGFnCisJY21wbAlTSUdIKCVlYngpLCVlZHgJLyogVGVzdCBmb3IgaW1taW5lbnQgb3ZlcmZsb3cgKi8KKwlqYglMTGVzc190aGFuXzEKKwlqYQlMR3JlYXRlcl90aGFuXzEKKworCWNtcGwJU0lHTCglZWJ4KSwlZWF4CisJamIJTExlc3NfdGhhbl8xCisKK0xHcmVhdGVyX3RoYW5fMToKKy8qIFRoZSBkaXZpZGVuZCBpcyBncmVhdGVyIG9yIGVxdWFsLCB3b3VsZCBjYXVzZSBvdmVyZmxvdyAqLworCXNldGFlYglGUFVfb3ZmbF9mbGFnCQkvKiBLZWVwIGEgcmVjb3JkICovCisKKwlzdWJsCVNJR0woJWVieCksJWVheAorCXNiYmwJU0lHSCglZWJ4KSwlZWR4CS8qIFByZXZlbnQgdGhlIG92ZXJmbG93ICovCisJbW92bAklZWF4LEZQVV9hY2N1bV8yCisJbW92bAklZWR4LEZQVV9hY2N1bV8zCisKK0xMZXNzX3RoYW5fMToKKy8qIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgYSBkaXZpZGVuZCA8IGRpdmlzb3IsIHdpdGggYSByZWNvcmQgb2YKKyAgIGFkanVzdG1lbnQgaW4gRlBVX292ZmxfZmxhZyAqLworCisJLyogV2Ugd2lsbCBkaXZpZGUgYnkgYSBudW1iZXIgd2hpY2ggaXMgdG9vIGxhcmdlICovCisJbW92bAlTSUdIKCVlYngpLCVlY3gKKwlhZGRsCSQxLCVlY3gKKwlqbmMJTEZpcnN0X2Rpdl9ub3RfMQorCisJLyogaGVyZSB3ZSBuZWVkIHRvIGRpdmlkZSBieSAxMDAwMDAwMDBoLAorCSAgIGkuZS4sIG5vIGRpdmlzaW9uIGF0IGFsbC4uICovCisJbW92CSVlZHgsJWVheAorCWptcAlMRmlyc3RfZGl2X2RvbmUKKworTEZpcnN0X2Rpdl9ub3RfMToKKwlkaXZsCSVlY3gJCS8qIERpdmlkZSB0aGUgbnVtZXJhdG9yIGJ5IHRoZSBhdWdtZW50ZWQKKwkJCQkgICBkZW5vbSBtcyBkdyAqLworCitMRmlyc3RfZGl2X2RvbmU6CisJbW92bAklZWF4LEZQVV9yZXN1bHRfMgkvKiBQdXQgdGhlIHJlc3VsdCBpbiB0aGUgYW5zd2VyICovCisKKwltdWxsCVNJR0goJWVieCkJLyogbXVsIGJ5IHRoZSBtcyBkdyBvZiB0aGUgZGVub20gKi8KKworCXN1YmwJJWVheCxGUFVfYWNjdW1fMgkvKiBTdWJ0cmFjdCBmcm9tIHRoZSBudW0gbG9jYWwgcmVnICovCisJc2JibAklZWR4LEZQVV9hY2N1bV8zCisKKwltb3ZsCUZQVV9yZXN1bHRfMiwlZWF4CS8qIEdldCB0aGUgcmVzdWx0IGJhY2sgKi8KKwltdWxsCVNJR0woJWVieCkJLyogbm93IG11bCB0aGUgbHMgZHcgb2YgdGhlIGRlbm9tICovCisKKwlzdWJsCSVlYXgsRlBVX2FjY3VtXzEJLyogU3VidHJhY3QgZnJvbSB0aGUgbnVtIGxvY2FsIHJlZyAqLworCXNiYmwJJWVkeCxGUFVfYWNjdW1fMgorCXNiYmwJJDAsRlBVX2FjY3VtXzMKKwlqZQlMRG9fMm5kXzMyX2JpdHMJCS8qIE11c3QgY2hlY2sgZm9yIG5vbi16ZXJvIHJlc3VsdCBoZXJlICovCisKKyNpZmRlZiBQQVJBTk9JRAorCWpiCUxfYnVnZ2VkXzEKKyNlbmRpZiAvKiBQQVJBTk9JRCAqLyAKKworCS8qIG5lZWQgdG8gc3VidHJhY3QgYW5vdGhlciBvbmNlIG9mIHRoZSBkZW5vbSAqLworCWluY2wJRlBVX3Jlc3VsdF8yCS8qIENvcnJlY3QgdGhlIGFuc3dlciAqLworCisJbW92bAlTSUdMKCVlYngpLCVlYXgKKwltb3ZsCVNJR0goJWVieCksJWVkeAorCXN1YmwJJWVheCxGUFVfYWNjdW1fMQkvKiBTdWJ0cmFjdCBmcm9tIHRoZSBudW0gbG9jYWwgcmVnICovCisJc2JibAklZWR4LEZQVV9hY2N1bV8yCisKKyNpZmRlZiBQQVJBTk9JRAorCXNiYmwJJDAsRlBVX2FjY3VtXzMKKwlqbmUJTF9idWdnZWRfMQkvKiBNdXN0IGNoZWNrIGZvciBub24temVybyByZXN1bHQgaGVyZSAqLworI2VuZGlmIC8qIFBBUkFOT0lEICovIAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogSGFsZiBvZiB0aGUgbWFpbiBwcm9ibGVtIGlzIGRvbmUsIHRoZXJlIGlzIGp1c3QgYSByZWR1Y2VkIG51bWVyYXRvcgorICAgdG8gaGFuZGxlIG5vdy4KKyAgIFdvcmsgd2l0aCB0aGUgc2Vjb25kIDMyIGJpdHMsIEZQVV9hY2N1bV8wIG5vdCB1c2VkIGZyb20gbm93IG9uICovCitMRG9fMm5kXzMyX2JpdHM6CisJbW92bAlGUFVfYWNjdW1fMiwlZWR4CS8qIGdldCB0aGUgcmVkdWNlZCBudW0gKi8KKwltb3ZsCUZQVV9hY2N1bV8xLCVlYXgKKworCS8qIG5lZWQgdG8gY2hlY2sgZm9yIHBvc3NpYmxlIHN1YnNlcXVlbnQgb3ZlcmZsb3cgKi8KKwljbXBsCVNJR0goJWVieCksJWVkeAorCWpiCUxEb18ybmRfZGl2CisJamEJTFByZXZlbnRfMm5kX292ZXJmbG93CisKKwljbXBsCVNJR0woJWVieCksJWVheAorCWpiCUxEb18ybmRfZGl2CisKK0xQcmV2ZW50XzJuZF9vdmVyZmxvdzoKKy8qIFRoZSBudW1lcmF0b3IgaXMgZ3JlYXRlciBvciBlcXVhbCwgd291bGQgY2F1c2Ugb3ZlcmZsb3cgKi8KKwkvKiBwcmV2ZW50IG92ZXJmbG93ICovCisJc3VibAlTSUdMKCVlYngpLCVlYXgKKwlzYmJsCVNJR0goJWVieCksJWVkeAorCW1vdmwJJWVkeCxGUFVfYWNjdW1fMgorCW1vdmwJJWVheCxGUFVfYWNjdW1fMQorCisJaW5jbAlGUFVfcmVzdWx0XzIJLyogUmVmbGVjdCB0aGUgc3VidHJhY3Rpb24gaW4gdGhlIGFuc3dlciAqLworCisjaWZkZWYgUEFSQU5PSUQKKwlqZQlMX2J1Z2dlZF8yCS8qIENhbid0IGJ1bXAgdGhlIHJlc3VsdCB0byAxLjAgKi8KKyNlbmRpZiAvKiBQQVJBTk9JRCAqLyAKKworTERvXzJuZF9kaXY6CisJY21wbAkkMCwlZWN4CQkvKiBhdWdtZW50ZWQgZGVub20gbXN3ICovCisJam56CUxTZWNvbmRfZGl2X25vdF8xCisKKwkvKiAlZWN4ID09IDAsIHdlIGFyZSBkaXZpZGluZyBieSAxLjAgKi8KKwltb3YJJWVkeCwlZWF4CisJam1wCUxTZWNvbmRfZGl2X2RvbmUKKworTFNlY29uZF9kaXZfbm90XzE6CisJZGl2bAklZWN4CQkvKiBEaXZpZGUgdGhlIG51bWVyYXRvciBieSB0aGUgZGVub20gbXMgZHcgKi8KKworTFNlY29uZF9kaXZfZG9uZToKKwltb3ZsCSVlYXgsRlBVX3Jlc3VsdF8xCS8qIFB1dCB0aGUgcmVzdWx0IGluIHRoZSBhbnN3ZXIgKi8KKworCW11bGwJU0lHSCglZWJ4KQkvKiBtdWwgYnkgdGhlIG1zIGR3IG9mIHRoZSBkZW5vbSAqLworCisJc3VibAklZWF4LEZQVV9hY2N1bV8xCS8qIFN1YnRyYWN0IGZyb20gdGhlIG51bSBsb2NhbCByZWcgKi8KKwlzYmJsCSVlZHgsRlBVX2FjY3VtXzIKKworI2lmZGVmIFBBUkFOT0lECisJamMJTF9idWdnZWRfMgorI2VuZGlmIC8qIFBBUkFOT0lEICovIAorCisJbW92bAlGUFVfcmVzdWx0XzEsJWVheAkvKiBHZXQgdGhlIHJlc3VsdCBiYWNrICovCisJbXVsbAlTSUdMKCVlYngpCS8qIG5vdyBtdWwgdGhlIGxzIGR3IG9mIHRoZSBkZW5vbSAqLworCisJc3VibAklZWF4LEZQVV9hY2N1bV8wCS8qIFN1YnRyYWN0IGZyb20gdGhlIG51bSBsb2NhbCByZWcgKi8KKwlzYmJsCSVlZHgsRlBVX2FjY3VtXzEJLyogU3VidHJhY3QgZnJvbSB0aGUgbnVtIGxvY2FsIHJlZyAqLworCXNiYmwJJDAsRlBVX2FjY3VtXzIKKworI2lmZGVmIFBBUkFOT0lECisJamMJTF9idWdnZWRfMgorI2VuZGlmIC8qIFBBUkFOT0lEICovIAorCisJanoJTERvXzNyZF8zMl9iaXRzCisKKyNpZmRlZiBQQVJBTk9JRAorCWNtcGwJJDEsRlBVX2FjY3VtXzIKKwlqbmUJTF9idWdnZWRfMgorI2VuZGlmIC8qIFBBUkFOT0lEICovCisKKwkvKiBuZWVkIHRvIHN1YnRyYWN0IGFub3RoZXIgb25jZSBvZiB0aGUgZGVub20gKi8KKwltb3ZsCVNJR0woJWVieCksJWVheAorCW1vdmwJU0lHSCglZWJ4KSwlZWR4CisJc3VibAklZWF4LEZQVV9hY2N1bV8wCS8qIFN1YnRyYWN0IGZyb20gdGhlIG51bSBsb2NhbCByZWcgKi8KKwlzYmJsCSVlZHgsRlBVX2FjY3VtXzEKKwlzYmJsCSQwLEZQVV9hY2N1bV8yCisKKyNpZmRlZiBQQVJBTk9JRAorCWpjCUxfYnVnZ2VkXzIKKwlqbmUJTF9idWdnZWRfMgorI2VuZGlmIC8qIFBBUkFOT0lEICovIAorCisJYWRkbAkkMSxGUFVfcmVzdWx0XzEJLyogQ29ycmVjdCB0aGUgYW5zd2VyICovCisJYWRjbAkkMCxGUFVfcmVzdWx0XzIKKworI2lmZGVmIFBBUkFOT0lECisJamMJTF9idWdnZWRfMgkvKiBNdXN0IGNoZWNrIGZvciBub24temVybyByZXN1bHQgaGVyZSAqLworI2VuZGlmIC8qIFBBUkFOT0lEICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBUaGUgZGl2aXNpb24gaXMgZXNzZW50aWFsbHkgZmluaXNoZWQgaGVyZSwgd2UganVzdCBuZWVkIHRvIHBlcmZvcm0KKyAgIHRpZHlpbmcgb3BlcmF0aW9ucy4KKyAgIERlYWwgd2l0aCB0aGUgM3JkIDMyIGJpdHMgKi8KK0xEb18zcmRfMzJfYml0czoKKwltb3ZsCUZQVV9hY2N1bV8xLCVlZHgJCS8qIGdldCB0aGUgcmVkdWNlZCBudW0gKi8KKwltb3ZsCUZQVV9hY2N1bV8wLCVlYXgKKworCS8qIG5lZWQgdG8gY2hlY2sgZm9yIHBvc3NpYmxlIHN1YnNlcXVlbnQgb3ZlcmZsb3cgKi8KKwljbXBsCVNJR0goJWVieCksJWVkeAkvKiBkZW5vbSAqLworCWpiCUxSb3VuZF9wcmVwCisJamEJTFByZXZlbnRfM3JkX292ZXJmbG93CisKKwljbXBsCVNJR0woJWVieCksJWVheAkvKiBkZW5vbSAqLworCWpiCUxSb3VuZF9wcmVwCisKK0xQcmV2ZW50XzNyZF9vdmVyZmxvdzoKKwkvKiBwcmV2ZW50IG92ZXJmbG93ICovCisJc3VibAlTSUdMKCVlYngpLCVlYXgKKwlzYmJsCVNJR0goJWVieCksJWVkeAorCW1vdmwJJWVkeCxGUFVfYWNjdW1fMQorCW1vdmwJJWVheCxGUFVfYWNjdW1fMAorCisJYWRkbAkkMSxGUFVfcmVzdWx0XzEJLyogUmVmbGVjdCB0aGUgc3VidHJhY3Rpb24gaW4gdGhlIGFuc3dlciAqLworCWFkY2wJJDAsRlBVX3Jlc3VsdF8yCisJam5lCUxSb3VuZF9wcmVwCisJam5jCUxSb3VuZF9wcmVwCisKKwkvKiBUaGlzIGlzIGEgdHJpY2t5IHNwb3QsIHRoZXJlIGlzIGFuIG92ZXJmbG93IG9mIHRoZSBhbnN3ZXIgKi8KKwltb3ZiCSQyNTUsRlBVX292ZmxfZmxhZwkJLyogT3ZlcmZsb3cgLT4gMS4wMDAgKi8KKworTFJvdW5kX3ByZXA6CisvKgorICogUHJlcGFyZSBmb3Igcm91bmRpbmcuCisgKiBUbyB0ZXN0IGZvciByb3VuZGluZywgd2UganVzdCBuZWVkIHRvIGNvbXBhcmUgMiphY2N1bSB3aXRoIHRoZQorICogZGVub20uCisgKi8KKwltb3ZsCUZQVV9hY2N1bV8wLCVlY3gKKwltb3ZsCUZQVV9hY2N1bV8xLCVlZHgKKwltb3ZsCSVlY3gsJWVheAorCW9ybAklZWR4LCVlYXgKKwlqeglMUm91bmRfb3ZmbAkJLyogVGhlIGFjY3VtdWxhdG9yIGNvbnRhaW5zIHplcm8uICovCisKKwkvKiBNdWx0aXBseSBieSAyICovCisJY2xjCisJcmNsbAkkMSwlZWN4CisJcmNsbAkkMSwlZWR4CisJamMJTFJvdW5kX2xhcmdlCQkvKiBObyBuZWVkIHRvIGNvbXBhcmUsIGRlbm9tIHNtYWxsZXIgKi8KKworCXN1YmwJU0lHTCglZWJ4KSwlZWN4CisJc2JibAlTSUdIKCVlYngpLCVlZHgKKwlqbmMJTFJvdW5kX25vdF9zbWFsbAorCisJbW92bAkkMHg3MDAwMDAwMCwlZWF4CS8qIERlbm9tIHdhcyBsYXJnZXIgKi8KKwlqbXAJTFJvdW5kX292ZmwKKworTFJvdW5kX25vdF9zbWFsbDoKKwlqbnoJTFJvdW5kX2xhcmdlCisKKwltb3ZsCSQweDgwMDAwMDAwLCVlYXgJLyogUmVtYWluZGVyIHdhcyBleGFjdGx5IDEvMiBkZW5vbSAqLworCWptcAlMUm91bmRfb3ZmbAorCitMUm91bmRfbGFyZ2U6CisJbW92bAkkMHhmZjAwMDAwMCwlZWF4CS8qIERlbm9tIHdhcyBzbWFsbGVyICovCisKK0xSb3VuZF9vdmZsOgorLyogV2UgYXJlIG5vdyByZWFkeSB0byBkZWFsIHdpdGggcm91bmRpbmcsIGJ1dCBmaXJzdCB3ZSBtdXN0IGdldAorICAgdGhlIGJpdHMgcHJvcGVybHkgYWxpZ25lZCAqLworCXRlc3RiCSQyNTUsRlBVX292ZmxfZmxhZwkvKiB3YXMgdGhlIG51bSA+IGRlbm9tID8gKi8KKwlqZQlMUm91bmRfcHJlY2lzaW9uCisKKwlpbmN3CUVYUCglZWRpKQorCisJLyogc2hpZnQgdGhlIG1hbnRpc3NhIHJpZ2h0IG9uZSBiaXQgKi8KKwlzdGMJCQkvKiBXaWxsIHNldCB0aGUgbXMgYml0ICovCisJcmNybAlGUFVfcmVzdWx0XzIKKwlyY3JsCUZQVV9yZXN1bHRfMQorCXJjcmwJJWVheAorCisvKiBSb3VuZCB0aGUgcmVzdWx0IGFzIHJlcXVpcmVkICovCitMUm91bmRfcHJlY2lzaW9uOgorCWRlY3cJRVhQKCVlZGkpCS8qIGJpbmFyeSBwb2ludCBiZXR3ZWVuIDFzdCAmIDJuZCBiaXRzICovCisKKwltb3ZsCSVlYXgsJWVkeAorCW1vdmwJRlBVX3Jlc3VsdF8xLCVlYngKKwltb3ZsCUZQVV9yZXN1bHRfMiwlZWF4CisJam1wCWZwdV9yZWdfcm91bmQKKworCisjaWZkZWYgUEFSQU5PSUQKKy8qIFRoZSBsb2dpYyBpcyB3cm9uZyBpZiB3ZSBnb3QgaGVyZSAqLworTF9idWdnZWQ6CisJcHVzaGwJRVhfSU5URVJOQUx8MHgyMDIKKwljYWxsCUVYQ0VQVElPTgorCXBvcAklZWJ4CisJam1wCUxfZXhpdAorCitMX2J1Z2dlZF8xOgorCXB1c2hsCUVYX0lOVEVSTkFMfDB4MjAzCisJY2FsbAlFWENFUFRJT04KKwlwb3AJJWVieAorCWptcAlMX2V4aXQKKworTF9idWdnZWRfMjoKKwlwdXNobAlFWF9JTlRFUk5BTHwweDIwNAorCWNhbGwJRVhDRVBUSU9OCisJcG9wCSVlYngKKwlqbXAJTF9leGl0CisKK0xfZXhpdDoKKwltb3ZsCSQtMSwlZWF4CisJcG9wbAklZWJ4CisJcG9wbAklZWRpCisJcG9wbAklZXNpCisKKwlsZWF2ZQorCXJldAorI2VuZGlmIC8qIFBBUkFOT0lEICovIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hdGgtZW11L3JlZ191X211bC5TIGIvYXJjaC9pMzg2L21hdGgtZW11L3JlZ191X211bC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3M2YxMmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWF0aC1lbXUvcmVnX3VfbXVsLlMKQEAgLTAsMCArMSwxNDggQEAKKwkuZmlsZQkicmVnX3VfbXVsLlMiCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICByZWdfdV9tdWwuUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDb3JlIG11bHRpcGxpY2F0aW9uIHJvdXRpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTMsMTk5NSwxOTk3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgQXVzdHJhbGlhIHwKKyB8ICAgICAgICAgICAgICAgICAgRS1tYWlsICAgYmlsbG1Ac3VidXJiaWEubmV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgIEJhc2ljIG11bHRpcGxpY2F0aW9uIHJvdXRpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgRG9lcyBub3QgY2hlY2sgdGhlIHJlc3VsdGluZyBleHBvbmVudCBmb3Igb3ZlcmZsb3cvdW5kZXJmbG93ICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgIEZQVV91X211bChGUFVfUkVHICphLCBGUFVfUkVHICpiLCBGUFVfUkVHICpjLCB1bnNpZ25lZCBpbnQgY3cpOyAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICBJbnRlcm5hbCB3b3JraW5nIGlzIGF0IGFwcHJveCAxMjggYml0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgIFJlc3VsdCBpcyByb3VuZGVkIHRvIG5lYXJlc3QgNTMgb3IgNjQgYml0cywgdXNpbmcgIm5lYXJlc3Qgb3IgZXZlbiIuICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImV4Y2VwdGlvbi5oIgorI2luY2x1ZGUgImZwdV9lbXUuaCIKKyNpbmNsdWRlICJjb250cm9sX3cuaCIKKworCisKKyNpZm5kZWYgTk9OX1JFRU5UUkFOVF9GUFUKKy8qICBMb2NhbCBzdG9yYWdlIG9uIHRoZSBzdGFjazogKi8KKyNkZWZpbmUgRlBVX2FjY3VtXzAJLTQoJWVicCkJLyogbXMgd29yZCAqLworI2RlZmluZSBGUFVfYWNjdW1fMQktOCglZWJwKQorCisjZWxzZQorLyogIExvY2FsIHN0b3JhZ2UgaW4gYSBzdGF0aWMgYXJlYTogKi8KKy5kYXRhCisJLmFsaWduIDQsMAorRlBVX2FjY3VtXzA6CisJLmxvbmcJMAorRlBVX2FjY3VtXzE6CisJLmxvbmcJMAorI2VuZGlmIC8qIE5PTl9SRUVOVFJBTlRfRlBVICovCisKKworLnRleHQKK0VOVFJZKEZQVV91X211bCkKKwlwdXNobAklZWJwCisJbW92bAklZXNwLCVlYnAKKyNpZm5kZWYgTk9OX1JFRU5UUkFOVF9GUFUKKwlzdWJsCSQ4LCVlc3AKKyNlbmRpZiAvKiBOT05fUkVFTlRSQU5UX0ZQVSAqLyAKKworCXB1c2hsCSVlc2kKKwlwdXNobAklZWRpCisJcHVzaGwJJWVieAorCisJbW92bAlQQVJBTTEsJWVzaQorCW1vdmwJUEFSQU0yLCVlZGkKKworI2lmZGVmIFBBUkFOT0lECisJdGVzdGwJJDB4ODAwMDAwMDAsU0lHSCglZXNpKQorCWp6CUxfYnVnZ2VkCisJdGVzdGwJJDB4ODAwMDAwMDAsU0lHSCglZWRpKQorCWp6CUxfYnVnZ2VkCisjZW5kaWYgLyogUEFSQU5PSUQgKi8KKworCXhvcmwJJWVjeCwlZWN4CisJeG9ybAklZWJ4LCVlYngKKworCW1vdmwJU0lHTCglZXNpKSwlZWF4CisJbXVsbAlTSUdMKCVlZGkpCisJbW92bAklZWF4LEZQVV9hY2N1bV8wCisJbW92bAklZWR4LEZQVV9hY2N1bV8xCisKKwltb3ZsCVNJR0woJWVzaSksJWVheAorCW11bGwJU0lHSCglZWRpKQorCWFkZGwJJWVheCxGUFVfYWNjdW1fMQorCWFkY2wJJWVkeCwlZWJ4CisvKglhZGNsCSQwLCVlY3gJCS8vIG92ZXJmbG93IGhlcmUgaXMgbm90IHBvc3NpYmxlICovCisKKwltb3ZsCVNJR0goJWVzaSksJWVheAorCW11bGwJU0lHTCglZWRpKQorCWFkZGwJJWVheCxGUFVfYWNjdW1fMQorCWFkY2wJJWVkeCwlZWJ4CisJYWRjbAkkMCwlZWN4CisKKwltb3ZsCVNJR0goJWVzaSksJWVheAorCW11bGwJU0lHSCglZWRpKQorCWFkZGwJJWVheCwlZWJ4CisJYWRjbAklZWR4LCVlY3gKKworCS8qIEdldCB0aGUgc3VtIG9mIHRoZSBleHBvbmVudHMuICovCisJbW92bAlQQVJBTTYsJWVheAorCXN1YmwJRVhQX0JJQVMtMSwlZWF4CisKKwkvKiBUd28gZGVub3JtYWxzIGNhbiBjYXVzZSBhbiBleHBvbmVudCB1bmRlcmZsb3cgKi8KKwljbXBsCUVYUF9XQVlfVU5ERVIsJWVheAorCWpnCUV4cF9ub3RfdW5kZXJmbG93CisKKwkvKiBTZXQgdG8gYSByZWFsbHkgbG93IHZhbHVlIGFsbG93IGNvcnJlY3QgaGFuZGxpbmcgKi8KKwltb3ZsCUVYUF9XQVlfVU5ERVIsJWVheAorCitFeHBfbm90X3VuZGVyZmxvdzoKKworLyogIEhhdmUgbm93IGZpbmlzaGVkIHdpdGggdGhlIHNvdXJjZXMgKi8KKwltb3ZsCVBBUkFNMywlZWRpCS8qIFBvaW50IHRvIHRoZSBkZXN0aW5hdGlvbiAqLworCW1vdncJJWF4LEVYUCglZWRpKQorCisvKiAgTm93IG1ha2Ugc3VyZSB0aGF0IHRoZSByZXN1bHQgaXMgbm9ybWFsaXplZCAqLworCXRlc3RsCSQweDgwMDAwMDAwLCVlY3gKKwlqbnoJTFJlc3VsdF9Ob3JtYWxpc2VkCisKKwkvKiBOb3JtYWxpemUgYnkgc2hpZnRpbmcgbGVmdCBvbmUgYml0ICovCisJc2hsbAkkMSxGUFVfYWNjdW1fMAorCXJjbGwJJDEsRlBVX2FjY3VtXzEKKwlyY2xsCSQxLCVlYngKKwlyY2xsCSQxLCVlY3gKKwlkZWN3CUVYUCglZWRpKQorCitMUmVzdWx0X05vcm1hbGlzZWQ6CisJbW92bAlGUFVfYWNjdW1fMCwlZWF4CisJbW92bAlGUFVfYWNjdW1fMSwlZWR4CisJb3JsCSVlYXgsJWVheAorCWp6CUxfZXh0ZW50X3plcm8KKworCW9ybAkkMSwlZWR4CisKK0xfZXh0ZW50X3plcm86CisJbW92bAklZWN4LCVlYXgKKwlqbXAJZnB1X3JlZ19yb3VuZAorCisKKyNpZmRlZiBQQVJBTk9JRAorTF9idWdnZWQ6CisJcHVzaGwJRVhfSU5URVJOQUx8MHgyMDUKKwljYWxsCUVYQ0VQVElPTgorCXBvcAklZWJ4CisJam1wCUxfZXhpdAorCitMX2V4aXQ6CisJcG9wbAklZWJ4CisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJbGVhdmUKKwlyZXQKKyNlbmRpZiAvKiBQQVJBTk9JRCAqLyAKKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hdGgtZW11L3JlZ191X3N1Yi5TIGIvYXJjaC9pMzg2L21hdGgtZW11L3JlZ191X3N1Yi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNmMyNDgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWF0aC1lbXUvcmVnX3Vfc3ViLlMKQEAgLTAsMCArMSwyNzIgQEAKKwkuZmlsZQkicmVnX3Vfc3ViLlMiCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICByZWdfdV9zdWIuUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDb3JlIGZsb2F0aW5nIHBvaW50IHN1YnRyYWN0aW9uIHJvdXRpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTMsMTk5NSwxOTk3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgQXVzdHJhbGlhIHwKKyB8ICAgICAgICAgICAgICAgICAgRS1tYWlsICAgYmlsbG1Ac3VidXJiaWEubmV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDYWxsIGZyb20gQyBhczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgIGludCBGUFVfdV9zdWIoRlBVX1JFRyAqYXJnMSwgRlBVX1JFRyAqYXJnMiwgRlBVX1JFRyAqYW5zdywgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29udHJvbF93KSAgICAgICAgICAgICB8CisgfCAgICBSZXR1cm4gdmFsdWUgaXMgdGhlIHRhZyBvZiB0aGUgYW5zd2VyLCBvci1lZCB3aXRoIEZQVV9FeGNlcHRpb24gaWYgICAgIHwKKyB8ICAgIG9uZSB3YXMgcmFpc2VkLCBvciAtMSBvbiBpbnRlcm5hbCBlcnJvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgfCAgICBLZXJuZWwgc3VidHJhY3Rpb24gcm91dGluZSBGUFVfdV9zdWIocmVnICphcmcxLCByZWcgKmFyZzIsIHJlZyAqYW5zdykuCisgfCAgICBUYWtlcyB0d28gdmFsaWQgcmVnIGYucC4gbnVtYmVycyAoVEFHX1ZhbGlkKSwgd2hpY2ggYXJlCisgfCAgICB0cmVhdGVkIGFzIHVuc2lnbmVkIG51bWJlcnMsCisgfCAgICBhbmQgcmV0dXJucyB0aGVpciBkaWZmZXJlbmNlIGFzIGEgVEFHX1ZhbGlkIG9yIFRBR19aZXJvIGYucC4KKyB8ICAgIG51bWJlci4KKyB8ICAgIFRoZSBmaXJzdCBudW1iZXIgKGFyZzEpIG11c3QgYmUgdGhlIGxhcmdlci4KKyB8ICAgIFRoZSByZXR1cm5lZCBudW1iZXIgaXMgbm9ybWFsaXplZC4KKyB8ICAgIEJhc2ljIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGlmIFBBUkFOT0lEIGlzIGRlZmluZWQuCisgKi8KKworI2luY2x1ZGUgImV4Y2VwdGlvbi5oIgorI2luY2x1ZGUgImZwdV9lbXUuaCIKKyNpbmNsdWRlICJjb250cm9sX3cuaCIKKworLnRleHQKK0VOVFJZKEZQVV91X3N1YikKKwlwdXNobAklZWJwCisJbW92bAklZXNwLCVlYnAKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCXB1c2hsCSVlYngKKworCW1vdmwJUEFSQU0xLCVlc2kJLyogc291cmNlIDEgKi8KKwltb3ZsCVBBUkFNMiwlZWRpCS8qIHNvdXJjZSAyICovCisJCisJbW92bAlQQVJBTTYsJWVjeAorCXN1YmwJUEFSQU03LCVlY3gJLyogZXhwMSAtIGV4cDIgKi8KKworI2lmZGVmIFBBUkFOT0lECisJLyogc291cmNlIDIgaXMgYWx3YXlzIHNtYWxsZXIgdGhhbiBzb3VyY2UgMSAqLworCWpzCUxfYnVnZ2VkXzEKKworCXRlc3RsCSQweDgwMDAwMDAwLFNJR0goJWVkaSkJLyogVGhlIGFyZ3MgYXJlIGFzc3VtZWQgdG8gYmUgYmUgbm9ybWFsaXplZCAqLworCWplCUxfYnVnZ2VkXzIKKworCXRlc3RsCSQweDgwMDAwMDAwLFNJR0goJWVzaSkKKwlqZQlMX2J1Z2dlZF8yCisjZW5kaWYgLyogUEFSQU5PSUQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8CUZvcm0gYSByZWdpc3RlciBob2xkaW5nIHRoZSAgICAgfAorIHwJc21hbGxlciBudW1iZXIgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwltb3ZsCVNJR0goJWVkaSksJWVheAkvKiByZWdpc3RlciBtcyB3b3JkICovCisJbW92bAlTSUdMKCVlZGkpLCVlYngJLyogcmVnaXN0ZXIgbHMgd29yZCAqLworCisJbW92bAlQQVJBTTMsJWVkaQkvKiBkZXN0aW5hdGlvbiAqLworCW1vdmwJUEFSQU02LCVlZHgKKwltb3Z3CSVkeCxFWFAoJWVkaSkJLyogQ29weSBleHBvbmVudCB0byBkZXN0aW5hdGlvbiAqLworCisJeG9ybAklZWR4LCVlZHgJLyogcmVnaXN0ZXIgZXh0ZW5zaW9uICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfAlTaGlmdCB0aGUgdGVtcG9yYXJ5IHJlZ2lzdGVyCXwKKyB8ICAgICAgcmlnaHQgdGhlIHJlcXVpcmVkIG51bWJlciBvZgl8CisgfAlwbGFjZXMuCQkJCXwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJY21wdwkkMzIsJWN4CQkvKiBzaHJkIG9ubHkgd29ya3MgZm9yIDAuLjMxIGJpdHMgKi8KKwlqbmMJTF9tb3JlX3RoYW5fMzEKKworLyogbGVzcyB0aGFuIDMyIGJpdHMgKi8KKwlzaHJkCSVjbCwlZWJ4LCVlZHgKKwlzaHJkCSVjbCwlZWF4LCVlYngKKwlzaHIJJWNsLCVlYXgKKwlqbXAJTF9zaGlmdF9kb25lCisKK0xfbW9yZV90aGFuXzMxOgorCWNtcHcJJDY0LCVjeAorCWpuYwlMX21vcmVfdGhhbl82MworCisJc3ViYgkkMzIsJWNsCisJanoJTF9leGFjdGx5XzMyCisKKwlzaHJkCSVjbCwlZWF4LCVlZHgKKwlzaHIJJWNsLCVlYXgKKwlvcmwJJWVieCwlZWJ4CisJanoJTF9tb3JlXzMxX25vX2xvdwkvKiBub25lIG9mIHRoZSBsb3dlc3QgYml0cyBpcyBzZXQgKi8KKworCW9ybAkkMSwlZWR4CQkJLyogcmVjb3JkIHRoZSBmYWN0IGluIHRoZSBleHRlbnNpb24gKi8KKworTF9tb3JlXzMxX25vX2xvdzoKKwltb3ZsCSVlYXgsJWVieAorCXhvcmwJJWVheCwlZWF4CisJam1wCUxfc2hpZnRfZG9uZQorCitMX2V4YWN0bHlfMzI6CisJbW92bAklZWJ4LCVlZHgKKwltb3ZsCSVlYXgsJWVieAorCXhvcmwJJWVheCwlZWF4CisJam1wCUxfc2hpZnRfZG9uZQorCitMX21vcmVfdGhhbl82MzoKKwljbXB3CSQ2NSwlY3gKKwlqbmMJTF9tb3JlX3RoYW5fNjQKKworCS8qIFNoaWZ0IHJpZ2h0IGJ5IDY0IGJpdHMgKi8KKwltb3ZsCSVlYXgsJWVkeAorCW9ybAklZWJ4LCVlYngKKwlqeglMX21vcmVfNjNfbm9fbG93CisKKwlvcmwJJDEsJWVkeAorCWptcAlMX21vcmVfNjNfbm9fbG93CisKK0xfbW9yZV90aGFuXzY0OgorCWpuZQlMX21vcmVfdGhhbl82NQorCisJLyogU2hpZnQgcmlnaHQgYnkgNjUgYml0cyAqLworCS8qIENhcnJ5IGlzIGNsZWFyIGlmIHdlIGdldCBoZXJlICovCisJbW92bAklZWF4LCVlZHgKKwlyY3JsCSVlZHgKKwlqbmMJTF9zaGlmdF82NV9uYworCisJb3JsCSQxLCVlZHgKKwlqbXAJTF9tb3JlXzYzX25vX2xvdworCitMX3NoaWZ0XzY1X25jOgorCW9ybAklZWJ4LCVlYngKKwlqeglMX21vcmVfNjNfbm9fbG93CisKKwlvcmwJJDEsJWVkeAorCWptcAlMX21vcmVfNjNfbm9fbG93CisKK0xfbW9yZV90aGFuXzY1OgorCW1vdmwJJDEsJWVkeAkJLyogVGhlIHNoaWZ0ZWQgbnIgYWx3YXlzIGF0IGxlYXN0IG9uZSAnMScgKi8KKworTF9tb3JlXzYzX25vX2xvdzoKKwl4b3JsCSVlYngsJWVieAorCXhvcmwJJWVheCwlZWF4CisKK0xfc2hpZnRfZG9uZToKK0xfc3VidHI6CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8CURvIHRoZSBzdWJ0cmFjdGlvbgl8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJeG9ybAklZWN4LCVlY3gKKwlzdWJsCSVlZHgsJWVjeAorCW1vdmwJJWVjeCwlZWR4CisJbW92bAlTSUdMKCVlc2kpLCVlY3gKKwlzYmJsCSVlYngsJWVjeAorCW1vdmwJJWVjeCwlZWJ4CisJbW92bAlTSUdIKCVlc2kpLCVlY3gKKwlzYmJsCSVlYXgsJWVjeAorCW1vdmwJJWVjeCwlZWF4CisKKyNpZmRlZiBQQVJBTk9JRAorCS8qIFdlIGNhbiBuZXZlciBnZXQgYSBib3Jyb3cgKi8KKwlqYwlMX2J1Z2dlZAorI2VuZGlmIC8qIFBBUkFOT0lEICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfAlOb3JtYWxpemUgdGhlIHJlc3VsdAkJfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJdGVzdGwJJDB4ODAwMDAwMDAsJWVheAorCWpueglMX3JvdW5kCQkvKiBubyBzaGlmdGluZyBuZWVkZWQgKi8KKworCW9ybAklZWF4LCVlYXgKKwlqbnoJTF9zaGlmdF8xCS8qIHNoaWZ0IGxlZnQgMSAtIDMxIGJpdHMgKi8KKworCW9ybAklZWJ4LCVlYngKKwlqbnoJTF9zaGlmdF8zMgkvKiBzaGlmdCBsZWZ0IDMyIC0gNjMgYml0cyAqLworCisvKgorICoJIEEgcmFyZSBjYXNlLCB0aGUgb25seSBvbmUgd2hpY2ggaXMgbm9uLXplcm8gaWYgd2UgZ290IGhlcmUKKyAqICAgICAgICAgaXM6ICAgICAgICAgICAxMDAwMDAwIC4uLi4gMDAwMAorICogICAgICAgICAgICAgICAgICAgICAgLTAxMTExMTEgLi4uLiAxMTExIDEKKyAqICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAwMDAwMDAwIC4uLi4gMDAwMCAxIAorICovCisKKwljbXBsCSQweDgwMDAwMDAwLCVlZHgKKwlqbnoJTF9tdXN0X2JlX3plcm8KKworCS8qIFNoaWZ0IGxlZnQgNjQgYml0cyAqLworCXN1YncJJDY0LEVYUCglZWRpKQorCXhjaGcJJWVkeCwlZWF4CisJam1wCWZwdV9yZWdfcm91bmQKKworTF9tdXN0X2JlX3plcm86CisjaWZkZWYgUEFSQU5PSUQKKwlvcmwJJWVkeCwlZWR4CisJam56CUxfYnVnZ2VkXzMKKyNlbmRpZiAvKiBQQVJBTk9JRCAqLyAKKworCS8qIFRoZSByZXN1bHQgaXMgemVybyAqLworCW1vdncJJDAsRVhQKCVlZGkpCQkvKiBleHBvbmVudCAqLworCW1vdmwJJDAsU0lHTCglZWRpKQorCW1vdmwJJDAsU0lHSCglZWRpKQorCW1vdmwJVEFHX1plcm8sJWVheAorCWptcAlMX2V4aXQKKworTF9zaGlmdF8zMjoKKwltb3ZsCSVlYngsJWVheAorCW1vdmwJJWVkeCwlZWJ4CisJbW92bAkkMCwlZWR4CisJc3VidwkkMzIsRVhQKCVlZGkpCS8qIENhbiBnZXQgdW5kZXJmbG93IGhlcmUgKi8KKworLyogV2UgbmVlZCB0byBzaGlmdCBsZWZ0IGJ5IDEgLSAzMSBiaXRzICovCitMX3NoaWZ0XzE6CisJYnNybAklZWF4LCVlY3gJLyogZ2V0IHRoZSByZXF1aXJlZCBzaGlmdCBpbiAlZWN4ICovCisJc3VibAkkMzEsJWVjeAorCW5lZ2wJJWVjeAorCXNobGQJJWNsLCVlYngsJWVheAorCXNobGQJJWNsLCVlZHgsJWVieAorCXNobAklY2wsJWVkeAorCXN1YncJJWN4LEVYUCglZWRpKQkvKiBDYW4gZ2V0IHVuZGVyZmxvdyBoZXJlICovCisKK0xfcm91bmQ6CisJam1wCWZwdV9yZWdfcm91bmQJLyogUm91bmQgdGhlIHJlc3VsdCAqLworCisKKyNpZmRlZiBQQVJBTk9JRAorTF9idWdnZWRfMToKKwlwdXNobAlFWF9JTlRFUk5BTHwweDIwNgorCWNhbGwJRVhDRVBUSU9OCisJcG9wCSVlYngKKwlqbXAJTF9lcnJvcl9leGl0CisKK0xfYnVnZ2VkXzI6CisJcHVzaGwJRVhfSU5URVJOQUx8MHgyMDkKKwljYWxsCUVYQ0VQVElPTgorCXBvcAklZWJ4CisJam1wCUxfZXJyb3JfZXhpdAorCitMX2J1Z2dlZF8zOgorCXB1c2hsCUVYX0lOVEVSTkFMfDB4MjEwCisJY2FsbAlFWENFUFRJT04KKwlwb3AJJWVieAorCWptcAlMX2Vycm9yX2V4aXQKKworTF9idWdnZWRfNDoKKwlwdXNobAlFWF9JTlRFUk5BTHwweDIxMQorCWNhbGwJRVhDRVBUSU9OCisJcG9wCSVlYngKKwlqbXAJTF9lcnJvcl9leGl0CisKK0xfYnVnZ2VkOgorCXB1c2hsCUVYX0lOVEVSTkFMfDB4MjEyCisJY2FsbAlFWENFUFRJT04KKwlwb3AJJWVieAorCWptcAlMX2Vycm9yX2V4aXQKKworTF9lcnJvcl9leGl0OgorCW1vdmwJJC0xLCVlYXgKKworI2VuZGlmIC8qIFBBUkFOT0lEICovCisKK0xfZXhpdDoKKwlwb3BsCSVlYngKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlsZWF2ZQorCXJldApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hdGgtZW11L3JvdW5kX1hzaWcuUyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9yb3VuZF9Yc2lnLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJlMGU4NzcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWF0aC1lbXUvcm91bmRfWHNpZy5TCkBAIC0wLDAgKzEsMTQxIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICByb3VuZF9Yc2lnLlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDb3B5cmlnaHQgKEMpIDE5OTIsMTk5MywxOTk0LDE5OTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICBXLiBNZXR6ZW50aGVuLCAyMiBQYXJrZXIgU3QsIE9ybW9uZCwgVmljIDMxNjMsICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgIEF1c3RyYWxpYS4gIEUtbWFpbCBiaWxsbUBqYWNvYmkubWF0aHMubW9uYXNoLmVkdS5hdSB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IE5vcm1hbGl6ZSBhbmQgcm91bmQgYSAxMiBieXRlIHF1YW50aXR5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ2FsbCBmcm9tIEMgYXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgIGludCByb3VuZF9Yc2lnKFhzaWcgKm4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgTm9ybWFsaXplIGEgMTIgYnl0ZSBxdWFudGl0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDYWxsIGZyb20gQyBhczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgaW50IG5vcm1fWHNpZyhYc2lnICpuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBFYWNoIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIHNoaWZ0IChuciBvZiBiaXRzKS4gICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCS5maWxlCSJyb3VuZF9Yc2lnLlMiCisKKyNpbmNsdWRlICJmcHVfZW11LmgiCisKKworLnRleHQKK0VOVFJZKHJvdW5kX1hzaWcpCisJcHVzaGwJJWVicAorCW1vdmwJJWVzcCwlZWJwCisJcHVzaGwJJWVieAkJLyogUmVzZXJ2ZSBzb21lIHNwYWNlICovCisJcHVzaGwJJWVieAorCXB1c2hsCSVlc2kKKworCW1vdmwJUEFSQU0xLCVlc2kKKworCW1vdmwJOCglZXNpKSwlZWR4CisJbW92bAk0KCVlc2kpLCVlYngKKwltb3ZsCSglZXNpKSwlZWF4CisKKwltb3ZsCSQwLC00KCVlYnApCisKKwlvcmwJJWVkeCwlZWR4CS8qIG1zIGJpdHMgKi8KKwlqcwlMX3JvdW5kCQkvKiBBbHJlYWR5IG5vcm1hbGl6ZWQgKi8KKwlqbnoJTF9zaGlmdF8xCS8qIFNoaWZ0IGxlZnQgMSAtIDMxIGJpdHMgKi8KKworCW1vdmwJJWVieCwlZWR4CisJbW92bAklZWF4LCVlYngKKwl4b3JsCSVlYXgsJWVheAorCW1vdmwJJC0zMiwtNCglZWJwKQorCisvKiBXZSBuZWVkIHRvIHNoaWZ0IGxlZnQgYnkgMSAtIDMxIGJpdHMgKi8KK0xfc2hpZnRfMToKKwlic3JsCSVlZHgsJWVjeAkvKiBnZXQgdGhlIHJlcXVpcmVkIHNoaWZ0IGluICVlY3ggKi8KKwlzdWJsCSQzMSwlZWN4CisJbmVnbAklZWN4CisJc3VibAklZWN4LC00KCVlYnApCisJc2hsZAklY2wsJWVieCwlZWR4CisJc2hsZAklY2wsJWVheCwlZWJ4CisJc2hsCSVjbCwlZWF4CisKK0xfcm91bmQ6CisJdGVzdGwJJDB4ODAwMDAwMDAsJWVheAorCWp6CUxfZXhpdAorCisJYWRkbAkkMSwlZWJ4CisJYWRjbAkkMCwlZWR4CisJam56CUxfZXhpdAorCisJbW92bAkkMHg4MDAwMDAwMCwlZWR4CisJaW5jbAktNCglZWJwKQorCitMX2V4aXQ6CisJbW92bAklZWR4LDgoJWVzaSkKKwltb3ZsCSVlYngsNCglZXNpKQorCW1vdmwJJWVheCwoJWVzaSkKKworCW1vdmwJLTQoJWVicCksJWVheAorCisJcG9wbAklZXNpCisJcG9wbAklZWJ4CisJbGVhdmUKKwlyZXQKKworCisKKworRU5UUlkobm9ybV9Yc2lnKQorCXB1c2hsCSVlYnAKKwltb3ZsCSVlc3AsJWVicAorCXB1c2hsCSVlYngJCS8qIFJlc2VydmUgc29tZSBzcGFjZSAqLworCXB1c2hsCSVlYngKKwlwdXNobAklZXNpCisKKwltb3ZsCVBBUkFNMSwlZXNpCisKKwltb3ZsCTgoJWVzaSksJWVkeAorCW1vdmwJNCglZXNpKSwlZWJ4CisJbW92bAkoJWVzaSksJWVheAorCisJbW92bAkkMCwtNCglZWJwKQorCisJb3JsCSVlZHgsJWVkeAkvKiBtcyBiaXRzICovCisJanMJTF9uX2V4aXQJCS8qIEFscmVhZHkgbm9ybWFsaXplZCAqLworCWpueglMX25fc2hpZnRfMQkvKiBTaGlmdCBsZWZ0IDEgLSAzMSBiaXRzICovCisKKwltb3ZsCSVlYngsJWVkeAorCW1vdmwJJWVheCwlZWJ4CisJeG9ybAklZWF4LCVlYXgKKwltb3ZsCSQtMzIsLTQoJWVicCkKKworCW9ybAklZWR4LCVlZHgJLyogbXMgYml0cyAqLworCWpzCUxfbl9leGl0CS8qIE5vcm1hbGl6ZWQgbm93ICovCisJam56CUxfbl9zaGlmdF8xCS8qIFNoaWZ0IGxlZnQgMSAtIDMxIGJpdHMgKi8KKworCW1vdmwJJWVieCwlZWR4CisJbW92bAklZWF4LCVlYngKKwl4b3JsCSVlYXgsJWVheAorCWFkZGwJJC0zMiwtNCglZWJwKQorCWptcAlMX25fZXhpdAkvKiBNaWdodCBub3QgYmUgbm9ybWFsaXplZCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBidXQgc2hpZnQgbm8gbW9yZS4gKi8KKworLyogV2UgbmVlZCB0byBzaGlmdCBsZWZ0IGJ5IDEgLSAzMSBiaXRzICovCitMX25fc2hpZnRfMToKKwlic3JsCSVlZHgsJWVjeAkvKiBnZXQgdGhlIHJlcXVpcmVkIHNoaWZ0IGluICVlY3ggKi8KKwlzdWJsCSQzMSwlZWN4CisJbmVnbAklZWN4CisJc3VibAklZWN4LC00KCVlYnApCisJc2hsZAklY2wsJWVieCwlZWR4CisJc2hsZAklY2wsJWVheCwlZWJ4CisJc2hsCSVjbCwlZWF4CisKK0xfbl9leGl0OgorCW1vdmwJJWVkeCw4KCVlc2kpCisJbW92bAklZWJ4LDQoJWVzaSkKKwltb3ZsCSVlYXgsKCVlc2kpCisKKwltb3ZsCS00KCVlYnApLCVlYXgKKworCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCWxlYXZlCisJcmV0CisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYXRoLWVtdS9zaHJfWHNpZy5TIGIvYXJjaC9pMzg2L21hdGgtZW11L3Nocl9Yc2lnLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFjZGQxMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9zaHJfWHNpZy5TCkBAIC0wLDAgKzEsODcgQEAKKwkuZmlsZQkic2hyX1hzaWcuUyIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgIHNocl9Yc2lnLlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IDEyIGJ5dGUgcmlnaHQgc2hpZnQgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDb3B5cmlnaHQgKEMpIDE5OTIsMTk5NCwxOTk1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICBXLiBNZXR6ZW50aGVuLCAyMiBQYXJrZXIgU3QsIE9ybW9uZCwgVmljIDMxNjMsICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgIEF1c3RyYWxpYS4gIEUtbWFpbCBiaWxsbUBqYWNvYmkubWF0aHMubW9uYXNoLmVkdS5hdSB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENhbGwgZnJvbSBDIGFzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICB2b2lkIHNocl9Yc2lnKFhzaWcgKmFyZywgdW5zaWduZWQgbnIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgRXh0ZW5kZWQgc2hpZnQgcmlnaHQgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICBGYXN0ZXN0IGZvciBzbWFsbCBzaGlmdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgIFNoaWZ0cyB0aGUgMTIgYnl0ZSBxdWFudGl0eSBwb2ludGVkIHRvIGJ5IHRoZSBmaXJzdCBhcmcgKGFyZykgICAgICAgICAgIHwKKyB8ICAgcmlnaHQgYnkgdGhlIG51bWJlciBvZiBiaXRzIHNwZWNpZmllZCBieSB0aGUgc2Vjb25kIGFyZyAobnIpLiAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJmcHVfZW11LmgiCisKKy50ZXh0CitFTlRSWShzaHJfWHNpZykKKwlwdXNoCSVlYnAKKwltb3ZsCSVlc3AsJWVicAorCXB1c2hsCSVlc2kKKwltb3ZsCVBBUkFNMiwlZWN4CisJbW92bAlQQVJBTTEsJWVzaQorCWNtcGwJJDMyLCVlY3gJLyogc2hyZCBvbmx5IHdvcmtzIGZvciAwLi4zMSBiaXRzICovCisJam5jCUxfbW9yZV90aGFuXzMxCisKKy8qIGxlc3MgdGhhbiAzMiBiaXRzICovCisJcHVzaGwJJWVieAorCW1vdmwJKCVlc2kpLCVlYXgJLyogbHNsICovCisJbW92bAk0KCVlc2kpLCVlYngJLyogbWlkbCAqLworCW1vdmwJOCglZXNpKSwlZWR4CS8qIG1zbCAqLworCXNocmQJJWNsLCVlYngsJWVheAorCXNocmQJJWNsLCVlZHgsJWVieAorCXNocgklY2wsJWVkeAorCW1vdmwJJWVheCwoJWVzaSkKKwltb3ZsCSVlYngsNCglZXNpKQorCW1vdmwJJWVkeCw4KCVlc2kpCisJcG9wbAklZWJ4CisJcG9wbAklZXNpCisJbGVhdmUKKwlyZXQKKworTF9tb3JlX3RoYW5fMzE6CisJY21wbAkkNjQsJWVjeAorCWpuYwlMX21vcmVfdGhhbl82MworCisJc3ViYgkkMzIsJWNsCisJbW92bAk0KCVlc2kpLCVlYXgJLyogbWlkbCAqLworCW1vdmwJOCglZXNpKSwlZWR4CS8qIG1zbCAqLworCXNocmQJJWNsLCVlZHgsJWVheAorCXNocgklY2wsJWVkeAorCW1vdmwJJWVheCwoJWVzaSkKKwltb3ZsCSVlZHgsNCglZXNpKQorCW1vdmwJJDAsOCglZXNpKQorCXBvcGwJJWVzaQorCWxlYXZlCisJcmV0CisKK0xfbW9yZV90aGFuXzYzOgorCWNtcGwJJDk2LCVlY3gKKwlqbmMJTF9tb3JlX3RoYW5fOTUKKworCXN1YmIJJDY0LCVjbAorCW1vdmwJOCglZXNpKSwlZWF4CS8qIG1zbCAqLworCXNocgklY2wsJWVheAorCXhvcmwJJWVkeCwlZWR4CisJbW92bAklZWF4LCglZXNpKQorCW1vdmwJJWVkeCw0KCVlc2kpCisJbW92bAklZWR4LDgoJWVzaSkKKwlwb3BsCSVlc2kKKwlsZWF2ZQorCXJldAorCitMX21vcmVfdGhhbl85NToKKwl4b3JsCSVlYXgsJWVheAorCW1vdmwJJWVheCwoJWVzaSkKKwltb3ZsCSVlYXgsNCglZXNpKQorCW1vdmwJJWVheCw4KCVlc2kpCisJcG9wbAklZXNpCisJbGVhdmUKKwlyZXQKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYXRoLWVtdS9zdGF0dXNfdy5oIGIvYXJjaC9pMzg2L21hdGgtZW11L3N0YXR1c193LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhkN2I3NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9zdGF0dXNfdy5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgIHN0YXR1c193LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENvcHlyaWdodCAoQykgMTk5MiwxOTkzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgQXVzdHJhbGlhLiAgRS1tYWlsICAgYmlsbG1AdmF4Yy5jYy5tb25hc2guZWR1LmF1ICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIF9TVEFUVVNfSF8KKyNkZWZpbmUgX1NUQVRVU19IXworCisjaW5jbHVkZSAiZnB1X2VtdS5oIiAgICAvKiBmb3IgZGVmaW5pdGlvbiBvZiBQRUNVTElBUl80ODYgKi8KKworI2lmZGVmIF9fQVNTRU1CTFlfXworI2RlZmluZQlDb25zdF9fKHgpCSQjI3gKKyNlbHNlCisjZGVmaW5lCUNvbnN0X18oeCkJeAorI2VuZGlmCisKKyNkZWZpbmUgU1dfQmFja3dhcmQgICAgCUNvbnN0X18oMHg4MDAwKQkvKiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIFNXX0MzCQlDb25zdF9fKDB4NDAwMCkJLyogY29uZGl0aW9uIGJpdCAzICovCisjZGVmaW5lIFNXX1RvcAkJQ29uc3RfXygweDM4MDApCS8qIHRvcCBvZiBzdGFjayAqLworI2RlZmluZSBTV19Ub3BfU2hpZnQgCUNvbnN0X18oMTEpCS8qIHNoaWZ0IGZvciB0b3Agb2Ygc3RhY2sgYml0cyAqLworI2RlZmluZSBTV19DMgkJQ29uc3RfXygweDA0MDApCS8qIGNvbmRpdGlvbiBiaXQgMiAqLworI2RlZmluZSBTV19DMQkJQ29uc3RfXygweDAyMDApCS8qIGNvbmRpdGlvbiBiaXQgMSAqLworI2RlZmluZSBTV19DMAkJQ29uc3RfXygweDAxMDApCS8qIGNvbmRpdGlvbiBiaXQgMCAqLworI2RlZmluZSBTV19TdW1tYXJ5ICAgICAJQ29uc3RfXygweDAwODApCS8qIGV4Y2VwdGlvbiBzdW1tYXJ5ICovCisjZGVmaW5lIFNXX1N0YWNrX0ZhdWx0CUNvbnN0X18oMHgwMDQwKQkvKiBzdGFjayBmYXVsdCAqLworI2RlZmluZSBTV19QcmVjaXNpb24gICAJQ29uc3RfXygweDAwMjApCS8qIGxvc3Mgb2YgcHJlY2lzaW9uICovCisjZGVmaW5lIFNXX1VuZGVyZmxvdyAgIAlDb25zdF9fKDB4MDAxMCkJLyogdW5kZXJmbG93ICovCisjZGVmaW5lIFNXX092ZXJmbG93ICAgIAlDb25zdF9fKDB4MDAwOCkJLyogb3ZlcmZsb3cgKi8KKyNkZWZpbmUgU1dfWmVyb19EaXYgICAgCUNvbnN0X18oMHgwMDA0KQkvKiBkaXZpZGUgYnkgemVybyAqLworI2RlZmluZSBTV19EZW5vcm1fT3AgICAJQ29uc3RfXygweDAwMDIpCS8qIGRlbm9ybWFsaXplZCBvcGVyYW5kICovCisjZGVmaW5lIFNXX0ludmFsaWQgICAgIAlDb25zdF9fKDB4MDAwMSkJLyogaW52YWxpZCBvcGVyYXRpb24gKi8KKworI2RlZmluZSBTV19FeGNfTWFzayAgICAgQ29uc3RfXygweDI3ZikgIC8qIFN0YXR1cyB3b3JkIGV4Y2VwdGlvbiBiaXQgbWFzayAqLworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisjZGVmaW5lIENPTVBfQV9ndF9CCTEKKyNkZWZpbmUgQ09NUF9BX2VxX0IJMgorI2RlZmluZSBDT01QX0FfbHRfQgkzCisjZGVmaW5lIENPTVBfTm9fQ29tcAk0CisjZGVmaW5lIENPTVBfRGVub3JtYWwgICAweDIwCisjZGVmaW5lIENPTVBfTmFOCTB4NDAKKyNkZWZpbmUgQ09NUF9TTmFOCTB4ODAKKworI2RlZmluZSBzdGF0dXNfd29yZCgpIFwKKyAgKChwYXJ0aWFsX3N0YXR1cyAmIH5TV19Ub3AgJiAweGZmZmYpIHwgKCh0b3AgPDwgU1dfVG9wX1NoaWZ0KSAmIFNXX1RvcCkpCisjZGVmaW5lIHNldGNjKGNjKSAoeyBcCisgIHBhcnRpYWxfc3RhdHVzICY9IH4oU1dfQzB8U1dfQzF8U1dfQzJ8U1dfQzMpOyBcCisgIHBhcnRpYWxfc3RhdHVzIHw9IChjYykgJiAoU1dfQzB8U1dfQzF8U1dfQzJ8U1dfQzMpOyB9KQorCisjaWZkZWYgUEVDVUxJQVJfNDg2CisgICAvKiBEZWZhdWx0LCB0aGlzIGNvbnZleXMgbm8gaW5mb3JtYXRpb24sIGJ1dCBhbiA4MDQ4NiBkb2VzIGl0LiAqLworICAgLyogQ2xlYXIgdGhlIFNXX0MxIGJpdCwgIm90aGVyIGJpdHMgdW5kZWZpbmVkIi4gKi8KKyMgIGRlZmluZSBjbGVhcl9DMSgpICB7IHBhcnRpYWxfc3RhdHVzICY9IH5TV19DMTsgfQorIyBlbHNlCisjICBkZWZpbmUgY2xlYXJfQzEoKQorI2VuZGlmIC8qIFBFQ1VMSUFSXzQ4NiAqLworCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKKyNlbmRpZiAvKiBfU1RBVFVTX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWF0aC1lbXUvdmVyc2lvbi5oIGIvYXJjaC9pMzg2L21hdGgtZW11L3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGQ3M2ExCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L3ZlcnNpb24uaApAQCAtMCwwICsxLDEyIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICB2ZXJzaW9uLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENvcHlyaWdodCAoQykgMTk5MiwxOTkzLDE5OTQsMTk5NiwxOTk3LDE5OTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICBXLiBNZXR6ZW50aGVuLCAyMiBQYXJrZXIgU3QsIE9ybW9uZCwgVmljIDMxNjMsIEF1c3RyYWxpYSB8CisgfCAgICAgICAgICAgICAgICAgIEUtbWFpbCAgIGJpbGxtQG1lbGJwYy5vcmcuYXUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgRlBVX1ZFUlNJT04gIndtLUZQVS1lbXUgdmVyc2lvbiAyLjAxIgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hdGgtZW11L3dtX3NocnguUyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS93bV9zaHJ4LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE4NDI4MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS93bV9zaHJ4LlMKQEAgLTAsMCArMSwyMDQgQEAKKwkuZmlsZQkid21fc2hyeC5TIgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgd21fc2hyeC5TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgNjQgYml0IHJpZ2h0IHNoaWZ0IGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENvcHlyaWdodCAoQykgMTk5MiwxOTk1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgQXVzdHJhbGlhLiAgRS1tYWlsIGJpbGxtQGphY29iaS5tYXRocy5tb25hc2guZWR1LmF1IHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ2FsbCBmcm9tIEMgYXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgIHVuc2lnbmVkIEZQVV9zaHJ4KHZvaWQgKmFyZzEsIHVuc2lnbmVkIGFyZzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IGFuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICB1bnNpZ25lZCBGUFVfc2hyeHModm9pZCAqYXJnMSwgdW5zaWduZWQgYXJnMikgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImZwdV9lbXUuaCIKKworLnRleHQKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgICB1bnNpZ25lZCBGUFVfc2hyeCh2b2lkICphcmcxLCB1bnNpZ25lZCBhcmcyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgRXh0ZW5kZWQgc2hpZnQgcmlnaHQgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICBGYXN0ZXN0IGZvciBzbWFsbCBzaGlmdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgIFNoaWZ0cyB0aGUgNjQgYml0IHF1YW50aXR5IHBvaW50ZWQgdG8gYnkgdGhlIGZpcnN0IGFyZyAoYXJnMSkgICAgICAgICAgIHwKKyB8ICAgcmlnaHQgYnkgdGhlIG51bWJlciBvZiBiaXRzIHNwZWNpZmllZCBieSB0aGUgc2Vjb25kIGFyZyAoYXJnMikuICAgICAgICAgfAorIHwgICBGb3JtcyBhIDk2IGJpdCBxdWFudGl0eSBmcm9tIHRoZSA2NCBiaXQgYXJnIGFuZCBlYXg6ICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICBbICA2NCBiaXQgYXJnIF1bIGVheCBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgc2hpZnQgcmlnaHQgIC0tLS0tLS0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICBUaGUgZWF4IHJlZ2lzdGVyIGlzIGluaXRpYWxpemVkIHRvIDAgYmVmb3JlIHRoZSBzaGlmdGluZy4gICAgICAgICAgICAgICB8CisgfCAgIFJlc3VsdHMgcmV0dXJuZWQgaW4gdGhlIDY0IGJpdCBhcmcgYW5kIGVheC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworRU5UUlkoRlBVX3NocngpCisJcHVzaAklZWJwCisJbW92bAklZXNwLCVlYnAKKwlwdXNobAklZXNpCisJbW92bAlQQVJBTTIsJWVjeAorCW1vdmwJUEFSQU0xLCVlc2kKKwljbXBsCSQzMiwlZWN4CS8qIHNocmQgb25seSB3b3JrcyBmb3IgMC4uMzEgYml0cyAqLworCWpuYwlMX21vcmVfdGhhbl8zMQorCisvKiBsZXNzIHRoYW4gMzIgYml0cyAqLworCXB1c2hsCSVlYngKKwltb3ZsCSglZXNpKSwlZWJ4CS8qIGxzbCAqLworCW1vdmwJNCglZXNpKSwlZWR4CS8qIG1zbCAqLworCXhvcmwJJWVheCwlZWF4CS8qIGV4dGVuc2lvbiAqLworCXNocmQJJWNsLCVlYngsJWVheAorCXNocmQJJWNsLCVlZHgsJWVieAorCXNocgklY2wsJWVkeAorCW1vdmwJJWVieCwoJWVzaSkKKwltb3ZsCSVlZHgsNCglZXNpKQorCXBvcGwJJWVieAorCXBvcGwJJWVzaQorCWxlYXZlCisJcmV0CisKK0xfbW9yZV90aGFuXzMxOgorCWNtcGwJJDY0LCVlY3gKKwlqbmMJTF9tb3JlX3RoYW5fNjMKKworCXN1YmIJJDMyLCVjbAorCW1vdmwJKCVlc2kpLCVlYXgJLyogbHNsICovCisJbW92bAk0KCVlc2kpLCVlZHgJLyogbXNsICovCisJc2hyZAklY2wsJWVkeCwlZWF4CisJc2hyCSVjbCwlZWR4CisJbW92bAklZWR4LCglZXNpKQorCW1vdmwJJDAsNCglZXNpKQorCXBvcGwJJWVzaQorCWxlYXZlCisJcmV0CisKK0xfbW9yZV90aGFuXzYzOgorCWNtcGwJJDk2LCVlY3gKKwlqbmMJTF9tb3JlX3RoYW5fOTUKKworCXN1YmIJJDY0LCVjbAorCW1vdmwJNCglZXNpKSwlZWF4CS8qIG1zbCAqLworCXNocgklY2wsJWVheAorCXhvcmwJJWVkeCwlZWR4CisJbW92bAklZWR4LCglZXNpKQorCW1vdmwJJWVkeCw0KCVlc2kpCisJcG9wbAklZXNpCisJbGVhdmUKKwlyZXQKKworTF9tb3JlX3RoYW5fOTU6CisJeG9ybAklZWF4LCVlYXgKKwltb3ZsCSVlYXgsKCVlc2kpCisJbW92bAklZWF4LDQoJWVzaSkKKwlwb3BsCSVlc2kKKwlsZWF2ZQorCXJldAorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgICB1bnNpZ25lZCBGUFVfc2hyeHModm9pZCAqYXJnMSwgdW5zaWduZWQgYXJnMikgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgRXh0ZW5kZWQgc2hpZnQgcmlnaHQgZnVuY3Rpb24gKG9wdGltaXplZCBmb3Igc21hbGwgZmxvYXRpbmcgcG9pbnQgICAgICAgfAorIHwgICBpbnRlZ2VycykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgIFNoaWZ0cyB0aGUgNjQgYml0IHF1YW50aXR5IHBvaW50ZWQgdG8gYnkgdGhlIGZpcnN0IGFyZyAoYXJnMSkgICAgICAgICAgIHwKKyB8ICAgcmlnaHQgYnkgdGhlIG51bWJlciBvZiBiaXRzIHNwZWNpZmllZCBieSB0aGUgc2Vjb25kIGFyZyAoYXJnMikuICAgICAgICAgfAorIHwgICBGb3JtcyBhIDk2IGJpdCBxdWFudGl0eSBmcm9tIHRoZSA2NCBiaXQgYXJnIGFuZCBlYXg6ICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICBbICA2NCBiaXQgYXJnIF1bIGVheCBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgc2hpZnQgcmlnaHQgIC0tLS0tLS0tLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICBUaGUgZWF4IHJlZ2lzdGVyIGlzIGluaXRpYWxpemVkIHRvIDAgYmVmb3JlIHRoZSBzaGlmdGluZy4gICAgICAgICAgICAgICB8CisgfCAgIFRoZSBsb3dlciA4IGJpdHMgb2YgZWF4IGFyZSBsb3N0IGFuZCByZXBsYWNlZCBieSBhIGZsYWcgd2hpY2ggaXMgICAgICAgIHwKKyB8ICAgc2V0ICh0byAweDAxKSBpZiBhbnkgYml0LCBhcGFydCBmcm9tIHRoZSBmaXJzdCBvbmUsIGlzIHNldCBpbiB0aGUgICAgICAgfAorIHwgICBwYXJ0IHdoaWNoIGhhcyBiZWVuIHNoaWZ0ZWQgb3V0IG9mIHRoZSBhcmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgIFJlc3VsdHMgcmV0dXJuZWQgaW4gdGhlIDY0IGJpdCBhcmcgYW5kIGVheC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0VOVFJZKEZQVV9zaHJ4cykKKwlwdXNoCSVlYnAKKwltb3ZsCSVlc3AsJWVicAorCXB1c2hsCSVlc2kKKwlwdXNobAklZWJ4CisJbW92bAlQQVJBTTIsJWVjeAorCW1vdmwJUEFSQU0xLCVlc2kKKwljbXBsCSQ2NCwlZWN4CS8qIHNocmQgb25seSB3b3JrcyBmb3IgMC4uMzEgYml0cyAqLworCWpuYwlMc19tb3JlX3RoYW5fNjMKKworCWNtcGwJJDMyLCVlY3gJLyogc2hyZCBvbmx5IHdvcmtzIGZvciAwLi4zMSBiaXRzICovCisJamMJTHNfbGVzc190aGFuXzMyCisKKy8qIFdlIGdvdCBoZXJlIHdpdGhvdXQganVtcHMgYnkgYXNzdW1pbmcgdGhhdCB0aGUgbW9zdCBjb21tb24gcmVxdWlyZW1lbnQKKyAgIGlzIGZvciBzbWFsbCBpbnRlZ2VycyAqLworLyogU2hpZnQgYnkgWzMyLi42M10gYml0cyAqLworCXN1YmIJJDMyLCVjbAorCW1vdmwJKCVlc2kpLCVlYXgJLyogbHNsICovCisJbW92bAk0KCVlc2kpLCVlZHgJLyogbXNsICovCisJeG9ybAklZWJ4LCVlYngKKwlzaHJkCSVjbCwlZWF4LCVlYngKKwlzaHJkCSVjbCwlZWR4LCVlYXgKKwlzaHIJJWNsLCVlZHgKKwlvcmwJJWVieCwlZWJ4CQkvKiB0ZXN0IHRoZXNlIDMyIGJpdHMgKi8KKwlzZXRuZQklYmwKKwl0ZXN0CSQweDdmZmZmZmZmLCVlYXgJLyogYW5kIDMxIGJpdHMgaGVyZSAqLworCXNldG5lCSViaAorCW9ydwklYngsJWJ4CQkJLyogQW55IG9mIHRoZSA2MyBiaXQgc2V0ID8gKi8KKwlzZXRuZQklYWwKKwltb3ZsCSVlZHgsKCVlc2kpCisJbW92bAkkMCw0KCVlc2kpCisJcG9wbAklZWJ4CisJcG9wbAklZXNpCisJbGVhdmUKKwlyZXQKKworLyogU2hpZnQgYnkgWzAuLjMxXSBiaXRzICovCitMc19sZXNzX3RoYW5fMzI6CisJbW92bAkoJWVzaSksJWVieAkvKiBsc2wgKi8KKwltb3ZsCTQoJWVzaSksJWVkeAkvKiBtc2wgKi8KKwl4b3JsCSVlYXgsJWVheAkvKiBleHRlbnNpb24gKi8KKwlzaHJkCSVjbCwlZWJ4LCVlYXgKKwlzaHJkCSVjbCwlZWR4LCVlYngKKwlzaHIJJWNsLCVlZHgKKwl0ZXN0CSQweDdmZmZmZmZmLCVlYXgJLyogb25seSBuZWVkIHRvIGxvb2sgYXQgZWF4IGhlcmUgKi8KKwlzZXRuZQklYWwKKwltb3ZsCSVlYngsKCVlc2kpCisJbW92bAklZWR4LDQoJWVzaSkKKwlwb3BsCSVlYngKKwlwb3BsCSVlc2kKKwlsZWF2ZQorCXJldAorCisvKiBTaGlmdCBieSBbNjQuLjk1XSBiaXRzICovCitMc19tb3JlX3RoYW5fNjM6CisJY21wbAkkOTYsJWVjeAorCWpuYwlMc19tb3JlX3RoYW5fOTUKKworCXN1YmIJJDY0LCVjbAorCW1vdmwJKCVlc2kpLCVlYngJLyogbHNsICovCisJbW92bAk0KCVlc2kpLCVlYXgJLyogbXNsICovCisJeG9ybAklZWR4LCVlZHgJLyogZXh0ZW5zaW9uICovCisJc2hyZAklY2wsJWVieCwlZWR4CisJc2hyZAklY2wsJWVheCwlZWJ4CisJc2hyCSVjbCwlZWF4CisJb3JsCSVlYngsJWVkeAorCXNldG5lCSVibAorCXRlc3QJJDB4N2ZmZmZmZmYsJWVheAkvKiBvbmx5IG5lZWQgdG8gbG9vayBhdCBlYXggaGVyZSAqLworCXNldG5lCSViaAorCW9ydwklYngsJWJ4CisJc2V0bmUJJWFsCisJeG9ybAklZWR4LCVlZHgKKwltb3ZsCSVlZHgsKCVlc2kpCS8qIHNldCB0byB6ZXJvICovCisJbW92bAklZWR4LDQoJWVzaSkJLyogc2V0IHRvIHplcm8gKi8KKwlwb3BsCSVlYngKKwlwb3BsCSVlc2kKKwlsZWF2ZQorCXJldAorCitMc19tb3JlX3RoYW5fOTU6CisvKiBTaGlmdCBieSBbOTYuLmluZikgYml0cyAqLworCXhvcmwJJWVheCwlZWF4CisJbW92bAkoJWVzaSksJWVieAorCW9ybAk0KCVlc2kpLCVlYngKKwlzZXRuZQklYWwKKwl4b3JsCSVlYngsJWVieAorCW1vdmwJJWVieCwoJWVzaSkKKwltb3ZsCSVlYngsNCglZXNpKQorCXBvcGwJJWVieAorCXBvcGwJJWVzaQorCWxlYXZlCisJcmV0CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWF0aC1lbXUvd21fc3FydC5TIGIvYXJjaC9pMzg2L21hdGgtZW11L3dtX3NxcnQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjU4ZjU5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L3dtX3NxcnQuUwpAQCAtMCwwICsxLDQ3MCBAQAorCS5maWxlCSJ3bV9zcXJ0LlMiCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICB3bV9zcXJ0LlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBGaXhlZCBwb2ludCBhcml0aG1ldGljIHNxdWFyZSByb290IGV2YWx1YXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTMsMTk5NSwxOTk3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgVy4gTWV0emVudGhlbiwgMjIgUGFya2VyIFN0LCBPcm1vbmQsIFZpYyAzMTYzLCAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICBBdXN0cmFsaWEuICBFLW1haWwgYmlsbG1Ac3VidXJiaWEubmV0ICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDYWxsIGZyb20gQyBhczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgIGludCB3bV9zcXJ0KEZQVV9SRUcgKm4sIHVuc2lnbmVkIGludCBjb250cm9sX3dvcmQpICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgIHdtX3NxcnQoRlBVX1JFRyAqbiwgdW5zaWduZWQgaW50IGNvbnRyb2xfd29yZCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICByZXR1cm5zIHRoZSBzcXVhcmUgcm9vdCBvZiBuIGluIG4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgIFVzZSBOZXd0b24ncyBtZXRob2QgdG8gY29tcHV0ZSB0aGUgc3F1YXJlIHJvb3Qgb2YgYSBudW1iZXIsIHdoaWNoIG11c3QgICB8CisgfCAgYmUgaW4gdGhlIHJhbmdlICBbMS4wIC4uIDQuMCksICB0byA2NCBiaXRzIGFjY3VyYWN5LiAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICBEb2VzIG5vdCBjaGVjayB0aGUgc2lnbiBvciB0YWcgb2YgdGhlIGFyZ3VtZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgIFNldHMgdGhlIGV4cG9uZW50LCBidXQgbm90IHRoZSBzaWduIG9yIHRhZyBvZiB0aGUgcmVzdWx0LiAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICBUaGUgZ3Vlc3MgaXMga2VwdCBpbiAlZXNpOiVlZGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiZXhjZXB0aW9uLmgiCisjaW5jbHVkZSAiZnB1X2VtdS5oIgorCisKKyNpZm5kZWYgTk9OX1JFRU5UUkFOVF9GUFUKKy8qCUxvY2FsIHN0b3JhZ2Ugb24gdGhlIHN0YWNrOiAqLworI2RlZmluZSBGUFVfYWNjdW1fMwktNCglZWJwKQkvKiBtcyB3b3JkICovCisjZGVmaW5lIEZQVV9hY2N1bV8yCS04KCVlYnApCisjZGVmaW5lIEZQVV9hY2N1bV8xCS0xMiglZWJwKQorI2RlZmluZSBGUFVfYWNjdW1fMAktMTYoJWVicCkKKworLyoKKyAqIFRoZSBkZS1ub3JtYWxpc2VkIGFyZ3VtZW50OgorICogICAgICAgICAgICAgICAgICBzcV8yICAgICAgICAgICAgICAgICAgc3FfMSAgICAgICAgICAgICAgc3FfMAorICogICAgICAgIGIgYiBiIGIgYiBiIGIgLi4uIGIgYiBiICAgYiBiIGIgLi4uLiBiIGIgYiAgIGIgMCAwIDAgLi4uIDAKKyAqICAgICAgICAgICBeIGJpbmFyeSBwb2ludCBoZXJlCisgKi8KKyNkZWZpbmUgRlBVX2ZzcXJ0X2FyZ18yCS0yMCglZWJwKQkvKiBtcyB3b3JkICovCisjZGVmaW5lIEZQVV9mc3FydF9hcmdfMQktMjQoJWVicCkKKyNkZWZpbmUgRlBVX2ZzcXJ0X2FyZ18wCS0yOCglZWJwKQkvKiBscyB3b3JkLCBhdCBtb3N0IHRoZSBtcyBiaXQgaXMgc2V0ICovCisKKyNlbHNlCisvKglMb2NhbCBzdG9yYWdlIGluIGEgc3RhdGljIGFyZWE6ICovCisuZGF0YQorCS5hbGlnbiA0LDAKK0ZQVV9hY2N1bV8zOgorCS5sb25nCTAJCS8qIG1zIHdvcmQgKi8KK0ZQVV9hY2N1bV8yOgorCS5sb25nCTAKK0ZQVV9hY2N1bV8xOgorCS5sb25nCTAKK0ZQVV9hY2N1bV8wOgorCS5sb25nCTAKKworLyogVGhlIGRlLW5vcm1hbGlzZWQgYXJndW1lbnQ6CisgICAgICAgICAgICAgICAgICAgIHNxXzIgICAgICAgICAgICAgICAgICBzcV8xICAgICAgICAgICAgICBzcV8wCisgICAgICAgICAgYiBiIGIgYiBiIGIgYiAuLi4gYiBiIGIgICBiIGIgYiAuLi4uIGIgYiBiICAgYiAwIDAgMCAuLi4gMAorICAgICAgICAgICAgIF4gYmluYXJ5IHBvaW50IGhlcmUKKyAqLworRlBVX2ZzcXJ0X2FyZ18yOgorCS5sb25nCTAJCS8qIG1zIHdvcmQgKi8KK0ZQVV9mc3FydF9hcmdfMToKKwkubG9uZwkwCitGUFVfZnNxcnRfYXJnXzA6CisJLmxvbmcJMAkJLyogbHMgd29yZCwgYXQgbW9zdCB0aGUgbXMgYml0IGlzIHNldCAqLworI2VuZGlmIC8qIE5PTl9SRUVOVFJBTlRfRlBVICovIAorCisKKy50ZXh0CitFTlRSWSh3bV9zcXJ0KQorCXB1c2hsCSVlYnAKKwltb3ZsCSVlc3AsJWVicAorI2lmbmRlZiBOT05fUkVFTlRSQU5UX0ZQVQorCXN1YmwJJDI4LCVlc3AKKyNlbmRpZiAvKiBOT05fUkVFTlRSQU5UX0ZQVSAqLworCXB1c2hsCSVlc2kKKwlwdXNobAklZWRpCisJcHVzaGwJJWVieAorCisJbW92bAlQQVJBTTEsJWVzaQorCisJbW92bAlTSUdIKCVlc2kpLCVlYXgKKwltb3ZsCVNJR0woJWVzaSksJWVjeAorCXhvcmwJJWVkeCwlZWR4CisKKy8qIFdlIHVzZSBhIHJvdWdoIGxpbmVhciBlc3RpbWF0ZSBmb3IgdGhlIGZpcnN0IGd1ZXNzLi4gKi8KKworCWNtcHcJRVhQX0JJQVMsRVhQKCVlc2kpCisJam56CXNxcnRfYXJnX2dlXzIKKworCXNocmwJJDEsJWVheAkJCS8qIGFyZyBpcyBpbiB0aGUgcmFuZ2UgIFsxLjAgLi4gMi4wKSAqLworCXJjcmwJJDEsJWVjeAorCXJjcmwJJDEsJWVkeAorCitzcXJ0X2FyZ19nZV8yOgorLyogRnJvbSBoZXJlIG9uLCBuIGlzIG5ldmVyIGFjY2Vzc2VkIGRpcmVjdGx5IGFnYWluIHVudGlsIGl0IGlzCisgICByZXBsYWNlZCBieSB0aGUgYW5zd2VyLiAqLworCisJbW92bAklZWF4LEZQVV9mc3FydF9hcmdfMgkJLyogbXMgd29yZCBvZiBuICovCisJbW92bAklZWN4LEZQVV9mc3FydF9hcmdfMQorCW1vdmwJJWVkeCxGUFVfZnNxcnRfYXJnXzAKKworLyogTWFrZSBhIGxpbmVhciBmaXJzdCBlc3RpbWF0ZSAqLworCXNocmwJJDEsJWVheAorCWFkZGwJJDB4NDAwMDAwMDAsJWVheAorCW1vdmwJJDB4YWFhYWFhYWEsJWVjeAorCW11bGwJJWVjeAorCXNobGwJJWVkeAkJCS8qIG1heCByZXN1bHQgd2FzIDdmZmYuLi4gKi8KKwl0ZXN0bAkkMHg4MDAwMDAwMCwlZWR4CS8qIGJ1dCBtaW4gd2FzIDNmZmYuLi4gKi8KKwlqbnoJc3FydF9wcmVsaW1fbm9fYWRqdXN0CisKKwltb3ZsCSQweDgwMDAwMDAwLCVlZHgJLyogcm91bmQgdXAgKi8KKworc3FydF9wcmVsaW1fbm9fYWRqdXN0OgorCW1vdmwJJWVkeCwlZXNpCS8qIE91ciBmaXJzdCBndWVzcyAqLworCisvKiBXZSBoYXZlIG5vdyBjb21wdXRlZCAoYXBwcm94KSAgICgyICsgeCkgLyAzLCB3aGljaCBmb3JtcyB0aGUgYmFzaXMKKyAgIGZvciBhIGZldyBpdGVyYXRpb25zIG9mIE5ld3RvbidzIG1ldGhvZCAqLworCisJbW92bAlGUFVfZnNxcnRfYXJnXzIsJWVjeAkvKiBtcyB3b3JkICovCisKKy8qCisgKiBGcm9tIG91ciBpbml0aWFsIGVzdGltYXRlLCB0aHJlZSBpdGVyYXRpb25zIGFyZSBlbm91Z2ggdG8gZ2V0IHVzCisgKiB0byAzMCBiaXRzIG9yIHNvLiBUaGlzIHdpbGwgdGhlbiBhbGxvdyB0d28gaXRlcmF0aW9ucyBhdCBiZXR0ZXIKKyAqIHByZWNpc2lvbiB0byBjb21wbGV0ZSB0aGUgcHJvY2Vzcy4KKyAqLworCisvKiBDb21wdXRlICAoZyArIG4vZykvMiAgYXQgZWFjaCBpdGVyYXRpb24gKGcgaXMgdGhlIGd1ZXNzKS4gKi8KKwlzaHJsCSVlY3gJCS8qIERvaW5nIHRoaXMgZmlyc3Qgd2lsbCBwcmV2ZW50IGEgZGl2aWRlICovCisJCQkJLyogb3ZlcmZsb3cgbGF0ZXIuICovCisKKwltb3ZsCSVlY3gsJWVkeAkvKiBtc3cgb2YgdGhlIGFyZyAvIDIgKi8KKwlkaXZsCSVlc2kJCS8qIGN1cnJlbnQgZXN0aW1hdGUgKi8KKwlzaHJsCSVlc2kJCS8qIGRpdmlkZSBieSAyICovCisJYWRkbAklZWF4LCVlc2kJLyogdGhlIG5ldyBlc3RpbWF0ZSAqLworCisJbW92bAklZWN4LCVlZHgKKwlkaXZsCSVlc2kKKwlzaHJsCSVlc2kKKwlhZGRsCSVlYXgsJWVzaQorCisJbW92bAklZWN4LCVlZHgKKwlkaXZsCSVlc2kKKwlzaHJsCSVlc2kKKwlhZGRsCSVlYXgsJWVzaQorCisvKgorICogTm93IHRoYXQgYW4gZXN0aW1hdGUgYWNjdXJhdGUgdG8gYWJvdXQgMzAgYml0cyBoYXMgYmVlbiBvYnRhaW5lZCAoaW4gJWVzaSksCisgKiB3ZSBpbXByb3ZlIGl0IHRvIDYwIGJpdHMgb3Igc28uCisgKgorICogVGhlIHN0cmF0ZWd5IGZyb20gbm93IG9uIGlzIHRvIGNvbXB1dGUgbmV3IGVzdGltYXRlcyBmcm9tCisgKiAgICAgIGd1ZXNzIDo9IGd1ZXNzICsgKG4gLSBndWVzc14yKSAvICgyICogZ3Vlc3MpCisgKi8KKworLyogRmlyc3QsIGZpbmQgdGhlIHNxdWFyZSBvZiB0aGUgZ3Vlc3MgKi8KKwltb3ZsCSVlc2ksJWVheAorCW11bGwJJWVzaQorLyogZ3Vlc3NeMiBub3cgaW4gJWVkeDolZWF4ICovCisKKwltb3ZsCUZQVV9mc3FydF9hcmdfMSwlZWN4CisJc3VibAklZWN4LCVlYXgKKwltb3ZsCUZQVV9mc3FydF9hcmdfMiwlZWN4CS8qIG1zIHdvcmQgb2Ygbm9ybWFsaXplZCBuICovCisJc2JibAklZWN4LCVlZHgKKwlqbmMJc3FydF9zdGFnZV8yX3Bvc2l0aXZlCisKKy8qIFN1YnRyYWN0aW9uIGdpdmVzIGEgbmVnYXRpdmUgcmVzdWx0LAorICAgbmVnYXRlIHRoZSByZXN1bHQgYmVmb3JlIGRpdmlzaW9uLiAqLworCW5vdGwJJWVkeAorCW5vdGwJJWVheAorCWFkZGwJJDEsJWVheAorCWFkY2wJJDAsJWVkeAorCisJZGl2bAklZXNpCisJbW92bAklZWF4LCVlY3gKKworCW1vdmwJJWVkeCwlZWF4CisJZGl2bAklZXNpCisJam1wCXNxcnRfc3RhZ2VfMl9maW5pc2gKKworc3FydF9zdGFnZV8yX3Bvc2l0aXZlOgorCWRpdmwJJWVzaQorCW1vdmwJJWVheCwlZWN4CisKKwltb3ZsCSVlZHgsJWVheAorCWRpdmwJJWVzaQorCisJbm90bAklZWN4CisJbm90bAklZWF4CisJYWRkbAkkMSwlZWF4CisJYWRjbAkkMCwlZWN4CisKK3NxcnRfc3RhZ2VfMl9maW5pc2g6CisJc2FybAkkMSwlZWN4CQkvKiBkaXZpZGUgYnkgMiAqLworCXJjcmwJJDEsJWVheAorCisJLyogRm9ybSB0aGUgbmV3IGVzdGltYXRlIGluICVlc2k6JWVkaSAqLworCW1vdmwJJWVheCwlZWRpCisJYWRkbAklZWN4LCVlc2kKKworCWpueglzcXJ0X3N0YWdlXzJfZG9uZQkvKiByZXN1bHQgc2hvdWxkIGJlIFsxLi4yKSAqLworCisjaWZkZWYgUEFSQU5PSUQKKy8qIEl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBnZXQgaGVyZSBvbmx5IGlmIHRoZSBhcmcgaXMgZmZmZi4uLi5mZmZmICovCisJY21wCSQweGZmZmZmZmZmLEZQVV9mc3FydF9hcmdfMQorCWpueglzcXJ0X3N0YWdlXzJfZXJyb3IKKyNlbmRpZiAvKiBQQVJBTk9JRCAqLworCisvKiBUaGUgYmVzdCByb3VuZGVkIHJlc3VsdC4gKi8KKwl4b3JsCSVlYXgsJWVheAorCWRlY2wJJWVheAorCW1vdmwJJWVheCwlZWRpCisJbW92bAklZWF4LCVlc2kKKwltb3ZsCSQweDdmZmZmZmZmLCVlYXgKKwlqbXAJc3FydF9yb3VuZF9yZXN1bHQKKworI2lmZGVmIFBBUkFOT0lECitzcXJ0X3N0YWdlXzJfZXJyb3I6CisJcHVzaGwJRVhfSU5URVJOQUx8MHgyMTMKKwljYWxsCUVYQ0VQVElPTgorI2VuZGlmIC8qIFBBUkFOT0lEICovIAorCitzcXJ0X3N0YWdlXzJfZG9uZToKKworLyogTm93IHRoZSBzcXVhcmUgcm9vdCBoYXMgYmVlbiBjb21wdXRlZCB0byBiZXR0ZXIgdGhhbiA2MCBiaXRzLiAqLworCisvKiBGaW5kIHRoZSBzcXVhcmUgb2YgdGhlIGd1ZXNzLiAqLworCW1vdmwJJWVkaSwlZWF4CQkvKiBscyB3b3JkIG9mIGd1ZXNzICovCisJbXVsbAklZWRpCisJbW92bAklZWR4LEZQVV9hY2N1bV8xCisKKwltb3ZsCSVlc2ksJWVheAorCW11bGwJJWVzaQorCW1vdmwJJWVkeCxGUFVfYWNjdW1fMworCW1vdmwJJWVheCxGUFVfYWNjdW1fMgorCisJbW92bAklZWRpLCVlYXgKKwltdWxsCSVlc2kKKwlhZGRsCSVlYXgsRlBVX2FjY3VtXzEKKwlhZGNsCSVlZHgsRlBVX2FjY3VtXzIKKwlhZGNsCSQwLEZQVV9hY2N1bV8zCisKKy8qCW1vdmwJJWVzaSwlZWF4ICovCisvKgltdWxsCSVlZGkgKi8KKwlhZGRsCSVlYXgsRlBVX2FjY3VtXzEKKwlhZGNsCSVlZHgsRlBVX2FjY3VtXzIKKwlhZGNsCSQwLEZQVV9hY2N1bV8zCisKKy8qIGd1ZXNzXjIgbm93IGluIEZQVV9hY2N1bV8zOkZQVV9hY2N1bV8yOkZQVV9hY2N1bV8xICovCisKKwltb3ZsCUZQVV9mc3FydF9hcmdfMCwlZWF4CQkvKiBnZXQgbm9ybWFsaXplZCBuICovCisJc3VibAklZWF4LEZQVV9hY2N1bV8xCisJbW92bAlGUFVfZnNxcnRfYXJnXzEsJWVheAorCXNiYmwJJWVheCxGUFVfYWNjdW1fMgorCW1vdmwJRlBVX2ZzcXJ0X2FyZ18yLCVlYXgJCS8qIG1zIHdvcmQgb2Ygbm9ybWFsaXplZCBuICovCisJc2JibAklZWF4LEZQVV9hY2N1bV8zCisJam5jCXNxcnRfc3RhZ2VfM19wb3NpdGl2ZQorCisvKiBTdWJ0cmFjdGlvbiBnaXZlcyBhIG5lZ2F0aXZlIHJlc3VsdCwKKyAgIG5lZ2F0ZSB0aGUgcmVzdWx0IGJlZm9yZSBkaXZpc2lvbiAqLworCW5vdGwJRlBVX2FjY3VtXzEKKwlub3RsCUZQVV9hY2N1bV8yCisJbm90bAlGUFVfYWNjdW1fMworCWFkZGwJJDEsRlBVX2FjY3VtXzEKKwlhZGNsCSQwLEZQVV9hY2N1bV8yCisKKyNpZmRlZiBQQVJBTk9JRAorCWFkY2wJJDAsRlBVX2FjY3VtXzMJLyogVGhpcyBtdXN0IGJlIHplcm8gKi8KKwlqeglzcXJ0X3N0YWdlXzNfbm9fZXJyb3IKKworc3FydF9zdGFnZV8zX2Vycm9yOgorCXB1c2hsCUVYX0lOVEVSTkFMfDB4MjA3CisJY2FsbAlFWENFUFRJT04KKworc3FydF9zdGFnZV8zX25vX2Vycm9yOgorI2VuZGlmIC8qIFBBUkFOT0lEICovCisKKwltb3ZsCUZQVV9hY2N1bV8yLCVlZHgKKwltb3ZsCUZQVV9hY2N1bV8xLCVlYXgKKwlkaXZsCSVlc2kKKwltb3ZsCSVlYXgsJWVjeAorCisJbW92bAklZWR4LCVlYXgKKwlkaXZsCSVlc2kKKworCXNhcmwJJDEsJWVjeAkJLyogZGl2aWRlIGJ5IDIgKi8KKwlyY3JsCSQxLCVlYXgKKworCS8qIHByZXBhcmUgdG8gcm91bmQgdGhlIHJlc3VsdCAqLworCisJYWRkbAklZWN4LCVlZGkKKwlhZGNsCSQwLCVlc2kKKworCWptcAlzcXJ0X3N0YWdlXzNfZmluaXNoZWQKKworc3FydF9zdGFnZV8zX3Bvc2l0aXZlOgorCW1vdmwJRlBVX2FjY3VtXzIsJWVkeAorCW1vdmwJRlBVX2FjY3VtXzEsJWVheAorCWRpdmwJJWVzaQorCW1vdmwJJWVheCwlZWN4CisKKwltb3ZsCSVlZHgsJWVheAorCWRpdmwJJWVzaQorCisJc2FybAkkMSwlZWN4CQkvKiBkaXZpZGUgYnkgMiAqLworCXJjcmwJJDEsJWVheAorCisJLyogcHJlcGFyZSB0byByb3VuZCB0aGUgcmVzdWx0ICovCisKKwlub3RsCSVlYXgJCS8qIE5lZ2F0ZSB0aGUgY29ycmVjdGlvbiB0ZXJtICovCisJbm90bAklZWN4CisJYWRkbAkkMSwlZWF4CisJYWRjbAkkMCwlZWN4CQkvKiBjYXJyeSBoZXJlID09PiBjb3JyZWN0aW9uID09IDAgKi8KKwlhZGNsCSQweGZmZmZmZmZmLCVlc2kKKworCWFkZGwJJWVjeCwlZWRpCisJYWRjbAkkMCwlZXNpCisKK3NxcnRfc3RhZ2VfM19maW5pc2hlZDoKKworLyoKKyAqIFRoZSByZXN1bHQgaW4gJWVzaTolZWRpOiVlc2kgc2hvdWxkIGJlIGdvb2QgdG8gYWJvdXQgOTAgYml0cyBoZXJlLAorICogYW5kIHRoZSByb3VuZGluZyBpbmZvcm1hdGlvbiBoZXJlIGRvZXMgbm90IGhhdmUgc3VmZmljaWVudCBhY2N1cmFjeQorICogaW4gYSBmZXcgcmFyZSBjYXNlcy4KKyAqLworCWNtcGwJJDB4ZmZmZmZmZTAsJWVheAorCWphCXNxcnRfbmVhcl9leGFjdF94CisKKwljbXBsCSQweDAwMDAwMDIwLCVlYXgKKwlqYglzcXJ0X25lYXJfZXhhY3QKKworCWNtcGwJJDB4N2ZmZmZmZTAsJWVheAorCWpiCXNxcnRfcm91bmRfcmVzdWx0CisKKwljbXBsCSQweDgwMDAwMDIwLCVlYXgKKwlqYglzcXJ0X2dldF9tb3JlX3ByZWNpc2lvbgorCitzcXJ0X3JvdW5kX3Jlc3VsdDoKKy8qIFNldCB1cCBmb3Igcm91bmRpbmcgb3BlcmF0aW9ucyAqLworCW1vdmwJJWVheCwlZWR4CisJbW92bAklZXNpLCVlYXgKKwltb3ZsCSVlZGksJWVieAorCW1vdmwJUEFSQU0xLCVlZGkKKwltb3Z3CUVYUF9CSUFTLEVYUCglZWRpKQkvKiBSZXN1bHQgaXMgaW4gIFsxLjAgLi4gMi4wKSAqLworCWptcAlmcHVfcmVnX3JvdW5kCisKKworc3FydF9uZWFyX2V4YWN0X3g6CisvKiBGaXJzdCwgdGhlIGVzdGltYXRlIG11c3QgYmUgcm91bmRlZCB1cC4gKi8KKwlhZGRsCSQxLCVlZGkKKwlhZGNsCSQwLCVlc2kKKworc3FydF9uZWFyX2V4YWN0OgorLyoKKyAqIFRoaXMgaXMgYW4gZWFzeSBjYXNlIGJlY2F1c2UgeF4xLzIgaXMgbW9ub3RvbmljLgorICogV2UgbmVlZCBqdXN0IGZpbmQgdGhlIHNxdWFyZSBvZiBvdXIgZXN0aW1hdGUsIGNvbXBhcmUgaXQKKyAqIHdpdGggdGhlIGFyZ3VtZW50LCBhbmQgZGVkdWNlIHdoZXRoZXIgb3VyIGVzdGltYXRlIGlzCisgKiBhYm92ZSwgYmVsb3csIG9yIGV4YWN0LiBXZSB1c2UgdGhlIGZhY3QgdGhhdCB0aGUgZXN0aW1hdGUKKyAqIGlzIGtub3duIHRvIGJlIGFjY3VyYXRlIHRvIGFib3V0IDkwIGJpdHMuCisgKi8KKwltb3ZsCSVlZGksJWVheAkJLyogbHMgd29yZCBvZiBndWVzcyAqLworCW11bGwJJWVkaQorCW1vdmwJJWVkeCwlZWJ4CQkvKiAybmQgbHMgd29yZCBvZiBzcXVhcmUgKi8KKwltb3ZsCSVlYXgsJWVjeAkJLyogbHMgd29yZCBvZiBzcXVhcmUgKi8KKworCW1vdmwJJWVkaSwlZWF4CisJbXVsbAklZXNpCisJYWRkbAklZWF4LCVlYngKKwlhZGRsCSVlYXgsJWVieAorCisjaWZkZWYgUEFSQU5PSUQKKwljbXAJJDB4ZmZmZmZmYjAsJWVieAorCWpiCXNxcnRfbmVhcl9leGFjdF9vaworCisJY21wCSQweDAwMDAwMDUwLCVlYngKKwlqYQlzcXJ0X25lYXJfZXhhY3Rfb2sKKworCXB1c2hsCUVYX0lOVEVSTkFMfDB4MjE0CisJY2FsbAlFWENFUFRJT04KKworc3FydF9uZWFyX2V4YWN0X29rOgorI2VuZGlmIC8qIFBBUkFOT0lEICovIAorCisJb3IJJWVieCwlZWJ4CisJanMJc3FydF9uZWFyX2V4YWN0X3NtYWxsCisKKwlqbnoJc3FydF9uZWFyX2V4YWN0X2xhcmdlCisKKwlvcgklZWJ4LCVlZHgKKwlqbnoJc3FydF9uZWFyX2V4YWN0X2xhcmdlCisKKy8qIE91ciBlc3RpbWF0ZSBpcyBleGFjdGx5IHRoZSByaWdodCBhbnN3ZXIgKi8KKwl4b3JsCSVlYXgsJWVheAorCWptcAlzcXJ0X3JvdW5kX3Jlc3VsdAorCitzcXJ0X25lYXJfZXhhY3Rfc21hbGw6CisvKiBPdXIgZXN0aW1hdGUgaXMgdG9vIHNtYWxsICovCisJbW92bAkkMHgwMDAwMDBmZiwlZWF4CisJam1wCXNxcnRfcm91bmRfcmVzdWx0CisJCitzcXJ0X25lYXJfZXhhY3RfbGFyZ2U6CisvKiBPdXIgZXN0aW1hdGUgaXMgdG9vIGxhcmdlLCB3ZSBuZWVkIHRvIGRlY3JlbWVudCBpdCAqLworCXN1YmwJJDEsJWVkaQorCXNiYmwJJDAsJWVzaQorCW1vdmwJJDB4ZmZmZmZmMDAsJWVheAorCWptcAlzcXJ0X3JvdW5kX3Jlc3VsdAorCisKK3NxcnRfZ2V0X21vcmVfcHJlY2lzaW9uOgorLyogVGhpcyBjYXNlIGlzIGFsbW9zdCB0aGUgc2FtZSBhcyB0aGUgYWJvdmUsIGV4Y2VwdCB3ZSBzdGFydAorICAgd2l0aCBhbiBleHRyYSBiaXQgb2YgcHJlY2lzaW9uIGluIHRoZSBlc3RpbWF0ZS4gKi8KKwlzdGMJCQkvKiBUaGUgZXh0cmEgYml0LiAqLworCXJjbGwJJDEsJWVkaQkJLyogU2hpZnQgdGhlIGVzdGltYXRlIGxlZnQgb25lIGJpdCAqLworCXJjbGwJJDEsJWVzaQorCisJbW92bAklZWRpLCVlYXgJCS8qIGxzIHdvcmQgb2YgZ3Vlc3MgKi8KKwltdWxsCSVlZGkKKwltb3ZsCSVlZHgsJWVieAkJLyogMm5kIGxzIHdvcmQgb2Ygc3F1YXJlICovCisJbW92bAklZWF4LCVlY3gJCS8qIGxzIHdvcmQgb2Ygc3F1YXJlICovCisKKwltb3ZsCSVlZGksJWVheAorCW11bGwJJWVzaQorCWFkZGwJJWVheCwlZWJ4CisJYWRkbAklZWF4LCVlYngKKworLyogUHV0IG91ciBlc3RpbWF0ZSBiYWNrIHRvIGl0cyBvcmlnaW5hbCB2YWx1ZSAqLworCXN0YwkJCS8qIFRoZSBtcyBiaXQuICovCisJcmNybAkkMSwlZXNpCQkvKiBTaGlmdCB0aGUgZXN0aW1hdGUgbGVmdCBvbmUgYml0ICovCisJcmNybAkkMSwlZWRpCisKKyNpZmRlZiBQQVJBTk9JRAorCWNtcAkkMHhmZmZmZmY2MCwlZWJ4CisJamIJc3FydF9tb3JlX3ByZWNfb2sKKworCWNtcAkkMHgwMDAwMDBhMCwlZWJ4CisJamEJc3FydF9tb3JlX3ByZWNfb2sKKworCXB1c2hsCUVYX0lOVEVSTkFMfDB4MjE1CisJY2FsbAlFWENFUFRJT04KKworc3FydF9tb3JlX3ByZWNfb2s6CisjZW5kaWYgLyogUEFSQU5PSUQgKi8gCisKKwlvcgklZWJ4LCVlYngKKwlqcwlzcXJ0X21vcmVfcHJlY19zbWFsbAorCisJam56CXNxcnRfbW9yZV9wcmVjX2xhcmdlCisKKwlvcgklZWJ4LCVlY3gKKwlqbnoJc3FydF9tb3JlX3ByZWNfbGFyZ2UKKworLyogT3VyIGVzdGltYXRlIGlzIGV4YWN0bHkgdGhlIHJpZ2h0IGFuc3dlciAqLworCW1vdmwJJDB4ODAwMDAwMDAsJWVheAorCWptcAlzcXJ0X3JvdW5kX3Jlc3VsdAorCitzcXJ0X21vcmVfcHJlY19zbWFsbDoKKy8qIE91ciBlc3RpbWF0ZSBpcyB0b28gc21hbGwgKi8KKwltb3ZsCSQweDgwMDAwMGZmLCVlYXgKKwlqbXAJc3FydF9yb3VuZF9yZXN1bHQKKwkKK3NxcnRfbW9yZV9wcmVjX2xhcmdlOgorLyogT3VyIGVzdGltYXRlIGlzIHRvbyBsYXJnZSAqLworCW1vdmwJJDB4N2ZmZmZmMDAsJWVheAorCWptcAlzcXJ0X3JvdW5kX3Jlc3VsdApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21tL01ha2VmaWxlIGIvYXJjaC9pMzg2L21tL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMzI3MjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbW0vTWFrZWZpbGUKQEAgLTAsMCArMSwxMCBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGkzODYtc3BlY2lmaWMgcGFydHMgb2YgdGhlIG1lbW9yeSBtYW5hZ2VyLgorIworCitvYmoteQk6PSBpbml0Lm8gcGd0YWJsZS5vIGZhdWx0Lm8gaW9yZW1hcC5vIGV4dGFibGUubyBwYWdlYXR0ci5vIG1tYXAubworCitvYmotJChDT05GSUdfRElTQ09OVElHTUVNKQkrPSBkaXNjb250aWcubworb2JqLSQoQ09ORklHX0hVR0VUTEJfUEFHRSkgKz0gaHVnZXRsYnBhZ2Uubworb2JqLSQoQ09ORklHX0hJR0hNRU0pICs9IGhpZ2htZW0ubworb2JqLSQoQ09ORklHX0JPT1RfSU9SRU1BUCkgKz0gYm9vdF9pb3JlbWFwLm8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tbS9ib290X2lvcmVtYXAuYyBiL2FyY2gvaTM4Ni9tbS9ib290X2lvcmVtYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjNiMzA2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21tL2Jvb3RfaW9yZW1hcC5jCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBhcmNoL2kzODYvbW0vYm9vdF9pb3JlbWFwLmMKKyAqIAorICogUmUtbWFwIGZ1bmN0aW9ucyBmb3IgZWFybHkgYm9vdC10aW1lIGJlZm9yZSBwYWdpbmdfaW5pdCgpIHdoZW4gdGhlIAorICogYm9vdC10aW1lIHBhZ2V0YWJsZXMgYXJlIHN0aWxsIGluIHVzZQorICoKKyAqIFdyaXR0ZW4gYnkgRGF2ZSBIYW5zZW4gPGhhdmVibHVlQHVzLmlibS5jb20+CisgKi8KKworCisvKgorICogV2UgbmVlZCB0byB1c2UgdGhlIDItbGV2ZWwgcGFnZXRhYmxlIGZ1bmN0aW9ucywgYnV0IENPTkZJR19YODZfUEFFCisgKiBrZWVwcyB0aGF0IGZyb20gaGFwcGVubmluZy4gIElmIGFueW9uZSBoYXMgYSBiZXR0ZXIgd2F5LCBJJ20gbGlzdGVuaW5nLgorICoKKyAqIGJvb3RfcHRlX3QgaXMgZGVmaW5lZCBvbmx5IGlmIHRoaXMgYWxsIHdvcmtzIGNvcnJlY3RseQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyN1bmRlZiBDT05GSUdfWDg2X1BBRQorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisKKy8qIAorICogSSdtIGNoZWF0aW5nIGhlcmUuICBJdCBpcyBrbm93biB0aGF0IHRoZSB0d28gYm9vdCBQVEUgcGFnZXMgYXJlIAorICogYWxsb2NhdGVkIG5leHQgdG8gZWFjaCBvdGhlci4gIEknbSBwcmV0ZW5kaW5nIHRoYXQgdGhleSdyZSBqdXN0CisgKiBvbmUgYmlnIGFycmF5LiAKKyAqLworCisjZGVmaW5lIEJPT1RfUFRFX1BUUlMgKFBUUlNfUEVSX1BURSoyKQorI2RlZmluZSBib290X3B0ZV9pbmRleChhZGRyZXNzKSBcCisJICAgICAoKChhZGRyZXNzKSA+PiBQQUdFX1NISUZUKSAmIChCT09UX1BURV9QVFJTIC0gMSkpCisKK3N0YXRpYyBpbmxpbmUgYm9vdF9wdGVfdCogYm9vdF92YWRkcl90b19wdGUodm9pZCAqYWRkcmVzcykKK3sKKwlib290X3B0ZV90KiBib290X3BnID0gKGJvb3RfcHRlX3QqKXBnMDsKKwlyZXR1cm4gJmJvb3RfcGdbYm9vdF9wdGVfaW5kZXgoKHVuc2lnbmVkIGxvbmcpYWRkcmVzcyldOworfQorCisvKgorICogVGhpcyBpcyBvbmx5IGZvciBhIGNhbGxlciB3aG8gaXMgY2xldmVyIGVub3VnaCB0byBwYWdlLWFsaWduCisgKiBwaHlzX2FkZHIgYW5kIHZpcnR1YWxfc291cmNlLCBhbmQgd2hvIGFsc28gaGFzIGEgcHJlZmVyZW5jZQorICogYWJvdXQgd2hpY2ggdmlydHVhbCBhZGRyZXNzIGZyb20gd2hpY2ggdG8gc3RlYWwgcHRlcworICovCitzdGF0aWMgdm9pZCBfX2Jvb3RfaW9yZW1hcCh1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBucnBhZ2VzLCAKKwkJICAgIHZvaWQqIHZpcnR1YWxfc291cmNlKQoreworCWJvb3RfcHRlX3QqIHB0ZTsKKwlpbnQgaTsKKwljaGFyICp2YWRkciA9IHZpcnR1YWxfc291cmNlOworCisJcHRlID0gYm9vdF92YWRkcl90b19wdGUodmlydHVhbF9zb3VyY2UpOworCWZvciAoaT0wOyBpIDwgbnJwYWdlczsgaSsrLCBwaHlzX2FkZHIgKz0gUEFHRV9TSVpFLCBwdGUrKykgeworCQlzZXRfcHRlKHB0ZSwgcGZuX3B0ZShwaHlzX2FkZHI+PlBBR0VfU0hJRlQsIFBBR0VfS0VSTkVMKSk7CisJCV9fZmx1c2hfdGxiX29uZSgmdmFkZHJbaSpQQUdFX1NJWkVdKTsKKwl9Cit9CisKKy8qIHRoZSB2aXJ0dWFsIHNwYWNlIHdlJ3JlIGdvaW5nIHRvIHJlbWFwIGNvbWVzIGZyb20gdGhpcyBhcnJheSAqLworI2RlZmluZSBCT09UX0lPUkVNQVBfUEFHRVMgNAorI2RlZmluZSBCT09UX0lPUkVNQVBfU0laRSAoQk9PVF9JT1JFTUFQX1BBR0VTKlBBR0VfU0laRSkKK3N0YXRpYyBfX2luaXRkYXRhIGNoYXIgYm9vdF9pb3JlbWFwX3NwYWNlW0JPT1RfSU9SRU1BUF9TSVpFXQorCQkgICAgICAgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKFBBR0VfU0laRSkpKTsKKworLyoKKyAqIFRoaXMgb25seSBhcHBsaWVzIHRvIHRoaW5ncyB3aGljaCBuZWVkIHRvIGlvcmVtYXAgYmVmb3JlIHBhZ2luZ19pbml0KCkKKyAqIGJ0X2lvcmVtYXAoKSBhbmQgcGxhaW4gaW9yZW1hcCgpIGFyZSBib3RoIHVzZWxlc3MgYXQgdGhpcyBwb2ludC4KKyAqIAorICogV2hlbiB1c2VkLCB3ZSdyZSBzdGlsbCB1c2luZyB0aGUgYm9vdC10aW1lIHBhZ2V0YWJsZXMsIHdoaWNoIG9ubHkKKyAqIGhhdmUgMiBQVEUgcGFnZXMgbWFwcGluZyB0aGUgZmlyc3QgOE1CCisgKgorICogVGhlcmUgaXMgbm8gdW5tYXAuICBUaGUgYm9vdC10aW1lIFBURSBwYWdlcyBhcmVuJ3QgdXNlZCBhZnRlciBib290LgorICogSWYgeW91IHJlYWxseSB3YW50IHRoZSBzcGFjZSBiYWNrLCBqdXN0IHJlbWFwIGl0IHlvdXJzZWxmLgorICogYm9vdF9pb3JlbWFwKCZpb3JlbWFwX3NwYWNlLVBBR0VfT0ZGU0VULCBCT09UX0lPUkVNQVBfU0laRSkKKyAqLworX19pbml0IHZvaWQqIGJvb3RfaW9yZW1hcCh1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgbGFzdF9hZGRyLCBvZmZzZXQ7CisJdW5zaWduZWQgaW50IG5ycGFnZXM7CisJCisJbGFzdF9hZGRyID0gcGh5c19hZGRyICsgc2l6ZSAtIDE7CisKKwkvKiBwYWdlIGFsaWduIHRoZSByZXF1ZXN0ZWQgYWRkcmVzcyAqLworCW9mZnNldCA9IHBoeXNfYWRkciAmIH5QQUdFX01BU0s7CisJcGh5c19hZGRyICY9IFBBR0VfTUFTSzsKKwlzaXplID0gUEFHRV9BTElHTihsYXN0X2FkZHIpIC0gcGh5c19hZGRyOworCQorCW5ycGFnZXMgPSBzaXplID4+IFBBR0VfU0hJRlQ7CisJaWYgKG5ycGFnZXMgPiBCT09UX0lPUkVNQVBfUEFHRVMpCisJCXJldHVybiBOVUxMOworCQorCV9fYm9vdF9pb3JlbWFwKHBoeXNfYWRkciwgbnJwYWdlcywgYm9vdF9pb3JlbWFwX3NwYWNlKTsKKworCXJldHVybiAmYm9vdF9pb3JlbWFwX3NwYWNlW29mZnNldF07Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbW0vZGlzY29udGlnLmMgYi9hcmNoL2kzODYvbW0vZGlzY29udGlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcyNmI0MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tbS9kaXNjb250aWcuYwpAQCAtMCwwICsxLDM4MyBAQAorLyoKKyAqIFdyaXR0ZW4gYnk6IFBhdHJpY2lhIEdhdWdoZW4gPGdvbmVAdXMuaWJtLmNvbT4sIElCTSBDb3Jwb3JhdGlvbgorICogQXVndXN0IDIwMDI6IGFkZGVkIHJlbW90ZSBub2RlIEtWQSByZW1hcCAtIE1hcnRpbiBKLiBCbGlnaCAKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIElCTSBDb3JwLgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgICAgICAgIAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tbXpvbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+CisjaW5jbHVkZSA8bGludXgvbm9kZW1hc2suaD4KKyNpbmNsdWRlIDxhc20vZTgyMC5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9tbXpvbmUuaD4KKyNpbmNsdWRlIDxiaW9zX2ViZGEuaD4KKworc3RydWN0IHBnbGlzdF9kYXRhICpub2RlX2RhdGFbTUFYX05VTU5PREVTXTsKK2Jvb3RtZW1fZGF0YV90IG5vZGUwX2JkYXRhOworCisvKgorICogbnVtYSBpbnRlcmZhY2UgLSB3ZSBleHBlY3QgdGhlIG51bWEgYXJjaGl0ZWN0dXJlIHNwZWNmaWMgY29kZSB0byBoYXZlCisgKiAgICAgICAgICAgICAgICAgIHBvcHVsYXRlZCB0aGUgZm9sbG93aW5nIGluaXRpYWxpc2F0aW9uLgorICoKKyAqIDEpIG5vZGVfb25saW5lX21hcCAgLSB0aGUgbWFwIG9mIGFsbCBub2RlcyBjb25maWd1cmVkIChvbmxpbmUpIGluIHRoZSBzeXN0ZW0KKyAqIDIpIHBoeXNub2RlX21hcCAgICAgLSB0aGUgbWFwcGluZyBiZXR3ZWVuIGEgcGZuIGFuZCBvd25pbmcgbm9kZQorICogMykgbm9kZV9zdGFydF9wZm4gICAtIHRoZSBzdGFydGluZyBwYWdlIGZyYW1lIG51bWJlciBmb3IgYSBub2RlCisgKiAzKSBub2RlX2VuZF9wZm4gICAgIC0gdGhlIGVuZGluZyBwYWdlIGZyYW0gbnVtYmVyIGZvciBhIG5vZGUKKyAqLworCisvKgorICogcGh5c25vZGVfbWFwIGtlZXBzIHRyYWNrIG9mIHRoZSBwaHlzaWNhbCBtZW1vcnkgbGF5b3V0IG9mIGEgZ2VuZXJpYworICogbnVtYSBub2RlIG9uIGEgMjU2TWIgYnJlYWsgKGVhY2ggZWxlbWVudCBvZiB0aGUgYXJyYXkgd2lsbAorICogcmVwcmVzZW50IDI1Nk1iIG9mIG1lbW9yeSBhbmQgd2lsbCBiZSBtYXJrZWQgYnkgdGhlIG5vZGUgaWQuICBzbywKKyAqIGlmIHRoZSBmaXJzdCBnaWcgaXMgb24gbm9kZSAwLCBhbmQgdGhlIHNlY29uZCBnaWcgaXMgb24gbm9kZSAxCisgKiBwaHlzbm9kZV9tYXAgd2lsbCBjb250YWluOgorICoKKyAqICAgICBwaHlzbm9kZV9tYXBbMC0zXSA9IDA7CisgKiAgICAgcGh5c25vZGVfbWFwWzQtN10gPSAxOworICogICAgIHBoeXNub2RlX21hcFs4LSBdID0gLTE7CisgKi8KK3M4IHBoeXNub2RlX21hcFtNQVhfRUxFTUVOVFNdID0geyBbMCAuLi4gKE1BWF9FTEVNRU5UUyAtIDEpXSA9IC0xfTsKKwordm9pZCBtZW1vcnlfcHJlc2VudChpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKwl1bnNpZ25lZCBsb25nIHBmbjsKKworCXByaW50ayhLRVJOX0lORk8gIk5vZGU6ICVkLCBzdGFydF9wZm46ICVsZCwgZW5kX3BmbjogJWxkXG4iLAorCQkJbmlkLCBzdGFydCwgZW5kKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiICBTZXR0aW5nIHBoeXNub2RlX21hcCBhcnJheSB0byBub2RlICVkIGZvciBwZm5zOlxuIiwgbmlkKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiICAiKTsKKwlmb3IgKHBmbiA9IHN0YXJ0OyBwZm4gPCBlbmQ7IHBmbiArPSBQQUdFU19QRVJfRUxFTUVOVCkgeworCQlwaHlzbm9kZV9tYXBbcGZuIC8gUEFHRVNfUEVSX0VMRU1FTlRdID0gbmlkOworCQlwcmludGsoIiVsZCAiLCBwZm4pOworCX0KKwlwcmludGsoIlxuIik7Cit9CisKK3Vuc2lnbmVkIGxvbmcgbm9kZV9tZW1tYXBfc2l6ZV9ieXRlcyhpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwKKwkJCQkJICAgICAgdW5zaWduZWQgbG9uZyBlbmRfcGZuKQoreworCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBlbmRfcGZuIC0gc3RhcnRfcGZuOworCisJaWYgKCFucl9wYWdlcykKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gKG5yX3BhZ2VzICsgMSkgKiBzaXplb2Yoc3RydWN0IHBhZ2UpOworfQorCit1bnNpZ25lZCBsb25nIG5vZGVfc3RhcnRfcGZuW01BWF9OVU1OT0RFU107Cit1bnNpZ25lZCBsb25nIG5vZGVfZW5kX3BmbltNQVhfTlVNTk9ERVNdOworCitleHRlcm4gdW5zaWduZWQgbG9uZyBmaW5kX21heF9sb3dfcGZuKHZvaWQpOworZXh0ZXJuIHZvaWQgZmluZF9tYXhfcGZuKHZvaWQpOworZXh0ZXJuIHZvaWQgb25lX2hpZ2hwYWdlX2luaXQoc3RydWN0IHBhZ2UgKiwgaW50LCBpbnQpOworCitleHRlcm4gc3RydWN0IGU4MjBtYXAgZTgyMDsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGluaXRfcGdfdGFibGVzX2VuZDsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGhpZ2hlbmRfcGZuLCBoaWdoc3RhcnRfcGZuOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWF4X2xvd19wZm47CitleHRlcm4gdW5zaWduZWQgbG9uZyB0b3RhbHJhbV9wYWdlczsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHRvdGFsaGlnaF9wYWdlczsKKworI2RlZmluZSBMQVJHRV9QQUdFX0JZVEVTIChQVFJTX1BFUl9QVEUgKiBQQUdFX1NJWkUpCisKK3Vuc2lnbmVkIGxvbmcgbm9kZV9yZW1hcF9zdGFydF9wZm5bTUFYX05VTU5PREVTXTsKK3Vuc2lnbmVkIGxvbmcgbm9kZV9yZW1hcF9zaXplW01BWF9OVU1OT0RFU107Cit1bnNpZ25lZCBsb25nIG5vZGVfcmVtYXBfb2Zmc2V0W01BWF9OVU1OT0RFU107Cit2b2lkICpub2RlX3JlbWFwX3N0YXJ0X3ZhZGRyW01BWF9OVU1OT0RFU107Cit2b2lkIHNldF9wbWRfcGZuKHVuc2lnbmVkIGxvbmcgdmFkZHIsIHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBmbGFncyk7CisKKy8qCisgKiBGTEFUIC0gc3VwcG9ydCBmb3IgYmFzaWMgUEMgbWVtb3J5IG1vZGVsIHdpdGggZGlzY29udGlnIGVuYWJsZWQsIGVzc2VudGlhbGx5CisgKiAgICAgICAgYSBzaW5nbGUgbm9kZSB3aXRoIGFsbCBhdmFpbGFibGUgcHJvY2Vzc29ycyBpbiBpdCB3aXRoIGEgZmxhdAorICogICAgICAgIG1lbW9yeSBtYXAuCisgKi8KK2ludCBfX2luaXQgZ2V0X21lbWNmZ19udW1hX2ZsYXQodm9pZCkKK3sKKwlwcmludGsoIk5VTUEgLSBzaW5nbGUgbm9kZSwgZmxhdCBtZW1vcnkgbW9kZVxuIik7CisKKwkvKiBSdW4gdGhlIG1lbW9yeSBjb25maWd1cmF0aW9uIGFuZCBmaW5kIHRoZSB0b3Agb2YgbWVtb3J5LiAqLworCWZpbmRfbWF4X3BmbigpOworCW5vZGVfc3RhcnRfcGZuWzBdID0gMDsKKwlub2RlX2VuZF9wZm5bMF0gPSBtYXhfcGZuOworCW1lbW9yeV9wcmVzZW50KDAsIDAsIG1heF9wZm4pOworCisgICAgICAgIC8qIEluZGljYXRlIHRoZXJlIGlzIG9uZSBub2RlIGF2YWlsYWJsZS4gKi8KKwlub2Rlc19jbGVhcihub2RlX29ubGluZV9tYXApOworCW5vZGVfc2V0X29ubGluZSgwKTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEZpbmQgdGhlIGhpZ2hlc3QgcGFnZSBmcmFtZSBudW1iZXIgd2UgaGF2ZSBhdmFpbGFibGUgZm9yIHRoZSBub2RlCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBmaW5kX21heF9wZm5fbm9kZShpbnQgbmlkKQoreworCWlmIChub2RlX2VuZF9wZm5bbmlkXSA+IG1heF9wZm4pCisJCW5vZGVfZW5kX3BmbltuaWRdID0gbWF4X3BmbjsKKwkvKgorCSAqIGlmIGEgdXNlciBoYXMgZ2l2ZW4gbWVtPVhYWFgsIHRoZW4gd2UgbmVlZCB0byBtYWtlIHN1cmUgCisJICogdGhhdCB0aGUgbm9kZSBfc3RhcnRzXyBiZWZvcmUgdGhhdCwgdG9vLCBub3QganVzdCBlbmRzCisJICovCisJaWYgKG5vZGVfc3RhcnRfcGZuW25pZF0gPiBtYXhfcGZuKQorCQlub2RlX3N0YXJ0X3BmbltuaWRdID0gbWF4X3BmbjsKKwlpZiAobm9kZV9zdGFydF9wZm5bbmlkXSA+IG5vZGVfZW5kX3BmbltuaWRdKQorCQlCVUcoKTsKK30KKworLyogCisgKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBwZ19kYXRhX3QgZm9yIHRoaXMgbm9kZSB2aWEgYSBjcnVkZSBwcmUtYm9vdG1lbQorICogbWV0aG9kLiAgRm9yIG5vZGUgemVybyB0YWtlIHRoaXMgZnJvbSB0aGUgYm90dG9tIG9mIG1lbW9yeSwgZm9yCisgKiBzdWJzZXF1ZW50IG5vZGVzIHBsYWNlIHRoZW0gYXQgbm9kZV9yZW1hcF9zdGFydF92YWRkciB3aGljaCBjb250YWlucworICogbm9kZSBsb2NhbCBkYXRhIGluIHBoeXNpY2FsbHkgbm9kZSBsb2NhbCBtZW1vcnkuICBTZWUgc2V0dXBfbWVtb3J5KCkKKyAqIGZvciBkZXRhaWxzLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgYWxsb2NhdGVfcGdkYXQoaW50IG5pZCkKK3sKKwlpZiAobmlkICYmIG5vZGVfaGFzX29ubGluZV9tZW0obmlkKSkKKwkJTk9ERV9EQVRBKG5pZCkgPSAocGdfZGF0YV90ICopbm9kZV9yZW1hcF9zdGFydF92YWRkcltuaWRdOworCWVsc2UgeworCQlOT0RFX0RBVEEobmlkKSA9IChwZ19kYXRhX3QgKikoX192YShtaW5fbG93X3BmbiA8PCBQQUdFX1NISUZUKSk7CisJCW1pbl9sb3dfcGZuICs9IFBGTl9VUChzaXplb2YocGdfZGF0YV90KSk7CisJfQorfQorCit2b2lkIF9faW5pdCByZW1hcF9udW1hX2t2YSh2b2lkKQoreworCXZvaWQgKnZhZGRyOworCXVuc2lnbmVkIGxvbmcgcGZuOworCWludCBub2RlOworCisJZm9yX2VhY2hfb25saW5lX25vZGUobm9kZSkgeworCQlpZiAobm9kZSA9PSAwKQorCQkJY29udGludWU7CisJCWZvciAocGZuPTA7IHBmbiA8IG5vZGVfcmVtYXBfc2l6ZVtub2RlXTsgcGZuICs9IFBUUlNfUEVSX1BURSkgeworCQkJdmFkZHIgPSBub2RlX3JlbWFwX3N0YXJ0X3ZhZGRyW25vZGVdKyhwZm48PFBBR0VfU0hJRlQpOworCQkJc2V0X3BtZF9wZm4oKHVsb25nKSB2YWRkciwgCisJCQkJbm9kZV9yZW1hcF9zdGFydF9wZm5bbm9kZV0gKyBwZm4sIAorCQkJCVBBR0VfS0VSTkVMX0xBUkdFKTsKKwkJfQorCX0KK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2FsY3VsYXRlX251bWFfcmVtYXBfcGFnZXModm9pZCkKK3sKKwlpbnQgbmlkOworCXVuc2lnbmVkIGxvbmcgc2l6ZSwgcmVzZXJ2ZV9wYWdlcyA9IDA7CisKKwlmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpIHsKKwkJaWYgKG5pZCA9PSAwKQorCQkJY29udGludWU7CisJCWlmICghbm9kZV9yZW1hcF9zaXplW25pZF0pCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBUaGUgYWNwaS9zcmF0IG5vZGUgaW5mbyBjYW4gc2hvdyBob3QtYWRkIG1lbXJveSB6b25lcworCQkgKiB3aGVyZSBtZW1vcnkgY291bGQgYmUgYWRkZWQgYnV0IG5vdCBjdXJyZW50bHkgcHJlc2VudC4KKwkJICovCisJCWlmIChub2RlX3N0YXJ0X3BmbltuaWRdID4gbWF4X3BmbikKKwkJCWNvbnRpbnVlOworCQlpZiAobm9kZV9lbmRfcGZuW25pZF0gPiBtYXhfcGZuKQorCQkJbm9kZV9lbmRfcGZuW25pZF0gPSBtYXhfcGZuOworCisJCS8qIGVuc3VyZSB0aGUgcmVtYXAgaW5jbHVkZXMgc3BhY2UgZm9yIHRoZSBwZ2RhdC4gKi8KKwkJc2l6ZSA9IG5vZGVfcmVtYXBfc2l6ZVtuaWRdICsgc2l6ZW9mKHBnX2RhdGFfdCk7CisKKwkJLyogY29udmVydCBzaXplIHRvIGxhcmdlIChwbWQgc2l6ZSkgcGFnZXMsIHJvdW5kaW5nIHVwICovCisJCXNpemUgPSAoc2l6ZSArIExBUkdFX1BBR0VfQllURVMgLSAxKSAvIExBUkdFX1BBR0VfQllURVM7CisJCS8qIG5vdyB0aGUgcm91bmR1cCBpcyBjb3JyZWN0LCBjb252ZXJ0IHRvIFBBR0VfU0laRSBwYWdlcyAqLworCQlzaXplID0gc2l6ZSAqIFBUUlNfUEVSX1BURTsKKwkJcHJpbnRrKCJSZXNlcnZpbmcgJWxkIHBhZ2VzIG9mIEtWQSBmb3IgbG1lbV9tYXAgb2Ygbm9kZSAlZFxuIiwKKwkJCQlzaXplLCBuaWQpOworCQlub2RlX3JlbWFwX3NpemVbbmlkXSA9IHNpemU7CisJCXJlc2VydmVfcGFnZXMgKz0gc2l6ZTsKKwkJbm9kZV9yZW1hcF9vZmZzZXRbbmlkXSA9IHJlc2VydmVfcGFnZXM7CisJCXByaW50aygiU2hyaW5raW5nIG5vZGUgJWQgZnJvbSAlbGQgcGFnZXMgdG8gJWxkIHBhZ2VzXG4iLAorCQkJbmlkLCBub2RlX2VuZF9wZm5bbmlkXSwgbm9kZV9lbmRfcGZuW25pZF0gLSBzaXplKTsKKwkJbm9kZV9lbmRfcGZuW25pZF0gLT0gc2l6ZTsKKwkJbm9kZV9yZW1hcF9zdGFydF9wZm5bbmlkXSA9IG5vZGVfZW5kX3BmbltuaWRdOworCX0KKwlwcmludGsoIlJlc2VydmluZyB0b3RhbCBvZiAlbGQgcGFnZXMgZm9yIG51bWEgS1ZBIHJlbWFwXG4iLAorCQkJcmVzZXJ2ZV9wYWdlcyk7CisJcmV0dXJuIHJlc2VydmVfcGFnZXM7Cit9CisKK2V4dGVybiB2b2lkIHNldHVwX2Jvb3RtZW1fYWxsb2NhdG9yKHZvaWQpOwordW5zaWduZWQgbG9uZyBfX2luaXQgc2V0dXBfbWVtb3J5KHZvaWQpCit7CisJaW50IG5pZDsKKwl1bnNpZ25lZCBsb25nIHN5c3RlbV9zdGFydF9wZm4sIHN5c3RlbV9tYXhfbG93X3BmbjsKKwl1bnNpZ25lZCBsb25nIHJlc2VydmVfcGFnZXM7CisKKwkvKgorCSAqIFdoZW4gbWFwcGluZyBhIE5VTUEgbWFjaGluZSB3ZSBhbGxvY2F0ZSB0aGUgbm9kZV9tZW1fbWFwIGFycmF5cworCSAqIGZyb20gbm9kZSBsb2NhbCBtZW1vcnkuICBUaGV5IGFyZSB0aGVuIG1hcHBlZCBkaXJlY3RseSBpbnRvIEtWQQorCSAqIGJldHdlZW4gem9uZSBub3JtYWwgYW5kIHZtYWxsb2Mgc3BhY2UuICBDYWxjdWxhdGUgdGhlIHNpemUgb2YKKwkgKiB0aGlzIHNwYWNlIGFuZCB1c2UgaXQgdG8gYWRqdXN0IHRoZSBib3VuZHJ5IGJldHdlZW4gWk9ORV9OT1JNQUwKKwkgKiBhbmQgWk9ORV9ISUdITUVNLgorCSAqLworCWZpbmRfbWF4X3BmbigpOworCWdldF9tZW1jZmdfbnVtYSgpOworCisJcmVzZXJ2ZV9wYWdlcyA9IGNhbGN1bGF0ZV9udW1hX3JlbWFwX3BhZ2VzKCk7CisKKwkvKiBwYXJ0aWFsbHkgdXNlZCBwYWdlcyBhcmUgbm90IHVzYWJsZSAtIHRodXMgcm91bmQgdXB3YXJkcyAqLworCXN5c3RlbV9zdGFydF9wZm4gPSBtaW5fbG93X3BmbiA9IFBGTl9VUChpbml0X3BnX3RhYmxlc19lbmQpOworCisJc3lzdGVtX21heF9sb3dfcGZuID0gbWF4X2xvd19wZm4gPSBmaW5kX21heF9sb3dfcGZuKCkgLSByZXNlcnZlX3BhZ2VzOworCXByaW50aygicmVzZXJ2ZV9wYWdlcyA9ICVsZCBmaW5kX21heF9sb3dfcGZuKCkgfiAlbGRcbiIsCisJCQlyZXNlcnZlX3BhZ2VzLCBtYXhfbG93X3BmbiArIHJlc2VydmVfcGFnZXMpOworCXByaW50aygibWF4X3BmbiA9ICVsZFxuIiwgbWF4X3Bmbik7CisjaWZkZWYgQ09ORklHX0hJR0hNRU0KKwloaWdoc3RhcnRfcGZuID0gaGlnaGVuZF9wZm4gPSBtYXhfcGZuOworCWlmIChtYXhfcGZuID4gc3lzdGVtX21heF9sb3dfcGZuKQorCQloaWdoc3RhcnRfcGZuID0gc3lzdGVtX21heF9sb3dfcGZuOworCXByaW50ayhLRVJOX05PVElDRSAiJWxkTUIgSElHSE1FTSBhdmFpbGFibGUuXG4iLAorCSAgICAgICBwYWdlc190b19tYihoaWdoZW5kX3BmbiAtIGhpZ2hzdGFydF9wZm4pKTsKKyNlbmRpZgorCXByaW50ayhLRVJOX05PVElDRSAiJWxkTUIgTE9XTUVNIGF2YWlsYWJsZS5cbiIsCisJCQlwYWdlc190b19tYihzeXN0ZW1fbWF4X2xvd19wZm4pKTsKKwlwcmludGsoIm1pbl9sb3dfcGZuID0gJWxkLCBtYXhfbG93X3BmbiA9ICVsZCwgaGlnaHN0YXJ0X3BmbiA9ICVsZFxuIiwgCisJCQltaW5fbG93X3BmbiwgbWF4X2xvd19wZm4sIGhpZ2hzdGFydF9wZm4pOworCisJcHJpbnRrKCJMb3cgbWVtb3J5IGVuZHMgYXQgdmFkZHIgJTA4bHhcbiIsCisJCQkodWxvbmcpIHBmbl90b19rYWRkcihtYXhfbG93X3BmbikpOworCWZvcl9lYWNoX29ubGluZV9ub2RlKG5pZCkgeworCQlub2RlX3JlbWFwX3N0YXJ0X3ZhZGRyW25pZF0gPSBwZm5fdG9fa2FkZHIoCisJCQkoaGlnaHN0YXJ0X3BmbiArIHJlc2VydmVfcGFnZXMpIC0gbm9kZV9yZW1hcF9vZmZzZXRbbmlkXSk7CisJCWFsbG9jYXRlX3BnZGF0KG5pZCk7CisJCXByaW50ayAoIm5vZGUgJWQgd2lsbCByZW1hcCB0byB2YWRkciAlMDhseCAtICUwOGx4XG4iLCBuaWQsCisJCQkodWxvbmcpIG5vZGVfcmVtYXBfc3RhcnRfdmFkZHJbbmlkXSwKKwkJCSh1bG9uZykgcGZuX3RvX2thZGRyKGhpZ2hzdGFydF9wZm4gKyByZXNlcnZlX3BhZ2VzCisJCQkgICAgLSBub2RlX3JlbWFwX29mZnNldFtuaWRdICsgbm9kZV9yZW1hcF9zaXplW25pZF0pKTsKKwl9CisJcHJpbnRrKCJIaWdoIG1lbW9yeSBzdGFydHMgYXQgdmFkZHIgJTA4bHhcbiIsCisJCQkodWxvbmcpIHBmbl90b19rYWRkcihoaWdoc3RhcnRfcGZuKSk7CisJdm1hbGxvY19lYXJseXJlc2VydmUgPSByZXNlcnZlX3BhZ2VzICogUEFHRV9TSVpFOworCWZvcl9lYWNoX29ubGluZV9ub2RlKG5pZCkKKwkJZmluZF9tYXhfcGZuX25vZGUobmlkKTsKKworCW1lbXNldChOT0RFX0RBVEEoMCksIDAsIHNpemVvZihzdHJ1Y3QgcGdsaXN0X2RhdGEpKTsKKwlOT0RFX0RBVEEoMCktPmJkYXRhID0gJm5vZGUwX2JkYXRhOworCXNldHVwX2Jvb3RtZW1fYWxsb2NhdG9yKCk7CisJcmV0dXJuIG1heF9sb3dfcGZuOworfQorCit2b2lkIF9faW5pdCB6b25lX3NpemVzX2luaXQodm9pZCkKK3sKKwlpbnQgbmlkOworCisJLyoKKwkgKiBJbnNlcnQgbm9kZXMgaW50byBwZ2RhdF9saXN0IGJhY2t3YXJkIHNvIHRoZXkgYXBwZWFyIGluIG9yZGVyLgorCSAqIENsb2JiZXIgbm9kZSAwJ3MgbGlua3MgYW5kIE5VTEwgb3V0IHBnZGF0X2xpc3QgYmVmb3JlIHN0YXJ0aW5nLgorCSAqLworCXBnZGF0X2xpc3QgPSBOVUxMOworCWZvciAobmlkID0gTUFYX05VTU5PREVTIC0gMTsgbmlkID49IDA7IG5pZC0tKSB7CisJCWlmICghbm9kZV9vbmxpbmUobmlkKSkKKwkJCWNvbnRpbnVlOworCQlOT0RFX0RBVEEobmlkKS0+cGdkYXRfbmV4dCA9IHBnZGF0X2xpc3Q7CisJCXBnZGF0X2xpc3QgPSBOT0RFX0RBVEEobmlkKTsKKwl9CisKKwlmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpIHsKKwkJdW5zaWduZWQgbG9uZyB6b25lc19zaXplW01BWF9OUl9aT05FU10gPSB7MCwgMCwgMH07CisJCXVuc2lnbmVkIGxvbmcgKnpob2xlc19zaXplOworCQl1bnNpZ25lZCBpbnQgbWF4X2RtYTsKKworCQl1bnNpZ25lZCBsb25nIGxvdyA9IG1heF9sb3dfcGZuOworCQl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gbm9kZV9zdGFydF9wZm5bbmlkXTsKKwkJdW5zaWduZWQgbG9uZyBoaWdoID0gbm9kZV9lbmRfcGZuW25pZF07CisKKwkJbWF4X2RtYSA9IHZpcnRfdG9fcGh5cygoY2hhciAqKU1BWF9ETUFfQUREUkVTUykgPj4gUEFHRV9TSElGVDsKKworCQlpZiAobm9kZV9oYXNfb25saW5lX21lbShuaWQpKXsKKwkJCWlmIChzdGFydCA+IGxvdykgeworI2lmZGVmIENPTkZJR19ISUdITUVNCisJCQkJQlVHX09OKHN0YXJ0ID4gaGlnaCk7CisJCQkJem9uZXNfc2l6ZVtaT05FX0hJR0hNRU1dID0gaGlnaCAtIHN0YXJ0OworI2VuZGlmCisJCQl9IGVsc2UgeworCQkJCWlmIChsb3cgPCBtYXhfZG1hKQorCQkJCQl6b25lc19zaXplW1pPTkVfRE1BXSA9IGxvdzsKKwkJCQllbHNlIHsKKwkJCQkJQlVHX09OKG1heF9kbWEgPiBsb3cpOworCQkJCQlCVUdfT04obG93ID4gaGlnaCk7CisJCQkJCXpvbmVzX3NpemVbWk9ORV9ETUFdID0gbWF4X2RtYTsKKwkJCQkJem9uZXNfc2l6ZVtaT05FX05PUk1BTF0gPSBsb3cgLSBtYXhfZG1hOworI2lmZGVmIENPTkZJR19ISUdITUVNCisJCQkJCXpvbmVzX3NpemVbWk9ORV9ISUdITUVNXSA9IGhpZ2ggLSBsb3c7CisjZW5kaWYKKwkJCQl9CisJCQl9CisJCX0KKworCQl6aG9sZXNfc2l6ZSA9IGdldF96aG9sZXNfc2l6ZShuaWQpOworCQkvKgorCQkgKiBXZSBsZXQgdGhlIGxtZW1fbWFwIGZvciBub2RlIDAgYmUgYWxsb2NhdGVkIGZyb20gdGhlCisJCSAqIG5vcm1hbCBib290bWVtIGFsbG9jYXRvciwgYnV0IG90aGVyIG5vZGVzIGNvbWUgZnJvbSB0aGUKKwkJICogcmVtYXBwZWQgS1ZBIGFyZWEgLSBtYmxpZ2gKKwkJICovCisJCWlmICghbmlkKQorCQkJZnJlZV9hcmVhX2luaXRfbm9kZShuaWQsIE5PREVfREFUQShuaWQpLAorCQkJCQl6b25lc19zaXplLCBzdGFydCwgemhvbGVzX3NpemUpOworCQllbHNlIHsKKwkJCXVuc2lnbmVkIGxvbmcgbG1lbV9tYXA7CisJCQlsbWVtX21hcCA9ICh1bnNpZ25lZCBsb25nKW5vZGVfcmVtYXBfc3RhcnRfdmFkZHJbbmlkXTsKKwkJCWxtZW1fbWFwICs9IHNpemVvZihwZ19kYXRhX3QpICsgUEFHRV9TSVpFIC0gMTsKKwkJCWxtZW1fbWFwICY9IFBBR0VfTUFTSzsKKwkJCU5PREVfREFUQShuaWQpLT5ub2RlX21lbV9tYXAgPSAoc3RydWN0IHBhZ2UgKilsbWVtX21hcDsKKwkJCWZyZWVfYXJlYV9pbml0X25vZGUobmlkLCBOT0RFX0RBVEEobmlkKSwgem9uZXNfc2l6ZSwKKwkJCQlzdGFydCwgemhvbGVzX3NpemUpOworCQl9CisJfQorCXJldHVybjsKK30KKwordm9pZCBfX2luaXQgc2V0X2hpZ2htZW1fcGFnZXNfaW5pdChpbnQgYmFkX3Bwcm8pIAoreworI2lmZGVmIENPTkZJR19ISUdITUVNCisJc3RydWN0IHpvbmUgKnpvbmU7CisKKwlmb3JfZWFjaF96b25lKHpvbmUpIHsKKwkJdW5zaWduZWQgbG9uZyBub2RlX3Bmbiwgbm9kZV9oaWdoX3NpemUsIHpvbmVfc3RhcnRfcGZuOworCQlzdHJ1Y3QgcGFnZSAqIHpvbmVfbWVtX21hcDsKKwkJCisJCWlmICghaXNfaGlnaG1lbSh6b25lKSkKKwkJCWNvbnRpbnVlOworCisJCXByaW50aygiSW5pdGlhbGl6aW5nICVzIGZvciBub2RlICVkXG4iLCB6b25lLT5uYW1lLAorCQkJem9uZS0+em9uZV9wZ2RhdC0+bm9kZV9pZCk7CisKKwkJbm9kZV9oaWdoX3NpemUgPSB6b25lLT5zcGFubmVkX3BhZ2VzOworCQl6b25lX21lbV9tYXAgPSB6b25lLT56b25lX21lbV9tYXA7CisJCXpvbmVfc3RhcnRfcGZuID0gem9uZS0+em9uZV9zdGFydF9wZm47CisKKwkJZm9yIChub2RlX3BmbiA9IDA7IG5vZGVfcGZuIDwgbm9kZV9oaWdoX3NpemU7IG5vZGVfcGZuKyspIHsKKwkJCW9uZV9oaWdocGFnZV9pbml0KChzdHJ1Y3QgcGFnZSAqKSh6b25lX21lbV9tYXAgKyBub2RlX3BmbiksCisJCQkJCSAgem9uZV9zdGFydF9wZm4gKyBub2RlX3BmbiwgYmFkX3Bwcm8pOworCQl9CisJfQorCXRvdGFscmFtX3BhZ2VzICs9IHRvdGFsaGlnaF9wYWdlczsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21tL2V4dGFibGUuYyBiL2FyY2gvaTM4Ni9tbS9leHRhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcwNjQ0OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tbS9leHRhYmxlLmMKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIGxpbnV4L2FyY2gvaTM4Ni9tbS9leHRhYmxlLmMKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitpbnQgZml4dXBfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWNvbnN0IHN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkgKmZpeHVwOworCisjaWZkZWYgQ09ORklHX1BOUEJJT1MKKwlpZiAodW5saWtlbHkoKHJlZ3MtPnhjcyAmIH4xNSkgPT0gKEdEVF9FTlRSWV9QTlBCSU9TX0JBU0UgPDwgMykpKQorCXsKKwkJZXh0ZXJuIHUzMiBwbnBfYmlvc19mYXVsdF9laXAsIHBucF9iaW9zX2ZhdWx0X2VzcDsKKwkJZXh0ZXJuIHUzMiBwbnBfYmlvc19pc191dHRlcl9jcmFwOworCQlwbnBfYmlvc19pc191dHRlcl9jcmFwID0gMTsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiUE5QQklPUyBmYXVsdC4uIGF0dGVtcHRpbmcgcmVjb3ZlcnkuXG4iKTsKKwkJX19hc21fXyB2b2xhdGlsZSgKKwkJCSJtb3ZsICUwLCAlJWVzcFxuXHQiCisJCQkiam1wIColMVxuXHQiCisJCQk6IDogImciIChwbnBfYmlvc19mYXVsdF9lc3ApLCAiZyIgKHBucF9iaW9zX2ZhdWx0X2VpcCkpOworCQlwYW5pYygiZG9fdHJhcDogY2FuJ3QgaGl0IHRoaXMiKTsKKwl9CisjZW5kaWYKKworCWZpeHVwID0gc2VhcmNoX2V4Y2VwdGlvbl90YWJsZXMocmVncy0+ZWlwKTsKKwlpZiAoZml4dXApIHsKKwkJcmVncy0+ZWlwID0gZml4dXAtPmZpeHVwOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tbS9mYXVsdC5jIGIvYXJjaC9pMzg2L21tL2ZhdWx0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUwOTIzNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tbS9mYXVsdC5jCkBAIC0wLDAgKzEsNTUyIEBACisvKgorICogIGxpbnV4L2FyY2gvaTM4Ni9tbS9mYXVsdC5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NSAgTGludXMgVG9ydmFsZHMKKyAqLworCisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW1hbi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdnRfa2Vybi5oPgkJLyogRm9yIHVuYmxhbmtfc2NyZWVuKCkgKi8KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vZGVzYy5oPgorI2luY2x1ZGUgPGFzbS9rZGVidWcuaD4KKworZXh0ZXJuIHZvaWQgZGllKGNvbnN0IGNoYXIgKixzdHJ1Y3QgcHRfcmVncyAqLGxvbmcpOworCisvKgorICogVW5sb2NrIGFueSBzcGlubG9ja3Mgd2hpY2ggd2lsbCBwcmV2ZW50IHVzIGZyb20gZ2V0dGluZyB0aGUKKyAqIG1lc3NhZ2Ugb3V0IAorICovCit2b2lkIGJ1c3Rfc3BpbmxvY2tzKGludCB5ZXMpCit7CisJaW50IGxvZ2xldmVsX3NhdmUgPSBjb25zb2xlX2xvZ2xldmVsOworCisJaWYgKHllcykgeworCQlvb3BzX2luX3Byb2dyZXNzID0gMTsKKwkJcmV0dXJuOworCX0KKyNpZmRlZiBDT05GSUdfVlQKKwl1bmJsYW5rX3NjcmVlbigpOworI2VuZGlmCisJb29wc19pbl9wcm9ncmVzcyA9IDA7CisJLyoKKwkgKiBPSywgdGhlIG1lc3NhZ2UgaXMgb24gdGhlIGNvbnNvbGUuICBOb3cgd2UgY2FsbCBwcmludGsoKQorCSAqIHdpdGhvdXQgb29wc19pbl9wcm9ncmVzcyBzZXQgc28gdGhhdCBwcmludGsgd2lsbCBnaXZlIGtsb2dkCisJICogYSBwb2tlLiAgSG9sZCBvbnRvIHlvdXIgaGF0cy4uLgorCSAqLworCWNvbnNvbGVfbG9nbGV2ZWwgPSAxNTsJCS8qIE5NSSBvb3BzZXIgbWF5IGhhdmUgc2h1dCB0aGUgY29uc29sZSB1cCAqLworCXByaW50aygiICIpOworCWNvbnNvbGVfbG9nbGV2ZWwgPSBsb2dsZXZlbF9zYXZlOworfQorCisvKgorICogUmV0dXJuIEVJUCBwbHVzIHRoZSBDUyBzZWdtZW50IGJhc2UuICBUaGUgc2VnbWVudCBsaW1pdCBpcyBhbHNvCisgKiBhZGp1c3RlZCwgY2xhbXBlZCB0byB0aGUga2VybmVsL3VzZXIgYWRkcmVzcyBzcGFjZSAod2hpY2hldmVyIGlzCisgKiBhcHByb3ByaWF0ZSksIGFuZCByZXR1cm5lZCBpbiAqZWlwX2xpbWl0LgorICoKKyAqIFRoZSBzZWdtZW50IGlzIGNoZWNrZWQsIGJlY2F1c2UgaXQgbWlnaHQgaGF2ZSBiZWVuIGNoYW5nZWQgYnkgYW5vdGhlcgorICogdGFzayBiZXR3ZWVuIHRoZSBvcmlnaW5hbCBmYXVsdGluZyBpbnN0cnVjdGlvbiBhbmQgaGVyZS4KKyAqCisgKiBJZiBDUyBpcyBubyBsb25nZXIgYSB2YWxpZCBjb2RlIHNlZ21lbnQsIG9yIGlmIEVJUCBpcyBiZXlvbmQgdGhlCisgKiBsaW1pdCwgb3IgaWYgaXQgaXMgYSBrZXJuZWwgYWRkcmVzcyB3aGVuIENTIGlzIG5vdCBhIGtlcm5lbCBzZWdtZW50LAorICogdGhlbiB0aGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBiZSBncmVhdGVyIHRoYW4gKmVpcF9saW1pdC4KKyAqIAorICogVGhpcyBpcyBzbG93LCBidXQgaXMgdmVyeSByYXJlbHkgZXhlY3V0ZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfc2VnbWVudF9laXAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQkJCSAgICB1bnNpZ25lZCBsb25nICplaXBfbGltaXQpCit7CisJdW5zaWduZWQgbG9uZyBlaXAgPSByZWdzLT5laXA7CisJdW5zaWduZWQgc2VnID0gcmVncy0+eGNzICYgMHhmZmZmOworCXUzMiBzZWdfYXIsIHNlZ19saW1pdCwgYmFzZSwgKmRlc2M7CisKKwkvKiBUaGUgc3RhbmRhcmQga2VybmVsL3VzZXIgYWRkcmVzcyBzcGFjZSBsaW1pdC4gKi8KKwkqZWlwX2xpbWl0ID0gKHNlZyAmIDMpID8gVVNFUl9EUy5zZWcgOiBLRVJORUxfRFMuc2VnOworCisJLyogVW5saWtlbHksIGJ1dCBtdXN0IGNvbWUgYmVmb3JlIHNlZ21lbnQgY2hlY2tzLiAqLworCWlmICh1bmxpa2VseSgocmVncy0+ZWZsYWdzICYgVk1fTUFTSykgIT0gMCkpCisJCXJldHVybiBlaXAgKyAoc2VnIDw8IDQpOworCQorCS8qIEJ5IGZhciB0aGUgbW9zdCBjb21tb24gY2FzZXMuICovCisJaWYgKGxpa2VseShzZWcgPT0gX19VU0VSX0NTIHx8IHNlZyA9PSBfX0tFUk5FTF9DUykpCisJCXJldHVybiBlaXA7CisKKwkvKiBDaGVjayB0aGUgc2VnbWVudCBleGlzdHMsIGlzIHdpdGhpbiB0aGUgY3VycmVudCBMRFQvR0RUIHNpemUsCisJICAgdGhhdCBrZXJuZWwvdXNlciAocmluZyAwLi4zKSBoYXMgdGhlIGFwcHJvcHJpYXRlIHByaXZpbGVnZSwKKwkgICB0aGF0IGl0J3MgYSBjb2RlIHNlZ21lbnQsIGFuZCBnZXQgdGhlIGxpbWl0LiAqLworCV9fYXNtX18gKCJsYXJsICUzLCUwOyBsc2xsICUzLCUxIgorCQkgOiAiPSZyIiAoc2VnX2FyKSwgIj1yIiAoc2VnX2xpbWl0KSA6ICIwIiAoMCksICJybSIgKHNlZykpOworCWlmICgofnNlZ19hciAmIDB4OTgwMCkgfHwgZWlwID4gc2VnX2xpbWl0KSB7CisJCSplaXBfbGltaXQgPSAwOworCQlyZXR1cm4gMTsJIC8qIFNvIHRoYXQgcmV0dXJuZWQgZWlwID4gKmVpcF9saW1pdC4gKi8KKwl9CisKKwkvKiBHZXQgdGhlIEdEVC9MRFQgZGVzY3JpcHRvciBiYXNlLiAKKwkgICBXaGVuIHlvdSBsb29rIGZvciByYWNlcyBpbiB0aGlzIGNvZGUgcmVtZW1iZXIgdGhhdAorCSAgIExEVCBhbmQgb3RoZXIgaG9ycm9ycyBhcmUgb25seSB1c2VkIGluIHVzZXIgc3BhY2UuICovCisJaWYgKHNlZyAmICgxPDwyKSkgeworCQkvKiBNdXN0IGxvY2sgdGhlIExEVCB3aGlsZSByZWFkaW5nIGl0LiAqLworCQlkb3duKCZjdXJyZW50LT5tbS0+Y29udGV4dC5zZW0pOworCQlkZXNjID0gY3VycmVudC0+bW0tPmNvbnRleHQubGR0OworCQlkZXNjID0gKHZvaWQgKilkZXNjICsgKHNlZyAmIH43KTsKKwl9IGVsc2UgeworCQkvKiBNdXN0IGRpc2FibGUgcHJlZW1wdGlvbiB3aGlsZSByZWFkaW5nIHRoZSBHRFQuICovCisJCWRlc2MgPSAodTMyICopJnBlcl9jcHUoY3B1X2dkdF90YWJsZSwgZ2V0X2NwdSgpKTsKKwkJZGVzYyA9ICh2b2lkICopZGVzYyArIChzZWcgJiB+Nyk7CisJfQorCisJLyogRGVjb2RlIHRoZSBjb2RlIHNlZ21lbnQgYmFzZSBmcm9tIHRoZSBkZXNjcmlwdG9yICovCisJYmFzZSA9IGdldF9kZXNjX2Jhc2UoKHVuc2lnbmVkIGxvbmcgKilkZXNjKTsKKworCWlmIChzZWcgJiAoMTw8MikpIHsgCisJCXVwKCZjdXJyZW50LT5tbS0+Y29udGV4dC5zZW0pOworCX0gZWxzZQorCQlwdXRfY3B1KCk7CisKKwkvKiBBZGp1c3QgRUlQIGFuZCBzZWdtZW50IGxpbWl0LCBhbmQgY2xhbXAgYXQgdGhlIGtlcm5lbCBsaW1pdC4KKwkgICBJdCdzIGxlZ2l0aW1hdGUgZm9yIHNlZ21lbnRzIHRvIHdyYXAgYXQgMHhmZmZmZmZmZi4gKi8KKwlzZWdfbGltaXQgKz0gYmFzZTsKKwlpZiAoc2VnX2xpbWl0IDwgKmVpcF9saW1pdCAmJiBzZWdfbGltaXQgPj0gYmFzZSkKKwkJKmVpcF9saW1pdCA9IHNlZ19saW1pdDsKKwlyZXR1cm4gZWlwICsgYmFzZTsKK30KKworLyogCisgKiBTb21ldGltZXMgQU1EIEF0aGxvbi9PcHRlcm9uIENQVXMgcmVwb3J0IGludmFsaWQgZXhjZXB0aW9ucyBvbiBwcmVmZXRjaC4KKyAqIENoZWNrIHRoYXQgaGVyZSBhbmQgaWdub3JlIGl0LgorICovCitzdGF0aWMgaW50IF9faXNfcHJlZmV0Y2goc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgYWRkcikKK3sgCisJdW5zaWduZWQgbG9uZyBsaW1pdDsKKwl1bnNpZ25lZCBsb25nIGluc3RyID0gZ2V0X3NlZ21lbnRfZWlwIChyZWdzLCAmbGltaXQpOworCWludCBzY2FuX21vcmUgPSAxOworCWludCBwcmVmZXRjaCA9IDA7IAorCWludCBpOworCisJZm9yIChpID0gMDsgc2Nhbl9tb3JlICYmIGkgPCAxNTsgaSsrKSB7IAorCQl1bnNpZ25lZCBjaGFyIG9wY29kZTsKKwkJdW5zaWduZWQgY2hhciBpbnN0cl9oaTsKKwkJdW5zaWduZWQgY2hhciBpbnN0cl9sbzsKKworCQlpZiAoaW5zdHIgPiBsaW1pdCkKKwkJCWJyZWFrOworCQlpZiAoX19nZXRfdXNlcihvcGNvZGUsICh1bnNpZ25lZCBjaGFyICopIGluc3RyKSkKKwkJCWJyZWFrOyAKKworCQlpbnN0cl9oaSA9IG9wY29kZSAmIDB4ZjA7IAorCQlpbnN0cl9sbyA9IG9wY29kZSAmIDB4MGY7IAorCQlpbnN0cisrOworCisJCXN3aXRjaCAoaW5zdHJfaGkpIHsgCisJCWNhc2UgMHgyMDoKKwkJY2FzZSAweDMwOgorCQkJLyogVmFsdWVzIDB4MjYsMHgyRSwweDM2LDB4M0UgYXJlIHZhbGlkIHg4NiBwcmVmaXhlcy4gKi8KKwkJCXNjYW5fbW9yZSA9ICgoaW5zdHJfbG8gJiA3KSA9PSAweDYpOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSAweDYwOgorCQkJLyogMHg2NCB0aHJ1IDB4NjcgYXJlIHZhbGlkIHByZWZpeGVzIGluIGFsbCBtb2Rlcy4gKi8KKwkJCXNjYW5fbW9yZSA9IChpbnN0cl9sbyAmIDB4QykgPT0gMHg0OworCQkJYnJlYWs7CQkKKwkJY2FzZSAweEYwOgorCQkJLyogMHhGMCwgMHhGMiwgYW5kIDB4RjMgYXJlIHZhbGlkIHByZWZpeGVzICovCisJCQlzY2FuX21vcmUgPSAhaW5zdHJfbG8gfHwgKGluc3RyX2xvPj4xKSA9PSAxOworCQkJYnJlYWs7CQkJCisJCWNhc2UgMHgwMDoKKwkJCS8qIFByZWZldGNoIGluc3RydWN0aW9uIGlzIDB4MEYwRCBvciAweDBGMTggKi8KKwkJCXNjYW5fbW9yZSA9IDA7CisJCQlpZiAoaW5zdHIgPiBsaW1pdCkKKwkJCQlicmVhazsKKwkJCWlmIChfX2dldF91c2VyKG9wY29kZSwgKHVuc2lnbmVkIGNoYXIgKikgaW5zdHIpKSAKKwkJCQlicmVhazsKKwkJCXByZWZldGNoID0gKGluc3RyX2xvID09IDB4RikgJiYKKwkJCQkob3Bjb2RlID09IDB4MEQgfHwgb3Bjb2RlID09IDB4MTgpOworCQkJYnJlYWs7CQkJCisJCWRlZmF1bHQ6CisJCQlzY2FuX21vcmUgPSAwOworCQkJYnJlYWs7CisJCX0gCisJfQorCXJldHVybiBwcmVmZXRjaDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfcHJlZmV0Y2goc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZSkKK3sKKwlpZiAodW5saWtlbHkoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfQU1EICYmCisJCSAgICAgYm9vdF9jcHVfZGF0YS54ODYgPj0gNikpIHsKKwkJLyogQ2F0Y2ggYW4gb2JzY3VyZSBjYXNlIG9mIHByZWZldGNoIGluc2lkZSBhbiBOWCBwYWdlLiAqLworCQlpZiAobnhfZW5hYmxlZCAmJiAoZXJyb3JfY29kZSAmIDE2KSkKKwkJCXJldHVybiAwOworCQlyZXR1cm4gX19pc19wcmVmZXRjaChyZWdzLCBhZGRyKTsKKwl9CisJcmV0dXJuIDA7Cit9IAorCitmYXN0Y2FsbCB2b2lkIGRvX2ludmFsaWRfb3Aoc3RydWN0IHB0X3JlZ3MgKiwgdW5zaWduZWQgbG9uZyk7CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaGFuZGxlcyBwYWdlIGZhdWx0cy4gIEl0IGRldGVybWluZXMgdGhlIGFkZHJlc3MsCisgKiBhbmQgdGhlIHByb2JsZW0sIGFuZCB0aGVuIHBhc3NlcyBpdCBvZmYgdG8gb25lIG9mIHRoZSBhcHByb3ByaWF0ZQorICogcm91dGluZXMuCisgKgorICogZXJyb3JfY29kZToKKyAqCWJpdCAwID09IDAgbWVhbnMgbm8gcGFnZSBmb3VuZCwgMSBtZWFucyBwcm90ZWN0aW9uIGZhdWx0CisgKgliaXQgMSA9PSAwIG1lYW5zIHJlYWQsIDEgbWVhbnMgd3JpdGUKKyAqCWJpdCAyID09IDAgbWVhbnMga2VybmVsLCAxIG1lYW5zIHVzZXItbW9kZQorICovCitmYXN0Y2FsbCB2b2lkIGRvX3BhZ2VfZmF1bHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWE7CisJdW5zaWduZWQgbG9uZyBhZGRyZXNzOworCXVuc2lnbmVkIGxvbmcgcGFnZTsKKwlpbnQgd3JpdGU7CisJc2lnaW5mb190IGluZm87CisKKwkvKiBnZXQgdGhlIGFkZHJlc3MgKi8KKwlfX2FzbV9fKCJtb3ZsICUlY3IyLCUwIjoiPXIiIChhZGRyZXNzKSk7CisKKwlpZiAobm90aWZ5X2RpZShESUVfUEFHRV9GQVVMVCwgInBhZ2UgZmF1bHQiLCByZWdzLCBlcnJvcl9jb2RlLCAxNCwKKwkJCQkJU0lHU0VHVikgPT0gTk9USUZZX1NUT1ApCisJCXJldHVybjsKKwkvKiBJdCdzIHNhZmUgdG8gYWxsb3cgaXJxJ3MgYWZ0ZXIgY3IyIGhhcyBiZWVuIHNhdmVkICovCisJaWYgKHJlZ3MtPmVmbGFncyAmIChYODZfRUZMQUdTX0lGfFZNX01BU0spKQorCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwl0c2sgPSBjdXJyZW50OworCisJaW5mby5zaV9jb2RlID0gU0VHVl9NQVBFUlI7CisKKwkvKgorCSAqIFdlIGZhdWx0LWluIGtlcm5lbC1zcGFjZSB2aXJ0dWFsIG1lbW9yeSBvbi1kZW1hbmQuIFRoZQorCSAqICdyZWZlcmVuY2UnIHBhZ2UgdGFibGUgaXMgaW5pdF9tbS5wZ2QuCisJICoKKwkgKiBOT1RFISBXZSBNVVNUIE5PVCB0YWtlIGFueSBsb2NrcyBmb3IgdGhpcyBjYXNlLiBXZSBtYXkKKwkgKiBiZSBpbiBhbiBpbnRlcnJ1cHQgb3IgYSBjcml0aWNhbCByZWdpb24sIGFuZCBzaG91bGQKKwkgKiBvbmx5IGNvcHkgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIG1hc3RlciBwYWdlIHRhYmxlLAorCSAqIG5vdGhpbmcgbW9yZS4KKwkgKgorCSAqIFRoaXMgdmVyaWZpZXMgdGhhdCB0aGUgZmF1bHQgaGFwcGVucyBpbiBrZXJuZWwgc3BhY2UKKwkgKiAoZXJyb3JfY29kZSAmIDQpID09IDAsIGFuZCB0aGF0IHRoZSBmYXVsdCB3YXMgbm90IGEKKwkgKiBwcm90ZWN0aW9uIGVycm9yIChlcnJvcl9jb2RlICYgMSkgPT0gMC4KKwkgKi8KKwlpZiAodW5saWtlbHkoYWRkcmVzcyA+PSBUQVNLX1NJWkUpKSB7IAorCQlpZiAoIShlcnJvcl9jb2RlICYgNSkpCisJCQlnb3RvIHZtYWxsb2NfZmF1bHQ7CisJCS8qIAorCQkgKiBEb24ndCB0YWtlIHRoZSBtbSBzZW1hcGhvcmUgaGVyZS4gSWYgd2UgZml4dXAgYSBwcmVmZXRjaAorCQkgKiBmYXVsdCB3ZSBjb3VsZCBvdGhlcndpc2UgZGVhZGxvY2suCisJCSAqLworCQlnb3RvIGJhZF9hcmVhX25vc2VtYXBob3JlOworCX0gCisKKwltbSA9IHRzay0+bW07CisKKwkvKgorCSAqIElmIHdlJ3JlIGluIGFuIGludGVycnVwdCwgaGF2ZSBubyB1c2VyIGNvbnRleHQgb3IgYXJlIHJ1bm5pbmcgaW4gYW4KKwkgKiBhdG9taWMgcmVnaW9uIHRoZW4gd2UgbXVzdCBub3QgdGFrZSB0aGUgZmF1bHQuLgorCSAqLworCWlmIChpbl9hdG9taWMoKSB8fCAhbW0pCisJCWdvdG8gYmFkX2FyZWFfbm9zZW1hcGhvcmU7CisKKwkvKiBXaGVuIHJ1bm5pbmcgaW4gdGhlIGtlcm5lbCB3ZSBleHBlY3QgZmF1bHRzIHRvIG9jY3VyIG9ubHkgdG8KKwkgKiBhZGRyZXNzZXMgaW4gdXNlciBzcGFjZS4gIEFsbCBvdGhlciBmYXVsdHMgcmVwcmVzZW50IGVycm9ycyBpbiB0aGUKKwkgKiBrZXJuZWwgYW5kIHNob3VsZCBnZW5lcmF0ZSBhbiBPT1BTLiAgVW5mb3J0dW5hdGx5LCBpbiB0aGUgY2FzZSBvZiBhbgorCSAqIGVycm9uZW91cyBmYXVsdCBvY2N1cmluZyBpbiBhIGNvZGUgcGF0aCB3aGljaCBhbHJlYWR5IGhvbGRzIG1tYXBfc2VtCisJICogd2Ugd2lsbCBkZWFkbG9jayBhdHRlbXB0aW5nIHRvIHZhbGlkYXRlIHRoZSBmYXVsdCBhZ2FpbnN0IHRoZQorCSAqIGFkZHJlc3Mgc3BhY2UuICBMdWNraWx5IHRoZSBrZXJuZWwgb25seSB2YWxpZGx5IHJlZmVyZW5jZXMgdXNlcgorCSAqIHNwYWNlIGZyb20gd2VsbCBkZWZpbmVkIGFyZWFzIG9mIGNvZGUsIHdoaWNoIGFyZSBsaXN0ZWQgaW4gdGhlCisJICogZXhjZXB0aW9ucyB0YWJsZS4KKwkgKgorCSAqIEFzIHRoZSB2YXN0IG1ham9yaXR5IG9mIGZhdWx0cyB3aWxsIGJlIHZhbGlkIHdlIHdpbGwgb25seSBwZXJmb3JtCisJICogdGhlIHNvdXJjZSByZWZlcmVuY2UgY2hlY2sgd2hlbiB0aGVyZSBpcyBhIHBvc3NpYmlsdHkgb2YgYSBkZWFkbG9jay4KKwkgKiBBdHRlbXB0IHRvIGxvY2sgdGhlIGFkZHJlc3Mgc3BhY2UsIGlmIHdlIGNhbm5vdCB3ZSB0aGVuIHZhbGlkYXRlIHRoZQorCSAqIHNvdXJjZS4gIElmIHRoaXMgaXMgaW52YWxpZCB3ZSBjYW4gc2tpcCB0aGUgYWRkcmVzcyBzcGFjZSBjaGVjaywKKwkgKiB0aHVzIGF2b2lkaW5nIHRoZSBkZWFkbG9jay4KKwkgKi8KKwlpZiAoIWRvd25fcmVhZF90cnlsb2NrKCZtbS0+bW1hcF9zZW0pKSB7CisJCWlmICgoZXJyb3JfY29kZSAmIDQpID09IDAgJiYKKwkJICAgICFzZWFyY2hfZXhjZXB0aW9uX3RhYmxlcyhyZWdzLT5laXApKQorCQkJZ290byBiYWRfYXJlYV9ub3NlbWFwaG9yZTsKKwkJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOworCX0KKworCXZtYSA9IGZpbmRfdm1hKG1tLCBhZGRyZXNzKTsKKwlpZiAoIXZtYSkKKwkJZ290byBiYWRfYXJlYTsKKwlpZiAodm1hLT52bV9zdGFydCA8PSBhZGRyZXNzKQorCQlnb3RvIGdvb2RfYXJlYTsKKwlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fR1JPV1NET1dOKSkKKwkJZ290byBiYWRfYXJlYTsKKwlpZiAoZXJyb3JfY29kZSAmIDQpIHsKKwkJLyoKKwkJICogYWNjZXNzaW5nIHRoZSBzdGFjayBiZWxvdyAlZXNwIGlzIGFsd2F5cyBhIGJ1Zy4KKwkJICogVGhlICIrIDMyIiBpcyB0aGVyZSBkdWUgdG8gc29tZSBpbnN0cnVjdGlvbnMgKGxpa2UKKwkJICogcHVzaGEpIGRvaW5nIHBvc3QtZGVjcmVtZW50IG9uIHRoZSBzdGFjayBhbmQgdGhhdAorCQkgKiBkb2Vzbid0IHNob3cgdXAgdW50aWwgbGF0ZXIuLgorCQkgKi8KKwkJaWYgKGFkZHJlc3MgKyAzMiA8IHJlZ3MtPmVzcCkKKwkJCWdvdG8gYmFkX2FyZWE7CisJfQorCWlmIChleHBhbmRfc3RhY2sodm1hLCBhZGRyZXNzKSkKKwkJZ290byBiYWRfYXJlYTsKKy8qCisgKiBPaywgd2UgaGF2ZSBhIGdvb2Qgdm1fYXJlYSBmb3IgdGhpcyBtZW1vcnkgYWNjZXNzLCBzbworICogd2UgY2FuIGhhbmRsZSBpdC4uCisgKi8KK2dvb2RfYXJlYToKKwlpbmZvLnNpX2NvZGUgPSBTRUdWX0FDQ0VSUjsKKwl3cml0ZSA9IDA7CisJc3dpdGNoIChlcnJvcl9jb2RlICYgMykgeworCQlkZWZhdWx0OgkvKiAzOiB3cml0ZSwgcHJlc2VudCAqLworI2lmZGVmIFRFU1RfVkVSSUZZX0FSRUEKKwkJCWlmIChyZWdzLT5jcyA9PSBLRVJORUxfQ1MpCisJCQkJcHJpbnRrKCJXUCBmYXVsdCBhdCAlMDhseFxuIiwgcmVncy0+ZWlwKTsKKyNlbmRpZgorCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgMjoJCS8qIHdyaXRlLCBub3QgcHJlc2VudCAqLworCQkJaWYgKCEodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSkKKwkJCQlnb3RvIGJhZF9hcmVhOworCQkJd3JpdGUrKzsKKwkJCWJyZWFrOworCQljYXNlIDE6CQkvKiByZWFkLCBwcmVzZW50ICovCisJCQlnb3RvIGJhZF9hcmVhOworCQljYXNlIDA6CQkvKiByZWFkLCBub3QgcHJlc2VudCAqLworCQkJaWYgKCEodm1hLT52bV9mbGFncyAmIChWTV9SRUFEIHwgVk1fRVhFQykpKQorCQkJCWdvdG8gYmFkX2FyZWE7CisJfQorCisgc3Vydml2ZToKKwkvKgorCSAqIElmIGZvciBhbnkgcmVhc29uIGF0IGFsbCB3ZSBjb3VsZG4ndCBoYW5kbGUgdGhlIGZhdWx0LAorCSAqIG1ha2Ugc3VyZSB3ZSBleGl0IGdyYWNlZnVsbHkgcmF0aGVyIHRoYW4gZW5kbGVzc2x5IHJlZG8KKwkgKiB0aGUgZmF1bHQuCisJICovCisJc3dpdGNoIChoYW5kbGVfbW1fZmF1bHQobW0sIHZtYSwgYWRkcmVzcywgd3JpdGUpKSB7CisJCWNhc2UgVk1fRkFVTFRfTUlOT1I6CisJCQl0c2stPm1pbl9mbHQrKzsKKwkJCWJyZWFrOworCQljYXNlIFZNX0ZBVUxUX01BSk9SOgorCQkJdHNrLT5tYWpfZmx0Kys7CisJCQlicmVhazsKKwkJY2FzZSBWTV9GQVVMVF9TSUdCVVM6CisJCQlnb3RvIGRvX3NpZ2J1czsKKwkJY2FzZSBWTV9GQVVMVF9PT006CisJCQlnb3RvIG91dF9vZl9tZW1vcnk7CisJCWRlZmF1bHQ6CisJCQlCVUcoKTsKKwl9CisKKwkvKgorCSAqIERpZCBpdCBoaXQgdGhlIERPUyBzY3JlZW4gbWVtb3J5IFZBIGZyb20gdm04NiBtb2RlPworCSAqLworCWlmIChyZWdzLT5lZmxhZ3MgJiBWTV9NQVNLKSB7CisJCXVuc2lnbmVkIGxvbmcgYml0ID0gKGFkZHJlc3MgLSAweEEwMDAwKSA+PiBQQUdFX1NISUZUOworCQlpZiAoYml0IDwgMzIpCisJCQl0c2stPnRocmVhZC5zY3JlZW5fYml0bWFwIHw9IDEgPDwgYml0OworCX0KKwl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOworCXJldHVybjsKKworLyoKKyAqIFNvbWV0aGluZyB0cmllZCB0byBhY2Nlc3MgbWVtb3J5IHRoYXQgaXNuJ3QgaW4gb3VyIG1lbW9yeSBtYXAuLgorICogRml4IGl0LCBidXQgY2hlY2sgaWYgaXQncyBrZXJuZWwgb3IgdXNlciBmaXJzdC4uCisgKi8KK2JhZF9hcmVhOgorCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisKK2JhZF9hcmVhX25vc2VtYXBob3JlOgorCS8qIFVzZXIgbW9kZSBhY2Nlc3NlcyBqdXN0IGNhdXNlIGEgU0lHU0VHViAqLworCWlmIChlcnJvcl9jb2RlICYgNCkgeworCQkvKiAKKwkJICogVmFsaWQgdG8gZG8gYW5vdGhlciBwYWdlIGZhdWx0IGhlcmUgYmVjYXVzZSB0aGlzIG9uZSBjYW1lIAorCQkgKiBmcm9tIHVzZXIgc3BhY2UuCisJCSAqLworCQlpZiAoaXNfcHJlZmV0Y2gocmVncywgYWRkcmVzcywgZXJyb3JfY29kZSkpCisJCQlyZXR1cm47CisKKwkJdHNrLT50aHJlYWQuY3IyID0gYWRkcmVzczsKKwkJLyogS2VybmVsIGFkZHJlc3NlcyBhcmUgYWx3YXlzIHByb3RlY3Rpb24gZmF1bHRzICovCisJCXRzay0+dGhyZWFkLmVycm9yX2NvZGUgPSBlcnJvcl9jb2RlIHwgKGFkZHJlc3MgPj0gVEFTS19TSVpFKTsKKwkJdHNrLT50aHJlYWQudHJhcF9ubyA9IDE0OworCQlpbmZvLnNpX3NpZ25vID0gU0lHU0VHVjsKKwkJaW5mby5zaV9lcnJubyA9IDA7CisJCS8qIGluZm8uc2lfY29kZSBoYXMgYmVlbiBzZXQgYWJvdmUgKi8KKwkJaW5mby5zaV9hZGRyID0gKHZvaWQgX191c2VyICopYWRkcmVzczsKKwkJZm9yY2Vfc2lnX2luZm8oU0lHU0VHViwgJmluZm8sIHRzayk7CisJCXJldHVybjsKKwl9CisKKyNpZmRlZiBDT05GSUdfWDg2X0YwMEZfQlVHCisJLyoKKwkgKiBQZW50aXVtIEYwIDBGIEM3IEM4IGJ1ZyB3b3JrYXJvdW5kLgorCSAqLworCWlmIChib290X2NwdV9kYXRhLmYwMGZfYnVnKSB7CisJCXVuc2lnbmVkIGxvbmcgbnI7CisJCQorCQluciA9IChhZGRyZXNzIC0gaWR0X2Rlc2NyLmFkZHJlc3MpID4+IDM7CisKKwkJaWYgKG5yID09IDYpIHsKKwkJCWRvX2ludmFsaWRfb3AocmVncywgMCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisjZW5kaWYKKworbm9fY29udGV4dDoKKwkvKiBBcmUgd2UgcHJlcGFyZWQgdG8gaGFuZGxlIHRoaXMga2VybmVsIGZhdWx0PyAgKi8KKwlpZiAoZml4dXBfZXhjZXB0aW9uKHJlZ3MpKQorCQlyZXR1cm47CisKKwkvKiAKKwkgKiBWYWxpZCB0byBkbyBhbm90aGVyIHBhZ2UgZmF1bHQgaGVyZSwgYmVjYXVzZSBpZiB0aGlzIGZhdWx0CisJICogaGFkIGJlZW4gdHJpZ2dlcmVkIGJ5IGlzX3ByZWZldGNoIGZpeHVwX2V4Y2VwdGlvbiB3b3VsZCBoYXZlIAorCSAqIGhhbmRsZWQgaXQuCisJICovCisgCWlmIChpc19wcmVmZXRjaChyZWdzLCBhZGRyZXNzLCBlcnJvcl9jb2RlKSkKKyAJCXJldHVybjsKKworLyoKKyAqIE9vcHMuIFRoZSBrZXJuZWwgdHJpZWQgdG8gYWNjZXNzIHNvbWUgYmFkIHBhZ2UuIFdlJ2xsIGhhdmUgdG8KKyAqIHRlcm1pbmF0ZSB0aGluZ3Mgd2l0aCBleHRyZW1lIHByZWp1ZGljZS4KKyAqLworCisJYnVzdF9zcGlubG9ja3MoMSk7CisKKyNpZmRlZiBDT05GSUdfWDg2X1BBRQorCWlmIChlcnJvcl9jb2RlICYgMTYpIHsKKwkJcHRlX3QgKnB0ZSA9IGxvb2t1cF9hZGRyZXNzKGFkZHJlc3MpOworCisJCWlmIChwdGUgJiYgcHRlX3ByZXNlbnQoKnB0ZSkgJiYgIXB0ZV9leGVjX2tlcm5lbCgqcHRlKSkKKwkJCXByaW50ayhLRVJOX0NSSVQgImtlcm5lbCB0cmllZCB0byBleGVjdXRlIE5YLXByb3RlY3RlZCBwYWdlIC0gZXhwbG9pdCBhdHRlbXB0PyAodWlkOiAlZClcbiIsIGN1cnJlbnQtPnVpZCk7CisJfQorI2VuZGlmCisJaWYgKGFkZHJlc3MgPCBQQUdFX1NJWkUpCisJCXByaW50ayhLRVJOX0FMRVJUICJVbmFibGUgdG8gaGFuZGxlIGtlcm5lbCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2UiKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0FMRVJUICJVbmFibGUgdG8gaGFuZGxlIGtlcm5lbCBwYWdpbmcgcmVxdWVzdCIpOworCXByaW50aygiIGF0IHZpcnR1YWwgYWRkcmVzcyAlMDhseFxuIixhZGRyZXNzKTsKKwlwcmludGsoS0VSTl9BTEVSVCAiIHByaW50aW5nIGVpcDpcbiIpOworCXByaW50aygiJTA4bHhcbiIsIHJlZ3MtPmVpcCk7CisJYXNtKCJtb3ZsICUlY3IzLCUwIjoiPXIiIChwYWdlKSk7CisJcGFnZSA9ICgodW5zaWduZWQgbG9uZyAqKSBfX3ZhKHBhZ2UpKVthZGRyZXNzID4+IDIyXTsKKwlwcmludGsoS0VSTl9BTEVSVCAiKnBkZSA9ICUwOGx4XG4iLCBwYWdlKTsKKwkvKgorCSAqIFdlIG11c3Qgbm90IGRpcmVjdGx5IGFjY2VzcyB0aGUgcHRlIGluIHRoZSBoaWdocHRlCisJICogY2FzZSwgdGhlIHBhZ2UgdGFibGUgbWlnaHQgYmUgYWxsb2NhdGVkIGluIGhpZ2htZW0uCisJICogQW5kIGxldHMgcmF0aGVyIG5vdCBrbWFwLWF0b21pYyB0aGUgcHRlLCBqdXN0IGluIGNhc2UKKwkgKiBpdCdzIGFsbG9jYXRlZCBhbHJlYWR5LgorCSAqLworI2lmbmRlZiBDT05GSUdfSElHSFBURQorCWlmIChwYWdlICYgMSkgeworCQlwYWdlICY9IFBBR0VfTUFTSzsKKwkJYWRkcmVzcyAmPSAweDAwM2ZmMDAwOworCQlwYWdlID0gKCh1bnNpZ25lZCBsb25nICopIF9fdmEocGFnZSkpW2FkZHJlc3MgPj4gUEFHRV9TSElGVF07CisJCXByaW50ayhLRVJOX0FMRVJUICIqcHRlID0gJTA4bHhcbiIsIHBhZ2UpOworCX0KKyNlbmRpZgorCWRpZSgiT29wcyIsIHJlZ3MsIGVycm9yX2NvZGUpOworCWJ1c3Rfc3BpbmxvY2tzKDApOworCWRvX2V4aXQoU0lHS0lMTCk7CisKKy8qCisgKiBXZSByYW4gb3V0IG9mIG1lbW9yeSwgb3Igc29tZSBvdGhlciB0aGluZyBoYXBwZW5lZCB0byB1cyB0aGF0IG1hZGUKKyAqIHVzIHVuYWJsZSB0byBoYW5kbGUgdGhlIHBhZ2UgZmF1bHQgZ3JhY2VmdWxseS4KKyAqLworb3V0X29mX21lbW9yeToKKwl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOworCWlmICh0c2stPnBpZCA9PSAxKSB7CisJCXlpZWxkKCk7CisJCWRvd25fcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwkJZ290byBzdXJ2aXZlOworCX0KKwlwcmludGsoIlZNOiBraWxsaW5nIHByb2Nlc3MgJXNcbiIsIHRzay0+Y29tbSk7CisJaWYgKGVycm9yX2NvZGUgJiA0KQorCQlkb19leGl0KFNJR0tJTEwpOworCWdvdG8gbm9fY29udGV4dDsKKworZG9fc2lnYnVzOgorCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisKKwkvKiBLZXJuZWwgbW9kZT8gSGFuZGxlIGV4Y2VwdGlvbnMgb3IgZGllICovCisJaWYgKCEoZXJyb3JfY29kZSAmIDQpKQorCQlnb3RvIG5vX2NvbnRleHQ7CisKKwkvKiBVc2VyIHNwYWNlID0+IG9rIHRvIGRvIGFub3RoZXIgcGFnZSBmYXVsdCAqLworCWlmIChpc19wcmVmZXRjaChyZWdzLCBhZGRyZXNzLCBlcnJvcl9jb2RlKSkKKwkJcmV0dXJuOworCisJdHNrLT50aHJlYWQuY3IyID0gYWRkcmVzczsKKwl0c2stPnRocmVhZC5lcnJvcl9jb2RlID0gZXJyb3JfY29kZTsKKwl0c2stPnRocmVhZC50cmFwX25vID0gMTQ7CisJaW5mby5zaV9zaWdubyA9IFNJR0JVUzsKKwlpbmZvLnNpX2Vycm5vID0gMDsKKwlpbmZvLnNpX2NvZGUgPSBCVVNfQURSRVJSOworCWluZm8uc2lfYWRkciA9ICh2b2lkIF9fdXNlciAqKWFkZHJlc3M7CisJZm9yY2Vfc2lnX2luZm8oU0lHQlVTLCAmaW5mbywgdHNrKTsKKwlyZXR1cm47CisKK3ZtYWxsb2NfZmF1bHQ6CisJeworCQkvKgorCQkgKiBTeW5jaHJvbml6ZSB0aGlzIHRhc2sncyB0b3AgbGV2ZWwgcGFnZS10YWJsZQorCQkgKiB3aXRoIHRoZSAncmVmZXJlbmNlJyBwYWdlIHRhYmxlLgorCQkgKgorCQkgKiBEbyBfbm90XyB1c2UgInRzayIgaGVyZS4gV2UgbWlnaHQgYmUgaW5zaWRlCisJCSAqIGFuIGludGVycnVwdCBpbiB0aGUgbWlkZGxlIG9mIGEgdGFzayBzd2l0Y2guLgorCQkgKi8KKwkJaW50IGluZGV4ID0gcGdkX2luZGV4KGFkZHJlc3MpOworCQl1bnNpZ25lZCBsb25nIHBnZF9wYWRkcjsKKwkJcGdkX3QgKnBnZCwgKnBnZF9rOworCQlwdWRfdCAqcHVkLCAqcHVkX2s7CisJCXBtZF90ICpwbWQsICpwbWRfazsKKwkJcHRlX3QgKnB0ZV9rOworCisJCWFzbSgibW92bCAlJWNyMywlMCI6Ij1yIiAocGdkX3BhZGRyKSk7CisJCXBnZCA9IGluZGV4ICsgKHBnZF90ICopX192YShwZ2RfcGFkZHIpOworCQlwZ2RfayA9IGluaXRfbW0ucGdkICsgaW5kZXg7CisKKwkJaWYgKCFwZ2RfcHJlc2VudCgqcGdkX2spKQorCQkJZ290byBub19jb250ZXh0OworCisJCS8qCisJCSAqIHNldF9wZ2QocGdkLCAqcGdkX2spOyBoZXJlIHdvdWxkIGJlIHVzZWxlc3Mgb24gUEFFCisJCSAqIGFuZCByZWR1bmRhbnQgd2l0aCB0aGUgc2V0X3BtZCgpIG9uIG5vbi1QQUUuIEFzIHdvdWxkCisJCSAqIHNldF9wdWQuCisJCSAqLworCisJCXB1ZCA9IHB1ZF9vZmZzZXQocGdkLCBhZGRyZXNzKTsKKwkJcHVkX2sgPSBwdWRfb2Zmc2V0KHBnZF9rLCBhZGRyZXNzKTsKKwkJaWYgKCFwdWRfcHJlc2VudCgqcHVkX2spKQorCQkJZ290byBub19jb250ZXh0OworCQkKKwkJcG1kID0gcG1kX29mZnNldChwdWQsIGFkZHJlc3MpOworCQlwbWRfayA9IHBtZF9vZmZzZXQocHVkX2ssIGFkZHJlc3MpOworCQlpZiAoIXBtZF9wcmVzZW50KCpwbWRfaykpCisJCQlnb3RvIG5vX2NvbnRleHQ7CisJCXNldF9wbWQocG1kLCAqcG1kX2spOworCisJCXB0ZV9rID0gcHRlX29mZnNldF9rZXJuZWwocG1kX2ssIGFkZHJlc3MpOworCQlpZiAoIXB0ZV9wcmVzZW50KCpwdGVfaykpCisJCQlnb3RvIG5vX2NvbnRleHQ7CisJCXJldHVybjsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbW0vaGlnaG1lbS5jIGIvYXJjaC9pMzg2L21tL2hpZ2htZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzRjNGNhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21tL2hpZ2htZW0uYwpAQCAtMCwwICsxLDg5IEBACisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorCit2b2lkICprbWFwKHN0cnVjdCBwYWdlICpwYWdlKQoreworCW1pZ2h0X3NsZWVwKCk7CisJaWYgKCFQYWdlSGlnaE1lbShwYWdlKSkKKwkJcmV0dXJuIHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwlyZXR1cm4ga21hcF9oaWdoKHBhZ2UpOworfQorCit2b2lkIGt1bm1hcChzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlpZiAoaW5faW50ZXJydXB0KCkpCisJCUJVRygpOworCWlmICghUGFnZUhpZ2hNZW0ocGFnZSkpCisJCXJldHVybjsKKwlrdW5tYXBfaGlnaChwYWdlKTsKK30KKworLyoKKyAqIGttYXBfYXRvbWljL2t1bm1hcF9hdG9taWMgaXMgc2lnbmlmaWNhbnRseSBmYXN0ZXIgdGhhbiBrbWFwL2t1bm1hcCBiZWNhdXNlCisgKiBubyBnbG9iYWwgbG9jayBpcyBuZWVkZWQgYW5kIGJlY2F1c2UgdGhlIGttYXAgY29kZSBtdXN0IHBlcmZvcm0gYSBnbG9iYWwgVExCCisgKiBpbnZhbGlkYXRpb24gd2hlbiB0aGUga21hcCBwb29sIHdyYXBzLgorICoKKyAqIEhvd2V2ZXIgd2hlbiBob2xkaW5nIGFuIGF0b21pYyBrbWFwIGlzIGlzIG5vdCBsZWdhbCB0byBzbGVlcCwgc28gYXRvbWljCisgKiBrbWFwcyBhcmUgYXBwcm9wcmlhdGUgZm9yIHNob3J0LCB0aWdodCBjb2RlIHBhdGhzIG9ubHkuCisgKi8KK3ZvaWQgKmttYXBfYXRvbWljKHN0cnVjdCBwYWdlICpwYWdlLCBlbnVtIGttX3R5cGUgdHlwZSkKK3sKKwllbnVtIGZpeGVkX2FkZHJlc3NlcyBpZHg7CisJdW5zaWduZWQgbG9uZyB2YWRkcjsKKworCS8qIGV2ZW4gIUNPTkZJR19QUkVFTVBUIG5lZWRzIHRoaXMsIGZvciBpbl9hdG9taWMgaW4gZG9fcGFnZV9mYXVsdCAqLworCWluY19wcmVlbXB0X2NvdW50KCk7CisJaWYgKCFQYWdlSGlnaE1lbShwYWdlKSkKKwkJcmV0dXJuIHBhZ2VfYWRkcmVzcyhwYWdlKTsKKworCWlkeCA9IHR5cGUgKyBLTV9UWVBFX05SKnNtcF9wcm9jZXNzb3JfaWQoKTsKKwl2YWRkciA9IF9fZml4X3RvX3ZpcnQoRklYX0tNQVBfQkVHSU4gKyBpZHgpOworI2lmZGVmIENPTkZJR19ERUJVR19ISUdITUVNCisJaWYgKCFwdGVfbm9uZSgqKGttYXBfcHRlLWlkeCkpKQorCQlCVUcoKTsKKyNlbmRpZgorCXNldF9wdGUoa21hcF9wdGUtaWR4LCBta19wdGUocGFnZSwga21hcF9wcm90KSk7CisJX19mbHVzaF90bGJfb25lKHZhZGRyKTsKKworCXJldHVybiAodm9pZCopIHZhZGRyOworfQorCit2b2lkIGt1bm1hcF9hdG9taWModm9pZCAqa3ZhZGRyLCBlbnVtIGttX3R5cGUgdHlwZSkKK3sKKyNpZmRlZiBDT05GSUdfREVCVUdfSElHSE1FTQorCXVuc2lnbmVkIGxvbmcgdmFkZHIgPSAodW5zaWduZWQgbG9uZykga3ZhZGRyICYgUEFHRV9NQVNLOworCWVudW0gZml4ZWRfYWRkcmVzc2VzIGlkeCA9IHR5cGUgKyBLTV9UWVBFX05SKnNtcF9wcm9jZXNzb3JfaWQoKTsKKworCWlmICh2YWRkciA8IEZJWEFERFJfU1RBUlQpIHsgLy8gRklYTUUKKwkJZGVjX3ByZWVtcHRfY291bnQoKTsKKwkJcHJlZW1wdF9jaGVja19yZXNjaGVkKCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAodmFkZHIgIT0gX19maXhfdG9fdmlydChGSVhfS01BUF9CRUdJTitpZHgpKQorCQlCVUcoKTsKKworCS8qCisJICogZm9yY2Ugb3RoZXIgbWFwcGluZ3MgdG8gT29wcyBpZiB0aGV5J2xsIHRyeSB0byBhY2Nlc3MKKwkgKiB0aGlzIHB0ZSB3aXRob3V0IGZpcnN0IHJlbWFwIGl0CisJICovCisJcHRlX2NsZWFyKCZpbml0X21tLCB2YWRkciwga21hcF9wdGUtaWR4KTsKKwlfX2ZsdXNoX3RsYl9vbmUodmFkZHIpOworI2VuZGlmCisKKwlkZWNfcHJlZW1wdF9jb3VudCgpOworCXByZWVtcHRfY2hlY2tfcmVzY2hlZCgpOworfQorCitzdHJ1Y3QgcGFnZSAqa21hcF9hdG9taWNfdG9fcGFnZSh2b2lkICpwdHIpCit7CisJdW5zaWduZWQgbG9uZyBpZHgsIHZhZGRyID0gKHVuc2lnbmVkIGxvbmcpcHRyOworCXB0ZV90ICpwdGU7CisKKwlpZiAodmFkZHIgPCBGSVhBRERSX1NUQVJUKQorCQlyZXR1cm4gdmlydF90b19wYWdlKHB0cik7CisKKwlpZHggPSB2aXJ0X3RvX2ZpeCh2YWRkcik7CisJcHRlID0ga21hcF9wdGUgLSAoaWR4IC0gRklYX0tNQVBfQkVHSU4pOworCXJldHVybiBwdGVfcGFnZSgqcHRlKTsKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21tL2h1Z2V0bGJwYWdlLmMgYi9hcmNoL2kzODYvbW0vaHVnZXRsYnBhZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGM0NTE0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21tL2h1Z2V0bGJwYWdlLmMKQEAgLTAsMCArMSw0MzEgQEAKKy8qCisgKiBJQS0zMiBIdWdlIFRMQiBQYWdlIFN1cHBvcnQgZm9yIEtlcm5lbC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIFJvaGl0IFNldGggPHJvaGl0LnNldGhAaW50ZWwuY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2h1Z2V0bGIuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisjaW5jbHVkZSA8YXNtL21tYW4uaD4KKyNpbmNsdWRlIDxhc20vdGxiLmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisKK3N0YXRpYyBwdGVfdCAqaHVnZV9wdGVfYWxsb2Moc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlwZ2RfdCAqcGdkOworCXB1ZF90ICpwdWQ7CisJcG1kX3QgKnBtZCA9IE5VTEw7CisKKwlwZ2QgPSBwZ2Rfb2Zmc2V0KG1tLCBhZGRyKTsKKwlwdWQgPSBwdWRfYWxsb2MobW0sIHBnZCwgYWRkcik7CisJcG1kID0gcG1kX2FsbG9jKG1tLCBwdWQsIGFkZHIpOworCXJldHVybiAocHRlX3QgKikgcG1kOworfQorCitzdGF0aWMgcHRlX3QgKmh1Z2VfcHRlX29mZnNldChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyKQoreworCXBnZF90ICpwZ2Q7CisJcHVkX3QgKnB1ZDsKKwlwbWRfdCAqcG1kID0gTlVMTDsKKworCXBnZCA9IHBnZF9vZmZzZXQobW0sIGFkZHIpOworCXB1ZCA9IHB1ZF9vZmZzZXQocGdkLCBhZGRyKTsKKwlwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgYWRkcik7CisJcmV0dXJuIChwdGVfdCAqKSBwbWQ7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9odWdlX3B0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBwYWdlICpwYWdlLCBwdGVfdCAqIHBhZ2VfdGFibGUsIGludCB3cml0ZV9hY2Nlc3MpCit7CisJcHRlX3QgZW50cnk7CisKKwlhZGRfbW1fY291bnRlcihtbSwgcnNzLCBIUEFHRV9TSVpFIC8gUEFHRV9TSVpFKTsKKwlpZiAod3JpdGVfYWNjZXNzKSB7CisJCWVudHJ5ID0KKwkJICAgIHB0ZV9ta3dyaXRlKHB0ZV9ta2RpcnR5KG1rX3B0ZShwYWdlLCB2bWEtPnZtX3BhZ2VfcHJvdCkpKTsKKwl9IGVsc2UKKwkJZW50cnkgPSBwdGVfd3Jwcm90ZWN0KG1rX3B0ZShwYWdlLCB2bWEtPnZtX3BhZ2VfcHJvdCkpOworCWVudHJ5ID0gcHRlX21reW91bmcoZW50cnkpOworCW1rX3B0ZV9odWdlKGVudHJ5KTsKKwlzZXRfcHRlKHBhZ2VfdGFibGUsIGVudHJ5KTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGZvciBwcm9wZXIgYWxpZ25tZW50IG9mIGlucHV0IGFkZHIgYW5kIGxlbiBwYXJhbWV0ZXJzLgorICovCitpbnQgaXNfYWxpZ25lZF9odWdlcGFnZV9yYW5nZSh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCWlmIChsZW4gJiB+SFBBR0VfTUFTSykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGFkZHIgJiB+SFBBR0VfTUFTSykKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7Cit9CisKK2ludCBjb3B5X2h1Z2V0bGJfcGFnZV9yYW5nZShzdHJ1Y3QgbW1fc3RydWN0ICpkc3QsIHN0cnVjdCBtbV9zdHJ1Y3QgKnNyYywKKwkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXB0ZV90ICpzcmNfcHRlLCAqZHN0X3B0ZSwgZW50cnk7CisJc3RydWN0IHBhZ2UgKnB0ZXBhZ2U7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gdm1hLT52bV9zdGFydDsKKwl1bnNpZ25lZCBsb25nIGVuZCA9IHZtYS0+dm1fZW5kOworCisJd2hpbGUgKGFkZHIgPCBlbmQpIHsKKwkJZHN0X3B0ZSA9IGh1Z2VfcHRlX2FsbG9jKGRzdCwgYWRkcik7CisJCWlmICghZHN0X3B0ZSkKKwkJCWdvdG8gbm9tZW07CisJCXNyY19wdGUgPSBodWdlX3B0ZV9vZmZzZXQoc3JjLCBhZGRyKTsKKwkJZW50cnkgPSAqc3JjX3B0ZTsKKwkJcHRlcGFnZSA9IHB0ZV9wYWdlKGVudHJ5KTsKKwkJZ2V0X3BhZ2UocHRlcGFnZSk7CisJCXNldF9wdGUoZHN0X3B0ZSwgZW50cnkpOworCQlhZGRfbW1fY291bnRlcihkc3QsIHJzcywgSFBBR0VfU0laRSAvIFBBR0VfU0laRSk7CisJCWFkZHIgKz0gSFBBR0VfU0laRTsKKwl9CisJcmV0dXJuIDA7CisKK25vbWVtOgorCXJldHVybiAtRU5PTUVNOworfQorCitpbnQKK2ZvbGxvd19odWdldGxiX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkgICAgc3RydWN0IHBhZ2UgKipwYWdlcywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICoqdm1hcywKKwkJICAgIHVuc2lnbmVkIGxvbmcgKnBvc2l0aW9uLCBpbnQgKmxlbmd0aCwgaW50IGkpCit7CisJdW5zaWduZWQgbG9uZyB2cGZuLCB2YWRkciA9ICpwb3NpdGlvbjsKKwlpbnQgcmVtYWluZGVyID0gKmxlbmd0aDsKKworCVdBUk5fT04oIWlzX3ZtX2h1Z2V0bGJfcGFnZSh2bWEpKTsKKworCXZwZm4gPSB2YWRkci9QQUdFX1NJWkU7CisJd2hpbGUgKHZhZGRyIDwgdm1hLT52bV9lbmQgJiYgcmVtYWluZGVyKSB7CisKKwkJaWYgKHBhZ2VzKSB7CisJCQlwdGVfdCAqcHRlOworCQkJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwkJCXB0ZSA9IGh1Z2VfcHRlX29mZnNldChtbSwgdmFkZHIpOworCisJCQkvKiBodWdldGxiIHNob3VsZCBiZSBsb2NrZWQsIGFuZCBoZW5jZSwgcHJlZmF1bHRlZCAqLworCQkJV0FSTl9PTighcHRlIHx8IHB0ZV9ub25lKCpwdGUpKTsKKworCQkJcGFnZSA9ICZwdGVfcGFnZSgqcHRlKVt2cGZuICUgKEhQQUdFX1NJWkUvUEFHRV9TSVpFKV07CisKKwkJCVdBUk5fT04oIVBhZ2VDb21wb3VuZChwYWdlKSk7CisKKwkJCWdldF9wYWdlKHBhZ2UpOworCQkJcGFnZXNbaV0gPSBwYWdlOworCQl9CisKKwkJaWYgKHZtYXMpCisJCQl2bWFzW2ldID0gdm1hOworCisJCXZhZGRyICs9IFBBR0VfU0laRTsKKwkJKyt2cGZuOworCQktLXJlbWFpbmRlcjsKKwkJKytpOworCX0KKworCSpsZW5ndGggPSByZW1haW5kZXI7CisJKnBvc2l0aW9uID0gdmFkZHI7CisKKwlyZXR1cm4gaTsKK30KKworI2lmIDAJLyogVGhpcyBpcyBqdXN0IGZvciB0ZXN0aW5nICovCitzdHJ1Y3QgcGFnZSAqCitmb2xsb3dfaHVnZV9hZGRyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIGludCB3cml0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gYWRkcmVzczsKKwlpbnQgbGVuZ3RoID0gMTsKKwlpbnQgbnI7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisKKwl2bWEgPSBmaW5kX3ZtYShtbSwgYWRkcik7CisJaWYgKCF2bWEgfHwgIWlzX3ZtX2h1Z2V0bGJfcGFnZSh2bWEpKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCXB0ZSA9IGh1Z2VfcHRlX29mZnNldChtbSwgYWRkcmVzcyk7CisKKwkvKiBodWdldGxiIHNob3VsZCBiZSBsb2NrZWQsIGFuZCBoZW5jZSwgcHJlZmF1bHRlZCAqLworCVdBUk5fT04oIXB0ZSB8fCBwdGVfbm9uZSgqcHRlKSk7CisKKwlwYWdlID0gJnB0ZV9wYWdlKCpwdGUpW3ZwZm4gJSAoSFBBR0VfU0laRS9QQUdFX1NJWkUpXTsKKworCVdBUk5fT04oIVBhZ2VDb21wb3VuZChwYWdlKSk7CisKKwlyZXR1cm4gcGFnZTsKK30KKworaW50IHBtZF9odWdlKHBtZF90IHBtZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHBhZ2UgKgorZm9sbG93X2h1Z2VfcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCisJCXBtZF90ICpwbWQsIGludCB3cml0ZSkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKworI2Vsc2UKKworc3RydWN0IHBhZ2UgKgorZm9sbG93X2h1Z2VfYWRkcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBpbnQgd3JpdGUpCit7CisJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Cit9CisKK2ludCBwbWRfaHVnZShwbWRfdCBwbWQpCit7CisJcmV0dXJuICEhKHBtZF92YWwocG1kKSAmIF9QQUdFX1BTRSk7Cit9CisKK3N0cnVjdCBwYWdlICoKK2ZvbGxvd19odWdlX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAorCQlwbWRfdCAqcG1kLCBpbnQgd3JpdGUpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlwYWdlID0gcHRlX3BhZ2UoKihwdGVfdCAqKXBtZCk7CisJaWYgKHBhZ2UpCisJCXBhZ2UgKz0gKChhZGRyZXNzICYgfkhQQUdFX01BU0spID4+IFBBR0VfU0hJRlQpOworCXJldHVybiBwYWdlOworfQorI2VuZGlmCisKK3ZvaWQgdW5tYXBfaHVnZXBhZ2VfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCXVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLT52bV9tbTsKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CisJcHRlX3QgcHRlLCAqcHRlcDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCUJVR19PTihzdGFydCAmIChIUEFHRV9TSVpFIC0gMSkpOworCUJVR19PTihlbmQgJiAoSFBBR0VfU0laRSAtIDEpKTsKKworCWZvciAoYWRkcmVzcyA9IHN0YXJ0OyBhZGRyZXNzIDwgZW5kOyBhZGRyZXNzICs9IEhQQUdFX1NJWkUpIHsKKwkJcHRlcCA9IGh1Z2VfcHRlX29mZnNldChtbSwgYWRkcmVzcyk7CisJCWlmICghcHRlcCkKKwkJCWNvbnRpbnVlOworCQlwdGUgPSBwdGVwX2dldF9hbmRfY2xlYXIobW0sIGFkZHJlc3MsIHB0ZXApOworCQlpZiAocHRlX25vbmUocHRlKSkKKwkJCWNvbnRpbnVlOworCQlwYWdlID0gcHRlX3BhZ2UocHRlKTsKKwkJcHV0X3BhZ2UocGFnZSk7CisJfQorCWFkZF9tbV9jb3VudGVyKG1tICxyc3MsIC0oKGVuZCAtIHN0YXJ0KSA+PiBQQUdFX1NISUZUKSk7CisJZmx1c2hfdGxiX3JhbmdlKHZtYSwgc3RhcnQsIGVuZCk7Cit9CisKK2ludCBodWdldGxiX3ByZWZhdWx0KHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwlpbnQgcmV0ID0gMDsKKworCUJVR19PTih2bWEtPnZtX3N0YXJ0ICYgfkhQQUdFX01BU0spOworCUJVR19PTih2bWEtPnZtX2VuZCAmIH5IUEFHRV9NQVNLKTsKKworCXNwaW5fbG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CisJZm9yIChhZGRyID0gdm1hLT52bV9zdGFydDsgYWRkciA8IHZtYS0+dm1fZW5kOyBhZGRyICs9IEhQQUdFX1NJWkUpIHsKKwkJdW5zaWduZWQgbG9uZyBpZHg7CisJCXB0ZV90ICpwdGUgPSBodWdlX3B0ZV9hbGxvYyhtbSwgYWRkcik7CisJCXN0cnVjdCBwYWdlICpwYWdlOworCisJCWlmICghcHRlKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoIXB0ZV9ub25lKCpwdGUpKSB7CisJCQlwbWRfdCAqcG1kID0gKHBtZF90ICopIHB0ZTsKKworCQkJcGFnZSA9IHBtZF9wYWdlKCpwbWQpOworCQkJcG1kX2NsZWFyKHBtZCk7CisJCQltbS0+bnJfcHRlcy0tOworCQkJZGVjX3BhZ2Vfc3RhdGUobnJfcGFnZV90YWJsZV9wYWdlcyk7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCX0KKworCQlpZHggPSAoKGFkZHIgLSB2bWEtPnZtX3N0YXJ0KSA+PiBIUEFHRV9TSElGVCkKKwkJCSsgKHZtYS0+dm1fcGdvZmYgPj4gKEhQQUdFX1NISUZUIC0gUEFHRV9TSElGVCkpOworCQlwYWdlID0gZmluZF9nZXRfcGFnZShtYXBwaW5nLCBpZHgpOworCQlpZiAoIXBhZ2UpIHsKKwkJCS8qIGNoYXJnZSB0aGUgZnMgcXVvdGEgZmlyc3QgKi8KKwkJCWlmIChodWdldGxiX2dldF9xdW90YShtYXBwaW5nKSkgeworCQkJCXJldCA9IC1FTk9NRU07CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlwYWdlID0gYWxsb2NfaHVnZV9wYWdlKCk7CisJCQlpZiAoIXBhZ2UpIHsKKwkJCQlodWdldGxiX3B1dF9xdW90YShtYXBwaW5nKTsKKwkJCQlyZXQgPSAtRU5PTUVNOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJcmV0ID0gYWRkX3RvX3BhZ2VfY2FjaGUocGFnZSwgbWFwcGluZywgaWR4LCBHRlBfQVRPTUlDKTsKKwkJCWlmICghIHJldCkgeworCQkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJfSBlbHNlIHsKKwkJCQlodWdldGxiX3B1dF9xdW90YShtYXBwaW5nKTsKKwkJCQlmcmVlX2h1Z2VfcGFnZShwYWdlKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQlzZXRfaHVnZV9wdGUobW0sIHZtYSwgcGFnZSwgcHRlLCB2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpOworCX0KK291dDoKKwlzcGluX3VubG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworLyogeDg2XzY0IGFsc28gdXNlcyB0aGlzIGZpbGUgKi8KKworI2lmZGVmIEhBVkVfQVJDSF9IVUdFVExCX1VOTUFQUEVEX0FSRUEKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGh1Z2V0bGJfZ2V0X3VubWFwcGVkX2FyZWFfYm90dG9tdXAoc3RydWN0IGZpbGUgKmZpbGUsCisJCXVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCisJCXVuc2lnbmVkIGxvbmcgcGdvZmYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHI7CisKKwlzdGFydF9hZGRyID0gbW0tPmZyZWVfYXJlYV9jYWNoZTsKKworZnVsbF9zZWFyY2g6CisJYWRkciA9IEFMSUdOKHN0YXJ0X2FkZHIsIEhQQUdFX1NJWkUpOworCisJZm9yICh2bWEgPSBmaW5kX3ZtYShtbSwgYWRkcik7IDsgdm1hID0gdm1hLT52bV9uZXh0KSB7CisJCS8qIEF0IHRoaXMgcG9pbnQ6ICAoIXZtYSB8fCBhZGRyIDwgdm1hLT52bV9lbmQpLiAqLworCQlpZiAoVEFTS19TSVpFIC0gbGVuIDwgYWRkcikgeworCQkJLyoKKwkJCSAqIFN0YXJ0IGEgbmV3IHNlYXJjaCAtIGp1c3QgaW4gY2FzZSB3ZSBtaXNzZWQKKwkJCSAqIHNvbWUgaG9sZXMuCisJCQkgKi8KKwkJCWlmIChzdGFydF9hZGRyICE9IFRBU0tfVU5NQVBQRURfQkFTRSkgeworCQkJCXN0YXJ0X2FkZHIgPSBUQVNLX1VOTUFQUEVEX0JBU0U7CisJCQkJZ290byBmdWxsX3NlYXJjaDsKKwkJCX0KKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWlmICghdm1hIHx8IGFkZHIgKyBsZW4gPD0gdm1hLT52bV9zdGFydCkgeworCQkJbW0tPmZyZWVfYXJlYV9jYWNoZSA9IGFkZHIgKyBsZW47CisJCQlyZXR1cm4gYWRkcjsKKwkJfQorCQlhZGRyID0gQUxJR04odm1hLT52bV9lbmQsIEhQQUdFX1NJWkUpOworCX0KK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaHVnZXRsYl9nZXRfdW5tYXBwZWRfYXJlYV90b3Bkb3duKHN0cnVjdCBmaWxlICpmaWxlLAorCQl1bnNpZ25lZCBsb25nIGFkZHIwLCB1bnNpZ25lZCBsb25nIGxlbiwKKwkJdW5zaWduZWQgbG9uZyBwZ29mZiwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCAqcHJldl92bWE7CisJdW5zaWduZWQgbG9uZyBiYXNlID0gbW0tPm1tYXBfYmFzZSwgYWRkciA9IGFkZHIwOworCWludCBmaXJzdF90aW1lID0gMTsKKworCS8qIGRvbid0IGFsbG93IGFsbG9jYXRpb25zIGFib3ZlIGN1cnJlbnQgYmFzZSAqLworCWlmIChtbS0+ZnJlZV9hcmVhX2NhY2hlID4gYmFzZSkKKwkJbW0tPmZyZWVfYXJlYV9jYWNoZSA9IGJhc2U7CisKK3RyeV9hZ2FpbjoKKwkvKiBtYWtlIHN1cmUgaXQgY2FuIGZpdCBpbiB0aGUgcmVtYWluaW5nIGFkZHJlc3Mgc3BhY2UgKi8KKwlpZiAobW0tPmZyZWVfYXJlYV9jYWNoZSA8IGxlbikKKwkJZ290byBmYWlsOworCisJLyogZWl0aGVyIG5vIGFkZHJlc3MgcmVxdWVzdGVkIG9yIGNhbnQgZml0IGluIHJlcXVlc3RlZCBhZGRyZXNzIGhvbGUgKi8KKwlhZGRyID0gKG1tLT5mcmVlX2FyZWFfY2FjaGUgLSBsZW4pICYgSFBBR0VfTUFTSzsKKwlkbyB7CisJCS8qCisJCSAqIExvb2t1cCBmYWlsdXJlIG1lYW5zIG5vIHZtYSBpcyBhYm92ZSB0aGlzIGFkZHJlc3MsCisJCSAqIGkuZS4gcmV0dXJuIHdpdGggc3VjY2VzczoKKwkJICovCisJCWlmICghKHZtYSA9IGZpbmRfdm1hX3ByZXYobW0sIGFkZHIsICZwcmV2X3ZtYSkpKQorCQkJcmV0dXJuIGFkZHI7CisKKwkJLyoKKwkJICogbmV3IHJlZ2lvbiBmaXRzIGJldHdlZW4gcHJldl92bWEtPnZtX2VuZCBhbmQKKwkJICogdm1hLT52bV9zdGFydCwgdXNlIGl0OgorCQkgKi8KKwkJaWYgKGFkZHIgKyBsZW4gPD0gdm1hLT52bV9zdGFydCAmJgorCQkJCSghcHJldl92bWEgfHwgKGFkZHIgPj0gcHJldl92bWEtPnZtX2VuZCkpKQorCQkJLyogcmVtZW1iZXIgdGhlIGFkZHJlc3MgYXMgYSBoaW50IGZvciBuZXh0IHRpbWUgKi8KKwkJCXJldHVybiAobW0tPmZyZWVfYXJlYV9jYWNoZSA9IGFkZHIpOworCQllbHNlCisJCQkvKiBwdWxsIGZyZWVfYXJlYV9jYWNoZSBkb3duIHRvIHRoZSBmaXJzdCBob2xlICovCisJCQlpZiAobW0tPmZyZWVfYXJlYV9jYWNoZSA9PSB2bWEtPnZtX2VuZCkKKwkJCQltbS0+ZnJlZV9hcmVhX2NhY2hlID0gdm1hLT52bV9zdGFydDsKKworCQkvKiB0cnkganVzdCBiZWxvdyB0aGUgY3VycmVudCB2bWEtPnZtX3N0YXJ0ICovCisJCWFkZHIgPSAodm1hLT52bV9zdGFydCAtIGxlbikgJiBIUEFHRV9NQVNLOworCX0gd2hpbGUgKGxlbiA8PSB2bWEtPnZtX3N0YXJ0KTsKKworZmFpbDoKKwkvKgorCSAqIGlmIGhpbnQgbGVmdCB1cyB3aXRoIG5vIHNwYWNlIGZvciB0aGUgcmVxdWVzdGVkCisJICogbWFwcGluZyB0aGVuIHRyeSBhZ2FpbjoKKwkgKi8KKwlpZiAoZmlyc3RfdGltZSkgeworCQltbS0+ZnJlZV9hcmVhX2NhY2hlID0gYmFzZTsKKwkJZmlyc3RfdGltZSA9IDA7CisJCWdvdG8gdHJ5X2FnYWluOworCX0KKwkvKgorCSAqIEEgZmFpbGVkIG1tYXAoKSB2ZXJ5IGxpa2VseSBjYXVzZXMgYXBwbGljYXRpb24gZmFpbHVyZSwKKwkgKiBzbyBmYWxsIGJhY2sgdG8gdGhlIGJvdHRvbS11cCBmdW5jdGlvbiBoZXJlLiBUaGlzIHNjZW5hcmlvCisJICogY2FuIGhhcHBlbiB3aXRoIGxhcmdlIHN0YWNrIGxpbWl0cyBhbmQgbGFyZ2UgbW1hcCgpCisJICogYWxsb2NhdGlvbnMuCisJICovCisJbW0tPmZyZWVfYXJlYV9jYWNoZSA9IFRBU0tfVU5NQVBQRURfQkFTRTsKKwlhZGRyID0gaHVnZXRsYl9nZXRfdW5tYXBwZWRfYXJlYV9ib3R0b211cChmaWxlLCBhZGRyMCwKKwkJCWxlbiwgcGdvZmYsIGZsYWdzKTsKKworCS8qCisJICogUmVzdG9yZSB0aGUgdG9wZG93biBiYXNlOgorCSAqLworCW1tLT5mcmVlX2FyZWFfY2FjaGUgPSBiYXNlOworCisJcmV0dXJuIGFkZHI7Cit9CisKK3Vuc2lnbmVkIGxvbmcKK2h1Z2V0bGJfZ2V0X3VubWFwcGVkX2FyZWEoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgcGdvZmYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKworCWlmIChsZW4gJiB+SFBBR0VfTUFTSykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGxlbiA+IFRBU0tfU0laRSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoYWRkcikgeworCQlhZGRyID0gQUxJR04oYWRkciwgSFBBR0VfU0laRSk7CisJCXZtYSA9IGZpbmRfdm1hKG1tLCBhZGRyKTsKKwkJaWYgKFRBU0tfU0laRSAtIGxlbiA+PSBhZGRyICYmCisJCSAgICAoIXZtYSB8fCBhZGRyICsgbGVuIDw9IHZtYS0+dm1fc3RhcnQpKQorCQkJcmV0dXJuIGFkZHI7CisJfQorCWlmIChtbS0+Z2V0X3VubWFwcGVkX2FyZWEgPT0gYXJjaF9nZXRfdW5tYXBwZWRfYXJlYSkKKwkJcmV0dXJuIGh1Z2V0bGJfZ2V0X3VubWFwcGVkX2FyZWFfYm90dG9tdXAoZmlsZSwgYWRkciwgbGVuLAorCQkJCXBnb2ZmLCBmbGFncyk7CisJZWxzZQorCQlyZXR1cm4gaHVnZXRsYl9nZXRfdW5tYXBwZWRfYXJlYV90b3Bkb3duKGZpbGUsIGFkZHIsIGxlbiwKKwkJCQlwZ29mZiwgZmxhZ3MpOworfQorCisjZW5kaWYgLypIQVZFX0FSQ0hfSFVHRVRMQl9VTk1BUFBFRF9BUkVBKi8KKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21tL2luaXQuYyBiL2FyY2gvaTM4Ni9tbS9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E3ZWEzNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tbS9pbml0LmMKQEAgLTAsMCArMSw2OTYgQEAKKy8qCisgKiAgbGludXgvYXJjaC9pMzg2L21tL2luaXQuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUgIExpbnVzIFRvcnZhbGRzCisgKgorICogIFN1cHBvcnQgb2YgQklHTUVNIGFkZGVkIGJ5IEdlcmhhcmQgV2ljaGVydCwgU2llbWVucyBBRywgSnVseSAxOTk5CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2h1Z2V0bGIuaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZWZpLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgorI2luY2x1ZGUgPGFzbS9lODIwLmg+CisjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKyNpbmNsdWRlIDxhc20vdGxiLmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CisKK3Vuc2lnbmVkIGludCBfX1ZNQUxMT0NfUkVTRVJWRSA9IDEyOCA8PCAyMDsKKworREVGSU5FX1BFUl9DUFUoc3RydWN0IG1tdV9nYXRoZXIsIG1tdV9nYXRoZXJzKTsKK3Vuc2lnbmVkIGxvbmcgaGlnaHN0YXJ0X3BmbiwgaGlnaGVuZF9wZm47CisKK3N0YXRpYyBpbnQgbm9pbmxpbmUgZG9fdGVzdF93cF9iaXQodm9pZCk7CisKKy8qCisgKiBDcmVhdGVzIGEgbWlkZGxlIHBhZ2UgdGFibGUgYW5kIHB1dHMgYSBwb2ludGVyIHRvIGl0IGluIHRoZQorICogZ2l2ZW4gZ2xvYmFsIGRpcmVjdG9yeSBlbnRyeS4gVGhpcyBvbmx5IHJldHVybnMgdGhlIGdkIGVudHJ5CisgKiBpbiBub24tUEFFIGNvbXBpbGF0aW9uIG1vZGUsIHNpbmNlIHRoZSBtaWRkbGUgbGF5ZXIgaXMgZm9sZGVkLgorICovCitzdGF0aWMgcG1kX3QgKiBfX2luaXQgb25lX21kX3RhYmxlX2luaXQocGdkX3QgKnBnZCkKK3sKKwlwdWRfdCAqcHVkOworCXBtZF90ICpwbWRfdGFibGU7CisJCQorI2lmZGVmIENPTkZJR19YODZfUEFFCisJcG1kX3RhYmxlID0gKHBtZF90ICopIGFsbG9jX2Jvb3RtZW1fbG93X3BhZ2VzKFBBR0VfU0laRSk7CisJc2V0X3BnZChwZ2QsIF9fcGdkKF9fcGEocG1kX3RhYmxlKSB8IF9QQUdFX1BSRVNFTlQpKTsKKwlwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgMCk7CisJaWYgKHBtZF90YWJsZSAhPSBwbWRfb2Zmc2V0KHB1ZCwgMCkpIAorCQlCVUcoKTsKKyNlbHNlCisJcHVkID0gcHVkX29mZnNldChwZ2QsIDApOworCXBtZF90YWJsZSA9IHBtZF9vZmZzZXQocHVkLCAwKTsKKyNlbmRpZgorCisJcmV0dXJuIHBtZF90YWJsZTsKK30KKworLyoKKyAqIENyZWF0ZSBhIHBhZ2UgdGFibGUgYW5kIHBsYWNlIGEgcG9pbnRlciB0byBpdCBpbiBhIG1pZGRsZSBwYWdlCisgKiBkaXJlY3RvcnkgZW50cnkuCisgKi8KK3N0YXRpYyBwdGVfdCAqIF9faW5pdCBvbmVfcGFnZV90YWJsZV9pbml0KHBtZF90ICpwbWQpCit7CisJaWYgKHBtZF9ub25lKCpwbWQpKSB7CisJCXB0ZV90ICpwYWdlX3RhYmxlID0gKHB0ZV90ICopIGFsbG9jX2Jvb3RtZW1fbG93X3BhZ2VzKFBBR0VfU0laRSk7CisJCXNldF9wbWQocG1kLCBfX3BtZChfX3BhKHBhZ2VfdGFibGUpIHwgX1BBR0VfVEFCTEUpKTsKKwkJaWYgKHBhZ2VfdGFibGUgIT0gcHRlX29mZnNldF9rZXJuZWwocG1kLCAwKSkKKwkJCUJVRygpOwkKKworCQlyZXR1cm4gcGFnZV90YWJsZTsKKwl9CisJCisJcmV0dXJuIHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwgMCk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIGEgY2VydGFpbiByYW5nZSBvZiBrZXJuZWwgdmlydHVhbCBtZW1vcnkgCisgKiB3aXRoIG5ldyBib290bWVtIHBhZ2UgdGFibGVzLCBldmVyeXdoZXJlIHBhZ2UgdGFibGVzIGFyZSBtaXNzaW5nIGluCisgKiB0aGUgZ2l2ZW4gcmFuZ2UuCisgKi8KKworLyoKKyAqIE5PVEU6IFRoZSBwYWdldGFibGVzIGFyZSBhbGxvY2F0ZWQgY29udGlndW91cyBvbiB0aGUgcGh5c2ljYWwgc3BhY2UgCisgKiBzbyB3ZSBjYW4gY2FjaGUgdGhlIHBsYWNlIG9mIHRoZSBmaXJzdCBvbmUgYW5kIG1vdmUgYXJvdW5kIHdpdGhvdXQgCisgKiBjaGVja2luZyB0aGUgcGdkIGV2ZXJ5IHRpbWUuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBwYWdlX3RhYmxlX3JhbmdlX2luaXQgKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLCBwZ2RfdCAqcGdkX2Jhc2UpCit7CisJcGdkX3QgKnBnZDsKKwlwdWRfdCAqcHVkOworCXBtZF90ICpwbWQ7CisJaW50IHBnZF9pZHgsIHBtZF9pZHg7CisJdW5zaWduZWQgbG9uZyB2YWRkcjsKKworCXZhZGRyID0gc3RhcnQ7CisJcGdkX2lkeCA9IHBnZF9pbmRleCh2YWRkcik7CisJcG1kX2lkeCA9IHBtZF9pbmRleCh2YWRkcik7CisJcGdkID0gcGdkX2Jhc2UgKyBwZ2RfaWR4OworCisJZm9yICggOyAocGdkX2lkeCA8IFBUUlNfUEVSX1BHRCkgJiYgKHZhZGRyICE9IGVuZCk7IHBnZCsrLCBwZ2RfaWR4KyspIHsKKwkJaWYgKHBnZF9ub25lKCpwZ2QpKSAKKwkJCW9uZV9tZF90YWJsZV9pbml0KHBnZCk7CisJCXB1ZCA9IHB1ZF9vZmZzZXQocGdkLCB2YWRkcik7CisJCXBtZCA9IHBtZF9vZmZzZXQocHVkLCB2YWRkcik7CisJCWZvciAoOyAocG1kX2lkeCA8IFBUUlNfUEVSX1BNRCkgJiYgKHZhZGRyICE9IGVuZCk7IHBtZCsrLCBwbWRfaWR4KyspIHsKKwkJCWlmIChwbWRfbm9uZSgqcG1kKSkgCisJCQkJb25lX3BhZ2VfdGFibGVfaW5pdChwbWQpOworCisJCQl2YWRkciArPSBQTURfU0laRTsKKwkJfQorCQlwbWRfaWR4ID0gMDsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2tlcm5lbF90ZXh0KHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlpZiAoYWRkciA+PSBQQUdFX09GRlNFVCAmJiBhZGRyIDw9ICh1bnNpZ25lZCBsb25nKV9faW5pdF9lbmQpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBtYXBzIHRoZSBwaHlzaWNhbCBtZW1vcnkgdG8ga2VybmVsIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSwgYSB0b3RhbCAKKyAqIG9mIG1heF9sb3dfcGZuIHBhZ2VzLCBieSBjcmVhdGluZyBwYWdlIHRhYmxlcyBzdGFydGluZyBmcm9tIGFkZHJlc3MgCisgKiBQQUdFX09GRlNFVC4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IGtlcm5lbF9waHlzaWNhbF9tYXBwaW5nX2luaXQocGdkX3QgKnBnZF9iYXNlKQoreworCXVuc2lnbmVkIGxvbmcgcGZuOworCXBnZF90ICpwZ2Q7CisJcG1kX3QgKnBtZDsKKwlwdGVfdCAqcHRlOworCWludCBwZ2RfaWR4LCBwbWRfaWR4LCBwdGVfb2ZzOworCisJcGdkX2lkeCA9IHBnZF9pbmRleChQQUdFX09GRlNFVCk7CisJcGdkID0gcGdkX2Jhc2UgKyBwZ2RfaWR4OworCXBmbiA9IDA7CisKKwlmb3IgKDsgcGdkX2lkeCA8IFBUUlNfUEVSX1BHRDsgcGdkKyssIHBnZF9pZHgrKykgeworCQlwbWQgPSBvbmVfbWRfdGFibGVfaW5pdChwZ2QpOworCQlpZiAocGZuID49IG1heF9sb3dfcGZuKQorCQkJY29udGludWU7CisJCWZvciAocG1kX2lkeCA9IDA7IHBtZF9pZHggPCBQVFJTX1BFUl9QTUQgJiYgcGZuIDwgbWF4X2xvd19wZm47IHBtZCsrLCBwbWRfaWR4KyspIHsKKwkJCXVuc2lnbmVkIGludCBhZGRyZXNzID0gcGZuICogUEFHRV9TSVpFICsgUEFHRV9PRkZTRVQ7CisKKwkJCS8qIE1hcCB3aXRoIGJpZyBwYWdlcyBpZiBwb3NzaWJsZSwgb3RoZXJ3aXNlIGNyZWF0ZSBub3JtYWwgcGFnZSB0YWJsZXMuICovCisJCQlpZiAoY3B1X2hhc19wc2UpIHsKKwkJCQl1bnNpZ25lZCBpbnQgYWRkcmVzczIgPSAocGZuICsgUFRSU19QRVJfUFRFIC0gMSkgKiBQQUdFX1NJWkUgKyBQQUdFX09GRlNFVCArIFBBR0VfU0laRS0xOworCisJCQkJaWYgKGlzX2tlcm5lbF90ZXh0KGFkZHJlc3MpIHx8IGlzX2tlcm5lbF90ZXh0KGFkZHJlc3MyKSkKKwkJCQkJc2V0X3BtZChwbWQsIHBmbl9wbWQocGZuLCBQQUdFX0tFUk5FTF9MQVJHRV9FWEVDKSk7CisJCQkJZWxzZQorCQkJCQlzZXRfcG1kKHBtZCwgcGZuX3BtZChwZm4sIFBBR0VfS0VSTkVMX0xBUkdFKSk7CisJCQkJcGZuICs9IFBUUlNfUEVSX1BURTsKKwkJCX0gZWxzZSB7CisJCQkJcHRlID0gb25lX3BhZ2VfdGFibGVfaW5pdChwbWQpOworCisJCQkJZm9yIChwdGVfb2ZzID0gMDsgcHRlX29mcyA8IFBUUlNfUEVSX1BURSAmJiBwZm4gPCBtYXhfbG93X3BmbjsgcHRlKyssIHBmbisrLCBwdGVfb2ZzKyspIHsKKwkJCQkJCWlmIChpc19rZXJuZWxfdGV4dChhZGRyZXNzKSkKKwkJCQkJCQlzZXRfcHRlKHB0ZSwgcGZuX3B0ZShwZm4sIFBBR0VfS0VSTkVMX0VYRUMpKTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlzZXRfcHRlKHB0ZSwgcGZuX3B0ZShwZm4sIFBBR0VfS0VSTkVMKSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCBwYWdlX2tpbGxzX3Bwcm8odW5zaWduZWQgbG9uZyBwYWdlbnIpCit7CisJaWYgKHBhZ2VuciA+PSAweDcwMDAwICYmIHBhZ2VuciA8PSAweDcwMDNGKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworZXh0ZXJuIGludCBpc19hdmFpbGFibGVfbWVtb3J5KGVmaV9tZW1vcnlfZGVzY190ICopOworCitzdGF0aWMgaW5saW5lIGludCBwYWdlX2lzX3JhbSh1bnNpZ25lZCBsb25nIHBhZ2VucikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGFkZHIsIGVuZDsKKworCWlmIChlZmlfZW5hYmxlZCkgeworCQllZmlfbWVtb3J5X2Rlc2NfdCAqbWQ7CisKKwkJZm9yIChpID0gMDsgaSA8IG1lbW1hcC5ucl9tYXA7IGkrKykgeworCQkJbWQgPSAmbWVtbWFwLm1hcFtpXTsKKwkJCWlmICghaXNfYXZhaWxhYmxlX21lbW9yeShtZCkpCisJCQkJY29udGludWU7CisJCQlhZGRyID0gKG1kLT5waHlzX2FkZHIrUEFHRV9TSVpFLTEpID4+IFBBR0VfU0hJRlQ7CisJCQllbmQgPSAobWQtPnBoeXNfYWRkciArIChtZC0+bnVtX3BhZ2VzIDw8IEVGSV9QQUdFX1NISUZUKSkgPj4gUEFHRV9TSElGVDsKKworCQkJaWYgKChwYWdlbnIgPj0gYWRkcikgJiYgKHBhZ2VuciA8IGVuZCkpCisJCQkJcmV0dXJuIDE7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGU4MjAubnJfbWFwOyBpKyspIHsKKworCQlpZiAoZTgyMC5tYXBbaV0udHlwZSAhPSBFODIwX1JBTSkJLyogbm90IHVzYWJsZSBtZW1vcnkgKi8KKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKgkhISFGSVhNRSEhISBTb21lIEJJT1NlbiByZXBvcnQgYXJlYXMgYXMgUkFNIHRoYXQKKwkJICoJYXJlIG5vdC4gTm90YWJseSB0aGUgNjQwLT4xTWIgYXJlYS4gV2UgbmVlZCBhIHNhbml0eQorCQkgKgljaGVjayBoZXJlLgorCQkgKi8KKwkJYWRkciA9IChlODIwLm1hcFtpXS5hZGRyK1BBR0VfU0laRS0xKSA+PiBQQUdFX1NISUZUOworCQllbmQgPSAoZTgyMC5tYXBbaV0uYWRkcitlODIwLm1hcFtpXS5zaXplKSA+PiBQQUdFX1NISUZUOworCQlpZiAgKChwYWdlbnIgPj0gYWRkcikgJiYgKHBhZ2VuciA8IGVuZCkpCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfSElHSE1FTQorcHRlX3QgKmttYXBfcHRlOworcGdwcm90X3Qga21hcF9wcm90OworCisjZGVmaW5lIGttYXBfZ2V0X2ZpeG1hcF9wdGUodmFkZHIpCQkJCQlcCisJcHRlX29mZnNldF9rZXJuZWwocG1kX29mZnNldChwdWRfb2Zmc2V0KHBnZF9vZmZzZXRfayh2YWRkciksIHZhZGRyKSwgKHZhZGRyKSksICh2YWRkcikpCisKK3N0YXRpYyB2b2lkIF9faW5pdCBrbWFwX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGttYXBfdnN0YXJ0OworCisJLyogY2FjaGUgdGhlIGZpcnN0IGttYXAgcHRlICovCisJa21hcF92c3RhcnQgPSBfX2ZpeF90b192aXJ0KEZJWF9LTUFQX0JFR0lOKTsKKwlrbWFwX3B0ZSA9IGttYXBfZ2V0X2ZpeG1hcF9wdGUoa21hcF92c3RhcnQpOworCisJa21hcF9wcm90ID0gUEFHRV9LRVJORUw7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBwZXJtYW5lbnRfa21hcHNfaW5pdChwZ2RfdCAqcGdkX2Jhc2UpCit7CisJcGdkX3QgKnBnZDsKKwlwdWRfdCAqcHVkOworCXBtZF90ICpwbWQ7CisJcHRlX3QgKnB0ZTsKKwl1bnNpZ25lZCBsb25nIHZhZGRyOworCisJdmFkZHIgPSBQS01BUF9CQVNFOworCXBhZ2VfdGFibGVfcmFuZ2VfaW5pdCh2YWRkciwgdmFkZHIgKyBQQUdFX1NJWkUqTEFTVF9QS01BUCwgcGdkX2Jhc2UpOworCisJcGdkID0gc3dhcHBlcl9wZ19kaXIgKyBwZ2RfaW5kZXgodmFkZHIpOworCXB1ZCA9IHB1ZF9vZmZzZXQocGdkLCB2YWRkcik7CisJcG1kID0gcG1kX29mZnNldChwdWQsIHZhZGRyKTsKKwlwdGUgPSBwdGVfb2Zmc2V0X2tlcm5lbChwbWQsIHZhZGRyKTsKKwlwa21hcF9wYWdlX3RhYmxlID0gcHRlOwkKK30KKwordm9pZCBfX2luaXQgb25lX2hpZ2hwYWdlX2luaXQoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBwZm4sIGludCBiYWRfcHBybykKK3sKKwlpZiAocGFnZV9pc19yYW0ocGZuKSAmJiAhKGJhZF9wcHJvICYmIHBhZ2Vfa2lsbHNfcHBybyhwZm4pKSkgeworCQlDbGVhclBhZ2VSZXNlcnZlZChwYWdlKTsKKwkJc2V0X2JpdChQR19oaWdobWVtLCAmcGFnZS0+ZmxhZ3MpOworCQlzZXRfcGFnZV9jb3VudChwYWdlLCAxKTsKKwkJX19mcmVlX3BhZ2UocGFnZSk7CisJCXRvdGFsaGlnaF9wYWdlcysrOworCX0gZWxzZQorCQlTZXRQYWdlUmVzZXJ2ZWQocGFnZSk7Cit9CisKKyNpZm5kZWYgQ09ORklHX0RJU0NPTlRJR01FTQorc3RhdGljIHZvaWQgX19pbml0IHNldF9oaWdobWVtX3BhZ2VzX2luaXQoaW50IGJhZF9wcHJvKQoreworCWludCBwZm47CisJZm9yIChwZm4gPSBoaWdoc3RhcnRfcGZuOyBwZm4gPCBoaWdoZW5kX3BmbjsgcGZuKyspCisJCW9uZV9oaWdocGFnZV9pbml0KHBmbl90b19wYWdlKHBmbiksIHBmbiwgYmFkX3Bwcm8pOworCXRvdGFscmFtX3BhZ2VzICs9IHRvdGFsaGlnaF9wYWdlczsKK30KKyNlbHNlCitleHRlcm4gdm9pZCBzZXRfaGlnaG1lbV9wYWdlc19pbml0KGludCk7CisjZW5kaWYgLyogIUNPTkZJR19ESVNDT05USUdNRU0gKi8KKworI2Vsc2UKKyNkZWZpbmUga21hcF9pbml0KCkgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBwZXJtYW5lbnRfa21hcHNfaW5pdChwZ2RfYmFzZSkgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBzZXRfaGlnaG1lbV9wYWdlc19pbml0KGJhZF9wcHJvKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYgLyogQ09ORklHX0hJR0hNRU0gKi8KKwordW5zaWduZWQgbG9uZyBsb25nIF9fUEFHRV9LRVJORUwgPSBfUEFHRV9LRVJORUw7Cit1bnNpZ25lZCBsb25nIGxvbmcgX19QQUdFX0tFUk5FTF9FWEVDID0gX1BBR0VfS0VSTkVMX0VYRUM7CisKKyNpZm5kZWYgQ09ORklHX0RJU0NPTlRJR01FTQorI2RlZmluZSByZW1hcF9udW1hX2t2YSgpIGRvIHt9IHdoaWxlICgwKQorI2Vsc2UKK2V4dGVybiB2b2lkIF9faW5pdCByZW1hcF9udW1hX2t2YSh2b2lkKTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBfX2luaXQgcGFnZXRhYmxlX2luaXQgKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB2YWRkcjsKKwlwZ2RfdCAqcGdkX2Jhc2UgPSBzd2FwcGVyX3BnX2RpcjsKKworI2lmZGVmIENPTkZJR19YODZfUEFFCisJaW50IGk7CisJLyogSW5pdCBlbnRyaWVzIG9mIHRoZSBmaXJzdC1sZXZlbCBwYWdlIHRhYmxlIHRvIHRoZSB6ZXJvIHBhZ2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUFRSU19QRVJfUEdEOyBpKyspCisJCXNldF9wZ2QocGdkX2Jhc2UgKyBpLCBfX3BnZChfX3BhKGVtcHR5X3plcm9fcGFnZSkgfCBfUEFHRV9QUkVTRU5UKSk7CisjZW5kaWYKKworCS8qIEVuYWJsZSBQU0UgaWYgYXZhaWxhYmxlICovCisJaWYgKGNwdV9oYXNfcHNlKSB7CisJCXNldF9pbl9jcjQoWDg2X0NSNF9QU0UpOworCX0KKworCS8qIEVuYWJsZSBQR0UgaWYgYXZhaWxhYmxlICovCisJaWYgKGNwdV9oYXNfcGdlKSB7CisJCXNldF9pbl9jcjQoWDg2X0NSNF9QR0UpOworCQlfX1BBR0VfS0VSTkVMIHw9IF9QQUdFX0dMT0JBTDsKKwkJX19QQUdFX0tFUk5FTF9FWEVDIHw9IF9QQUdFX0dMT0JBTDsKKwl9CisKKwlrZXJuZWxfcGh5c2ljYWxfbWFwcGluZ19pbml0KHBnZF9iYXNlKTsKKwlyZW1hcF9udW1hX2t2YSgpOworCisJLyoKKwkgKiBGaXhlZCBtYXBwaW5ncywgb25seSB0aGUgcGFnZSB0YWJsZSBzdHJ1Y3R1cmUgaGFzIHRvIGJlCisJICogY3JlYXRlZCAtIG1hcHBpbmdzIHdpbGwgYmUgc2V0IGJ5IHNldF9maXhtYXAoKToKKwkgKi8KKwl2YWRkciA9IF9fZml4X3RvX3ZpcnQoX19lbmRfb2ZfZml4ZWRfYWRkcmVzc2VzIC0gMSkgJiBQTURfTUFTSzsKKwlwYWdlX3RhYmxlX3JhbmdlX2luaXQodmFkZHIsIDAsIHBnZF9iYXNlKTsKKworCXBlcm1hbmVudF9rbWFwc19pbml0KHBnZF9iYXNlKTsKKworI2lmZGVmIENPTkZJR19YODZfUEFFCisJLyoKKwkgKiBBZGQgbG93IG1lbW9yeSBpZGVudGl0eS1tYXBwaW5ncyAtIFNNUCBuZWVkcyBpdCB3aGVuCisJICogc3RhcnRpbmcgdXAgb24gYW4gQVAgZnJvbSByZWFsLW1vZGUuIEluIHRoZSBub24tUEFFCisJICogY2FzZSB3ZSBhbHJlYWR5IGhhdmUgdGhlc2UgbWFwcGluZ3MgdGhyb3VnaCBoZWFkLlMuCisJICogQWxsIHVzZXItc3BhY2UgbWFwcGluZ3MgYXJlIGV4cGxpY2l0bHkgY2xlYXJlZCBhZnRlcgorCSAqIFNNUCBzdGFydHVwLgorCSAqLworCXBnZF9iYXNlWzBdID0gcGdkX2Jhc2VbVVNFUl9QVFJTX1BFUl9QR0RdOworI2VuZGlmCit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19QTV9ESVNLKSB8fCBkZWZpbmVkKENPTkZJR19TT0ZUV0FSRV9TVVNQRU5EKQorLyoKKyAqIFN3YXAgc3VzcGVuZCAmIGZyaWVuZHMgbmVlZCB0aGlzIGZvciByZXN1bWUgYmVjYXVzZSB0aGluZ3MgbGlrZSB0aGUgaW50ZWwtYWdwCisgKiBkcml2ZXIgbWlnaHQgaGF2ZSBzcGxpdCB1cCBhIGtlcm5lbCA0TUIgbWFwcGluZy4KKyAqLworY2hhciBfX25vc2F2ZWRhdGEgc3dzdXNwX3BnX2RpcltQQUdFX1NJWkVdCisJX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKFBBR0VfU0laRSkpKTsKKworc3RhdGljIGlubGluZSB2b2lkIHNhdmVfcGdfZGlyKHZvaWQpCit7CisJbWVtY3B5KHN3c3VzcF9wZ19kaXIsIHN3YXBwZXJfcGdfZGlyLCBQQUdFX1NJWkUpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBzYXZlX3BnX2Rpcih2b2lkKQoreworfQorI2VuZGlmCisKK3ZvaWQgemFwX2xvd19tYXBwaW5ncyAodm9pZCkKK3sKKwlpbnQgaTsKKworCXNhdmVfcGdfZGlyKCk7CisKKwkvKgorCSAqIFphcCBpbml0aWFsIGxvdy1tZW1vcnkgbWFwcGluZ3MuCisJICoKKwkgKiBOb3RlIHRoYXQgInBnZF9jbGVhcigpIiBkb2Vzbid0IGRvIGl0IGZvcgorCSAqIHVzLCBiZWNhdXNlIHBnZF9jbGVhcigpIGlzIGEgbm8tb3Agb24gaTM4Ni4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgVVNFUl9QVFJTX1BFUl9QR0Q7IGkrKykKKyNpZmRlZiBDT05GSUdfWDg2X1BBRQorCQlzZXRfcGdkKHN3YXBwZXJfcGdfZGlyK2ksIF9fcGdkKDEgKyBfX3BhKGVtcHR5X3plcm9fcGFnZSkpKTsKKyNlbHNlCisJCXNldF9wZ2Qoc3dhcHBlcl9wZ19kaXIraSwgX19wZ2QoMCkpOworI2VuZGlmCisJZmx1c2hfdGxiX2FsbCgpOworfQorCitzdGF0aWMgaW50IGRpc2FibGVfbnggX19pbml0ZGF0YSA9IDA7Cit1NjQgX19zdXBwb3J0ZWRfcHRlX21hc2sgPSB+X1BBR0VfTlg7CisKKy8qCisgKiBub2V4ZWMgPSBvbnxvZmYKKyAqCisgKiBDb250cm9sIG5vbiBleGVjdXRhYmxlIG1hcHBpbmdzLgorICoKKyAqIG9uICAgICAgRW5hYmxlCisgKiBvZmYgICAgIERpc2FibGUKKyAqLwordm9pZCBfX2luaXQgbm9leGVjX3NldHVwKGNvbnN0IGNoYXIgKnN0cikKK3sKKwlpZiAoIXN0cm5jbXAoc3RyLCAib24iLDIpICYmIGNwdV9oYXNfbngpIHsKKwkJX19zdXBwb3J0ZWRfcHRlX21hc2sgfD0gX1BBR0VfTlg7CisJCWRpc2FibGVfbnggPSAwOworCX0gZWxzZSBpZiAoIXN0cm5jbXAoc3RyLCJvZmYiLDMpKSB7CisJCWRpc2FibGVfbnggPSAxOworCQlfX3N1cHBvcnRlZF9wdGVfbWFzayAmPSB+X1BBR0VfTlg7CisJfQorfQorCitpbnQgbnhfZW5hYmxlZCA9IDA7CisjaWZkZWYgQ09ORklHX1g4Nl9QQUUKKworc3RhdGljIHZvaWQgX19pbml0IHNldF9ueCh2b2lkKQoreworCXVuc2lnbmVkIGludCB2WzRdLCBsLCBoOworCisJaWYgKGNwdV9oYXNfcGFlICYmIChjcHVpZF9lYXgoMHg4MDAwMDAwMCkgPiAweDgwMDAwMDAxKSkgeworCQljcHVpZCgweDgwMDAwMDAxLCAmdlswXSwgJnZbMV0sICZ2WzJdLCAmdlszXSk7CisJCWlmICgodlszXSAmICgxIDw8IDIwKSkgJiYgIWRpc2FibGVfbngpIHsKKwkJCXJkbXNyKE1TUl9FRkVSLCBsLCBoKTsKKwkJCWwgfD0gRUZFUl9OWDsKKwkJCXdybXNyKE1TUl9FRkVSLCBsLCBoKTsKKwkJCW54X2VuYWJsZWQgPSAxOworCQkJX19zdXBwb3J0ZWRfcHRlX21hc2sgfD0gX1BBR0VfTlg7CisJCX0KKwl9Cit9CisKKy8qCisgKiBFbmFibGVzL2Rpc2FibGVzIGV4ZWN1dGFiaWxpdHkgb2YgYSBnaXZlbiBrZXJuZWwgcGFnZSBhbmQKKyAqIHJldHVybnMgdGhlIHByZXZpb3VzIHNldHRpbmcuCisgKi8KK2ludCBfX2luaXQgc2V0X2tlcm5lbF9leGVjKHVuc2lnbmVkIGxvbmcgdmFkZHIsIGludCBlbmFibGUpCit7CisJcHRlX3QgKnB0ZTsKKwlpbnQgcmV0ID0gMTsKKworCWlmICghbnhfZW5hYmxlZCkKKwkJZ290byBvdXQ7CisKKwlwdGUgPSBsb29rdXBfYWRkcmVzcyh2YWRkcik7CisJQlVHX09OKCFwdGUpOworCisJaWYgKCFwdGVfZXhlY19rZXJuZWwoKnB0ZSkpCisJCXJldCA9IDA7CisKKwlpZiAoZW5hYmxlKQorCQlwdGUtPnB0ZV9oaWdoICY9IH4oMSA8PCAoX1BBR0VfQklUX05YIC0gMzIpKTsKKwllbHNlCisJCXB0ZS0+cHRlX2hpZ2ggfD0gMSA8PCAoX1BBR0VfQklUX05YIC0gMzIpOworCV9fZmx1c2hfdGxiX2FsbCgpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKyNlbmRpZgorCisvKgorICogcGFnaW5nX2luaXQoKSBzZXRzIHVwIHRoZSBwYWdlIHRhYmxlcyAtIG5vdGUgdGhhdCB0aGUgZmlyc3QgOE1CIGFyZQorICogYWxyZWFkeSBtYXBwZWQgYnkgaGVhZC5TLgorICoKKyAqIFRoaXMgcm91dGluZXMgYWxzbyB1bm1hcHMgdGhlIHBhZ2UgYXQgdmlydHVhbCBrZXJuZWwgYWRkcmVzcyAwLCBzbworICogdGhhdCB3ZSBjYW4gdHJhcCB0aG9zZSBwZXNreSBOVUxMLXJlZmVyZW5jZSBlcnJvcnMgaW4gdGhlIGtlcm5lbC4KKyAqLwordm9pZCBfX2luaXQgcGFnaW5nX2luaXQodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfWDg2X1BBRQorCXNldF9ueCgpOworCWlmIChueF9lbmFibGVkKQorCQlwcmludGsoIk5YIChFeGVjdXRlIERpc2FibGUpIHByb3RlY3Rpb246IGFjdGl2ZVxuIik7CisjZW5kaWYKKworCXBhZ2V0YWJsZV9pbml0KCk7CisKKwlsb2FkX2NyMyhzd2FwcGVyX3BnX2Rpcik7CisKKyNpZmRlZiBDT05GSUdfWDg2X1BBRQorCS8qCisJICogV2Ugd2lsbCBiYWlsIG91dCBsYXRlciAtIHByaW50ayBkb2Vzbid0IHdvcmsgcmlnaHQgbm93IHNvCisJICogdGhlIHVzZXIgd291bGQganVzdCBzZWUgYSBoYW5naW5nIGtlcm5lbC4KKwkgKi8KKwlpZiAoY3B1X2hhc19wYWUpCisJCXNldF9pbl9jcjQoWDg2X0NSNF9QQUUpOworI2VuZGlmCisJX19mbHVzaF90bGJfYWxsKCk7CisKKwlrbWFwX2luaXQoKTsKK30KKworLyoKKyAqIFRlc3QgaWYgdGhlIFdQIGJpdCB3b3JrcyBpbiBzdXBlcnZpc29yIG1vZGUuIEl0IGlzbid0IHN1cHBvcnRlZCBvbiAzODYncworICogYW5kIGFsc28gb24gc29tZSBzdHJhbmdlIDQ4NidzIChOZXhHZW4gZXRjLikuIEFsbCA1ODYrJ3MgYXJlIE9LLiBUaGlzCisgKiB1c2VkIHRvIGludm9sdmUgYmxhY2sgbWFnaWMganVtcHMgdG8gd29yayBhcm91bmQgc29tZSBuYXN0eSBDUFUgYnVncywKKyAqIGJ1dCBmb3J0dW5hdGVseSB0aGUgc3dpdGNoIHRvIHVzaW5nIGV4Y2VwdGlvbnMgZ290IHJpZCBvZiBhbGwgdGhhdC4KKyAqLworCitzdGF0aWMgdm9pZCBfX2luaXQgdGVzdF93cF9iaXQodm9pZCkKK3sKKwlwcmludGsoIkNoZWNraW5nIGlmIHRoaXMgcHJvY2Vzc29yIGhvbm91cnMgdGhlIFdQIGJpdCBldmVuIGluIHN1cGVydmlzb3IgbW9kZS4uLiAiKTsKKworCS8qIEFueSBwYWdlLWFsaWduZWQgYWRkcmVzcyB3aWxsIGRvLCB0aGUgdGVzdCBpcyBub24tZGVzdHJ1Y3RpdmUgKi8KKwlfX3NldF9maXhtYXAoRklYX1dQX1RFU1QsIF9fcGEoJnN3YXBwZXJfcGdfZGlyKSwgUEFHRV9SRUFET05MWSk7CisJYm9vdF9jcHVfZGF0YS53cF93b3Jrc19vayA9IGRvX3Rlc3Rfd3BfYml0KCk7CisJY2xlYXJfZml4bWFwKEZJWF9XUF9URVNUKTsKKworCWlmICghYm9vdF9jcHVfZGF0YS53cF93b3Jrc19vaykgeworCQlwcmludGsoIk5vLlxuIik7CisjaWZkZWYgQ09ORklHX1g4Nl9XUF9XT1JLU19PSworCQlwYW5pYygiVGhpcyBrZXJuZWwgZG9lc24ndCBzdXBwb3J0IENQVSdzIHdpdGggYnJva2VuIFdQLiBSZWNvbXBpbGUgaXQgZm9yIGEgMzg2ISIpOworI2VuZGlmCisJfSBlbHNlIHsKKwkJcHJpbnRrKCJPay5cbiIpOworCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0IHNldF9tYXhfbWFwbnJfaW5pdCh2b2lkKQoreworI2lmZGVmIENPTkZJR19ISUdITUVNCisJbnVtX3BoeXNwYWdlcyA9IGhpZ2hlbmRfcGZuOworI2Vsc2UKKwludW1fcGh5c3BhZ2VzID0gbWF4X2xvd19wZm47CisjZW5kaWYKKyNpZm5kZWYgQ09ORklHX0RJU0NPTlRJR01FTQorCW1heF9tYXBuciA9IG51bV9waHlzcGFnZXM7CisjZW5kaWYKK30KKworc3RhdGljIHN0cnVjdCBrY29yZV9saXN0IGtjb3JlX21lbSwga2NvcmVfdm1hbGxvYzsgCisKK3ZvaWQgX19pbml0IG1lbV9pbml0KHZvaWQpCit7CisJZXh0ZXJuIGludCBwcHJvX3dpdGhfcmFtX2J1Zyh2b2lkKTsKKwlpbnQgY29kZXNpemUsIHJlc2VydmVkcGFnZXMsIGRhdGFzaXplLCBpbml0c2l6ZTsKKwlpbnQgdG1wOworCWludCBiYWRfcHBybzsKKworI2lmbmRlZiBDT05GSUdfRElTQ09OVElHTUVNCisJaWYgKCFtZW1fbWFwKQorCQlCVUcoKTsKKyNlbmRpZgorCQorCWJhZF9wcHJvID0gcHByb193aXRoX3JhbV9idWcoKTsKKworI2lmZGVmIENPTkZJR19ISUdITUVNCisJLyogY2hlY2sgdGhhdCBmaXhtYXAgYW5kIHBrbWFwIGRvIG5vdCBvdmVybGFwICovCisJaWYgKFBLTUFQX0JBU0UrTEFTVF9QS01BUCpQQUdFX1NJWkUgPj0gRklYQUREUl9TVEFSVCkgeworCQlwcmludGsoS0VSTl9FUlIgImZpeG1hcCBhbmQga21hcCBhcmVhcyBvdmVybGFwIC0gdGhpcyB3aWxsIGNyYXNoXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJwa3N0YXJ0OiAlbHhoIHBrZW5kOiAlbHhoIGZpeHN0YXJ0ICVseGhcbiIsCisJCQkJUEtNQVBfQkFTRSwgUEtNQVBfQkFTRStMQVNUX1BLTUFQKlBBR0VfU0laRSwgRklYQUREUl9TVEFSVCk7CisJCUJVRygpOworCX0KKyNlbmRpZgorIAorCXNldF9tYXhfbWFwbnJfaW5pdCgpOworCisjaWZkZWYgQ09ORklHX0hJR0hNRU0KKwloaWdoX21lbW9yeSA9ICh2b2lkICopIF9fdmEoaGlnaHN0YXJ0X3BmbiAqIFBBR0VfU0laRSAtIDEpICsgMTsKKyNlbHNlCisJaGlnaF9tZW1vcnkgPSAodm9pZCAqKSBfX3ZhKG1heF9sb3dfcGZuICogUEFHRV9TSVpFIC0gMSkgKyAxOworI2VuZGlmCisKKwkvKiB0aGlzIHdpbGwgcHV0IGFsbCBsb3cgbWVtb3J5IG9udG8gdGhlIGZyZWVsaXN0cyAqLworCXRvdGFscmFtX3BhZ2VzICs9IGZyZWVfYWxsX2Jvb3RtZW0oKTsKKworCXJlc2VydmVkcGFnZXMgPSAwOworCWZvciAodG1wID0gMDsgdG1wIDwgbWF4X2xvd19wZm47IHRtcCsrKQorCQkvKgorCQkgKiBPbmx5IGNvdW50IHJlc2VydmVkIFJBTSBwYWdlcworCQkgKi8KKwkJaWYgKHBhZ2VfaXNfcmFtKHRtcCkgJiYgUGFnZVJlc2VydmVkKHBmbl90b19wYWdlKHRtcCkpKQorCQkJcmVzZXJ2ZWRwYWdlcysrOworCisJc2V0X2hpZ2htZW1fcGFnZXNfaW5pdChiYWRfcHBybyk7CisKKwljb2Rlc2l6ZSA9ICAodW5zaWduZWQgbG9uZykgJl9ldGV4dCAtICh1bnNpZ25lZCBsb25nKSAmX3RleHQ7CisJZGF0YXNpemUgPSAgKHVuc2lnbmVkIGxvbmcpICZfZWRhdGEgLSAodW5zaWduZWQgbG9uZykgJl9ldGV4dDsKKwlpbml0c2l6ZSA9ICAodW5zaWduZWQgbG9uZykgJl9faW5pdF9lbmQgLSAodW5zaWduZWQgbG9uZykgJl9faW5pdF9iZWdpbjsKKworCWtjbGlzdF9hZGQoJmtjb3JlX21lbSwgX192YSgwKSwgbWF4X2xvd19wZm4gPDwgUEFHRV9TSElGVCk7IAorCWtjbGlzdF9hZGQoJmtjb3JlX3ZtYWxsb2MsICh2b2lkICopVk1BTExPQ19TVEFSVCwgCisJCSAgIFZNQUxMT0NfRU5ELVZNQUxMT0NfU1RBUlQpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiTWVtb3J5OiAlbHVrLyVsdWsgYXZhaWxhYmxlICglZGsga2VybmVsIGNvZGUsICVkayByZXNlcnZlZCwgJWRrIGRhdGEsICVkayBpbml0LCAlbGRrIGhpZ2htZW0pXG4iLAorCQkodW5zaWduZWQgbG9uZykgbnJfZnJlZV9wYWdlcygpIDw8IChQQUdFX1NISUZULTEwKSwKKwkJbnVtX3BoeXNwYWdlcyA8PCAoUEFHRV9TSElGVC0xMCksCisJCWNvZGVzaXplID4+IDEwLAorCQlyZXNlcnZlZHBhZ2VzIDw8IChQQUdFX1NISUZULTEwKSwKKwkJZGF0YXNpemUgPj4gMTAsCisJCWluaXRzaXplID4+IDEwLAorCQkodW5zaWduZWQgbG9uZykgKHRvdGFsaGlnaF9wYWdlcyA8PCAoUEFHRV9TSElGVC0xMCkpCisJICAgICAgICk7CisKKyNpZmRlZiBDT05GSUdfWDg2X1BBRQorCWlmICghY3B1X2hhc19wYWUpCisJCXBhbmljKCJjYW5ub3QgZXhlY3V0ZSBhIFBBRS1lbmFibGVkIGtlcm5lbCBvbiBhIFBBRS1sZXNzIENQVSEiKTsKKyNlbmRpZgorCWlmIChib290X2NwdV9kYXRhLndwX3dvcmtzX29rIDwgMCkKKwkJdGVzdF93cF9iaXQoKTsKKworCS8qCisJICogU3VidGxlLiBTTVAgaXMgZG9pbmcgaXQncyBib290IHN0dWZmIGxhdGUgKGJlY2F1c2UgaXQgaGFzIHRvCisJICogZm9yayBpZGxlIHRocmVhZHMpIC0gYnV0IGl0IGFsc28gbmVlZHMgbG93IG1hcHBpbmdzIGZvciB0aGUKKwkgKiBwcm90ZWN0ZWQtbW9kZSBlbnRyeSB0byB3b3JrLiBXZSB6YXAgdGhlc2UgZW50cmllcyBvbmx5IGFmdGVyCisJICogdGhlIFdQLWJpdCBoYXMgYmVlbiB0ZXN0ZWQuCisJICovCisjaWZuZGVmIENPTkZJR19TTVAKKwl6YXBfbG93X21hcHBpbmdzKCk7CisjZW5kaWYKK30KKwora21lbV9jYWNoZV90ICpwZ2RfY2FjaGU7CitrbWVtX2NhY2hlX3QgKnBtZF9jYWNoZTsKKwordm9pZCBfX2luaXQgcGd0YWJsZV9jYWNoZV9pbml0KHZvaWQpCit7CisJaWYgKFBUUlNfUEVSX1BNRCA+IDEpIHsKKwkJcG1kX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoInBtZCIsCisJCQkJCVBUUlNfUEVSX1BNRCpzaXplb2YocG1kX3QpLAorCQkJCQlQVFJTX1BFUl9QTUQqc2l6ZW9mKHBtZF90KSwKKwkJCQkJMCwKKwkJCQkJcG1kX2N0b3IsCisJCQkJCU5VTEwpOworCQlpZiAoIXBtZF9jYWNoZSkKKwkJCXBhbmljKCJwZ3RhYmxlX2NhY2hlX2luaXQoKTogY2Fubm90IGNyZWF0ZSBwbWQgY2FjaGUiKTsKKwl9CisJcGdkX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoInBnZCIsCisJCQkJUFRSU19QRVJfUEdEKnNpemVvZihwZ2RfdCksCisJCQkJUFRSU19QRVJfUEdEKnNpemVvZihwZ2RfdCksCisJCQkJMCwKKwkJCQlwZ2RfY3RvciwKKwkJCQlQVFJTX1BFUl9QTUQgPT0gMSA/IHBnZF9kdG9yIDogTlVMTCk7CisJaWYgKCFwZ2RfY2FjaGUpCisJCXBhbmljKCJwZ3RhYmxlX2NhY2hlX2luaXQoKTogQ2Fubm90IGNyZWF0ZSBwZ2QgY2FjaGUiKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIF9faW5pdCwgc2luY2UgZXhjZXB0aW9ucyBkb24ndCB3b3JrIGluIHRoYXQKKyAqIHNlY3Rpb24uICBQdXQgdGhpcyBhZnRlciB0aGUgY2FsbGVycywgc28gdGhhdCBpdCBjYW5ub3QgYmUgaW5saW5lZC4KKyAqLworc3RhdGljIGludCBub2lubGluZSBkb190ZXN0X3dwX2JpdCh2b2lkKQoreworCWNoYXIgdG1wX3JlZzsKKwlpbnQgZmxhZzsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkiCW1vdmIgJTAsJTEJXG4iCisJCSIxOgltb3ZiICUxLCUwCVxuIgorCQkiCXhvcmwgJTIsJTIJXG4iCisJCSIyOgkJCVxuIgorCQkiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgorCQkiCS5hbGlnbiA0CVxuIgorCQkiCS5sb25nIDFiLDJiCVxuIgorCQkiLnByZXZpb3VzCQlcbiIKKwkJOiI9bSIgKCooY2hhciAqKWZpeF90b192aXJ0KEZJWF9XUF9URVNUKSksCisJCSAiPXEiICh0bXBfcmVnKSwKKwkJICI9ciIgKGZsYWcpCisJCToiMiIgKDEpCisJCToibWVtb3J5Iik7CisJCisJcmV0dXJuIGZsYWc7Cit9CisKK3ZvaWQgZnJlZV9pbml0bWVtKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCisJYWRkciA9ICh1bnNpZ25lZCBsb25nKSgmX19pbml0X2JlZ2luKTsKKwlmb3IgKDsgYWRkciA8ICh1bnNpZ25lZCBsb25nKSgmX19pbml0X2VuZCk7IGFkZHIgKz0gUEFHRV9TSVpFKSB7CisJCUNsZWFyUGFnZVJlc2VydmVkKHZpcnRfdG9fcGFnZShhZGRyKSk7CisJCXNldF9wYWdlX2NvdW50KHZpcnRfdG9fcGFnZShhZGRyKSwgMSk7CisJCW1lbXNldCgodm9pZCAqKWFkZHIsIDB4Y2MsIFBBR0VfU0laRSk7CisJCWZyZWVfcGFnZShhZGRyKTsKKwkJdG90YWxyYW1fcGFnZXMrKzsKKwl9CisJcHJpbnRrIChLRVJOX0lORk8gIkZyZWVpbmcgdW51c2VkIGtlcm5lbCBtZW1vcnk6ICVkayBmcmVlZFxuIiwgKF9faW5pdF9lbmQgLSBfX2luaXRfYmVnaW4pID4+IDEwKTsKK30KKworI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAordm9pZCBmcmVlX2luaXRyZF9tZW0odW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJaWYgKHN0YXJ0IDwgZW5kKQorCQlwcmludGsgKEtFUk5fSU5GTyAiRnJlZWluZyBpbml0cmQgbWVtb3J5OiAlbGRrIGZyZWVkXG4iLCAoZW5kIC0gc3RhcnQpID4+IDEwKTsKKwlmb3IgKDsgc3RhcnQgPCBlbmQ7IHN0YXJ0ICs9IFBBR0VfU0laRSkgeworCQlDbGVhclBhZ2VSZXNlcnZlZCh2aXJ0X3RvX3BhZ2Uoc3RhcnQpKTsKKwkJc2V0X3BhZ2VfY291bnQodmlydF90b19wYWdlKHN0YXJ0KSwgMSk7CisJCWZyZWVfcGFnZShzdGFydCk7CisJCXRvdGFscmFtX3BhZ2VzKys7CisJfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbW0vaW9yZW1hcC5jIGIvYXJjaC9pMzg2L21tL2lvcmVtYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjA2ZjczCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21tL2lvcmVtYXAuYwpAQCAtMCwwICsxLDMyMCBAQAorLyoKKyAqIGFyY2gvaTM4Ni9tbS9pb3JlbWFwLmMKKyAqCisgKiBSZS1tYXAgSU8gbWVtb3J5IHRvIGtlcm5lbCBhZGRyZXNzIHNwYWNlIHNvIHRoYXQgd2UgY2FuIGFjY2VzcyBpdC4KKyAqIFRoaXMgaXMgbmVlZGVkIGZvciBoaWdoIFBDSSBhZGRyZXNzZXMgdGhhdCBhcmVuJ3QgbWFwcGVkIGluIHRoZQorICogNjQway0xTUIgSU8gbWVtb3J5IGFyZWEgb24gUEMncworICoKKyAqIChDKSBDb3B5cmlnaHQgMTk5NSAxOTk2IExpbnVzIFRvcnZhbGRzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisKKyNkZWZpbmUgSVNBX1NUQVJUX0FERFJFU1MJMHhhMDAwMAorI2RlZmluZSBJU0FfRU5EX0FERFJFU1MJCTB4MTAwMDAwCisKK3N0YXRpYyBpbnQgaW9yZW1hcF9wdGVfcmFuZ2UocG1kX3QgKnBtZCwgdW5zaWduZWQgbG9uZyBhZGRyLAorCQl1bnNpZ25lZCBsb25nIGVuZCwgdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJcHRlX3QgKnB0ZTsKKwl1bnNpZ25lZCBsb25nIHBmbjsKKworCXBmbiA9IHBoeXNfYWRkciA+PiBQQUdFX1NISUZUOworCXB0ZSA9IHB0ZV9hbGxvY19rZXJuZWwoJmluaXRfbW0sIHBtZCwgYWRkcik7CisJaWYgKCFwdGUpCisJCXJldHVybiAtRU5PTUVNOworCWRvIHsKKwkJQlVHX09OKCFwdGVfbm9uZSgqcHRlKSk7CisJCXNldF9wdGUocHRlLCBwZm5fcHRlKHBmbiwgX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1JXIHwgCisJCQkJCV9QQUdFX0RJUlRZIHwgX1BBR0VfQUNDRVNTRUQgfCBmbGFncykpKTsKKwkJcGZuKys7CisJfSB3aGlsZSAocHRlKyssIGFkZHIgKz0gUEFHRV9TSVpFLCBhZGRyICE9IGVuZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlvcmVtYXBfcG1kX3JhbmdlKHB1ZF90ICpwdWQsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJdW5zaWduZWQgbG9uZyBlbmQsIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXBtZF90ICpwbWQ7CisJdW5zaWduZWQgbG9uZyBuZXh0OworCisJcGh5c19hZGRyIC09IGFkZHI7CisJcG1kID0gcG1kX2FsbG9jKCZpbml0X21tLCBwdWQsIGFkZHIpOworCWlmICghcG1kKQorCQlyZXR1cm4gLUVOT01FTTsKKwlkbyB7CisJCW5leHQgPSBwbWRfYWRkcl9lbmQoYWRkciwgZW5kKTsKKwkJaWYgKGlvcmVtYXBfcHRlX3JhbmdlKHBtZCwgYWRkciwgbmV4dCwgcGh5c19hZGRyICsgYWRkciwgZmxhZ3MpKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfSB3aGlsZSAocG1kKyssIGFkZHIgPSBuZXh0LCBhZGRyICE9IGVuZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlvcmVtYXBfcHVkX3JhbmdlKHBnZF90ICpwZ2QsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJdW5zaWduZWQgbG9uZyBlbmQsIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXB1ZF90ICpwdWQ7CisJdW5zaWduZWQgbG9uZyBuZXh0OworCisJcGh5c19hZGRyIC09IGFkZHI7CisJcHVkID0gcHVkX2FsbG9jKCZpbml0X21tLCBwZ2QsIGFkZHIpOworCWlmICghcHVkKQorCQlyZXR1cm4gLUVOT01FTTsKKwlkbyB7CisJCW5leHQgPSBwdWRfYWRkcl9lbmQoYWRkciwgZW5kKTsKKwkJaWYgKGlvcmVtYXBfcG1kX3JhbmdlKHB1ZCwgYWRkciwgbmV4dCwgcGh5c19hZGRyICsgYWRkciwgZmxhZ3MpKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfSB3aGlsZSAocHVkKyssIGFkZHIgPSBuZXh0LCBhZGRyICE9IGVuZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW9yZW1hcF9wYWdlX3JhbmdlKHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJdW5zaWduZWQgbG9uZyBlbmQsIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXBnZF90ICpwZ2Q7CisJdW5zaWduZWQgbG9uZyBuZXh0OworCWludCBlcnI7CisKKwlCVUdfT04oYWRkciA+PSBlbmQpOworCWZsdXNoX2NhY2hlX2FsbCgpOworCXBoeXNfYWRkciAtPSBhZGRyOworCXBnZCA9IHBnZF9vZmZzZXRfayhhZGRyKTsKKwlzcGluX2xvY2soJmluaXRfbW0ucGFnZV90YWJsZV9sb2NrKTsKKwlkbyB7CisJCW5leHQgPSBwZ2RfYWRkcl9lbmQoYWRkciwgZW5kKTsKKwkJZXJyID0gaW9yZW1hcF9wdWRfcmFuZ2UocGdkLCBhZGRyLCBuZXh0LCBwaHlzX2FkZHIrYWRkciwgZmxhZ3MpOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisJfSB3aGlsZSAocGdkKyssIGFkZHIgPSBuZXh0LCBhZGRyICE9IGVuZCk7CisJc3Bpbl91bmxvY2soJmluaXRfbW0ucGFnZV90YWJsZV9sb2NrKTsKKwlmbHVzaF90bGJfYWxsKCk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIEdlbmVyaWMgbWFwcGluZyBmdW5jdGlvbiAobm90IHZpc2libGUgb3V0c2lkZSk6CisgKi8KKworLyoKKyAqIFJlbWFwIGFuIGFyYml0cmFyeSBwaHlzaWNhbCBhZGRyZXNzIHNwYWNlIGludG8gdGhlIGtlcm5lbCB2aXJ0dWFsCisgKiBhZGRyZXNzIHNwYWNlLiBOZWVkZWQgd2hlbiB0aGUga2VybmVsIHdhbnRzIHRvIGFjY2VzcyBoaWdoIGFkZHJlc3NlcworICogZGlyZWN0bHkuCisgKgorICogTk9URSEgV2UgbmVlZCB0byBhbGxvdyBub24tcGFnZS1hbGlnbmVkIG1hcHBpbmdzIHRvbzogd2Ugd2lsbCBvYnZpb3VzbHkKKyAqIGhhdmUgdG8gY29udmVydCB0aGVtIGludG8gYW4gb2Zmc2V0IGluIGEgcGFnZS1hbGlnbmVkIG1hcHBpbmcsIGJ1dCB0aGUKKyAqIGNhbGxlciBzaG91bGRuJ3QgbmVlZCB0byBrbm93IHRoYXQgc21hbGwgZGV0YWlsLgorICovCit2b2lkIF9faW9tZW0gKiBfX2lvcmVtYXAodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwl2b2lkIF9faW9tZW0gKiBhZGRyOworCXN0cnVjdCB2bV9zdHJ1Y3QgKiBhcmVhOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBsYXN0X2FkZHI7CisKKwkvKiBEb24ndCBhbGxvdyB3cmFwYXJvdW5kIG9yIHplcm8gc2l6ZSAqLworCWxhc3RfYWRkciA9IHBoeXNfYWRkciArIHNpemUgLSAxOworCWlmICghc2l6ZSB8fCBsYXN0X2FkZHIgPCBwaHlzX2FkZHIpCisJCXJldHVybiBOVUxMOworCisJLyoKKwkgKiBEb24ndCByZW1hcCB0aGUgbG93IFBDSS9JU0EgYXJlYSwgaXQncyBhbHdheXMgbWFwcGVkLi4KKwkgKi8KKwlpZiAocGh5c19hZGRyID49IElTQV9TVEFSVF9BRERSRVNTICYmIGxhc3RfYWRkciA8IElTQV9FTkRfQUREUkVTUykKKwkJcmV0dXJuICh2b2lkIF9faW9tZW0gKikgcGh5c190b192aXJ0KHBoeXNfYWRkcik7CisKKwkvKgorCSAqIERvbid0IGFsbG93IGFueWJvZHkgdG8gcmVtYXAgbm9ybWFsIFJBTSB0aGF0IHdlJ3JlIHVzaW5nLi4KKwkgKi8KKwlpZiAocGh5c19hZGRyIDw9IHZpcnRfdG9fcGh5cyhoaWdoX21lbW9yeSAtIDEpKSB7CisJCWNoYXIgKnRfYWRkciwgKnRfZW5kOworCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCQl0X2FkZHIgPSBfX3ZhKHBoeXNfYWRkcik7CisJCXRfZW5kID0gdF9hZGRyICsgKHNpemUgLSAxKTsKKwkgICAKKwkJZm9yKHBhZ2UgPSB2aXJ0X3RvX3BhZ2UodF9hZGRyKTsgcGFnZSA8PSB2aXJ0X3RvX3BhZ2UodF9lbmQpOyBwYWdlKyspCisJCQlpZighUGFnZVJlc2VydmVkKHBhZ2UpKQorCQkJCXJldHVybiBOVUxMOworCX0KKworCS8qCisJICogTWFwcGluZ3MgaGF2ZSB0byBiZSBwYWdlLWFsaWduZWQKKwkgKi8KKwlvZmZzZXQgPSBwaHlzX2FkZHIgJiB+UEFHRV9NQVNLOworCXBoeXNfYWRkciAmPSBQQUdFX01BU0s7CisJc2l6ZSA9IFBBR0VfQUxJR04obGFzdF9hZGRyKzEpIC0gcGh5c19hZGRyOworCisJLyoKKwkgKiBPaywgZ28gZm9yIGl0Li4KKwkgKi8KKwlhcmVhID0gZ2V0X3ZtX2FyZWEoc2l6ZSwgVk1fSU9SRU1BUCB8IChmbGFncyA8PCAyMCkpOworCWlmICghYXJlYSkKKwkJcmV0dXJuIE5VTEw7CisJYXJlYS0+cGh5c19hZGRyID0gcGh5c19hZGRyOworCWFkZHIgPSAodm9pZCBfX2lvbWVtICopIGFyZWEtPmFkZHI7CisJaWYgKGlvcmVtYXBfcGFnZV9yYW5nZSgodW5zaWduZWQgbG9uZykgYWRkciwKKwkJCSh1bnNpZ25lZCBsb25nKSBhZGRyICsgc2l6ZSwgcGh5c19hZGRyLCBmbGFncykpIHsKKwkJdnVubWFwKCh2b2lkIF9fZm9yY2UgKikgYWRkcik7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gKHZvaWQgX19pb21lbSAqKSAob2Zmc2V0ICsgKGNoYXIgX19pb21lbSAqKWFkZHIpOworfQorCisKKy8qKgorICogaW9yZW1hcF9ub2NhY2hlICAgICAtICAgbWFwIGJ1cyBtZW1vcnkgaW50byBDUFUgc3BhY2UKKyAqIEBvZmZzZXQ6ICAgIGJ1cyBhZGRyZXNzIG9mIHRoZSBtZW1vcnkKKyAqIEBzaXplOiAgICAgIHNpemUgb2YgdGhlIHJlc291cmNlIHRvIG1hcAorICoKKyAqIGlvcmVtYXBfbm9jYWNoZSBwZXJmb3JtcyBhIHBsYXRmb3JtIHNwZWNpZmljIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgdG8KKyAqIG1ha2UgYnVzIG1lbW9yeSBDUFUgYWNjZXNzaWJsZSB2aWEgdGhlIHJlYWRiL3JlYWR3L3JlYWRsL3dyaXRlYi8KKyAqIHdyaXRldy93cml0ZWwgZnVuY3Rpb25zIGFuZCB0aGUgb3RoZXIgbW1pbyBoZWxwZXJzLiBUaGUgcmV0dXJuZWQKKyAqIGFkZHJlc3MgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgdXNhYmxlIGRpcmVjdGx5IGFzIGEgdmlydHVhbAorICogYWRkcmVzcy4gCisgKgorICogVGhpcyB2ZXJzaW9uIG9mIGlvcmVtYXAgZW5zdXJlcyB0aGF0IHRoZSBtZW1vcnkgaXMgbWFya2VkIHVuY2FjaGFibGUKKyAqIG9uIHRoZSBDUFUgYXMgd2VsbCBhcyBob25vdXJpbmcgZXhpc3RpbmcgY2FjaGluZyBydWxlcyBmcm9tIHRoaW5ncyBsaWtlCisgKiB0aGUgUENJIGJ1cy4gTm90ZSB0aGF0IHRoZXJlIGFyZSBvdGhlciBjYWNoZXMgYW5kIGJ1ZmZlcnMgb24gbWFueSAKKyAqIGJ1c3Nlcy4gSW4gcGFydGljdWxhciBkcml2ZXIgYXV0aG9ycyBzaG91bGQgcmVhZCB1cCBvbiBQQ0kgd3JpdGVzCisgKgorICogSXQncyB1c2VmdWwgaWYgc29tZSBjb250cm9sIHJlZ2lzdGVycyBhcmUgaW4gc3VjaCBhbiBhcmVhIGFuZAorICogd3JpdGUgY29tYmluaW5nIG9yIHJlYWQgY2FjaGluZyBpcyBub3QgZGVzaXJhYmxlOgorICogCisgKiBNdXN0IGJlIGZyZWVkIHdpdGggaW91bm1hcC4KKyAqLworCit2b2lkIF9faW9tZW0gKmlvcmVtYXBfbm9jYWNoZSAodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGxhc3RfYWRkcjsKKwl2b2lkIF9faW9tZW0gKnAgPSBfX2lvcmVtYXAocGh5c19hZGRyLCBzaXplLCBfUEFHRV9QQ0QpOworCWlmICghcCkgCisJCXJldHVybiBwOyAKKworCS8qIEd1YXJhbnRlZWQgdG8gYmUgPiBwaHlzX2FkZHIsIGFzIHBlciBfX2lvcmVtYXAoKSAqLworCWxhc3RfYWRkciA9IHBoeXNfYWRkciArIHNpemUgLSAxOworCisJaWYgKGxhc3RfYWRkciA8IHZpcnRfdG9fcGh5cyhoaWdoX21lbW9yeSkgLSAxKSB7CisJCXN0cnVjdCBwYWdlICpwcGFnZSA9IHZpcnRfdG9fcGFnZShfX3ZhKHBoeXNfYWRkcikpOwkJCisJCXVuc2lnbmVkIGxvbmcgbnBhZ2VzOworCisJCXBoeXNfYWRkciAmPSBQQUdFX01BU0s7CisKKwkJLyogVGhpcyBtaWdodCBvdmVyZmxvdyBhbmQgYmVjb21lIHplcm8uLiAqLworCQlsYXN0X2FkZHIgPSBQQUdFX0FMSUdOKGxhc3RfYWRkcik7CisKKwkJLyogLi4gYnV0IHRoYXQncyBvaywgYmVjYXVzZSBtb2R1bG8tMioqbiBhcml0aG1ldGljIHdpbGwgbWFrZQorCSAJKiB0aGUgcGFnZS1hbGlnbmVkICJsYXN0IC0gZmlyc3QiIGNvbWUgb3V0IHJpZ2h0LgorCSAJKi8KKwkJbnBhZ2VzID0gKGxhc3RfYWRkciAtIHBoeXNfYWRkcikgPj4gUEFHRV9TSElGVDsKKworCQlpZiAoY2hhbmdlX3BhZ2VfYXR0cihwcGFnZSwgbnBhZ2VzLCBQQUdFX0tFUk5FTF9OT0NBQ0hFKSA8IDApIHsgCisJCQlpb3VubWFwKHApOyAKKwkJCXAgPSBOVUxMOworCQl9CisJCWdsb2JhbF9mbHVzaF90bGIoKTsKKwl9CisKKwlyZXR1cm4gcDsJCQkJCQorfQorCit2b2lkIGlvdW5tYXAodm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQoreworCXN0cnVjdCB2bV9zdHJ1Y3QgKnA7CisJaWYgKCh2b2lkIF9fZm9yY2UgKikgYWRkciA8PSBoaWdoX21lbW9yeSkgCisJCXJldHVybjsKKworCS8qCisJICogX19pb3JlbWFwIHNwZWNpYWwtY2FzZXMgdGhlIFBDSS9JU0EgcmFuZ2UgYnkgbm90IGluc3RhbnRpYXRpbmcgYQorCSAqIHZtX2FyZWEgYW5kIGJ5IHNpbXBseSByZXR1cm5pbmcgYW4gYWRkcmVzcyBpbnRvIHRoZSBrZXJuZWwgbWFwcGluZworCSAqIG9mIElTQSBzcGFjZS4gICBTbyBoYW5kbGUgdGhhdCBoZXJlLgorCSAqLworCWlmIChhZGRyID49IHBoeXNfdG9fdmlydChJU0FfU1RBUlRfQUREUkVTUykgJiYKKwkJCWFkZHIgPCBwaHlzX3RvX3ZpcnQoSVNBX0VORF9BRERSRVNTKSkKKwkJcmV0dXJuOworCisJcCA9IHJlbW92ZV92bV9hcmVhKCh2b2lkICopIChQQUdFX01BU0sgJiAodW5zaWduZWQgbG9uZyBfX2ZvcmNlKSBhZGRyKSk7CisJaWYgKCFwKSB7IAorCQlwcmludGsoIl9faW91bm1hcDogYmFkIGFkZHJlc3MgJXBcbiIsIGFkZHIpOworCQlyZXR1cm47CisJfQorCisJaWYgKChwLT5mbGFncyA+PiAyMCkgJiYgcC0+cGh5c19hZGRyIDwgdmlydF90b19waHlzKGhpZ2hfbWVtb3J5KSAtIDEpIHsKKwkJLyogcC0+c2l6ZSBpbmNsdWRlcyB0aGUgZ3VhcmQgcGFnZSwgYnV0IGNwYSBkb2Vzbid0IGxpa2UgdGhhdCAqLworCQljaGFuZ2VfcGFnZV9hdHRyKHZpcnRfdG9fcGFnZShfX3ZhKHAtPnBoeXNfYWRkcikpLAorCQkJCSBwLT5zaXplID4+IFBBR0VfU0hJRlQsCisJCQkJIFBBR0VfS0VSTkVMKTsKKwkJZ2xvYmFsX2ZsdXNoX3RsYigpOworCX0gCisJa2ZyZWUocCk7IAorfQorCit2b2lkIF9faW5pdCAqYnRfaW9yZW1hcCh1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBsYXN0X2FkZHI7CisJdW5zaWduZWQgaW50IG5ycGFnZXM7CisJZW51bSBmaXhlZF9hZGRyZXNzZXMgaWR4OworCisJLyogRG9uJ3QgYWxsb3cgd3JhcGFyb3VuZCBvciB6ZXJvIHNpemUgKi8KKwlsYXN0X2FkZHIgPSBwaHlzX2FkZHIgKyBzaXplIC0gMTsKKwlpZiAoIXNpemUgfHwgbGFzdF9hZGRyIDwgcGh5c19hZGRyKQorCQlyZXR1cm4gTlVMTDsKKworCS8qCisJICogRG9uJ3QgcmVtYXAgdGhlIGxvdyBQQ0kvSVNBIGFyZWEsIGl0J3MgYWx3YXlzIG1hcHBlZC4uCisJICovCisJaWYgKHBoeXNfYWRkciA+PSBJU0FfU1RBUlRfQUREUkVTUyAmJiBsYXN0X2FkZHIgPCBJU0FfRU5EX0FERFJFU1MpCisJCXJldHVybiBwaHlzX3RvX3ZpcnQocGh5c19hZGRyKTsKKworCS8qCisJICogTWFwcGluZ3MgaGF2ZSB0byBiZSBwYWdlLWFsaWduZWQKKwkgKi8KKwlvZmZzZXQgPSBwaHlzX2FkZHIgJiB+UEFHRV9NQVNLOworCXBoeXNfYWRkciAmPSBQQUdFX01BU0s7CisJc2l6ZSA9IFBBR0VfQUxJR04obGFzdF9hZGRyKSAtIHBoeXNfYWRkcjsKKworCS8qCisJICogTWFwcGluZ3MgaGF2ZSB0byBmaXQgaW4gdGhlIEZJWF9CVE1BUCBhcmVhLgorCSAqLworCW5ycGFnZXMgPSBzaXplID4+IFBBR0VfU0hJRlQ7CisJaWYgKG5ycGFnZXMgPiBOUl9GSVhfQlRNQVBTKQorCQlyZXR1cm4gTlVMTDsKKworCS8qCisJICogT2ssIGdvIGZvciBpdC4uCisJICovCisJaWR4ID0gRklYX0JUTUFQX0JFR0lOOworCXdoaWxlIChucnBhZ2VzID4gMCkgeworCQlzZXRfZml4bWFwKGlkeCwgcGh5c19hZGRyKTsKKwkJcGh5c19hZGRyICs9IFBBR0VfU0laRTsKKwkJLS1pZHg7CisJCS0tbnJwYWdlczsKKwl9CisJcmV0dXJuICh2b2lkKikgKG9mZnNldCArIGZpeF90b192aXJ0KEZJWF9CVE1BUF9CRUdJTikpOworfQorCit2b2lkIF9faW5pdCBidF9pb3VubWFwKHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHZpcnRfYWRkcjsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwl1bnNpZ25lZCBpbnQgbnJwYWdlczsKKwllbnVtIGZpeGVkX2FkZHJlc3NlcyBpZHg7CisKKwl2aXJ0X2FkZHIgPSAodW5zaWduZWQgbG9uZylhZGRyOworCWlmICh2aXJ0X2FkZHIgPCBmaXhfdG9fdmlydChGSVhfQlRNQVBfQkVHSU4pKQorCQlyZXR1cm47CisJb2Zmc2V0ID0gdmlydF9hZGRyICYgflBBR0VfTUFTSzsKKwlucnBhZ2VzID0gUEFHRV9BTElHTihvZmZzZXQgKyBzaXplIC0gMSkgPj4gUEFHRV9TSElGVDsKKworCWlkeCA9IEZJWF9CVE1BUF9CRUdJTjsKKwl3aGlsZSAobnJwYWdlcyA+IDApIHsKKwkJY2xlYXJfZml4bWFwKGlkeCk7CisJCS0taWR4OworCQktLW5ycGFnZXM7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21tL21tYXAuYyBiL2FyY2gvaTM4Ni9tbS9tbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ3MzBhMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tbS9tbWFwLmMKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqICBsaW51eC9hcmNoL2kzODYvbW0vbW1hcC5jCisgKgorICogIGZsZXhpYmxlIG1tYXAgbGF5b3V0IHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA0IFJlZCBIYXQgSW5jLiwgRHVyaGFtLCBOb3J0aCBDYXJvbGluYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqCisgKiBTdGFydGVkIGJ5IEluZ28gTW9sbmFyIDxtaW5nb0BlbHRlLmh1PgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wZXJzb25hbGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisKKy8qCisgKiBUb3Agb2YgbW1hcCBhcmVhIChqdXN0IGJlbG93IHRoZSBwcm9jZXNzIHN0YWNrKS4KKyAqCisgKiBMZWF2ZSBhbiBhdCBsZWFzdCB+MTI4IE1CIGhvbGUuCisgKi8KKyNkZWZpbmUgTUlOX0dBUCAoMTI4KjEwMjQqMTAyNCkKKyNkZWZpbmUgTUFYX0dBUCAoVEFTS19TSVpFLzYqNSkKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG1tYXBfYmFzZShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwl1bnNpZ25lZCBsb25nIGdhcCA9IGN1cnJlbnQtPnNpZ25hbC0+cmxpbVtSTElNSVRfU1RBQ0tdLnJsaW1fY3VyOworCXVuc2lnbmVkIGxvbmcgcmFuZG9tX2ZhY3RvciA9IDA7CisKKwlpZiAoY3VycmVudC0+ZmxhZ3MgJiBQRl9SQU5ET01JWkUpCisJCXJhbmRvbV9mYWN0b3IgPSBnZXRfcmFuZG9tX2ludCgpICUgKDEwMjQqMTAyNCk7CisKKwlpZiAoZ2FwIDwgTUlOX0dBUCkKKwkJZ2FwID0gTUlOX0dBUDsKKwllbHNlIGlmIChnYXAgPiBNQVhfR0FQKQorCQlnYXAgPSBNQVhfR0FQOworCisJcmV0dXJuIFBBR0VfQUxJR04oVEFTS19TSVpFIC0gZ2FwIC0gcmFuZG9tX2ZhY3Rvcik7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uLCBjYWxsZWQgdmVyeSBlYXJseSBkdXJpbmcgdGhlIGNyZWF0aW9uIG9mIGEgbmV3CisgKiBwcm9jZXNzIFZNIGltYWdlLCBzZXRzIHVwIHdoaWNoIFZNIGxheW91dCBmdW5jdGlvbiB0byB1c2U6CisgKi8KK3ZvaWQgYXJjaF9waWNrX21tYXBfbGF5b3V0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCS8qCisJICogRmFsbCBiYWNrIHRvIHRoZSBzdGFuZGFyZCBsYXlvdXQgaWYgdGhlIHBlcnNvbmFsaXR5CisJICogYml0IGlzIHNldCwgb3IgaWYgdGhlIGV4cGVjdGVkIHN0YWNrIGdyb3d0aCBpcyB1bmxpbWl0ZWQ6CisJICovCisJaWYgKHN5c2N0bF9sZWdhY3lfdmFfbGF5b3V0IHx8CisJCQkoY3VycmVudC0+cGVyc29uYWxpdHkgJiBBRERSX0NPTVBBVF9MQVlPVVQpIHx8CisJCQljdXJyZW50LT5zaWduYWwtPnJsaW1bUkxJTUlUX1NUQUNLXS5ybGltX2N1ciA9PSBSTElNX0lORklOSVRZKSB7CisJCW1tLT5tbWFwX2Jhc2UgPSBUQVNLX1VOTUFQUEVEX0JBU0U7CisJCW1tLT5nZXRfdW5tYXBwZWRfYXJlYSA9IGFyY2hfZ2V0X3VubWFwcGVkX2FyZWE7CisJCW1tLT51bm1hcF9hcmVhID0gYXJjaF91bm1hcF9hcmVhOworCX0gZWxzZSB7CisJCW1tLT5tbWFwX2Jhc2UgPSBtbWFwX2Jhc2UobW0pOworCQltbS0+Z2V0X3VubWFwcGVkX2FyZWEgPSBhcmNoX2dldF91bm1hcHBlZF9hcmVhX3RvcGRvd247CisJCW1tLT51bm1hcF9hcmVhID0gYXJjaF91bm1hcF9hcmVhX3RvcGRvd247CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21tL3BhZ2VhdHRyLmMgYi9hcmNoL2kzODYvbW0vcGFnZWF0dHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjNkYTZiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21tL3BhZ2VhdHRyLmMKQEAgLTAsMCArMSwyMjEgQEAKKy8qIAorICogQ29weXJpZ2h0IDIwMDIgQW5kaSBLbGVlbiwgU3VTRSBMYWJzLiAKKyAqIFRoYW5rcyB0byBCZW4gTGFIYWlzZSBmb3IgcHJlY2lvdXMgZmVlZGJhY2suCisgKi8gCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKworc3RhdGljIERFRklORV9TUElOTE9DSyhjcGFfbG9jayk7CitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBkZl9saXN0ID0gTElTVF9IRUFEX0lOSVQoZGZfbGlzdCk7CisKKworcHRlX3QgKmxvb2t1cF9hZGRyZXNzKHVuc2lnbmVkIGxvbmcgYWRkcmVzcykgCit7IAorCXBnZF90ICpwZ2QgPSBwZ2Rfb2Zmc2V0X2soYWRkcmVzcyk7CisJcHVkX3QgKnB1ZDsKKwlwbWRfdCAqcG1kOworCWlmIChwZ2Rfbm9uZSgqcGdkKSkKKwkJcmV0dXJuIE5VTEw7CisJcHVkID0gcHVkX29mZnNldChwZ2QsIGFkZHJlc3MpOworCWlmIChwdWRfbm9uZSgqcHVkKSkKKwkJcmV0dXJuIE5VTEw7CisJcG1kID0gcG1kX29mZnNldChwdWQsIGFkZHJlc3MpOworCWlmIChwbWRfbm9uZSgqcG1kKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKHBtZF9sYXJnZSgqcG1kKSkKKwkJcmV0dXJuIChwdGVfdCAqKXBtZDsKKyAgICAgICAgcmV0dXJuIHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwgYWRkcmVzcyk7Cit9IAorCitzdGF0aWMgc3RydWN0IHBhZ2UgKnNwbGl0X2xhcmdlX3BhZ2UodW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwZ3Byb3RfdCBwcm90KQoreyAKKwlpbnQgaTsgCisJdW5zaWduZWQgbG9uZyBhZGRyOworCXN0cnVjdCBwYWdlICpiYXNlOworCXB0ZV90ICpwYmFzZTsKKworCXNwaW5fdW5sb2NrX2lycSgmY3BhX2xvY2spOworCWJhc2UgPSBhbGxvY19wYWdlcyhHRlBfS0VSTkVMLCAwKTsKKwlzcGluX2xvY2tfaXJxKCZjcGFfbG9jayk7CisJaWYgKCFiYXNlKSAKKwkJcmV0dXJuIE5VTEw7CisKKwlhZGRyZXNzID0gX19wYShhZGRyZXNzKTsKKwlhZGRyID0gYWRkcmVzcyAmIExBUkdFX1BBR0VfTUFTSzsgCisJcGJhc2UgPSAocHRlX3QgKilwYWdlX2FkZHJlc3MoYmFzZSk7CisJZm9yIChpID0gMDsgaSA8IFBUUlNfUEVSX1BURTsgaSsrLCBhZGRyICs9IFBBR0VfU0laRSkgeworCQlwYmFzZVtpXSA9IHBmbl9wdGUoYWRkciA+PiBQQUdFX1NISUZULCAKKwkJCQkgICBhZGRyID09IGFkZHJlc3MgPyBwcm90IDogUEFHRV9LRVJORUwpOworCX0KKwlyZXR1cm4gYmFzZTsKK30gCisKK3N0YXRpYyB2b2lkIGZsdXNoX2tlcm5lbF9tYXAodm9pZCAqZHVtbXkpIAoreyAKKwkvKiBDb3VsZCB1c2UgQ0xGTFVTSCBoZXJlIGlmIHRoZSBDUFUgc3VwcG9ydHMgaXQgKEhhbW1lcixQNCkgKi8KKwlpZiAoYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPj0gNCkgCisJCWFzbSB2b2xhdGlsZSgid2JpbnZkIjo6OiJtZW1vcnkiKTsgCisJLyogRmx1c2ggYWxsIHRvIHdvcmsgYXJvdW5kIEVycmF0YSBpbiBlYXJseSBhdGhsb25zIHJlZ2FyZGluZyAKKwkgKiBsYXJnZSBwYWdlIGZsdXNoaW5nLiAKKwkgKi8KKwlfX2ZsdXNoX3RsYl9hbGwoKTsgCQorfQorCitzdGF0aWMgdm9pZCBzZXRfcG1kX3B0ZShwdGVfdCAqa3B0ZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdGVfdCBwdGUpIAoreyAKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc2V0X3B0ZV9hdG9taWMoa3B0ZSwgcHRlKTsgCS8qIGNoYW5nZSBpbml0X21tICovCisJaWYgKFBUUlNfUEVSX1BNRCA+IDEpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZ2RfbG9jaywgZmxhZ3MpOworCWZvciAocGFnZSA9IHBnZF9saXN0OyBwYWdlOyBwYWdlID0gKHN0cnVjdCBwYWdlICopcGFnZS0+aW5kZXgpIHsKKwkJcGdkX3QgKnBnZDsKKwkJcHVkX3QgKnB1ZDsKKwkJcG1kX3QgKnBtZDsKKwkJcGdkID0gKHBnZF90ICopcGFnZV9hZGRyZXNzKHBhZ2UpICsgcGdkX2luZGV4KGFkZHJlc3MpOworCQlwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgYWRkcmVzcyk7CisJCXBtZCA9IHBtZF9vZmZzZXQocHVkLCBhZGRyZXNzKTsKKwkJc2V0X3B0ZV9hdG9taWMoKHB0ZV90ICopcG1kLCBwdGUpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZ2RfbG9jaywgZmxhZ3MpOworfQorCisvKiAKKyAqIE5vIG1vcmUgc3BlY2lhbCBwcm90ZWN0aW9ucyBpbiB0aGlzIDIvNE1CIGFyZWEgLSByZXZlcnQgdG8gYQorICogbGFyZ2UgcGFnZSBhZ2Fpbi4gCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByZXZlcnRfcGFnZShzdHJ1Y3QgcGFnZSAqa3B0ZV9wYWdlLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCit7CisJcHRlX3QgKmxpbmVhciA9IChwdGVfdCAqKSAKKwkJcG1kX29mZnNldChwdWRfb2Zmc2V0KHBnZF9vZmZzZXRfayhhZGRyZXNzKSwgYWRkcmVzcyksIGFkZHJlc3MpOworCXNldF9wbWRfcHRlKGxpbmVhciwgIGFkZHJlc3MsCisJCSAgICBwZm5fcHRlKChfX3BhKGFkZHJlc3MpICYgTEFSR0VfUEFHRV9NQVNLKSA+PiBQQUdFX1NISUZULAorCQkJICAgIFBBR0VfS0VSTkVMX0xBUkdFKSk7Cit9CisKK3N0YXRpYyBpbnQKK19fY2hhbmdlX3BhZ2VfYXR0cihzdHJ1Y3QgcGFnZSAqcGFnZSwgcGdwcm90X3QgcHJvdCkKK3sgCisJcHRlX3QgKmtwdGU7IAorCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKKwlzdHJ1Y3QgcGFnZSAqa3B0ZV9wYWdlOworCisJQlVHX09OKFBhZ2VIaWdoTWVtKHBhZ2UpKTsKKwlhZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyZXNzKHBhZ2UpOworCisJa3B0ZSA9IGxvb2t1cF9hZGRyZXNzKGFkZHJlc3MpOworCWlmICgha3B0ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJa3B0ZV9wYWdlID0gdmlydF90b19wYWdlKGtwdGUpOworCWlmIChwZ3Byb3RfdmFsKHByb3QpICE9IHBncHJvdF92YWwoUEFHRV9LRVJORUwpKSB7IAorCQlpZiAoKHB0ZV92YWwoKmtwdGUpICYgX1BBR0VfUFNFKSA9PSAwKSB7IAorCQkJc2V0X3B0ZV9hdG9taWMoa3B0ZSwgbWtfcHRlKHBhZ2UsIHByb3QpKTsgCisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgcGFnZSAqc3BsaXQgPSBzcGxpdF9sYXJnZV9wYWdlKGFkZHJlc3MsIHByb3QpOyAKKwkJCWlmICghc3BsaXQpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQlzZXRfcG1kX3B0ZShrcHRlLGFkZHJlc3MsbWtfcHRlKHNwbGl0LCBQQUdFX0tFUk5FTCkpOworCQkJa3B0ZV9wYWdlID0gc3BsaXQ7CisJCX0JCisJCWdldF9wYWdlKGtwdGVfcGFnZSk7CisJfSBlbHNlIGlmICgocHRlX3ZhbCgqa3B0ZSkgJiBfUEFHRV9QU0UpID09IDApIHsgCisJCXNldF9wdGVfYXRvbWljKGtwdGUsIG1rX3B0ZShwYWdlLCBQQUdFX0tFUk5FTCkpOworCQlfX3B1dF9wYWdlKGtwdGVfcGFnZSk7CisJfSBlbHNlCisJCUJVRygpOworCisJLyoKKwkgKiBJZiB0aGUgcHRlIHdhcyByZXNlcnZlZCwgaXQgbWVhbnMgaXQgd2FzIGNyZWF0ZWQgYXQgYm9vdAorCSAqIHRpbWUgKG5vdCB2aWEgc3BsaXRfbGFyZ2VfcGFnZSkgYW5kIGluIHR1cm4gd2UgbXVzdCBub3QKKwkgKiByZXBsYWNlIGl0IHdpdGggYSBsYXJnZXBhZ2UuCisJICovCisJaWYgKCFQYWdlUmVzZXJ2ZWQoa3B0ZV9wYWdlKSkgeworCQkvKiBtZW1sZWFrIGFuZCBwb3RlbnRpYWwgZmFpbGVkIDJNIHBhZ2UgcmVnZW5lcmF0aW9uICovCisJCUJVR19PTighcGFnZV9jb3VudChrcHRlX3BhZ2UpKTsKKworCQlpZiAoY3B1X2hhc19wc2UgJiYgKHBhZ2VfY291bnQoa3B0ZV9wYWdlKSA9PSAxKSkgeworCQkJbGlzdF9hZGQoJmtwdGVfcGFnZS0+bHJ1LCAmZGZfbGlzdCk7CisJCQlyZXZlcnRfcGFnZShrcHRlX3BhZ2UsIGFkZHJlc3MpOworCQl9CisJfQorCXJldHVybiAwOworfSAKKworc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX21hcCh2b2lkKQoreworCW9uX2VhY2hfY3B1KGZsdXNoX2tlcm5lbF9tYXAsIE5VTEwsIDEsIDEpOworfQorCisvKgorICogQ2hhbmdlIHRoZSBwYWdlIGF0dHJpYnV0ZXMgb2YgYW4gcGFnZSBpbiB0aGUgbGluZWFyIG1hcHBpbmcuCisgKgorICogVGhpcyBzaG91bGQgYmUgdXNlZCB3aGVuIGEgcGFnZSBpcyBtYXBwZWQgd2l0aCBhIGRpZmZlcmVudCBjYWNoaW5nIHBvbGljeQorICogdGhhbiB3cml0ZS1iYWNrIHNvbWV3aGVyZSAtIHNvbWUgQ1BVcyBkbyBub3QgbGlrZSBpdCB3aGVuIG1hcHBpbmdzIHdpdGgKKyAqIGRpZmZlcmVudCBjYWNoaW5nIHBvbGljaWVzIGV4aXN0LiBUaGlzIGNoYW5nZXMgdGhlIHBhZ2UgYXR0cmlidXRlcyBvZiB0aGUKKyAqIGluIGtlcm5lbCBsaW5lYXIgbWFwcGluZyB0b28uCisgKiAKKyAqIFRoZSBjYWxsZXIgbmVlZHMgdG8gZW5zdXJlIHRoYXQgdGhlcmUgYXJlIG5vIGNvbmZsaWN0aW5nIG1hcHBpbmdzIGVsc2V3aGVyZS4KKyAqIFRoaXMgZnVuY3Rpb24gb25seSBkZWFscyB3aXRoIHRoZSBrZXJuZWwgbGluZWFyIG1hcC4KKyAqIAorICogQ2FsbGVyIG11c3QgY2FsbCBnbG9iYWxfZmx1c2hfdGxiKCkgYWZ0ZXIgdGhpcy4KKyAqLworaW50IGNoYW5nZV9wYWdlX2F0dHIoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBudW1wYWdlcywgcGdwcm90X3QgcHJvdCkKK3sKKwlpbnQgZXJyID0gMDsgCisJaW50IGk7IAorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY3BhX2xvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtcGFnZXM7IGkrKywgcGFnZSsrKSB7IAorCQllcnIgPSBfX2NoYW5nZV9wYWdlX2F0dHIocGFnZSwgcHJvdCk7CisJCWlmIChlcnIpIAorCQkJYnJlYWs7IAorCX0gCQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNwYV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIGVycjsKK30KKwordm9pZCBnbG9iYWxfZmx1c2hfdGxiKHZvaWQpCit7IAorCUxJU1RfSEVBRChsKTsKKwlzdHJ1Y3QgcGFnZSAqcGcsICpuZXh0OworCisJQlVHX09OKGlycXNfZGlzYWJsZWQoKSk7CisKKwlzcGluX2xvY2tfaXJxKCZjcGFfbG9jayk7CisJbGlzdF9zcGxpY2VfaW5pdCgmZGZfbGlzdCwgJmwpOworCXNwaW5fdW5sb2NrX2lycSgmY3BhX2xvY2spOworCWZsdXNoX21hcCgpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwZywgbmV4dCwgJmwsIGxydSkKKwkJX19mcmVlX3BhZ2UocGcpOworfSAKKworI2lmZGVmIENPTkZJR19ERUJVR19QQUdFQUxMT0MKK3ZvaWQga2VybmVsX21hcF9wYWdlcyhzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG51bXBhZ2VzLCBpbnQgZW5hYmxlKQoreworCWlmIChQYWdlSGlnaE1lbShwYWdlKSkKKwkJcmV0dXJuOworCS8qIHRoZSByZXR1cm4gdmFsdWUgaXMgaWdub3JlZCAtIHRoZSBjYWxscyBjYW5ub3QgZmFpbCwKKwkgKiBsYXJnZSBwYWdlcyBhcmUgZGlzYWJsZWQgYXQgYm9vdCB0aW1lLgorCSAqLworCWNoYW5nZV9wYWdlX2F0dHIocGFnZSwgbnVtcGFnZXMsIGVuYWJsZSA/IFBBR0VfS0VSTkVMIDogX19wZ3Byb3QoMCkpOworCS8qIHdlIHNob3VsZCBwZXJmb3JtIGFuIElQSSBhbmQgZmx1c2ggYWxsIHRsYnMsCisJICogYnV0IHRoYXQgY2FuIGRlYWRsb2NrLT5mbHVzaCBvbmx5IGN1cnJlbnQgY3B1LgorCSAqLworCV9fZmx1c2hfdGxiX2FsbCgpOworfQorI2VuZGlmCisKK0VYUE9SVF9TWU1CT0woY2hhbmdlX3BhZ2VfYXR0cik7CitFWFBPUlRfU1lNQk9MKGdsb2JhbF9mbHVzaF90bGIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21tL3BndGFibGUuYyBiL2FyY2gvaTM4Ni9tbS9wZ3RhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc0MmQ1NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tbS9wZ3RhYmxlLmMKQEAgLTAsMCArMSwyNjAgQEAKKy8qCisgKiAgbGludXgvYXJjaC9pMzg2L21tL3BndGFibGUuYworICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CisjaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgorI2luY2x1ZGUgPGFzbS9lODIwLmg+CisjaW5jbHVkZSA8YXNtL3RsYi5oPgorI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorCit2b2lkIHNob3dfbWVtKHZvaWQpCit7CisJaW50IHRvdGFsID0gMCwgcmVzZXJ2ZWQgPSAwOworCWludCBzaGFyZWQgPSAwLCBjYWNoZWQgPSAwOworCWludCBoaWdobWVtID0gMDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlwZ19kYXRhX3QgKnBnZGF0OworCXVuc2lnbmVkIGxvbmcgaTsKKworCXByaW50aygiTWVtLWluZm86XG4iKTsKKwlzaG93X2ZyZWVfYXJlYXMoKTsKKwlwcmludGsoIkZyZWUgc3dhcDogICAgICAgJTZsZGtCXG4iLCBucl9zd2FwX3BhZ2VzPDwoUEFHRV9TSElGVC0xMCkpOworCWZvcl9lYWNoX3BnZGF0KHBnZGF0KSB7CisJCWZvciAoaSA9IDA7IGkgPCBwZ2RhdC0+bm9kZV9zcGFubmVkX3BhZ2VzOyArK2kpIHsKKwkJCXBhZ2UgPSBwZ2RhdC0+bm9kZV9tZW1fbWFwICsgaTsKKwkJCXRvdGFsKys7CisJCQlpZiAoUGFnZUhpZ2hNZW0ocGFnZSkpCisJCQkJaGlnaG1lbSsrOworCQkJaWYgKFBhZ2VSZXNlcnZlZChwYWdlKSkKKwkJCQlyZXNlcnZlZCsrOworCQkJZWxzZSBpZiAoUGFnZVN3YXBDYWNoZShwYWdlKSkKKwkJCQljYWNoZWQrKzsKKwkJCWVsc2UgaWYgKHBhZ2VfY291bnQocGFnZSkpCisJCQkJc2hhcmVkICs9IHBhZ2VfY291bnQocGFnZSkgLSAxOworCQl9CisJfQorCXByaW50aygiJWQgcGFnZXMgb2YgUkFNXG4iLCB0b3RhbCk7CisJcHJpbnRrKCIlZCBwYWdlcyBvZiBISUdITUVNXG4iLGhpZ2htZW0pOworCXByaW50aygiJWQgcmVzZXJ2ZWQgcGFnZXNcbiIscmVzZXJ2ZWQpOworCXByaW50aygiJWQgcGFnZXMgc2hhcmVkXG4iLHNoYXJlZCk7CisJcHJpbnRrKCIlZCBwYWdlcyBzd2FwIGNhY2hlZFxuIixjYWNoZWQpOworfQorCisvKgorICogQXNzb2NpYXRlIGEgdmlydHVhbCBwYWdlIGZyYW1lIHdpdGggYSBnaXZlbiBwaHlzaWNhbCBwYWdlIGZyYW1lIAorICogYW5kIHByb3RlY3Rpb24gZmxhZ3MgZm9yIHRoYXQgZnJhbWUuCisgKi8gCitzdGF0aWMgdm9pZCBzZXRfcHRlX3Bmbih1bnNpZ25lZCBsb25nIHZhZGRyLCB1bnNpZ25lZCBsb25nIHBmbiwgcGdwcm90X3QgZmxhZ3MpCit7CisJcGdkX3QgKnBnZDsKKwlwdWRfdCAqcHVkOworCXBtZF90ICpwbWQ7CisJcHRlX3QgKnB0ZTsKKworCXBnZCA9IHN3YXBwZXJfcGdfZGlyICsgcGdkX2luZGV4KHZhZGRyKTsKKwlpZiAocGdkX25vbmUoKnBnZCkpIHsKKwkJQlVHKCk7CisJCXJldHVybjsKKwl9CisJcHVkID0gcHVkX29mZnNldChwZ2QsIHZhZGRyKTsKKwlpZiAocHVkX25vbmUoKnB1ZCkpIHsKKwkJQlVHKCk7CisJCXJldHVybjsKKwl9CisJcG1kID0gcG1kX29mZnNldChwdWQsIHZhZGRyKTsKKwlpZiAocG1kX25vbmUoKnBtZCkpIHsKKwkJQlVHKCk7CisJCXJldHVybjsKKwl9CisJcHRlID0gcHRlX29mZnNldF9rZXJuZWwocG1kLCB2YWRkcik7CisJLyogPHBmbixmbGFncz4gc3RvcmVkIGFzLWlzLCB0byBwZXJtaXQgY2xlYXJpbmcgZW50cmllcyAqLworCXNldF9wdGUocHRlLCBwZm5fcHRlKHBmbiwgZmxhZ3MpKTsKKworCS8qCisJICogSXQncyBlbm91Z2ggdG8gZmx1c2ggdGhpcyBvbmUgbWFwcGluZy4KKwkgKiAoUEdFIG1hcHBpbmdzIGdldCBmbHVzaGVkIGFzIHdlbGwpCisJICovCisJX19mbHVzaF90bGJfb25lKHZhZGRyKTsKK30KKworLyoKKyAqIEFzc29jaWF0ZSBhIGxhcmdlIHZpcnR1YWwgcGFnZSBmcmFtZSB3aXRoIGEgZ2l2ZW4gcGh5c2ljYWwgcGFnZSBmcmFtZSAKKyAqIGFuZCBwcm90ZWN0aW9uIGZsYWdzIGZvciB0aGF0IGZyYW1lLiBwZm4gaXMgZm9yIHRoZSBiYXNlIG9mIHRoZSBwYWdlLAorICogdmFkZHIgaXMgd2hhdCB0aGUgcGFnZSBnZXRzIG1hcHBlZCB0byAtIGJvdGggbXVzdCBiZSBwcm9wZXJseSBhbGlnbmVkLiAKKyAqIFRoZSBwbWQgbXVzdCBhbHJlYWR5IGJlIGluc3RhbnRpYXRlZC4gQXNzdW1lcyBQQUUgbW9kZS4KKyAqLyAKK3ZvaWQgc2V0X3BtZF9wZm4odW5zaWduZWQgbG9uZyB2YWRkciwgdW5zaWduZWQgbG9uZyBwZm4sIHBncHJvdF90IGZsYWdzKQoreworCXBnZF90ICpwZ2Q7CisJcHVkX3QgKnB1ZDsKKwlwbWRfdCAqcG1kOworCisJaWYgKHZhZGRyICYgKFBNRF9TSVpFLTEpKSB7CQkvKiB2YWRkciBpcyBtaXNhbGlnbmVkICovCisJCXByaW50ayAoInNldF9wbWRfcGZuOiB2YWRkciBtaXNhbGlnbmVkXG4iKTsKKwkJcmV0dXJuOyAvKiBCVUcoKTsgKi8KKwl9CisJaWYgKHBmbiAmIChQVFJTX1BFUl9QVEUtMSkpIHsJCS8qIHBmbiBpcyBtaXNhbGlnbmVkICovCisJCXByaW50ayAoInNldF9wbWRfcGZuOiBwZm4gbWlzYWxpZ25lZFxuIik7CisJCXJldHVybjsgLyogQlVHKCk7ICovCisJfQorCXBnZCA9IHN3YXBwZXJfcGdfZGlyICsgcGdkX2luZGV4KHZhZGRyKTsKKwlpZiAocGdkX25vbmUoKnBnZCkpIHsKKwkJcHJpbnRrICgic2V0X3BtZF9wZm46IHBnZF9ub25lXG4iKTsKKwkJcmV0dXJuOyAvKiBCVUcoKTsgKi8KKwl9CisJcHVkID0gcHVkX29mZnNldChwZ2QsIHZhZGRyKTsKKwlwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgdmFkZHIpOworCXNldF9wbWQocG1kLCBwZm5fcG1kKHBmbiwgZmxhZ3MpKTsKKwkvKgorCSAqIEl0J3MgZW5vdWdoIHRvIGZsdXNoIHRoaXMgb25lIG1hcHBpbmcuCisJICogKFBHRSBtYXBwaW5ncyBnZXQgZmx1c2hlZCBhcyB3ZWxsKQorCSAqLworCV9fZmx1c2hfdGxiX29uZSh2YWRkcik7Cit9CisKK3ZvaWQgX19zZXRfZml4bWFwIChlbnVtIGZpeGVkX2FkZHJlc3NlcyBpZHgsIHVuc2lnbmVkIGxvbmcgcGh5cywgcGdwcm90X3QgZmxhZ3MpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gX19maXhfdG9fdmlydChpZHgpOworCisJaWYgKGlkeCA+PSBfX2VuZF9vZl9maXhlZF9hZGRyZXNzZXMpIHsKKwkJQlVHKCk7CisJCXJldHVybjsKKwl9CisJc2V0X3B0ZV9wZm4oYWRkcmVzcywgcGh5cyA+PiBQQUdFX1NISUZULCBmbGFncyk7Cit9CisKK3B0ZV90ICpwdGVfYWxsb2Nfb25lX2tlcm5lbChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworCXJldHVybiAocHRlX3QgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTHxfX0dGUF9SRVBFQVR8X19HRlBfWkVSTyk7Cit9CisKK3N0cnVjdCBwYWdlICpwdGVfYWxsb2Nfb25lKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCit7CisJc3RydWN0IHBhZ2UgKnB0ZTsKKworI2lmZGVmIENPTkZJR19ISUdIUFRFCisJcHRlID0gYWxsb2NfcGFnZXMoR0ZQX0tFUk5FTHxfX0dGUF9ISUdITUVNfF9fR0ZQX1JFUEVBVHxfX0dGUF9aRVJPLCAwKTsKKyNlbHNlCisJcHRlID0gYWxsb2NfcGFnZXMoR0ZQX0tFUk5FTHxfX0dGUF9SRVBFQVR8X19HRlBfWkVSTywgMCk7CisjZW5kaWYKKwlyZXR1cm4gcHRlOworfQorCit2b2lkIHBtZF9jdG9yKHZvaWQgKnBtZCwga21lbV9jYWNoZV90ICpjYWNoZSwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwltZW1zZXQocG1kLCAwLCBQVFJTX1BFUl9QTUQqc2l6ZW9mKHBtZF90KSk7Cit9CisKKy8qCisgKiBMaXN0IG9mIGFsbCBwZ2QncyBuZWVkZWQgZm9yIG5vbi1QQUUgc28gaXQgY2FuIGludmFsaWRhdGUgZW50cmllcworICogaW4gYm90aCBjYWNoZWQgYW5kIHVuY2FjaGVkIHBnZCdzOyBub3QgbmVlZGVkIGZvciBQQUUgc2luY2UgdGhlCisgKiBrZXJuZWwgcG1kIGlzIHNoYXJlZC4gSWYgUEFFIHdlcmUgbm90IHRvIHNoYXJlIHRoZSBwbWQgYSBzaW1pbGFyCisgKiB0YWN0aWMgd291bGQgYmUgbmVlZGVkLiBUaGlzIGlzIGVzc2VudGlhbGx5IGNvZGVwYXRoLWJhc2VkIGxvY2tpbmcKKyAqIGFnYWluc3QgcGFnZWF0dHIuYzsgaXQgaXMgdGhlIHVuaXF1ZSBjYXNlIGluIHdoaWNoIGEgdmFsaWQgY2hhbmdlCisgKiBvZiBrZXJuZWwgcGFnZXRhYmxlcyBjYW4ndCBiZSBsYXppbHkgc3luY2hyb25pemVkIGJ5IHZtYWxsb2MgZmF1bHRzLgorICogdm1hbGxvYyBmYXVsdHMgd29yayBiZWNhdXNlIGF0dGFjaGVkIHBhZ2V0YWJsZXMgYXJlIG5ldmVyIGZyZWVkLgorICogVGhlIGxvY2tpbmcgc2NoZW1lIHdhcyBjaG9zZW4gb24gdGhlIGJhc2lzIG9mIG1hbmZyZWQncworICogcmVjb21tZW5kYXRpb25zIGFuZCBoYXZpbmcgbm8gY29yZSBpbXBhY3Qgd2hhdHNvZXZlci4KKyAqIC0tIHdsaQorICovCitERUZJTkVfU1BJTkxPQ0socGdkX2xvY2spOworc3RydWN0IHBhZ2UgKnBnZF9saXN0OworCitzdGF0aWMgaW5saW5lIHZvaWQgcGdkX2xpc3RfYWRkKHBnZF90ICpwZ2QpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSB2aXJ0X3RvX3BhZ2UocGdkKTsKKwlwYWdlLT5pbmRleCA9ICh1bnNpZ25lZCBsb25nKXBnZF9saXN0OworCWlmIChwZ2RfbGlzdCkKKwkJcGdkX2xpc3QtPnByaXZhdGUgPSAodW5zaWduZWQgbG9uZykmcGFnZS0+aW5kZXg7CisJcGdkX2xpc3QgPSBwYWdlOworCXBhZ2UtPnByaXZhdGUgPSAodW5zaWduZWQgbG9uZykmcGdkX2xpc3Q7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwZ2RfbGlzdF9kZWwocGdkX3QgKnBnZCkKK3sKKwlzdHJ1Y3QgcGFnZSAqbmV4dCwgKipwcHJldiwgKnBhZ2UgPSB2aXJ0X3RvX3BhZ2UocGdkKTsKKwluZXh0ID0gKHN0cnVjdCBwYWdlICopcGFnZS0+aW5kZXg7CisJcHByZXYgPSAoc3RydWN0IHBhZ2UgKiopcGFnZS0+cHJpdmF0ZTsKKwkqcHByZXYgPSBuZXh0OworCWlmIChuZXh0KQorCQluZXh0LT5wcml2YXRlID0gKHVuc2lnbmVkIGxvbmcpcHByZXY7Cit9CisKK3ZvaWQgcGdkX2N0b3Iodm9pZCAqcGdkLCBrbWVtX2NhY2hlX3QgKmNhY2hlLCB1bnNpZ25lZCBsb25nIHVudXNlZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKFBUUlNfUEVSX1BNRCA9PSAxKQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGdkX2xvY2ssIGZsYWdzKTsKKworCW1lbWNweSgocGdkX3QgKilwZ2QgKyBVU0VSX1BUUlNfUEVSX1BHRCwKKwkJCXN3YXBwZXJfcGdfZGlyICsgVVNFUl9QVFJTX1BFUl9QR0QsCisJCQkoUFRSU19QRVJfUEdEIC0gVVNFUl9QVFJTX1BFUl9QR0QpICogc2l6ZW9mKHBnZF90KSk7CisKKwlpZiAoUFRSU19QRVJfUE1EID4gMSkKKwkJcmV0dXJuOworCisJcGdkX2xpc3RfYWRkKHBnZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGdkX2xvY2ssIGZsYWdzKTsKKwltZW1zZXQocGdkLCAwLCBVU0VSX1BUUlNfUEVSX1BHRCpzaXplb2YocGdkX3QpKTsKK30KKworLyogbmV2ZXIgY2FsbGVkIHdoZW4gUFRSU19QRVJfUE1EID4gMSAqLwordm9pZCBwZ2RfZHRvcih2b2lkICpwZ2QsIGttZW1fY2FjaGVfdCAqY2FjaGUsIHVuc2lnbmVkIGxvbmcgdW51c2VkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7IC8qIGNhbiBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dCAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBnZF9sb2NrLCBmbGFncyk7CisJcGdkX2xpc3RfZGVsKHBnZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGdkX2xvY2ssIGZsYWdzKTsKK30KKworcGdkX3QgKnBnZF9hbGxvYyhzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlpbnQgaTsKKwlwZ2RfdCAqcGdkID0ga21lbV9jYWNoZV9hbGxvYyhwZ2RfY2FjaGUsIEdGUF9LRVJORUwpOworCisJaWYgKFBUUlNfUEVSX1BNRCA9PSAxIHx8ICFwZ2QpCisJCXJldHVybiBwZ2Q7CisKKwlmb3IgKGkgPSAwOyBpIDwgVVNFUl9QVFJTX1BFUl9QR0Q7ICsraSkgeworCQlwbWRfdCAqcG1kID0ga21lbV9jYWNoZV9hbGxvYyhwbWRfY2FjaGUsIEdGUF9LRVJORUwpOworCQlpZiAoIXBtZCkKKwkJCWdvdG8gb3V0X29vbTsKKwkJc2V0X3BnZCgmcGdkW2ldLCBfX3BnZCgxICsgX19wYShwbWQpKSk7CisJfQorCXJldHVybiBwZ2Q7CisKK291dF9vb206CisJZm9yIChpLS07IGkgPj0gMDsgaS0tKQorCQlrbWVtX2NhY2hlX2ZyZWUocG1kX2NhY2hlLCAodm9pZCAqKV9fdmEocGdkX3ZhbChwZ2RbaV0pLTEpKTsKKwlrbWVtX2NhY2hlX2ZyZWUocGdkX2NhY2hlLCBwZ2QpOworCXJldHVybiBOVUxMOworfQorCit2b2lkIHBnZF9mcmVlKHBnZF90ICpwZ2QpCit7CisJaW50IGk7CisKKwkvKiBpbiB0aGUgUEFFIGNhc2UgdXNlciBwZ2QgZW50cmllcyBhcmUgb3ZlcndyaXR0ZW4gYmVmb3JlIHVzYWdlICovCisJaWYgKFBUUlNfUEVSX1BNRCA+IDEpCisJCWZvciAoaSA9IDA7IGkgPCBVU0VSX1BUUlNfUEVSX1BHRDsgKytpKQorCQkJa21lbV9jYWNoZV9mcmVlKHBtZF9jYWNoZSwgKHZvaWQgKilfX3ZhKHBnZF92YWwocGdkW2ldKS0xKSk7CisJLyogaW4gdGhlIG5vbi1QQUUgY2FzZSwgY2xlYXJfcGFnZV9yYW5nZSgpIGNsZWFycyB1c2VyIHBnZCBlbnRyaWVzICovCisJa21lbV9jYWNoZV9mcmVlKHBnZF9jYWNoZSwgcGdkKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9vcHJvZmlsZS9LY29uZmlnIGIvYXJjaC9pMzg2L29wcm9maWxlL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFkZTE5OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9vcHJvZmlsZS9LY29uZmlnCkBAIC0wLDAgKzEsMjMgQEAKKworbWVudSAiUHJvZmlsaW5nIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKworY29uZmlnIFBST0ZJTElORworCWJvb2wgIlByb2ZpbGluZyBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHRoZSBleHRlbmRlZCBwcm9maWxpbmcgc3VwcG9ydCBtZWNoYW5pc21zIHVzZWQKKwkgIGJ5IHByb2ZpbGVycyBzdWNoIGFzIE9Qcm9maWxlLgorCSAgCisKK2NvbmZpZyBPUFJPRklMRQorCXRyaXN0YXRlICJPUHJvZmlsZSBzeXN0ZW0gcHJvZmlsaW5nIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gUFJPRklMSU5HCisJaGVscAorCSAgT1Byb2ZpbGUgaXMgYSBwcm9maWxpbmcgc3lzdGVtIGNhcGFibGUgb2YgcHJvZmlsaW5nIHRoZQorCSAgd2hvbGUgc3lzdGVtLCBpbmNsdWRlIHRoZSBrZXJuZWwsIGtlcm5lbCBtb2R1bGVzLCBsaWJyYXJpZXMsCisJICBhbmQgYXBwbGljYXRpb25zLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitlbmRtZW51CisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9vcHJvZmlsZS9NYWtlZmlsZSBiL2FyY2gvaTM4Ni9vcHJvZmlsZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGYzZWIzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L29wcm9maWxlL01ha2VmaWxlCkBAIC0wLDAgKzEsMTIgQEAKK29iai0kKENPTkZJR19PUFJPRklMRSkgKz0gb3Byb2ZpbGUubworCitEUklWRVJfT0JKUyA9ICQoYWRkcHJlZml4IC4uLy4uLy4uL2RyaXZlcnMvb3Byb2ZpbGUvLCBcCisJCW9wcm9mLm8gY3B1X2J1ZmZlci5vIGJ1ZmZlcl9zeW5jLm8gXAorCQlldmVudF9idWZmZXIubyBvcHJvZmlsZV9maWxlcy5vIFwKKwkJb3Byb2ZpbGVmcy5vIG9wcm9maWxlX3N0YXRzLm8gIFwKKwkJdGltZXJfaW50Lm8gKQorCitvcHJvZmlsZS15CQkJCTo9ICQoRFJJVkVSX09CSlMpIGluaXQubyBiYWNrdHJhY2Uubworb3Byb2ZpbGUtJChDT05GSUdfWDg2X0xPQ0FMX0FQSUMpIAkrPSBubWlfaW50Lm8gb3BfbW9kZWxfYXRobG9uLm8gXAorCQkJCQkgICBvcF9tb2RlbF9wcHJvLm8gb3BfbW9kZWxfcDQubworb3Byb2ZpbGUtJChDT05GSUdfWDg2X0lPX0FQSUMpCQkrPSBubWlfdGltZXJfaW50Lm8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9vcHJvZmlsZS9iYWNrdHJhY2UuYyBiL2FyY2gvaTM4Ni9vcHJvZmlsZS9iYWNrdHJhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmQ3MmUwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L29wcm9maWxlL2JhY2t0cmFjZS5jCkBAIC0wLDAgKzEsMTExIEBACisvKioKKyAqIEBmaWxlIGJhY2t0cmFjZS5jCisgKgorICogQHJlbWFyayBDb3B5cmlnaHQgMjAwMiBPUHJvZmlsZSBhdXRob3JzCisgKiBAcmVtYXJrIFJlYWQgdGhlIGZpbGUgQ09QWUlORworICoKKyAqIEBhdXRob3IgSm9obiBMZXZvbgorICogQGF1dGhvciBEYXZpZCBTbWl0aAorICovCisKKyNpbmNsdWRlIDxsaW51eC9vcHJvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisKK3N0cnVjdCBmcmFtZV9oZWFkIHsKKwlzdHJ1Y3QgZnJhbWVfaGVhZCAqIGVicDsKKwl1bnNpZ25lZCBsb25nIHJldDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0YXRpYyBzdHJ1Y3QgZnJhbWVfaGVhZCAqCitkdW1wX2JhY2t0cmFjZShzdHJ1Y3QgZnJhbWVfaGVhZCAqIGhlYWQpCit7CisJb3Byb2ZpbGVfYWRkX3RyYWNlKGhlYWQtPnJldCk7CisKKwkvKiBmcmFtZSBwb2ludGVycyBzaG91bGQgc3RyaWN0bHkgcHJvZ3Jlc3MgYmFjayB1cCB0aGUgc3RhY2sKKwkgKiAodG93YXJkcyBoaWdoZXIgYWRkcmVzc2VzKSAqLworCWlmIChoZWFkID49IGhlYWQtPmVicCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gaGVhZC0+ZWJwOworfQorCisvKiBjaGVjayB0aGF0IHRoZSBwYWdlKHMpIGNvbnRhaW5pbmcgdGhlIGZyYW1lIGhlYWQgYXJlIHByZXNlbnQgKi8KK3N0YXRpYyBpbnQgcGFnZXNfcHJlc2VudChzdHJ1Y3QgZnJhbWVfaGVhZCAqIGhlYWQpCit7CisJc3RydWN0IG1tX3N0cnVjdCAqIG1tID0gY3VycmVudC0+bW07CisKKwkvKiBGSVhNRTogb25seSBuZWNlc3Nhcnkgb25jZSBwZXIgcGFnZSAqLworCWlmICghY2hlY2tfdXNlcl9wYWdlX3JlYWRhYmxlKG1tLCAodW5zaWduZWQgbG9uZyloZWFkKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gY2hlY2tfdXNlcl9wYWdlX3JlYWRhYmxlKG1tLCAodW5zaWduZWQgbG9uZykoaGVhZCArIDEpKTsKK30KKworLyoKKyAqIHwgICAgICAgICAgICAgfCAvXCBIaWdoZXIgYWRkcmVzc2VzCisgKiB8ICAgICAgICAgICAgIHwKKyAqIC0tLS0tLS0tLS0tLS0tLSBzdGFjayBiYXNlIChhZGRyZXNzIG9mIGN1cnJlbnRfdGhyZWFkX2luZm8pCisgKiB8IHRocmVhZCBpbmZvIHwKKyAqIC4gICAgICAgICAgICAgLgorICogfCAgICBzdGFjayAgICB8CisgKiAtLS0tLS0tLS0tLS0tLS0gc2F2ZWQgcmVncy0+ZWJwIHZhbHVlIGlmIHZhbGlkIChmcmFtZV9oZWFkIGFkZHJlc3MpCisgKiAuICAgICAgICAgICAgIC4KKyAqIC0tLS0tLS0tLS0tLS0tLSBzdHJ1Y3QgcHRfcmVncyBzdG9yZWQgb24gc3RhY2sgKHN0cnVjdCBwdF9yZWdzICopCisgKiB8ICAgICAgICAgICAgIHwKKyAqIC4gICAgICAgICAgICAgLgorICogfCAgICAgICAgICAgICB8CisgKiAtLS0tLS0tLS0tLS0tLS0gJWVzcAorICogfCAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgIHwgXC8gTG93ZXIgYWRkcmVzc2VzCisgKgorICogVGh1cywgJnB0X3JlZ3MgPC0+IHN0YWNrIGJhc2UgcmVzdHJpY3RzIHRoZSB2YWxpZChpc2gpIGVicCB2YWx1ZXMKKyAqLworI2lmZGVmIENPTkZJR19GUkFNRV9QT0lOVEVSCitzdGF0aWMgaW50IHZhbGlkX2tlcm5lbF9zdGFjayhzdHJ1Y3QgZnJhbWVfaGVhZCAqIGhlYWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGhlYWRhZGRyID0gKHVuc2lnbmVkIGxvbmcpaGVhZDsKKwl1bnNpZ25lZCBsb25nIHN0YWNrID0gKHVuc2lnbmVkIGxvbmcpcmVnczsKKwl1bnNpZ25lZCBsb25nIHN0YWNrX2Jhc2UgPSAoc3RhY2sgJiB+KFRIUkVBRF9TSVpFIC0gMSkpICsgVEhSRUFEX1NJWkU7CisKKwlyZXR1cm4gaGVhZGFkZHIgPiBzdGFjayAmJiBoZWFkYWRkciA8IHN0YWNrX2Jhc2U7Cit9CisjZWxzZQorLyogd2l0aG91dCBmcCwgaXQncyBqdXN0IGp1bmsgKi8KK3N0YXRpYyBpbnQgdmFsaWRfa2VybmVsX3N0YWNrKHN0cnVjdCBmcmFtZV9oZWFkICogaGVhZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKKwordm9pZAoreDg2X2JhY2t0cmFjZShzdHJ1Y3QgcHRfcmVncyAqIGNvbnN0IHJlZ3MsIHVuc2lnbmVkIGludCBkZXB0aCkKK3sKKwlzdHJ1Y3QgZnJhbWVfaGVhZCAqaGVhZDsKKworI2lmZGVmIENPTkZJR19YODZfNjQKKwloZWFkID0gKHN0cnVjdCBmcmFtZV9oZWFkICopcmVncy0+cmJwOworI2Vsc2UKKwloZWFkID0gKHN0cnVjdCBmcmFtZV9oZWFkICopcmVncy0+ZWJwOworI2VuZGlmCisKKwlpZiAoIXVzZXJfbW9kZShyZWdzKSkgeworCQl3aGlsZSAoZGVwdGgtLSAmJiB2YWxpZF9rZXJuZWxfc3RhY2soaGVhZCwgcmVncykpCisJCQloZWFkID0gZHVtcF9iYWNrdHJhY2UoaGVhZCk7CisJCXJldHVybjsKKwl9CisKKyNpZmRlZiBDT05GSUdfU01QCisJaWYgKCFzcGluX3RyeWxvY2soJmN1cnJlbnQtPm1tLT5wYWdlX3RhYmxlX2xvY2spKQorCQlyZXR1cm47CisjZW5kaWYKKworCXdoaWxlIChkZXB0aC0tICYmIGhlYWQgJiYgcGFnZXNfcHJlc2VudChoZWFkKSkKKwkJaGVhZCA9IGR1bXBfYmFja3RyYWNlKGhlYWQpOworCisjaWZkZWYgQ09ORklHX1NNUAorCXNwaW5fdW5sb2NrKCZjdXJyZW50LT5tbS0+cGFnZV90YWJsZV9sb2NrKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L29wcm9maWxlL2luaXQuYyBiL2FyY2gvaTM4Ni9vcHJvZmlsZS9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkwMzMyZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9vcHJvZmlsZS9pbml0LmMKQEAgLTAsMCArMSw0OCBAQAorLyoqCisgKiBAZmlsZSBpbml0LmMKKyAqCisgKiBAcmVtYXJrIENvcHlyaWdodCAyMDAyIE9Qcm9maWxlIGF1dGhvcnMKKyAqIEByZW1hcmsgUmVhZCB0aGUgZmlsZSBDT1BZSU5HCisgKgorICogQGF1dGhvciBKb2huIExldm9uIDxsZXZvbkBtb3ZlbWVudGFyaWFuLm9yZz4KKyAqLworCisjaW5jbHVkZSA8bGludXgvb3Byb2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyAKKy8qIFdlIHN1cHBvcnQgQ1BVcyB0aGF0IGhhdmUgcGVyZm9ybWFuY2UgY291bnRlcnMgbGlrZSB0aGUgUGVudGl1bSBQcm8KKyAqIHdpdGggdGhlIE5NSSBtb2RlIGRyaXZlci4KKyAqLworIAorZXh0ZXJuIGludCBubWlfaW5pdChzdHJ1Y3Qgb3Byb2ZpbGVfb3BlcmF0aW9ucyAqIG9wcyk7CitleHRlcm4gaW50IG5taV90aW1lcl9pbml0KHN0cnVjdCBvcHJvZmlsZV9vcGVyYXRpb25zICogb3BzKTsKK2V4dGVybiB2b2lkIG5taV9leGl0KHZvaWQpOworZXh0ZXJuIHZvaWQgeDg2X2JhY2t0cmFjZShzdHJ1Y3QgcHRfcmVncyAqIGNvbnN0IHJlZ3MsIHVuc2lnbmVkIGludCBkZXB0aCk7CisKKworaW50IF9faW5pdCBvcHJvZmlsZV9hcmNoX2luaXQoc3RydWN0IG9wcm9maWxlX29wZXJhdGlvbnMgKiBvcHMpCit7CisJaW50IHJldDsKKworCXJldCA9IC1FTk9ERVY7CisKKyNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKKwlyZXQgPSBubWlfaW5pdChvcHMpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCisJaWYgKHJldCA8IDApCisJCXJldCA9IG5taV90aW1lcl9pbml0KG9wcyk7CisjZW5kaWYKKwlvcHMtPmJhY2t0cmFjZSA9IHg4Nl9iYWNrdHJhY2U7CisKKwlyZXR1cm4gcmV0OworfQorCisKK3ZvaWQgb3Byb2ZpbGVfYXJjaF9leGl0KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCisJbm1pX2V4aXQoKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L29wcm9maWxlL25taV9pbnQuYyBiL2FyY2gvaTM4Ni9vcHJvZmlsZS9ubWlfaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ5MmQ5NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9vcHJvZmlsZS9ubWlfaW50LmMKQEAgLTAsMCArMSw0MjcgQEAKKy8qKgorICogQGZpbGUgbm1pX2ludC5jCisgKgorICogQHJlbWFyayBDb3B5cmlnaHQgMjAwMiBPUHJvZmlsZSBhdXRob3JzCisgKiBAcmVtYXJrIFJlYWQgdGhlIGZpbGUgQ09QWUlORworICoKKyAqIEBhdXRob3IgSm9obiBMZXZvbiA8bGV2b25AbW92ZW1lbnRhcmlhbi5vcmc+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L29wcm9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGFzbS9ubWkuaD4KKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKyAKKyNpbmNsdWRlICJvcF9jb3VudGVyLmgiCisjaW5jbHVkZSAib3BfeDg2X21vZGVsLmgiCisgCitzdGF0aWMgc3RydWN0IG9wX3g4Nl9tb2RlbF9zcGVjIGNvbnN0ICogbW9kZWw7CitzdGF0aWMgc3RydWN0IG9wX21zcnMgY3B1X21zcnNbTlJfQ1BVU107CitzdGF0aWMgdW5zaWduZWQgbG9uZyBzYXZlZF9sdnRwY1tOUl9DUFVTXTsKKyAKK3N0YXRpYyBpbnQgbm1pX3N0YXJ0KHZvaWQpOworc3RhdGljIHZvaWQgbm1pX3N0b3Aodm9pZCk7CisKKy8qIDAgPT0gcmVnaXN0ZXJlZCBidXQgb2ZmLCAxID09IHJlZ2lzdGVyZWQgYW5kIG9uICovCitzdGF0aWMgaW50IG5taV9lbmFibGVkID0gMDsKKworI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgaW50IG5taV9zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIHUzMiBzdGF0ZSkKK3sKKwlpZiAobm1pX2VuYWJsZWQgPT0gMSkKKwkJbm1pX3N0b3AoKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IG5taV9yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKmRldikKK3sKKwlpZiAobm1pX2VuYWJsZWQgPT0gMSkKKwkJbm1pX3N0YXJ0KCk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3Mgb3Byb2ZpbGVfc3lzY2xhc3MgPSB7CisJc2V0X2tzZXRfbmFtZSgib3Byb2ZpbGUiKSwKKwkucmVzdW1lCQk9IG5taV9yZXN1bWUsCisJLnN1c3BlbmQJPSBubWlfc3VzcGVuZCwKK307CisKKworc3RhdGljIHN0cnVjdCBzeXNfZGV2aWNlIGRldmljZV9vcHJvZmlsZSA9IHsKKwkuaWQJPSAwLAorCS5jbHMJPSAmb3Byb2ZpbGVfc3lzY2xhc3MsCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfZHJpdmVyZnModm9pZCkKK3sKKwlpbnQgZXJyb3I7CisJaWYgKCEoZXJyb3IgPSBzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJm9wcm9maWxlX3N5c2NsYXNzKSkpCisJCWVycm9yID0gc3lzZGV2X3JlZ2lzdGVyKCZkZXZpY2Vfb3Byb2ZpbGUpOworCXJldHVybiBlcnJvcjsKK30KKworCitzdGF0aWMgdm9pZCBleGl0X2RyaXZlcmZzKHZvaWQpCit7CisJc3lzZGV2X3VucmVnaXN0ZXIoJmRldmljZV9vcHJvZmlsZSk7CisJc3lzZGV2X2NsYXNzX3VucmVnaXN0ZXIoJm9wcm9maWxlX3N5c2NsYXNzKTsKK30KKworI2Vsc2UKKyNkZWZpbmUgaW5pdF9kcml2ZXJmcygpIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZXhpdF9kcml2ZXJmcygpIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworCitzdGF0aWMgaW50IG5taV9jYWxsYmFjayhzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGludCBjcHUpCit7CisJcmV0dXJuIG1vZGVsLT5jaGVja19jdHJzKHJlZ3MsICZjcHVfbXNyc1tjcHVdKTsKK30KKyAKKyAKK3N0YXRpYyB2b2lkIG5taV9jcHVfc2F2ZV9yZWdpc3RlcnMoc3RydWN0IG9wX21zcnMgKiBtc3JzKQoreworCXVuc2lnbmVkIGludCBjb25zdCBucl9jdHJzID0gbW9kZWwtPm51bV9jb3VudGVyczsKKwl1bnNpZ25lZCBpbnQgY29uc3QgbnJfY3RybHMgPSBtb2RlbC0+bnVtX2NvbnRyb2xzOyAKKwlzdHJ1Y3Qgb3BfbXNyICogY291bnRlcnMgPSBtc3JzLT5jb3VudGVyczsKKwlzdHJ1Y3Qgb3BfbXNyICogY29udHJvbHMgPSBtc3JzLT5jb250cm9sczsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBucl9jdHJzOyArK2kpIHsKKwkJcmRtc3IoY291bnRlcnNbaV0uYWRkciwKKwkJCWNvdW50ZXJzW2ldLnNhdmVkLmxvdywKKwkJCWNvdW50ZXJzW2ldLnNhdmVkLmhpZ2gpOworCX0KKyAKKwlmb3IgKGkgPSAwOyBpIDwgbnJfY3RybHM7ICsraSkgeworCQlyZG1zcihjb250cm9sc1tpXS5hZGRyLAorCQkJY29udHJvbHNbaV0uc2F2ZWQubG93LAorCQkJY29udHJvbHNbaV0uc2F2ZWQuaGlnaCk7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIG5taV9zYXZlX3JlZ2lzdGVycyh2b2lkICogZHVtbXkpCit7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlzdHJ1Y3Qgb3BfbXNycyAqIG1zcnMgPSAmY3B1X21zcnNbY3B1XTsKKwltb2RlbC0+ZmlsbF9pbl9hZGRyZXNzZXMobXNycyk7CisJbm1pX2NwdV9zYXZlX3JlZ2lzdGVycyhtc3JzKTsKK30KKworCitzdGF0aWMgdm9pZCBmcmVlX21zcnModm9pZCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgKytpKSB7CisJCWtmcmVlKGNwdV9tc3JzW2ldLmNvdW50ZXJzKTsKKwkJY3B1X21zcnNbaV0uY291bnRlcnMgPSBOVUxMOworCQlrZnJlZShjcHVfbXNyc1tpXS5jb250cm9scyk7CisJCWNwdV9tc3JzW2ldLmNvbnRyb2xzID0gTlVMTDsKKwl9Cit9CisKKworc3RhdGljIGludCBhbGxvY2F0ZV9tc3JzKHZvaWQpCit7CisJaW50IHN1Y2Nlc3MgPSAxOworCXNpemVfdCBjb250cm9sc19zaXplID0gc2l6ZW9mKHN0cnVjdCBvcF9tc3IpICogbW9kZWwtPm51bV9jb250cm9sczsKKwlzaXplX3QgY291bnRlcnNfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgb3BfbXNyKSAqIG1vZGVsLT5udW1fY291bnRlcnM7CisKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgKytpKSB7CisJCWlmICghY3B1X29ubGluZShpKSkKKwkJCWNvbnRpbnVlOworCisJCWNwdV9tc3JzW2ldLmNvdW50ZXJzID0ga21hbGxvYyhjb3VudGVyc19zaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFjcHVfbXNyc1tpXS5jb3VudGVycykgeworCQkJc3VjY2VzcyA9IDA7CisJCQlicmVhazsKKwkJfQorCQljcHVfbXNyc1tpXS5jb250cm9scyA9IGttYWxsb2MoY29udHJvbHNfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghY3B1X21zcnNbaV0uY29udHJvbHMpIHsKKwkJCXN1Y2Nlc3MgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIXN1Y2Nlc3MpCisJCWZyZWVfbXNycygpOworCisJcmV0dXJuIHN1Y2Nlc3M7Cit9CisKKworc3RhdGljIHZvaWQgbm1pX2NwdV9zZXR1cCh2b2lkICogZHVtbXkpCit7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlzdHJ1Y3Qgb3BfbXNycyAqIG1zcnMgPSAmY3B1X21zcnNbY3B1XTsKKwlzcGluX2xvY2soJm9wcm9maWxlZnNfbG9jayk7CisJbW9kZWwtPnNldHVwX2N0cnMobXNycyk7CisJc3Bpbl91bmxvY2soJm9wcm9maWxlZnNfbG9jayk7CisJc2F2ZWRfbHZ0cGNbY3B1XSA9IGFwaWNfcmVhZChBUElDX0xWVFBDKTsKKwlhcGljX3dyaXRlKEFQSUNfTFZUUEMsIEFQSUNfRE1fTk1JKTsKK30KKworCitzdGF0aWMgaW50IG5taV9zZXR1cCh2b2lkKQoreworCWlmICghYWxsb2NhdGVfbXNycygpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIFdlIHdhbGsgYSB0aGluIGxpbmUgYmV0d2VlbiBsYXcgYW5kIHJhcGUgaGVyZS4KKwkgKiBXZSBuZWVkIHRvIGJlIGNhcmVmdWwgdG8gaW5zdGFsbCBvdXIgTk1JIGhhbmRsZXIKKwkgKiB3aXRob3V0IGFjdHVhbGx5IHRyaWdnZXJpbmcgYW55IE5NSXMgYXMgdGhpcyB3aWxsCisJICogYnJlYWsgdGhlIGNvcmUgY29kZSBob3JyaWZpY2FsbHkuCisJICovCisJaWYgKHJlc2VydmVfbGFwaWNfbm1pKCkgPCAwKSB7CisJCWZyZWVfbXNycygpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwkvKiBXZSBuZWVkIHRvIHNlcmlhbGl6ZSBzYXZlIGFuZCBzZXR1cCBmb3IgSFQgYmVjYXVzZSB0aGUgc3Vic2V0CisJICogb2YgbXNycyBhcmUgZGlzdGluY3QgZm9yIHNhdmUgYW5kIHNldHVwIG9wZXJhdGlvbnMKKwkgKi8KKwlvbl9lYWNoX2NwdShubWlfc2F2ZV9yZWdpc3RlcnMsIE5VTEwsIDAsIDEpOworCW9uX2VhY2hfY3B1KG5taV9jcHVfc2V0dXAsIE5VTEwsIDAsIDEpOworCXNldF9ubWlfY2FsbGJhY2sobm1pX2NhbGxiYWNrKTsKKwlubWlfZW5hYmxlZCA9IDE7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgbm1pX3Jlc3RvcmVfcmVnaXN0ZXJzKHN0cnVjdCBvcF9tc3JzICogbXNycykKK3sKKwl1bnNpZ25lZCBpbnQgY29uc3QgbnJfY3RycyA9IG1vZGVsLT5udW1fY291bnRlcnM7CisJdW5zaWduZWQgaW50IGNvbnN0IG5yX2N0cmxzID0gbW9kZWwtPm51bV9jb250cm9sczsgCisJc3RydWN0IG9wX21zciAqIGNvdW50ZXJzID0gbXNycy0+Y291bnRlcnM7CisJc3RydWN0IG9wX21zciAqIGNvbnRyb2xzID0gbXNycy0+Y29udHJvbHM7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfY3RybHM7ICsraSkgeworCQl3cm1zcihjb250cm9sc1tpXS5hZGRyLAorCQkJY29udHJvbHNbaV0uc2F2ZWQubG93LAorCQkJY29udHJvbHNbaV0uc2F2ZWQuaGlnaCk7CisJfQorIAorCWZvciAoaSA9IDA7IGkgPCBucl9jdHJzOyArK2kpIHsKKwkJd3Jtc3IoY291bnRlcnNbaV0uYWRkciwKKwkJCWNvdW50ZXJzW2ldLnNhdmVkLmxvdywKKwkJCWNvdW50ZXJzW2ldLnNhdmVkLmhpZ2gpOworCX0KK30KKyAKKworc3RhdGljIHZvaWQgbm1pX2NwdV9zaHV0ZG93bih2b2lkICogZHVtbXkpCit7CisJdW5zaWduZWQgaW50IHY7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlzdHJ1Y3Qgb3BfbXNycyAqIG1zcnMgPSAmY3B1X21zcnNbY3B1XTsKKyAKKwkvKiByZXN0b3JpbmcgQVBJQ19MVlRQQyBjYW4gdHJpZ2dlciBhbiBhcGljIGVycm9yIGJlY2F1c2UgdGhlIGRlbGl2ZXJ5CisJICogbW9kZSBhbmQgdmVjdG9yIG5yIGNvbWJpbmF0aW9uIGNhbiBiZSBpbGxlZ2FsLiBUaGF0J3MgYnkgZGVzaWduOiBvbgorCSAqIHBvd2VyIG9uIGFwaWMgbHZ0IGNvbnRhaW4gYSB6ZXJvIHZlY3RvciBuciB3aGljaCBhcmUgbGVnYWwgb25seSBmb3IKKwkgKiBOTUkgZGVsaXZlcnkgbW9kZS4gU28gaW5oaWJpdCBhcGljIGVyciBiZWZvcmUgcmVzdG9yaW5nIGx2dHBjCisJICovCisJdiA9IGFwaWNfcmVhZChBUElDX0xWVEVSUik7CisJYXBpY193cml0ZShBUElDX0xWVEVSUiwgdiB8IEFQSUNfTFZUX01BU0tFRCk7CisJYXBpY193cml0ZShBUElDX0xWVFBDLCBzYXZlZF9sdnRwY1tjcHVdKTsKKwlhcGljX3dyaXRlKEFQSUNfTFZURVJSLCB2KTsKKwlubWlfcmVzdG9yZV9yZWdpc3RlcnMobXNycyk7Cit9CisKKyAKK3N0YXRpYyB2b2lkIG5taV9zaHV0ZG93bih2b2lkKQoreworCW5taV9lbmFibGVkID0gMDsKKwlvbl9lYWNoX2NwdShubWlfY3B1X3NodXRkb3duLCBOVUxMLCAwLCAxKTsKKwl1bnNldF9ubWlfY2FsbGJhY2soKTsKKwlyZWxlYXNlX2xhcGljX25taSgpOworCWZyZWVfbXNycygpOworfQorCisgCitzdGF0aWMgdm9pZCBubWlfY3B1X3N0YXJ0KHZvaWQgKiBkdW1teSkKK3sKKwlzdHJ1Y3Qgb3BfbXNycyBjb25zdCAqIG1zcnMgPSAmY3B1X21zcnNbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKKwltb2RlbC0+c3RhcnQobXNycyk7Cit9CisgCisKK3N0YXRpYyBpbnQgbm1pX3N0YXJ0KHZvaWQpCit7CisJb25fZWFjaF9jcHUobm1pX2NwdV9zdGFydCwgTlVMTCwgMCwgMSk7CisJcmV0dXJuIDA7Cit9CisgCisgCitzdGF0aWMgdm9pZCBubWlfY3B1X3N0b3Aodm9pZCAqIGR1bW15KQoreworCXN0cnVjdCBvcF9tc3JzIGNvbnN0ICogbXNycyA9ICZjcHVfbXNyc1tzbXBfcHJvY2Vzc29yX2lkKCldOworCW1vZGVsLT5zdG9wKG1zcnMpOworfQorIAorIAorc3RhdGljIHZvaWQgbm1pX3N0b3Aodm9pZCkKK3sKKwlvbl9lYWNoX2NwdShubWlfY3B1X3N0b3AsIE5VTEwsIDAsIDEpOworfQorCisKK3N0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyBjb3VudGVyX2NvbmZpZ1tPUF9NQVhfQ09VTlRFUl07CisKK3N0YXRpYyBpbnQgbm1pX2NyZWF0ZV9maWxlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgc3RydWN0IGRlbnRyeSAqIHJvb3QpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbW9kZWwtPm51bV9jb3VudGVyczsgKytpKSB7CisJCXN0cnVjdCBkZW50cnkgKiBkaXI7CisJCWNoYXIgYnVmWzJdOworIAorCQlzbnByaW50ZihidWYsIDIsICIlZCIsIGkpOworCQlkaXIgPSBvcHJvZmlsZWZzX21rZGlyKHNiLCByb290LCBidWYpOworCQlvcHJvZmlsZWZzX2NyZWF0ZV91bG9uZyhzYiwgZGlyLCAiZW5hYmxlZCIsICZjb3VudGVyX2NvbmZpZ1tpXS5lbmFibGVkKTsgCisJCW9wcm9maWxlZnNfY3JlYXRlX3Vsb25nKHNiLCBkaXIsICJldmVudCIsICZjb3VudGVyX2NvbmZpZ1tpXS5ldmVudCk7IAorCQlvcHJvZmlsZWZzX2NyZWF0ZV91bG9uZyhzYiwgZGlyLCAiY291bnQiLCAmY291bnRlcl9jb25maWdbaV0uY291bnQpOyAKKwkJb3Byb2ZpbGVmc19jcmVhdGVfdWxvbmcoc2IsIGRpciwgInVuaXRfbWFzayIsICZjb3VudGVyX2NvbmZpZ1tpXS51bml0X21hc2spOyAKKwkJb3Byb2ZpbGVmc19jcmVhdGVfdWxvbmcoc2IsIGRpciwgImtlcm5lbCIsICZjb3VudGVyX2NvbmZpZ1tpXS5rZXJuZWwpOyAKKwkJb3Byb2ZpbGVmc19jcmVhdGVfdWxvbmcoc2IsIGRpciwgInVzZXIiLCAmY291bnRlcl9jb25maWdbaV0udXNlcik7IAorCX0KKworCXJldHVybiAwOworfQorIAorIAorc3RhdGljIGludCBfX2luaXQgcDRfaW5pdChjaGFyICoqIGNwdV90eXBlKQoreworCV9fdTggY3B1X21vZGVsID0gYm9vdF9jcHVfZGF0YS54ODZfbW9kZWw7CisKKwlpZiAoY3B1X21vZGVsID4gNCkKKwkJcmV0dXJuIDA7CisKKyNpZm5kZWYgQ09ORklHX1NNUAorCSpjcHVfdHlwZSA9ICJpMzg2L3A0IjsKKwltb2RlbCA9ICZvcF9wNF9zcGVjOworCXJldHVybiAxOworI2Vsc2UKKwlzd2l0Y2ggKHNtcF9udW1fc2libGluZ3MpIHsKKwkJY2FzZSAxOgorCQkJKmNwdV90eXBlID0gImkzODYvcDQiOworCQkJbW9kZWwgPSAmb3BfcDRfc3BlYzsKKwkJCXJldHVybiAxOworCisJCWNhc2UgMjoKKwkJCSpjcHVfdHlwZSA9ICJpMzg2L3A0LWh0IjsKKwkJCW1vZGVsID0gJm9wX3A0X2h0Ml9zcGVjOworCQkJcmV0dXJuIDE7CisJfQorI2VuZGlmCisKKwlwcmludGsoS0VSTl9JTkZPICJvcHJvZmlsZTogUDQgSHlwZXJUaHJlYWRpbmcgZGV0ZWN0ZWQgd2l0aCA+IDIgdGhyZWFkc1xuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAib3Byb2ZpbGU6IFJldmVydGluZyB0byB0aW1lciBtb2RlLlxuIik7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBfX2luaXQgcHByb19pbml0KGNoYXIgKiogY3B1X3R5cGUpCit7CisJX191OCBjcHVfbW9kZWwgPSBib290X2NwdV9kYXRhLng4Nl9tb2RlbDsKKworCWlmIChjcHVfbW9kZWwgPiAweGQpCisJCXJldHVybiAwOworCisJaWYgKGNwdV9tb2RlbCA9PSA5KSB7CisJCSpjcHVfdHlwZSA9ICJpMzg2L3A2X21vYmlsZSI7CisJfSBlbHNlIGlmIChjcHVfbW9kZWwgPiA1KSB7CisJCSpjcHVfdHlwZSA9ICJpMzg2L3BpaWkiOworCX0gZWxzZSBpZiAoY3B1X21vZGVsID4gMikgeworCQkqY3B1X3R5cGUgPSAiaTM4Ni9waWkiOworCX0gZWxzZSB7CisJCSpjcHVfdHlwZSA9ICJpMzg2L3Bwcm8iOworCX0KKworCW1vZGVsID0gJm9wX3Bwcm9fc3BlYzsKKwlyZXR1cm4gMTsKK30KKworLyogaW4gb3JkZXIgdG8gZ2V0IGRyaXZlcmZzIHJpZ2h0ICovCitzdGF0aWMgaW50IHVzaW5nX25taTsKKworaW50IF9faW5pdCBubWlfaW5pdChzdHJ1Y3Qgb3Byb2ZpbGVfb3BlcmF0aW9ucyAqb3BzKQoreworCV9fdTggdmVuZG9yID0gYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yOworCV9fdTggZmFtaWx5ID0gYm9vdF9jcHVfZGF0YS54ODY7CisJY2hhciAqY3B1X3R5cGU7CisKKwlpZiAoIWNwdV9oYXNfYXBpYykKKwkJcmV0dXJuIC1FTk9ERVY7CisgCisJc3dpdGNoICh2ZW5kb3IpIHsKKwkJY2FzZSBYODZfVkVORE9SX0FNRDoKKwkJCS8qIE5lZWRzIHRvIGJlIGF0IGxlYXN0IGFuIEF0aGxvbiAob3IgaGFtbWVyIGluIDMyYml0IG1vZGUpICovCisKKwkJCXN3aXRjaCAoZmFtaWx5KSB7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiAtRU5PREVWOworCQkJY2FzZSA2OgorCQkJCW1vZGVsID0gJm9wX2F0aGxvbl9zcGVjOworCQkJCWNwdV90eXBlID0gImkzODYvYXRobG9uIjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHhmOgorCQkJCW1vZGVsID0gJm9wX2F0aGxvbl9zcGVjOworCQkJCS8qIEFjdHVhbGx5IGl0IGNvdWxkIGJlIGkzODYvaGFtbWVyIHRvbywgYnV0IGdpdmUKKwkJCQkgICB1c2VyIHNwYWNlIGFuIGNvbnNpc3RlbnQgbmFtZS4gKi8KKwkJCQljcHVfdHlwZSA9ICJ4ODYtNjQvaGFtbWVyIjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworIAorCQljYXNlIFg4Nl9WRU5ET1JfSU5URUw6CisJCQlzd2l0Y2ggKGZhbWlseSkgeworCQkJCS8qIFBlbnRpdW0gSVYgKi8KKwkJCQljYXNlIDB4ZjoKKwkJCQkJaWYgKCFwNF9pbml0KCZjcHVfdHlwZSkpCisJCQkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCQkJYnJlYWs7CisKKwkJCQkvKiBBIFA2LWNsYXNzIHByb2Nlc3NvciAqLworCQkJCWNhc2UgNjoKKwkJCQkJaWYgKCFwcHJvX2luaXQoJmNwdV90eXBlKSkKKwkJCQkJCXJldHVybiAtRU5PREVWOworCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCXJldHVybiAtRU5PREVWOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU5PREVWOworCX0KKworCWluaXRfZHJpdmVyZnMoKTsKKwl1c2luZ19ubWkgPSAxOworCW9wcy0+Y3JlYXRlX2ZpbGVzID0gbm1pX2NyZWF0ZV9maWxlczsKKwlvcHMtPnNldHVwID0gbm1pX3NldHVwOworCW9wcy0+c2h1dGRvd24gPSBubWlfc2h1dGRvd247CisJb3BzLT5zdGFydCA9IG5taV9zdGFydDsKKwlvcHMtPnN0b3AgPSBubWlfc3RvcDsKKwlvcHMtPmNwdV90eXBlID0gY3B1X3R5cGU7CisJcHJpbnRrKEtFUk5fSU5GTyAib3Byb2ZpbGU6IHVzaW5nIE5NSSBpbnRlcnJ1cHQuXG4iKTsKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIG5taV9leGl0KHZvaWQpCit7CisJaWYgKHVzaW5nX25taSkKKwkJZXhpdF9kcml2ZXJmcygpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L29wcm9maWxlL25taV90aW1lcl9pbnQuYyBiL2FyY2gvaTM4Ni9vcHJvZmlsZS9ubWlfdGltZXJfaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJlNDYyYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9vcHJvZmlsZS9ubWlfdGltZXJfaW50LmMKQEAgLTAsMCArMSw1NSBAQAorLyoqCisgKiBAZmlsZSBubWlfdGltZXJfaW50LmMKKyAqCisgKiBAcmVtYXJrIENvcHlyaWdodCAyMDAzIE9Qcm9maWxlIGF1dGhvcnMKKyAqIEByZW1hcmsgUmVhZCB0aGUgZmlsZSBDT1BZSU5HCisgKgorICogQGF1dGhvciBad2FuZSBNd2Fpa2FtYm8gPHp3YW5lQGxpbnV4cG93ZXIuY2E+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9vcHJvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisKKworI2luY2x1ZGUgPGFzbS9ubWkuaD4KKyNpbmNsdWRlIDxhc20vYXBpYy5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyAKK3N0YXRpYyBpbnQgbm1pX3RpbWVyX2NhbGxiYWNrKHN0cnVjdCBwdF9yZWdzICogcmVncywgaW50IGNwdSkKK3sKKwlvcHJvZmlsZV9hZGRfc2FtcGxlKHJlZ3MsIDApOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHRpbWVyX3N0YXJ0KHZvaWQpCit7CisJZGlzYWJsZV90aW1lcl9ubWlfd2F0Y2hkb2coKTsKKwlzZXRfbm1pX2NhbGxiYWNrKG5taV90aW1lcl9jYWxsYmFjayk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgdGltZXJfc3RvcCh2b2lkKQoreworCWVuYWJsZV90aW1lcl9ubWlfd2F0Y2hkb2coKTsKKwl1bnNldF9ubWlfY2FsbGJhY2soKTsKKwlzeW5jaHJvbml6ZV9rZXJuZWwoKTsKK30KKworCitpbnQgX19pbml0IG5taV90aW1lcl9pbml0KHN0cnVjdCBvcHJvZmlsZV9vcGVyYXRpb25zICogb3BzKQoreworCWV4dGVybiBpbnQgbm1pX2FjdGl2ZTsKKworCWlmIChubWlfYWN0aXZlIDw9IDApCisJCXJldHVybiAtRU5PREVWOworCisJb3BzLT5zdGFydCA9IHRpbWVyX3N0YXJ0OworCW9wcy0+c3RvcCA9IHRpbWVyX3N0b3A7CisJb3BzLT5jcHVfdHlwZSA9ICJ0aW1lciI7CisJcHJpbnRrKEtFUk5fSU5GTyAib3Byb2ZpbGU6IHVzaW5nIE5NSSB0aW1lciBpbnRlcnJ1cHQuXG4iKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9vcHJvZmlsZS9vcF9jb3VudGVyLmggYi9hcmNoL2kzODYvb3Byb2ZpbGUvb3BfY291bnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ODBiMTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvb3Byb2ZpbGUvb3BfY291bnRlci5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qKgorICogQGZpbGUgb3BfY291bnRlci5oCisgKgorICogQHJlbWFyayBDb3B5cmlnaHQgMjAwMiBPUHJvZmlsZSBhdXRob3JzCisgKiBAcmVtYXJrIFJlYWQgdGhlIGZpbGUgQ09QWUlORworICoKKyAqIEBhdXRob3IgSm9obiBMZXZvbgorICovCisgCisjaWZuZGVmIE9QX0NPVU5URVJfSAorI2RlZmluZSBPUF9DT1VOVEVSX0gKKyAKKyNkZWZpbmUgT1BfTUFYX0NPVU5URVIgOAorIAorLyogUGVyLXBlcmZjdHIgY29uZmlndXJhdGlvbiBhcyBzZXQgdmlhCisgKiBvcHJvZmlsZWZzLgorICovCitzdHJ1Y3Qgb3BfY291bnRlcl9jb25maWcgeworICAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50OworICAgICAgICB1bnNpZ25lZCBsb25nIGVuYWJsZWQ7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZXZlbnQ7CisgICAgICAgIHVuc2lnbmVkIGxvbmcga2VybmVsOworICAgICAgICB1bnNpZ25lZCBsb25nIHVzZXI7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgdW5pdF9tYXNrOworfTsKKworZXh0ZXJuIHN0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyBjb3VudGVyX2NvbmZpZ1tdOworCisjZW5kaWYgLyogT1BfQ09VTlRFUl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvb3Byb2ZpbGUvb3BfbW9kZWxfYXRobG9uLmMgYi9hcmNoL2kzODYvb3Byb2ZpbGUvb3BfbW9kZWxfYXRobG9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FkOWE3MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9vcHJvZmlsZS9vcF9tb2RlbF9hdGhsb24uYwpAQCAtMCwwICsxLDE0OSBAQAorLyoqCisgKiBAZmlsZSBvcF9tb2RlbF9hdGhsb24uaAorICogYXRobG9uIC8gSzcgbW9kZWwtc3BlY2lmaWMgTVNSIG9wZXJhdGlvbnMKKyAqCisgKiBAcmVtYXJrIENvcHlyaWdodCAyMDAyIE9Qcm9maWxlIGF1dGhvcnMKKyAqIEByZW1hcmsgUmVhZCB0aGUgZmlsZSBDT1BZSU5HCisgKgorICogQGF1dGhvciBKb2huIExldm9uCisgKiBAYXV0aG9yIFBoaWxpcHBlIEVsaWUKKyAqIEBhdXRob3IgR3JheWRvbiBIb2FyZQorICovCisKKyNpbmNsdWRlIDxsaW51eC9vcHJvZmlsZS5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vbXNyLmg+CisgCisjaW5jbHVkZSAib3BfeDg2X21vZGVsLmgiCisjaW5jbHVkZSAib3BfY291bnRlci5oIgorCisjZGVmaW5lIE5VTV9DT1VOVEVSUyA0CisjZGVmaW5lIE5VTV9DT05UUk9MUyA0CisKKyNkZWZpbmUgQ1RSX1JFQUQobCxoLG1zcnMsYykgZG8ge3JkbXNyKG1zcnMtPmNvdW50ZXJzWyhjKV0uYWRkciwgKGwpLCAoaCkpO30gd2hpbGUgKDApCisjZGVmaW5lIENUUl9XUklURShsLG1zcnMsYykgZG8ge3dybXNyKG1zcnMtPmNvdW50ZXJzWyhjKV0uYWRkciwgLSh1bnNpZ25lZCBpbnQpKGwpLCAtMSk7fSB3aGlsZSAoMCkKKyNkZWZpbmUgQ1RSX09WRVJGTE9XRUQobikgKCEoKG4pICYgKDFVPDwzMSkpKQorCisjZGVmaW5lIENUUkxfUkVBRChsLGgsbXNycyxjKSBkbyB7cmRtc3IobXNycy0+Y29udHJvbHNbKGMpXS5hZGRyLCAobCksIChoKSk7fSB3aGlsZSAoMCkKKyNkZWZpbmUgQ1RSTF9XUklURShsLGgsbXNycyxjKSBkbyB7d3Jtc3IobXNycy0+Y29udHJvbHNbKGMpXS5hZGRyLCAobCksIChoKSk7fSB3aGlsZSAoMCkKKyNkZWZpbmUgQ1RSTF9TRVRfQUNUSVZFKG4pIChuIHw9ICgxPDwyMikpCisjZGVmaW5lIENUUkxfU0VUX0lOQUNUSVZFKG4pIChuICY9IH4oMTw8MjIpKQorI2RlZmluZSBDVFJMX0NMRUFSKHgpICh4ICY9ICgxPDwyMSkpCisjZGVmaW5lIENUUkxfU0VUX0VOQUJMRSh2YWwpICh2YWwgfD0gMTw8MjApCisjZGVmaW5lIENUUkxfU0VUX1VTUih2YWwsdSkgKHZhbCB8PSAoKHUgJiAxKSA8PCAxNikpCisjZGVmaW5lIENUUkxfU0VUX0tFUk4odmFsLGspICh2YWwgfD0gKChrICYgMSkgPDwgMTcpKQorI2RlZmluZSBDVFJMX1NFVF9VTSh2YWwsIG0pICh2YWwgfD0gKG0gPDwgOCkpCisjZGVmaW5lIENUUkxfU0VUX0VWRU5UKHZhbCwgZSkgKHZhbCB8PSBlKQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyByZXNldF92YWx1ZVtOVU1fQ09VTlRFUlNdOworIAorc3RhdGljIHZvaWQgYXRobG9uX2ZpbGxfaW5fYWRkcmVzc2VzKHN0cnVjdCBvcF9tc3JzICogY29uc3QgbXNycykKK3sKKwltc3JzLT5jb3VudGVyc1swXS5hZGRyID0gTVNSX0s3X1BFUkZDVFIwOworCW1zcnMtPmNvdW50ZXJzWzFdLmFkZHIgPSBNU1JfSzdfUEVSRkNUUjE7CisJbXNycy0+Y291bnRlcnNbMl0uYWRkciA9IE1TUl9LN19QRVJGQ1RSMjsKKwltc3JzLT5jb3VudGVyc1szXS5hZGRyID0gTVNSX0s3X1BFUkZDVFIzOworCisJbXNycy0+Y29udHJvbHNbMF0uYWRkciA9IE1TUl9LN19FVk5UU0VMMDsKKwltc3JzLT5jb250cm9sc1sxXS5hZGRyID0gTVNSX0s3X0VWTlRTRUwxOworCW1zcnMtPmNvbnRyb2xzWzJdLmFkZHIgPSBNU1JfSzdfRVZOVFNFTDI7CisJbXNycy0+Y29udHJvbHNbM10uYWRkciA9IE1TUl9LN19FVk5UU0VMMzsKK30KKworIAorc3RhdGljIHZvaWQgYXRobG9uX3NldHVwX2N0cnMoc3RydWN0IG9wX21zcnMgY29uc3QgKiBjb25zdCBtc3JzKQoreworCXVuc2lnbmVkIGludCBsb3csIGhpZ2g7CisJaW50IGk7CisgCisJLyogY2xlYXIgYWxsIGNvdW50ZXJzICovCisJZm9yIChpID0gMCA7IGkgPCBOVU1fQ09OVFJPTFM7ICsraSkgeworCQlDVFJMX1JFQUQobG93LCBoaWdoLCBtc3JzLCBpKTsKKwkJQ1RSTF9DTEVBUihsb3cpOworCQlDVFJMX1dSSVRFKGxvdywgaGlnaCwgbXNycywgaSk7CisJfQorCQorCS8qIGF2b2lkIGEgZmFsc2UgZGV0ZWN0aW9uIG9mIGN0ciBvdmVyZmxvd3MgaW4gTk1JIGhhbmRsZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0NPVU5URVJTOyArK2kpIHsKKwkJQ1RSX1dSSVRFKDEsIG1zcnMsIGkpOworCX0KKworCS8qIGVuYWJsZSBhY3RpdmUgY291bnRlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0NPVU5URVJTOyArK2kpIHsKKwkJaWYgKGNvdW50ZXJfY29uZmlnW2ldLmVuYWJsZWQpIHsKKwkJCXJlc2V0X3ZhbHVlW2ldID0gY291bnRlcl9jb25maWdbaV0uY291bnQ7CisKKwkJCUNUUl9XUklURShjb3VudGVyX2NvbmZpZ1tpXS5jb3VudCwgbXNycywgaSk7CisKKwkJCUNUUkxfUkVBRChsb3csIGhpZ2gsIG1zcnMsIGkpOworCQkJQ1RSTF9DTEVBUihsb3cpOworCQkJQ1RSTF9TRVRfRU5BQkxFKGxvdyk7CisJCQlDVFJMX1NFVF9VU1IobG93LCBjb3VudGVyX2NvbmZpZ1tpXS51c2VyKTsKKwkJCUNUUkxfU0VUX0tFUk4obG93LCBjb3VudGVyX2NvbmZpZ1tpXS5rZXJuZWwpOworCQkJQ1RSTF9TRVRfVU0obG93LCBjb3VudGVyX2NvbmZpZ1tpXS51bml0X21hc2spOworCQkJQ1RSTF9TRVRfRVZFTlQobG93LCBjb3VudGVyX2NvbmZpZ1tpXS5ldmVudCk7CisJCQlDVFJMX1dSSVRFKGxvdywgaGlnaCwgbXNycywgaSk7CisJCX0gZWxzZSB7CisJCQlyZXNldF92YWx1ZVtpXSA9IDA7CisJCX0KKwl9Cit9CisKKyAKK3N0YXRpYyBpbnQgYXRobG9uX2NoZWNrX2N0cnMoc3RydWN0IHB0X3JlZ3MgKiBjb25zdCByZWdzLAorCQkJICAgICBzdHJ1Y3Qgb3BfbXNycyBjb25zdCAqIGNvbnN0IG1zcnMpCit7CisJdW5zaWduZWQgaW50IGxvdywgaGlnaDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDAgOyBpIDwgTlVNX0NPVU5URVJTOyArK2kpIHsKKwkJQ1RSX1JFQUQobG93LCBoaWdoLCBtc3JzLCBpKTsKKwkJaWYgKENUUl9PVkVSRkxPV0VEKGxvdykpIHsKKwkJCW9wcm9maWxlX2FkZF9zYW1wbGUocmVncywgaSk7CisJCQlDVFJfV1JJVEUocmVzZXRfdmFsdWVbaV0sIG1zcnMsIGkpOworCQl9CisJfQorCisJLyogU2VlIG9wX21vZGVsX3Bwcm8uYyAqLworCXJldHVybiAxOworfQorCisgCitzdGF0aWMgdm9pZCBhdGhsb25fc3RhcnQoc3RydWN0IG9wX21zcnMgY29uc3QgKiBjb25zdCBtc3JzKQoreworCXVuc2lnbmVkIGludCBsb3csIGhpZ2g7CisJaW50IGk7CisJZm9yIChpID0gMCA7IGkgPCBOVU1fQ09VTlRFUlMgOyArK2kpIHsKKwkJaWYgKHJlc2V0X3ZhbHVlW2ldKSB7CisJCQlDVFJMX1JFQUQobG93LCBoaWdoLCBtc3JzLCBpKTsKKwkJCUNUUkxfU0VUX0FDVElWRShsb3cpOworCQkJQ1RSTF9XUklURShsb3csIGhpZ2gsIG1zcnMsIGkpOworCQl9CisJfQorfQorCisKK3N0YXRpYyB2b2lkIGF0aGxvbl9zdG9wKHN0cnVjdCBvcF9tc3JzIGNvbnN0ICogY29uc3QgbXNycykKK3sKKwl1bnNpZ25lZCBpbnQgbG93LGhpZ2g7CisJaW50IGk7CisKKwkvKiBTdWJ0bGU6IHN0b3Agb24gYWxsIGNvdW50ZXJzIHRvIGF2b2lkIHJhY2Ugd2l0aAorCSAqIHNldHRpbmcgb3VyIHBtIGNhbGxiYWNrICovCisJZm9yIChpID0gMCA7IGkgPCBOVU1fQ09VTlRFUlMgOyArK2kpIHsKKwkJQ1RSTF9SRUFEKGxvdywgaGlnaCwgbXNycywgaSk7CisJCUNUUkxfU0VUX0lOQUNUSVZFKGxvdyk7CisJCUNUUkxfV1JJVEUobG93LCBoaWdoLCBtc3JzLCBpKTsKKwl9Cit9CisKKworc3RydWN0IG9wX3g4Nl9tb2RlbF9zcGVjIGNvbnN0IG9wX2F0aGxvbl9zcGVjID0geworCS5udW1fY291bnRlcnMgPSBOVU1fQ09VTlRFUlMsCisJLm51bV9jb250cm9scyA9IE5VTV9DT05UUk9MUywKKwkuZmlsbF9pbl9hZGRyZXNzZXMgPSAmYXRobG9uX2ZpbGxfaW5fYWRkcmVzc2VzLAorCS5zZXR1cF9jdHJzID0gJmF0aGxvbl9zZXR1cF9jdHJzLAorCS5jaGVja19jdHJzID0gJmF0aGxvbl9jaGVja19jdHJzLAorCS5zdGFydCA9ICZhdGhsb25fc3RhcnQsCisJLnN0b3AgPSAmYXRobG9uX3N0b3AKK307CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvb3Byb2ZpbGUvb3BfbW9kZWxfcDQuYyBiL2FyY2gvaTM4Ni9vcHJvZmlsZS9vcF9tb2RlbF9wNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjOGEwNjYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvb3Byb2ZpbGUvb3BfbW9kZWxfcDQuYwpAQCAtMCwwICsxLDcyNSBAQAorLyoqCisgKiBAZmlsZSBvcF9tb2RlbF9wNC5jCisgKiBQNCBtb2RlbC1zcGVjaWZpYyBNU1Igb3BlcmF0aW9ucworICoKKyAqIEByZW1hcmsgQ29weXJpZ2h0IDIwMDIgT1Byb2ZpbGUgYXV0aG9ycworICogQHJlbWFyayBSZWFkIHRoZSBmaWxlIENPUFlJTkcKKyAqCisgKiBAYXV0aG9yIEdyYXlkb24gSG9hcmUKKyAqLworCisjaW5jbHVkZSA8bGludXgvb3Byb2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KKyNpbmNsdWRlIDxhc20vYXBpYy5oPgorCisjaW5jbHVkZSAib3BfeDg2X21vZGVsLmgiCisjaW5jbHVkZSAib3BfY291bnRlci5oIgorCisjZGVmaW5lIE5VTV9FVkVOVFMgMzkKKworI2RlZmluZSBOVU1fQ09VTlRFUlNfTk9OX0hUIDgKKyNkZWZpbmUgTlVNX0VTQ1JTX05PTl9IVCA0NQorI2RlZmluZSBOVU1fQ0NDUlNfTk9OX0hUIDE4CisjZGVmaW5lIE5VTV9DT05UUk9MU19OT05fSFQgKE5VTV9FU0NSU19OT05fSFQgKyBOVU1fQ0NDUlNfTk9OX0hUKQorCisjZGVmaW5lIE5VTV9DT1VOVEVSU19IVDIgNAorI2RlZmluZSBOVU1fRVNDUlNfSFQyIDIzCisjZGVmaW5lIE5VTV9DQ0NSU19IVDIgOQorI2RlZmluZSBOVU1fQ09OVFJPTFNfSFQyIChOVU1fRVNDUlNfSFQyICsgTlVNX0NDQ1JTX0hUMikKKworc3RhdGljIHVuc2lnbmVkIGludCBudW1fY291bnRlcnMgPSBOVU1fQ09VTlRFUlNfTk9OX0hUOworCisKKy8qIHRoaXMgaGFzIHRvIGJlIGNoZWNrZWQgZHluYW1pY2FsbHkgc2luY2UgdGhlCisgICBoeXBlci10aHJlYWRlZG5lc3Mgb2YgYSBjaGlwIGlzIGRpc2NvdmVyZWQgYXQKKyAgIGtlcm5lbCBib290LXRpbWUuICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0dXBfbnVtX2NvdW50ZXJzKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1NNUAorCWlmIChzbXBfbnVtX3NpYmxpbmdzID09IDIpCisJCW51bV9jb3VudGVycyA9IE5VTV9DT1VOVEVSU19IVDI7CisjZW5kaWYKK30KKworc3RhdGljIGludCBpbmxpbmUgYWRkcl9pbmNyZW1lbnQodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfU01QCisJcmV0dXJuIHNtcF9udW1fc2libGluZ3MgPT0gMiA/IDIgOiAxOworI2Vsc2UKKwlyZXR1cm4gMTsKKyNlbmRpZgorfQorCisKKy8qIHRhYmxlcyB0byBzaW11bGF0ZSBzaW1wbGlmaWVkIGhhcmR3YXJlIHZpZXcgb2YgcDQgcmVnaXN0ZXJzICovCitzdHJ1Y3QgcDRfY291bnRlcl9iaW5kaW5nIHsKKwlpbnQgdmlydF9jb3VudGVyOworCWludCBjb3VudGVyX2FkZHJlc3M7CisJaW50IGNjY3JfYWRkcmVzczsKK307CisKK3N0cnVjdCBwNF9ldmVudF9iaW5kaW5nIHsKKwlpbnQgZXNjcl9zZWxlY3Q7ICAvKiB2YWx1ZSB0byBwdXQgaW4gQ0NDUiAqLworCWludCBldmVudF9zZWxlY3Q7IC8qIHZhbHVlIHRvIHB1dCBpbiBFU0NSICovCisJc3RydWN0IHsKKwkJaW50IHZpcnRfY291bnRlcjsgLyogZm9yIHRoaXMgY291bnRlci4uLiAqLworCQlpbnQgZXNjcl9hZGRyZXNzOyAvKiB1c2UgdGhpcyBFU0NSICAgICAgICovCisJfSBiaW5kaW5nc1syXTsKK307CisKKy8qIG5iOiB0aGVzZSBDVFJfKiBkZWZpbmVzIGFyZSBhIGR1cGxpY2F0ZSBvZiBkZWZpbmVzIGluCisgICBldmVudC9pMzg2LnA0KmV2ZW50cy4gKi8KKworCisjZGVmaW5lIENUUl9CUFVfMCAgICAgICgxIDw8IDApCisjZGVmaW5lIENUUl9NU18wICAgICAgICgxIDw8IDEpCisjZGVmaW5lIENUUl9GTEFNRV8wICAgICgxIDw8IDIpCisjZGVmaW5lIENUUl9JUV80ICAgICAgICgxIDw8IDMpCisjZGVmaW5lIENUUl9CUFVfMiAgICAgICgxIDw8IDQpCisjZGVmaW5lIENUUl9NU18yICAgICAgICgxIDw8IDUpCisjZGVmaW5lIENUUl9GTEFNRV8yICAgICgxIDw8IDYpCisjZGVmaW5lIENUUl9JUV81ICAgICAgICgxIDw8IDcpCisKK3N0YXRpYyBzdHJ1Y3QgcDRfY291bnRlcl9iaW5kaW5nIHA0X2NvdW50ZXJzIFtOVU1fQ09VTlRFUlNfTk9OX0hUXSA9IHsKKwl7IENUUl9CUFVfMCwgICBNU1JfUDRfQlBVX1BFUkZDVFIwLCAgIE1TUl9QNF9CUFVfQ0NDUjAgfSwKKwl7IENUUl9NU18wLCAgICBNU1JfUDRfTVNfUEVSRkNUUjAsICAgIE1TUl9QNF9NU19DQ0NSMCB9LAorCXsgQ1RSX0ZMQU1FXzAsIE1TUl9QNF9GTEFNRV9QRVJGQ1RSMCwgTVNSX1A0X0ZMQU1FX0NDQ1IwIH0sCisJeyBDVFJfSVFfNCwgICAgTVNSX1A0X0lRX1BFUkZDVFI0LCAgICBNU1JfUDRfSVFfQ0NDUjQgfSwKKwl7IENUUl9CUFVfMiwgICBNU1JfUDRfQlBVX1BFUkZDVFIyLCAgIE1TUl9QNF9CUFVfQ0NDUjIgfSwKKwl7IENUUl9NU18yLCAgICBNU1JfUDRfTVNfUEVSRkNUUjIsICAgIE1TUl9QNF9NU19DQ0NSMiB9LAorCXsgQ1RSX0ZMQU1FXzIsIE1TUl9QNF9GTEFNRV9QRVJGQ1RSMiwgTVNSX1A0X0ZMQU1FX0NDQ1IyIH0sCisJeyBDVFJfSVFfNSwgICAgTVNSX1A0X0lRX1BFUkZDVFI1LCAgICBNU1JfUDRfSVFfQ0NDUjUgfQorfTsKKworI2RlZmluZSBOVU1fVU5VU0VEX0NDQ1JTCU5VTV9DQ0NSU19OT05fSFQgLSBOVU1fQ09VTlRFUlNfTk9OX0hUCisKKy8qIEFsbCBjY2NyIHdlIGRvbid0IHVzZS4gKi8KK3N0YXRpYyBpbnQgcDRfdW51c2VkX2NjY3JbTlVNX1VOVVNFRF9DQ0NSU10gPSB7CisJTVNSX1A0X0JQVV9DQ0NSMSwJTVNSX1A0X0JQVV9DQ0NSMywKKwlNU1JfUDRfTVNfQ0NDUjEsCU1TUl9QNF9NU19DQ0NSMywKKwlNU1JfUDRfRkxBTUVfQ0NDUjEsCU1TUl9QNF9GTEFNRV9DQ0NSMywKKwlNU1JfUDRfSVFfQ0NDUjAsCU1TUl9QNF9JUV9DQ0NSMSwKKwlNU1JfUDRfSVFfQ0NDUjIsCU1TUl9QNF9JUV9DQ0NSMworfTsKKworLyogcDQgZXZlbnQgY29kZXMgaW4gbGlib3Avb3BfZXZlbnQuaCBhcmUgaW5kaWNlcyBpbnRvIHRoaXMgdGFibGUuICovCisKK3N0YXRpYyBzdHJ1Y3QgcDRfZXZlbnRfYmluZGluZyBwNF9ldmVudHNbTlVNX0VWRU5UU10gPSB7CisJCisJeyAvKiBCUkFOQ0hfUkVUSVJFRCAqLworCQkweDA1LCAweDA2LCAKKwkJeyB7Q1RSX0lRXzQsIE1TUl9QNF9DUlVfRVNDUjJ9LAorCQkgIHtDVFJfSVFfNSwgTVNSX1A0X0NSVV9FU0NSM30gfQorCX0sCisJCisJeyAvKiBNSVNQUkVEX0JSQU5DSF9SRVRJUkVEICovCisJCTB4MDQsIDB4MDMsIAorCQl7IHsgQ1RSX0lRXzQsIE1TUl9QNF9DUlVfRVNDUjB9LAorCQkgIHsgQ1RSX0lRXzUsIE1TUl9QNF9DUlVfRVNDUjF9IH0KKwl9LAorCQorCXsgLyogVENfREVMSVZFUl9NT0RFICovCisJCTB4MDEsIDB4MDEsCisJCXsgeyBDVFJfTVNfMCwgTVNSX1A0X1RDX0VTQ1IwfSwgIAorCQkgIHsgQ1RSX01TXzIsIE1TUl9QNF9UQ19FU0NSMX0gfQorCX0sCisJCisJeyAvKiBCUFVfRkVUQ0hfUkVRVUVTVCAqLworCQkweDAwLCAweDAzLCAKKwkJeyB7IENUUl9CUFVfMCwgTVNSX1A0X0JQVV9FU0NSMH0sCisJCSAgeyBDVFJfQlBVXzIsIE1TUl9QNF9CUFVfRVNDUjF9IH0KKwl9LAorCisJeyAvKiBJVExCX1JFRkVSRU5DRSAqLworCQkweDAzLCAweDE4LAorCQl7IHsgQ1RSX0JQVV8wLCBNU1JfUDRfSVRMQl9FU0NSMH0sCisJCSAgeyBDVFJfQlBVXzIsIE1TUl9QNF9JVExCX0VTQ1IxfSB9CisJfSwKKworCXsgLyogTUVNT1JZX0NBTkNFTCAqLworCQkweDA1LCAweDAyLAorCQl7IHsgQ1RSX0ZMQU1FXzAsIE1TUl9QNF9EQUNfRVNDUjB9LAorCQkgIHsgQ1RSX0ZMQU1FXzIsIE1TUl9QNF9EQUNfRVNDUjF9IH0KKwl9LAorCisJeyAvKiBNRU1PUllfQ09NUExFVEUgKi8KKwkJMHgwMiwgMHgwOCwKKwkJeyB7IENUUl9GTEFNRV8wLCBNU1JfUDRfU0FBVF9FU0NSMH0sCisJCSAgeyBDVFJfRkxBTUVfMiwgTVNSX1A0X1NBQVRfRVNDUjF9IH0KKwl9LAorCisJeyAvKiBMT0FEX1BPUlRfUkVQTEFZICovCisJCTB4MDIsIDB4MDQsIAorCQl7IHsgQ1RSX0ZMQU1FXzAsIE1TUl9QNF9TQUFUX0VTQ1IwfSwKKwkJICB7IENUUl9GTEFNRV8yLCBNU1JfUDRfU0FBVF9FU0NSMX0gfQorCX0sCisKKwl7IC8qIFNUT1JFX1BPUlRfUkVQTEFZICovCisJCTB4MDIsIDB4MDUsCisJCXsgeyBDVFJfRkxBTUVfMCwgTVNSX1A0X1NBQVRfRVNDUjB9LAorCQkgIHsgQ1RSX0ZMQU1FXzIsIE1TUl9QNF9TQUFUX0VTQ1IxfSB9CisJfSwKKworCXsgLyogTU9CX0xPQURfUkVQTEFZICovCisJCTB4MDIsIDB4MDMsCisJCXsgeyBDVFJfQlBVXzAsIE1TUl9QNF9NT0JfRVNDUjB9LAorCQkgIHsgQ1RSX0JQVV8yLCBNU1JfUDRfTU9CX0VTQ1IxfSB9CisJfSwKKworCXsgLyogUEFHRV9XQUxLX1RZUEUgKi8KKwkJMHgwNCwgMHgwMSwKKwkJeyB7IENUUl9CUFVfMCwgTVNSX1A0X1BNSF9FU0NSMH0sCisJCSAgeyBDVFJfQlBVXzIsIE1TUl9QNF9QTUhfRVNDUjF9IH0KKwl9LAorCisJeyAvKiBCU1FfQ0FDSEVfUkVGRVJFTkNFICovCisJCTB4MDcsIDB4MGMsIAorCQl7IHsgQ1RSX0JQVV8wLCBNU1JfUDRfQlNVX0VTQ1IwfSwKKwkJICB7IENUUl9CUFVfMiwgTVNSX1A0X0JTVV9FU0NSMX0gfQorCX0sCisKKwl7IC8qIElPUV9BTExPQ0FUSU9OICovCisJCTB4MDYsIDB4MDMsIAorCQl7IHsgQ1RSX0JQVV8wLCBNU1JfUDRfRlNCX0VTQ1IwfSwKKwkJICB7IDAsIDAgfSB9CisJfSwKKworCXsgLyogSU9RX0FDVElWRV9FTlRSSUVTICovCisJCTB4MDYsIDB4MWEsIAorCQl7IHsgQ1RSX0JQVV8yLCBNU1JfUDRfRlNCX0VTQ1IxfSwKKwkJICB7IDAsIDAgfSB9CisJfSwKKworCXsgLyogRlNCX0RBVEFfQUNUSVZJVFkgKi8KKwkJMHgwNiwgMHgxNywgCisJCXsgeyBDVFJfQlBVXzAsIE1TUl9QNF9GU0JfRVNDUjB9LAorCQkgIHsgQ1RSX0JQVV8yLCBNU1JfUDRfRlNCX0VTQ1IxfSB9CisJfSwKKworCXsgLyogQlNRX0FMTE9DQVRJT04gKi8KKwkJMHgwNywgMHgwNSwgCisJCXsgeyBDVFJfQlBVXzAsIE1TUl9QNF9CU1VfRVNDUjB9LAorCQkgIHsgMCwgMCB9IH0KKwl9LAorCisJeyAvKiBCU1FfQUNUSVZFX0VOVFJJRVMgKi8KKwkJMHgwNywgMHgwNiwKKwkJeyB7IENUUl9CUFVfMiwgTVNSX1A0X0JTVV9FU0NSMSAvKiBndWVzcyAqL30sICAKKwkJICB7IDAsIDAgfSB9CisJfSwKKworCXsgLyogWDg3X0FTU0lTVCAqLworCQkweDA1LCAweDAzLCAKKwkJeyB7IENUUl9JUV80LCBNU1JfUDRfQ1JVX0VTQ1IyfSwKKwkJICB7IENUUl9JUV81LCBNU1JfUDRfQ1JVX0VTQ1IzfSB9CisJfSwKKworCXsgLyogU1NFX0lOUFVUX0FTU0lTVCAqLworCQkweDAxLCAweDM0LAorCQl7IHsgQ1RSX0ZMQU1FXzAsIE1TUl9QNF9GSVJNX0VTQ1IwfSwKKwkJICB7IENUUl9GTEFNRV8yLCBNU1JfUDRfRklSTV9FU0NSMX0gfQorCX0sCisgIAorCXsgLyogUEFDS0VEX1NQX1VPUCAqLworCQkweDAxLCAweDA4LCAKKwkJeyB7IENUUl9GTEFNRV8wLCBNU1JfUDRfRklSTV9FU0NSMH0sCisJCSAgeyBDVFJfRkxBTUVfMiwgTVNSX1A0X0ZJUk1fRVNDUjF9IH0KKwl9LAorICAKKwl7IC8qIFBBQ0tFRF9EUF9VT1AgKi8KKwkJMHgwMSwgMHgwYywgCisJCXsgeyBDVFJfRkxBTUVfMCwgTVNSX1A0X0ZJUk1fRVNDUjB9LAorCQkgIHsgQ1RSX0ZMQU1FXzIsIE1TUl9QNF9GSVJNX0VTQ1IxfSB9CisJfSwKKworCXsgLyogU0NBTEFSX1NQX1VPUCAqLworCQkweDAxLCAweDBhLCAKKwkJeyB7IENUUl9GTEFNRV8wLCBNU1JfUDRfRklSTV9FU0NSMH0sCisJCSAgeyBDVFJfRkxBTUVfMiwgTVNSX1A0X0ZJUk1fRVNDUjF9IH0KKwl9LAorCisJeyAvKiBTQ0FMQVJfRFBfVU9QICovCisJCTB4MDEsIDB4MGUsCisJCXsgeyBDVFJfRkxBTUVfMCwgTVNSX1A0X0ZJUk1fRVNDUjB9LAorCQkgIHsgQ1RSX0ZMQU1FXzIsIE1TUl9QNF9GSVJNX0VTQ1IxfSB9CisJfSwKKworCXsgLyogNjRCSVRfTU1YX1VPUCAqLworCQkweDAxLCAweDAyLCAKKwkJeyB7IENUUl9GTEFNRV8wLCBNU1JfUDRfRklSTV9FU0NSMH0sCisJCSAgeyBDVFJfRkxBTUVfMiwgTVNSX1A0X0ZJUk1fRVNDUjF9IH0KKwl9LAorICAKKwl7IC8qIDEyOEJJVF9NTVhfVU9QICovCisJCTB4MDEsIDB4MWEsIAorCQl7IHsgQ1RSX0ZMQU1FXzAsIE1TUl9QNF9GSVJNX0VTQ1IwfSwKKwkJICB7IENUUl9GTEFNRV8yLCBNU1JfUDRfRklSTV9FU0NSMX0gfQorCX0sCisKKwl7IC8qIFg4N19GUF9VT1AgKi8KKwkJMHgwMSwgMHgwNCwgCisJCXsgeyBDVFJfRkxBTUVfMCwgTVNSX1A0X0ZJUk1fRVNDUjB9LAorCQkgIHsgQ1RSX0ZMQU1FXzIsIE1TUl9QNF9GSVJNX0VTQ1IxfSB9CisJfSwKKyAgCisJeyAvKiBYODdfU0lNRF9NT1ZFU19VT1AgKi8KKwkJMHgwMSwgMHgyZSwgCisJCXsgeyBDVFJfRkxBTUVfMCwgTVNSX1A0X0ZJUk1fRVNDUjB9LAorCQkgIHsgQ1RSX0ZMQU1FXzIsIE1TUl9QNF9GSVJNX0VTQ1IxfSB9CisJfSwKKyAgCisJeyAvKiBNQUNISU5FX0NMRUFSICovCisJCTB4MDUsIDB4MDIsIAorCQl7IHsgQ1RSX0lRXzQsIE1TUl9QNF9DUlVfRVNDUjJ9LAorCQkgIHsgQ1RSX0lRXzUsIE1TUl9QNF9DUlVfRVNDUjN9IH0KKwl9LAorCisJeyAvKiBHTE9CQUxfUE9XRVJfRVZFTlRTICovCisJCTB4MDYsIDB4MTMgLyogb2xkZXIgbWFudWFsIHNheXMgMHgwNSwgbmV3ZXIgMHgxMyAqLywKKwkJeyB7IENUUl9CUFVfMCwgTVNSX1A0X0ZTQl9FU0NSMH0sCisJCSAgeyBDVFJfQlBVXzIsIE1TUl9QNF9GU0JfRVNDUjF9IH0KKwl9LAorICAKKwl7IC8qIFRDX01TX1hGRVIgKi8KKwkJMHgwMCwgMHgwNSwgCisJCXsgeyBDVFJfTVNfMCwgTVNSX1A0X01TX0VTQ1IwfSwKKwkJICB7IENUUl9NU18yLCBNU1JfUDRfTVNfRVNDUjF9IH0KKwl9LAorCisJeyAvKiBVT1BfUVVFVUVfV1JJVEVTICovCisJCTB4MDAsIDB4MDksCisJCXsgeyBDVFJfTVNfMCwgTVNSX1A0X01TX0VTQ1IwfSwKKwkJICB7IENUUl9NU18yLCBNU1JfUDRfTVNfRVNDUjF9IH0KKwl9LAorCisJeyAvKiBGUk9OVF9FTkRfRVZFTlQgKi8KKwkJMHgwNSwgMHgwOCwKKwkJeyB7IENUUl9JUV80LCBNU1JfUDRfQ1JVX0VTQ1IyfSwKKwkJICB7IENUUl9JUV81LCBNU1JfUDRfQ1JVX0VTQ1IzfSB9CisJfSwKKworCXsgLyogRVhFQ1VUSU9OX0VWRU5UICovCisJCTB4MDUsIDB4MGMsCisJCXsgeyBDVFJfSVFfNCwgTVNSX1A0X0NSVV9FU0NSMn0sCisJCSAgeyBDVFJfSVFfNSwgTVNSX1A0X0NSVV9FU0NSM30gfQorCX0sCisKKwl7IC8qIFJFUExBWV9FVkVOVCAqLworCQkweDA1LCAweDA5LAorCQl7IHsgQ1RSX0lRXzQsIE1TUl9QNF9DUlVfRVNDUjJ9LAorCQkgIHsgQ1RSX0lRXzUsIE1TUl9QNF9DUlVfRVNDUjN9IH0KKwl9LAorCisJeyAvKiBJTlNUUl9SRVRJUkVEICovCisJCTB4MDQsIDB4MDIsIAorCQl7IHsgQ1RSX0lRXzQsIE1TUl9QNF9DUlVfRVNDUjB9LAorCQkgIHsgQ1RSX0lRXzUsIE1TUl9QNF9DUlVfRVNDUjF9IH0KKwl9LAorCisJeyAvKiBVT1BTX1JFVElSRUQgKi8KKwkJMHgwNCwgMHgwMSwKKwkJeyB7IENUUl9JUV80LCBNU1JfUDRfQ1JVX0VTQ1IwfSwKKwkJICB7IENUUl9JUV81LCBNU1JfUDRfQ1JVX0VTQ1IxfSB9CisJfSwKKworCXsgLyogVU9QX1RZUEUgKi8gICAgCisJCTB4MDIsIDB4MDIsIAorCQl7IHsgQ1RSX0lRXzQsIE1TUl9QNF9SQVRfRVNDUjB9LAorCQkgIHsgQ1RSX0lRXzUsIE1TUl9QNF9SQVRfRVNDUjF9IH0KKwl9LAorCisJeyAvKiBSRVRJUkVEX01JU1BSRURfQlJBTkNIX1RZUEUgKi8KKwkJMHgwMiwgMHgwNSwgCisJCXsgeyBDVFJfTVNfMCwgTVNSX1A0X1RCUFVfRVNDUjB9LAorCQkgIHsgQ1RSX01TXzIsIE1TUl9QNF9UQlBVX0VTQ1IxfSB9CisJfSwKKworCXsgLyogUkVUSVJFRF9CUkFOQ0hfVFlQRSAqLworCQkweDAyLCAweDA0LAorCQl7IHsgQ1RSX01TXzAsIE1TUl9QNF9UQlBVX0VTQ1IwfSwKKwkJICB7IENUUl9NU18yLCBNU1JfUDRfVEJQVV9FU0NSMX0gfQorCX0KK307CisKKworI2RlZmluZSBNSVNDX1BNQ19FTkFCTEVEX1AoeCkgKCh4KSAmIDEgPDwgNykKKworI2RlZmluZSBFU0NSX1JFU0VSVkVEX0JJVFMgMHg4MDAwMDAwMworI2RlZmluZSBFU0NSX0NMRUFSKGVzY3IpICgoZXNjcikgJj0gRVNDUl9SRVNFUlZFRF9CSVRTKQorI2RlZmluZSBFU0NSX1NFVF9VU1JfMChlc2NyLCB1c3IpICgoZXNjcikgfD0gKCgodXNyKSAmIDEpIDw8IDIpKQorI2RlZmluZSBFU0NSX1NFVF9PU18wKGVzY3IsIG9zKSAoKGVzY3IpIHw9ICgoKG9zKSAmIDEpIDw8IDMpKQorI2RlZmluZSBFU0NSX1NFVF9VU1JfMShlc2NyLCB1c3IpICgoZXNjcikgfD0gKCgodXNyKSAmIDEpKSkKKyNkZWZpbmUgRVNDUl9TRVRfT1NfMShlc2NyLCBvcykgKChlc2NyKSB8PSAoKChvcykgJiAxKSA8PCAxKSkKKyNkZWZpbmUgRVNDUl9TRVRfRVZFTlRfU0VMRUNUKGVzY3IsIHNlbCkgKChlc2NyKSB8PSAoKChzZWwpICYgMHgzZikgPDwgMjUpKQorI2RlZmluZSBFU0NSX1NFVF9FVkVOVF9NQVNLKGVzY3IsIG1hc2spICgoZXNjcikgfD0gKCgobWFzaykgJiAweGZmZmYpIDw8IDkpKQorI2RlZmluZSBFU0NSX1JFQUQoZXNjcixoaWdoLGV2LGkpIGRvIHtyZG1zcihldi0+YmluZGluZ3NbKGkpXS5lc2NyX2FkZHJlc3MsIChlc2NyKSwgKGhpZ2gpKTt9IHdoaWxlICgwKQorI2RlZmluZSBFU0NSX1dSSVRFKGVzY3IsaGlnaCxldixpKSBkbyB7d3Jtc3IoZXYtPmJpbmRpbmdzWyhpKV0uZXNjcl9hZGRyZXNzLCAoZXNjciksIChoaWdoKSk7fSB3aGlsZSAoMCkKKworI2RlZmluZSBDQ0NSX1JFU0VSVkVEX0JJVFMgMHgzODAzMEZGRgorI2RlZmluZSBDQ0NSX0NMRUFSKGNjY3IpICgoY2NjcikgJj0gQ0NDUl9SRVNFUlZFRF9CSVRTKQorI2RlZmluZSBDQ0NSX1NFVF9SRVFVSVJFRF9CSVRTKGNjY3IpICgoY2NjcikgfD0gMHgwMDAzMDAwMCkKKyNkZWZpbmUgQ0NDUl9TRVRfRVNDUl9TRUxFQ1QoY2Njciwgc2VsKSAoKGNjY3IpIHw9ICgoKHNlbCkgJiAweDA3KSA8PCAxMykpCisjZGVmaW5lIENDQ1JfU0VUX1BNSV9PVkZfMChjY2NyKSAoKGNjY3IpIHw9ICgxPDwyNikpCisjZGVmaW5lIENDQ1JfU0VUX1BNSV9PVkZfMShjY2NyKSAoKGNjY3IpIHw9ICgxPDwyNykpCisjZGVmaW5lIENDQ1JfU0VUX0VOQUJMRShjY2NyKSAoKGNjY3IpIHw9ICgxPDwxMikpCisjZGVmaW5lIENDQ1JfU0VUX0RJU0FCTEUoY2NjcikgKChjY2NyKSAmPSB+KDE8PDEyKSkKKyNkZWZpbmUgQ0NDUl9SRUFEKGxvdywgaGlnaCwgaSkgZG8ge3JkbXNyKHA0X2NvdW50ZXJzWyhpKV0uY2Njcl9hZGRyZXNzLCAobG93KSwgKGhpZ2gpKTt9IHdoaWxlICgwKQorI2RlZmluZSBDQ0NSX1dSSVRFKGxvdywgaGlnaCwgaSkgZG8ge3dybXNyKHA0X2NvdW50ZXJzWyhpKV0uY2Njcl9hZGRyZXNzLCAobG93KSwgKGhpZ2gpKTt9IHdoaWxlICgwKQorI2RlZmluZSBDQ0NSX09WRl9QKGNjY3IpICgoY2NjcikgJiAoMVU8PDMxKSkKKyNkZWZpbmUgQ0NDUl9DTEVBUl9PVkYoY2NjcikgKChjY2NyKSAmPSAofigxVTw8MzEpKSkKKworI2RlZmluZSBDVFJfUkVBRChsLGgsaSkgZG8ge3JkbXNyKHA0X2NvdW50ZXJzWyhpKV0uY291bnRlcl9hZGRyZXNzLCAobCksIChoKSk7fSB3aGlsZSAoMCkKKyNkZWZpbmUgQ1RSX1dSSVRFKGwsaSkgZG8ge3dybXNyKHA0X2NvdW50ZXJzWyhpKV0uY291bnRlcl9hZGRyZXNzLCAtKHUzMikobCksIC0xKTt9IHdoaWxlICgwKQorI2RlZmluZSBDVFJfT1ZFUkZMT1dfUChjdHIpICghKChjdHIpICYgMHg4MDAwMDAwMCkpCisKKworLyogdGhpcyBhc3NpZ25zIGEgInN0YWdnZXIiIHRvIHRoZSBjdXJyZW50IENQVSwgd2hpY2ggaXMgdXNlZCB0aHJvdWdob3V0CisgICB0aGUgY29kZSBpbiB0aGlzIG1vZHVsZSBhcyBhbiBleHRyYSBhcnJheSBvZmZzZXQsIHRvIHNlbGVjdCB0aGUgImV2ZW4iCisgICBvciAib2RkIiBwYXJ0IG9mIGFsbCB0aGUgZGl2aWRlZCByZXNvdXJjZXMuICovCitzdGF0aWMgdW5zaWduZWQgaW50IGdldF9zdGFnZ2VyKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1NNUAorCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJcmV0dXJuIChjcHUgIT0gZmlyc3RfY3B1KGNwdV9zaWJsaW5nX21hcFtjcHVdKSk7CisjZW5kaWYJCisJcmV0dXJuIDA7Cit9CisKKworLyogZmluYWxseSwgbWVkaWF0ZSBhY2Nlc3MgdG8gYSByZWFsIGhhcmR3YXJlIGNvdW50ZXIKKyAgIGJ5IHBhc3NpbmcgYSAidmlydHVhbCIgY291bnRlciBudW1lciB0byB0aGlzIG1hY3JvLAorICAgYWxvbmcgd2l0aCB5b3VyIHN0YWdnZXIgc2V0dGluZy4gKi8KKyNkZWZpbmUgVklSVF9DVFIoc3RhZ2dlciwgaSkgKChpKSArICgobnVtX2NvdW50ZXJzKSAqIChzdGFnZ2VyKSkpCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJlc2V0X3ZhbHVlW05VTV9DT1VOVEVSU19OT05fSFRdOworCisKK3N0YXRpYyB2b2lkIHA0X2ZpbGxfaW5fYWRkcmVzc2VzKHN0cnVjdCBvcF9tc3JzICogY29uc3QgbXNycykKK3sKKwl1bnNpZ25lZCBpbnQgaTsgCisJdW5zaWduZWQgaW50IGFkZHIsIHN0YWc7CisKKwlzZXR1cF9udW1fY291bnRlcnMoKTsKKwlzdGFnID0gZ2V0X3N0YWdnZXIoKTsKKworCS8qIHRoZSBjb3VudGVyIHJlZ2lzdGVycyB3ZSBwYXkgYXR0ZW50aW9uIHRvICovCisJZm9yIChpID0gMDsgaSA8IG51bV9jb3VudGVyczsgKytpKSB7CisJCW1zcnMtPmNvdW50ZXJzW2ldLmFkZHIgPSAKKwkJCXA0X2NvdW50ZXJzW1ZJUlRfQ1RSKHN0YWcsIGkpXS5jb3VudGVyX2FkZHJlc3M7CisJfQorCisJLyogRklYTUU6IGJhZCBmZWVsaW5nLCB3ZSBkb24ndCBzYXZlIHRoZSAxMCBjb3VudGVycyB3ZSBkb24ndCB1c2UuICovCisKKwkvKiAxOCBDQ0NSIHJlZ2lzdGVycyAqLworCWZvciAoaSA9IDAsIGFkZHIgPSBNU1JfUDRfQlBVX0NDQ1IwICsgc3RhZzsKKwkgICAgIGFkZHIgPD0gTVNSX1A0X0lRX0NDQ1I1OyArK2ksIGFkZHIgKz0gYWRkcl9pbmNyZW1lbnQoKSkgeworCQltc3JzLT5jb250cm9sc1tpXS5hZGRyID0gYWRkcjsKKwl9CisJCisJLyogNDMgRVNDUiByZWdpc3RlcnMgaW4gdGhyZWUgb3IgZm91ciBkaXNjb250aWd1b3VzIGdyb3VwICovCisJZm9yIChhZGRyID0gTVNSX1A0X0JTVV9FU0NSMCArIHN0YWc7CisJICAgICBhZGRyIDwgTVNSX1A0X0lRX0VTQ1IwOyArK2ksIGFkZHIgKz0gYWRkcl9pbmNyZW1lbnQoKSkgeworCQltc3JzLT5jb250cm9sc1tpXS5hZGRyID0gYWRkcjsKKwl9CisKKwkvKiBubyBJUV9FU0NSMC8xIG9uIHNvbWUgbW9kZWxzLCB3ZSBzYXZlIGEgc2Vjb25kZSB0aW1lIEJTVV9FU0NSMC8xCisJICogdG8gYXZvaWQgc3BlY2lhbCBjYXNlIGluIG5taV97c2F2ZXxyZXN0b3JlfV9yZWdpc3RlcnMoKSAqLworCWlmIChib290X2NwdV9kYXRhLng4Nl9tb2RlbCA+PSAweDMpIHsKKwkJZm9yIChhZGRyID0gTVNSX1A0X0JTVV9FU0NSMCArIHN0YWc7CisJCSAgICAgYWRkciA8PSBNU1JfUDRfQlNVX0VTQ1IxOyArK2ksIGFkZHIgKz0gYWRkcl9pbmNyZW1lbnQoKSkgeworCQkJbXNycy0+Y29udHJvbHNbaV0uYWRkciA9IGFkZHI7CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKGFkZHIgPSBNU1JfUDRfSVFfRVNDUjAgKyBzdGFnOworCQkgICAgIGFkZHIgPD0gTVNSX1A0X0lRX0VTQ1IxOyArK2ksIGFkZHIgKz0gYWRkcl9pbmNyZW1lbnQoKSkgeworCQkJbXNycy0+Y29udHJvbHNbaV0uYWRkciA9IGFkZHI7CisJCX0KKwl9CisKKwlmb3IgKGFkZHIgPSBNU1JfUDRfUkFUX0VTQ1IwICsgc3RhZzsKKwkgICAgIGFkZHIgPD0gTVNSX1A0X1NTVV9FU0NSMDsgKytpLCBhZGRyICs9IGFkZHJfaW5jcmVtZW50KCkpIHsKKwkJbXNycy0+Y29udHJvbHNbaV0uYWRkciA9IGFkZHI7CisJfQorCQorCWZvciAoYWRkciA9IE1TUl9QNF9NU19FU0NSMCArIHN0YWc7CisJICAgICBhZGRyIDw9IE1TUl9QNF9UQ19FU0NSMTsgKytpLCBhZGRyICs9IGFkZHJfaW5jcmVtZW50KCkpIHsgCisJCW1zcnMtPmNvbnRyb2xzW2ldLmFkZHIgPSBhZGRyOworCX0KKwkKKwlmb3IgKGFkZHIgPSBNU1JfUDRfSVhfRVNDUjAgKyBzdGFnOworCSAgICAgYWRkciA8PSBNU1JfUDRfQ1JVX0VTQ1IzOyArK2ksIGFkZHIgKz0gYWRkcl9pbmNyZW1lbnQoKSkgeyAKKwkJbXNycy0+Y29udHJvbHNbaV0uYWRkciA9IGFkZHI7CisJfQorCisJLyogdGhlcmUgYXJlIDIgcmVtYWluaW5nIG5vbi1jb250aWd1b3VzbHkgbG9jYXRlZCBFU0NScyAqLworCisJaWYgKG51bV9jb3VudGVycyA9PSBOVU1fQ09VTlRFUlNfTk9OX0hUKSB7CQkKKwkJLyogc3RhbmRhcmQgbm9uLUhUIENQVXMgaGFuZGxlIGJvdGggcmVtYWluaW5nIEVTQ1JzKi8KKwkJbXNycy0+Y29udHJvbHNbaSsrXS5hZGRyID0gTVNSX1A0X0NSVV9FU0NSNTsKKwkJbXNycy0+Y29udHJvbHNbaSsrXS5hZGRyID0gTVNSX1A0X0NSVV9FU0NSNDsKKworCX0gZWxzZSBpZiAoc3RhZyA9PSAwKSB7CisJCS8qIEhUIENQVXMgZ2l2ZSB0aGUgZmlyc3QgcmVtYWluZGVyIHRvIHRoZSBldmVuIHRocmVhZCwgYXMKKwkJICAgdGhlIDMybmQgY29udHJvbCByZWdpc3RlciAqLworCQltc3JzLT5jb250cm9sc1tpKytdLmFkZHIgPSBNU1JfUDRfQ1JVX0VTQ1I0OworCisJfSBlbHNlIHsKKwkJLyogYW5kIHR3byBjb3BpZXMgb2YgdGhlIHNlY29uZCB0byB0aGUgb2RkIHRocmVhZCwKKwkJICAgZm9yIHRoZSAyMnN0IGFuZCAyM25kIGNvbnRyb2wgcmVnaXN0ZXJzICovCisJCW1zcnMtPmNvbnRyb2xzW2krK10uYWRkciA9IE1TUl9QNF9DUlVfRVNDUjU7CisJCW1zcnMtPmNvbnRyb2xzW2krK10uYWRkciA9IE1TUl9QNF9DUlVfRVNDUjU7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHBtY19zZXR1cF9vbmVfcDRfY291bnRlcih1bnNpZ25lZCBpbnQgY3RyKQoreworCWludCBpOworCWludCBjb25zdCBtYXhiaW5kID0gMjsKKwl1bnNpZ25lZCBpbnQgY2NjciA9IDA7CisJdW5zaWduZWQgaW50IGVzY3IgPSAwOworCXVuc2lnbmVkIGludCBoaWdoID0gMDsKKwl1bnNpZ25lZCBpbnQgY291bnRlcl9iaXQ7CisJc3RydWN0IHA0X2V2ZW50X2JpbmRpbmcgKmV2ID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgc3RhZzsKKworCXN0YWcgPSBnZXRfc3RhZ2dlcigpOworCQorCS8qIGNvbnZlcnQgZnJvbSBjb3VudGVyICpudW1iZXIqIHRvIGNvdW50ZXIgKmJpdCogKi8KKwljb3VudGVyX2JpdCA9IDEgPDwgVklSVF9DVFIoc3RhZywgY3RyKTsKKwkKKwkvKiBmaW5kIG91ciBldmVudCBiaW5kaW5nIHN0cnVjdHVyZS4gKi8KKwlpZiAoY291bnRlcl9jb25maWdbY3RyXS5ldmVudCA8PSAwIHx8IGNvdW50ZXJfY29uZmlnW2N0cl0uZXZlbnQgPiBOVU1fRVZFTlRTKSB7CisJCXByaW50ayhLRVJOX0VSUiAKKwkJICAgICAgICJvcHJvZmlsZTogUDQgZXZlbnQgY29kZSAweCVseCBvdXQgb2YgcmFuZ2VcbiIsIAorCQkgICAgICAgY291bnRlcl9jb25maWdbY3RyXS5ldmVudCk7CisJCXJldHVybjsKKwl9CisJCisJZXYgPSAmKHA0X2V2ZW50c1tjb3VudGVyX2NvbmZpZ1tjdHJdLmV2ZW50IC0gMV0pOworCQorCWZvciAoaSA9IDA7IGkgPCBtYXhiaW5kOyBpKyspIHsKKwkJaWYgKGV2LT5iaW5kaW5nc1tpXS52aXJ0X2NvdW50ZXIgJiBjb3VudGVyX2JpdCkgeworCisJCQkvKiBtb2RpZnkgRVNDUiAqLworCQkJRVNDUl9SRUFEKGVzY3IsIGhpZ2gsIGV2LCBpKTsKKwkJCUVTQ1JfQ0xFQVIoZXNjcik7CisJCQlpZiAoc3RhZyA9PSAwKSB7CisJCQkJRVNDUl9TRVRfVVNSXzAoZXNjciwgY291bnRlcl9jb25maWdbY3RyXS51c2VyKTsKKwkJCQlFU0NSX1NFVF9PU18wKGVzY3IsIGNvdW50ZXJfY29uZmlnW2N0cl0ua2VybmVsKTsKKwkJCX0gZWxzZSB7CisJCQkJRVNDUl9TRVRfVVNSXzEoZXNjciwgY291bnRlcl9jb25maWdbY3RyXS51c2VyKTsKKwkJCQlFU0NSX1NFVF9PU18xKGVzY3IsIGNvdW50ZXJfY29uZmlnW2N0cl0ua2VybmVsKTsKKwkJCX0KKwkJCUVTQ1JfU0VUX0VWRU5UX1NFTEVDVChlc2NyLCBldi0+ZXZlbnRfc2VsZWN0KTsKKwkJCUVTQ1JfU0VUX0VWRU5UX01BU0soZXNjciwgY291bnRlcl9jb25maWdbY3RyXS51bml0X21hc2spOwkJCQorCQkJRVNDUl9XUklURShlc2NyLCBoaWdoLCBldiwgaSk7CisJCSAgICAgICAKKwkJCS8qIG1vZGlmeSBDQ0NSICovCisJCQlDQ0NSX1JFQUQoY2NjciwgaGlnaCwgVklSVF9DVFIoc3RhZywgY3RyKSk7CisJCQlDQ0NSX0NMRUFSKGNjY3IpOworCQkJQ0NDUl9TRVRfUkVRVUlSRURfQklUUyhjY2NyKTsKKwkJCUNDQ1JfU0VUX0VTQ1JfU0VMRUNUKGNjY3IsIGV2LT5lc2NyX3NlbGVjdCk7CisJCQlpZiAoc3RhZyA9PSAwKSB7CisJCQkJQ0NDUl9TRVRfUE1JX09WRl8wKGNjY3IpOworCQkJfSBlbHNlIHsKKwkJCQlDQ0NSX1NFVF9QTUlfT1ZGXzEoY2Njcik7CisJCQl9CisJCQlDQ0NSX1dSSVRFKGNjY3IsIGhpZ2gsIFZJUlRfQ1RSKHN0YWcsIGN0cikpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJcHJpbnRrKEtFUk5fRVJSIAorCSAgICAgICAib3Byb2ZpbGU6IFA0IGV2ZW50IGNvZGUgMHglbHggbm8gYmluZGluZywgc3RhZyAlZCBjdHIgJWRcbiIsCisJICAgICAgIGNvdW50ZXJfY29uZmlnW2N0cl0uZXZlbnQsIHN0YWcsIGN0cik7Cit9CisKKworc3RhdGljIHZvaWQgcDRfc2V0dXBfY3RycyhzdHJ1Y3Qgb3BfbXNycyBjb25zdCAqIGNvbnN0IG1zcnMpCit7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgaW50IGxvdywgaGlnaDsKKwl1bnNpZ25lZCBpbnQgYWRkcjsKKwl1bnNpZ25lZCBpbnQgc3RhZzsKKworCXN0YWcgPSBnZXRfc3RhZ2dlcigpOworCisJcmRtc3IoTVNSX0lBMzJfTUlTQ19FTkFCTEUsIGxvdywgaGlnaCk7CisJaWYgKCEgTUlTQ19QTUNfRU5BQkxFRF9QKGxvdykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJvcHJvZmlsZTogUDQgUE1DIG5vdCBhdmFpbGFibGVcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogY2xlYXIgdGhlIGNjY3JzIHdlIHdpbGwgdXNlICovCisJZm9yIChpID0gMCA7IGkgPCBudW1fY291bnRlcnMgOyBpKyspIHsKKwkJcmRtc3IocDRfY291bnRlcnNbVklSVF9DVFIoc3RhZywgaSldLmNjY3JfYWRkcmVzcywgbG93LCBoaWdoKTsKKwkJQ0NDUl9DTEVBUihsb3cpOworCQlDQ0NSX1NFVF9SRVFVSVJFRF9CSVRTKGxvdyk7CisJCXdybXNyKHA0X2NvdW50ZXJzW1ZJUlRfQ1RSKHN0YWcsIGkpXS5jY2NyX2FkZHJlc3MsIGxvdywgaGlnaCk7CisJfQorCisJLyogY2xlYXIgY2NjcnMgb3V0c2lkZSBvdXIgY29uY2VybiAqLworCWZvciAoaSA9IHN0YWcgOyBpIDwgTlVNX1VOVVNFRF9DQ0NSUyA7IGkgKz0gYWRkcl9pbmNyZW1lbnQoKSkgeworCQlyZG1zcihwNF91bnVzZWRfY2NjcltpXSwgbG93LCBoaWdoKTsKKwkJQ0NDUl9DTEVBUihsb3cpOworCQlDQ0NSX1NFVF9SRVFVSVJFRF9CSVRTKGxvdyk7CisJCXdybXNyKHA0X3VudXNlZF9jY2NyW2ldLCBsb3csIGhpZ2gpOworCX0KKworCS8qIGNsZWFyIGFsbCBlc2NycyAoaW5jbHVkaW5nIHRob3NlIG91dHNpZGUgb3VyIGNvbmNlcm4pICovCisJZm9yIChhZGRyID0gTVNSX1A0X0JTVV9FU0NSMCArIHN0YWc7CisJICAgICBhZGRyIDwgIE1TUl9QNF9JUV9FU0NSMDsgYWRkciArPSBhZGRyX2luY3JlbWVudCgpKSB7CisJCXdybXNyKGFkZHIsIDAsIDApOworCX0KKworCS8qIE9uIG9sZGVyIG1vZGVscyBjbGVhciBhbHNvIE1TUl9QNF9JUV9FU0NSMC8xICovCisJaWYgKGJvb3RfY3B1X2RhdGEueDg2X21vZGVsIDwgMHgzKSB7CisJCXdybXNyKE1TUl9QNF9JUV9FU0NSMCwgMCwgMCk7CisJCXdybXNyKE1TUl9QNF9JUV9FU0NSMSwgMCwgMCk7CisJfQorCisJZm9yIChhZGRyID0gTVNSX1A0X1JBVF9FU0NSMCArIHN0YWc7CisJICAgICBhZGRyIDw9IE1TUl9QNF9TU1VfRVNDUjA7ICsraSwgYWRkciArPSBhZGRyX2luY3JlbWVudCgpKSB7CisJCXdybXNyKGFkZHIsIDAsIDApOworCX0KKwkKKwlmb3IgKGFkZHIgPSBNU1JfUDRfTVNfRVNDUjAgKyBzdGFnOworCSAgICAgYWRkciA8PSBNU1JfUDRfVENfRVNDUjE7IGFkZHIgKz0gYWRkcl9pbmNyZW1lbnQoKSl7IAorCQl3cm1zcihhZGRyLCAwLCAwKTsKKwl9CisJCisJZm9yIChhZGRyID0gTVNSX1A0X0lYX0VTQ1IwICsgc3RhZzsKKwkgICAgIGFkZHIgPD0gTVNSX1A0X0NSVV9FU0NSMzsgYWRkciArPSBhZGRyX2luY3JlbWVudCgpKXsgCisJCXdybXNyKGFkZHIsIDAsIDApOworCX0KKworCWlmIChudW1fY291bnRlcnMgPT0gTlVNX0NPVU5URVJTX05PTl9IVCkgewkJCisJCXdybXNyKE1TUl9QNF9DUlVfRVNDUjQsIDAsIDApOworCQl3cm1zcihNU1JfUDRfQ1JVX0VTQ1I1LCAwLCAwKTsKKwl9IGVsc2UgaWYgKHN0YWcgPT0gMCkgeworCQl3cm1zcihNU1JfUDRfQ1JVX0VTQ1I0LCAwLCAwKTsKKwl9IGVsc2UgeworCQl3cm1zcihNU1JfUDRfQ1JVX0VTQ1I1LCAwLCAwKTsKKwl9CQkKKwkKKwkvKiBzZXR1cCBhbGwgY291bnRlcnMgKi8KKwlmb3IgKGkgPSAwIDsgaSA8IG51bV9jb3VudGVycyA7ICsraSkgeworCQlpZiAoY291bnRlcl9jb25maWdbaV0uZW5hYmxlZCkgeworCQkJcmVzZXRfdmFsdWVbaV0gPSBjb3VudGVyX2NvbmZpZ1tpXS5jb3VudDsKKwkJCXBtY19zZXR1cF9vbmVfcDRfY291bnRlcihpKTsKKwkJCUNUUl9XUklURShjb3VudGVyX2NvbmZpZ1tpXS5jb3VudCwgVklSVF9DVFIoc3RhZywgaSkpOworCQl9IGVsc2UgeworCQkJcmVzZXRfdmFsdWVbaV0gPSAwOworCQl9CisJfQorfQorCisKK3N0YXRpYyBpbnQgcDRfY2hlY2tfY3RycyhzdHJ1Y3QgcHRfcmVncyAqIGNvbnN0IHJlZ3MsCisJCQkgc3RydWN0IG9wX21zcnMgY29uc3QgKiBjb25zdCBtc3JzKQoreworCXVuc2lnbmVkIGxvbmcgY3RyLCBsb3csIGhpZ2gsIHN0YWcsIHJlYWw7CisJaW50IGk7CisKKwlzdGFnID0gZ2V0X3N0YWdnZXIoKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fY291bnRlcnM7ICsraSkgeworCQkKKwkJaWYgKCFyZXNldF92YWx1ZVtpXSkgCisJCQljb250aW51ZTsKKworCQkvKiAKKwkJICogdGhlcmUgaXMgc29tZSBlY2NlbnRyaWNpdHkgaW4gdGhlIGhhcmR3YXJlIHdoaWNoCisJCSAqIHJlcXVpcmVzIHRoYXQgd2UgcGVyZm9ybSAyIGV4dHJhIGNvcnJlY3Rpb25zOgorCQkgKgorCQkgKiAtIGNoZWNrIGJvdGggdGhlIENDQ1I6T1ZGIGZsYWcgZm9yIG92ZXJmbG93IGFuZCB0aGUKKwkJICogICBjb3VudGVyIGhpZ2ggYml0IGZvciB1bi1mbGFnZ2VkIG92ZXJmbG93cy4KKwkJICoKKwkJICogLSB3cml0ZSB0aGUgY291bnRlciBiYWNrIHR3aWNlIHRvIGVuc3VyZSBpdCBnZXRzCisJCSAqICAgdXBkYXRlZCBwcm9wZXJseS4KKwkJICogCisJCSAqIHRoZSBmb3JtZXIgc2VlbXMgdG8gYmUgcmVsYXRlZCB0byBleHRyYSBOTUlzIGhhcHBlbmluZworCQkgKiBkdXJpbmcgdGhlIGN1cnJlbnQgTk1JOyB0aGUgbGF0dGVyIGlzIHJlcG9ydGVkIGFzIGVycmF0YQorCQkgKiBOMTUgaW4gaW50ZWwgZG9jIDI0OTE5OS0wMjksIHBlbnRpdW0gNCBzcGVjaWZpY2F0aW9uCisJCSAqIHVwZGF0ZSwgdGhvdWdoIHRoZWlyIHN1Z2dlc3RlZCB3b3JrLWFyb3VuZCBkb2VzIG5vdAorCQkgKiBhcHBlYXIgdG8gc29sdmUgdGhlIHByb2JsZW0uCisJCSAqLworCQkKKwkJcmVhbCA9IFZJUlRfQ1RSKHN0YWcsIGkpOworCisJCUNDQ1JfUkVBRChsb3csIGhpZ2gsIHJlYWwpOworIAkJQ1RSX1JFQUQoY3RyLCBoaWdoLCByZWFsKTsKKwkJaWYgKENDQ1JfT1ZGX1AobG93KSB8fCBDVFJfT1ZFUkZMT1dfUChjdHIpKSB7CisJCQlvcHJvZmlsZV9hZGRfc2FtcGxlKHJlZ3MsIGkpOworIAkJCUNUUl9XUklURShyZXNldF92YWx1ZVtpXSwgcmVhbCk7CisJCQlDQ0NSX0NMRUFSX09WRihsb3cpOworCQkJQ0NDUl9XUklURShsb3csIGhpZ2gsIHJlYWwpOworIAkJCUNUUl9XUklURShyZXNldF92YWx1ZVtpXSwgcmVhbCk7CisJCX0KKwl9CisKKwkvKiBQNCBxdWlyazogeW91IGhhdmUgdG8gcmUtdW5tYXNrIHRoZSBhcGljIHZlY3RvciAqLworCWFwaWNfd3JpdGUoQVBJQ19MVlRQQywgYXBpY19yZWFkKEFQSUNfTFZUUEMpICYgfkFQSUNfTFZUX01BU0tFRCk7CisKKwkvKiBTZWUgb3BfbW9kZWxfcHByby5jICovCisJcmV0dXJuIDE7Cit9CisKKworc3RhdGljIHZvaWQgcDRfc3RhcnQoc3RydWN0IG9wX21zcnMgY29uc3QgKiBjb25zdCBtc3JzKQoreworCXVuc2lnbmVkIGludCBsb3csIGhpZ2gsIHN0YWc7CisJaW50IGk7CisKKwlzdGFnID0gZ2V0X3N0YWdnZXIoKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fY291bnRlcnM7ICsraSkgeworCQlpZiAoIXJlc2V0X3ZhbHVlW2ldKQorCQkJY29udGludWU7CisJCUNDQ1JfUkVBRChsb3csIGhpZ2gsIFZJUlRfQ1RSKHN0YWcsIGkpKTsKKwkJQ0NDUl9TRVRfRU5BQkxFKGxvdyk7CisJCUNDQ1JfV1JJVEUobG93LCBoaWdoLCBWSVJUX0NUUihzdGFnLCBpKSk7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHA0X3N0b3Aoc3RydWN0IG9wX21zcnMgY29uc3QgKiBjb25zdCBtc3JzKQoreworCXVuc2lnbmVkIGludCBsb3csIGhpZ2gsIHN0YWc7CisJaW50IGk7CisKKwlzdGFnID0gZ2V0X3N0YWdnZXIoKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fY291bnRlcnM7ICsraSkgeworCQlDQ0NSX1JFQUQobG93LCBoaWdoLCBWSVJUX0NUUihzdGFnLCBpKSk7CisJCUNDQ1JfU0VUX0RJU0FCTEUobG93KTsKKwkJQ0NDUl9XUklURShsb3csIGhpZ2gsIFZJUlRfQ1RSKHN0YWcsIGkpKTsKKwl9Cit9CisKKworI2lmZGVmIENPTkZJR19TTVAKK3N0cnVjdCBvcF94ODZfbW9kZWxfc3BlYyBjb25zdCBvcF9wNF9odDJfc3BlYyA9IHsKKwkubnVtX2NvdW50ZXJzID0gTlVNX0NPVU5URVJTX0hUMiwKKwkubnVtX2NvbnRyb2xzID0gTlVNX0NPTlRST0xTX0hUMiwKKwkuZmlsbF9pbl9hZGRyZXNzZXMgPSAmcDRfZmlsbF9pbl9hZGRyZXNzZXMsCisJLnNldHVwX2N0cnMgPSAmcDRfc2V0dXBfY3RycywKKwkuY2hlY2tfY3RycyA9ICZwNF9jaGVja19jdHJzLAorCS5zdGFydCA9ICZwNF9zdGFydCwKKwkuc3RvcCA9ICZwNF9zdG9wCit9OworI2VuZGlmCisKK3N0cnVjdCBvcF94ODZfbW9kZWxfc3BlYyBjb25zdCBvcF9wNF9zcGVjID0geworCS5udW1fY291bnRlcnMgPSBOVU1fQ09VTlRFUlNfTk9OX0hULAorCS5udW1fY29udHJvbHMgPSBOVU1fQ09OVFJPTFNfTk9OX0hULAorCS5maWxsX2luX2FkZHJlc3NlcyA9ICZwNF9maWxsX2luX2FkZHJlc3NlcywKKwkuc2V0dXBfY3RycyA9ICZwNF9zZXR1cF9jdHJzLAorCS5jaGVja19jdHJzID0gJnA0X2NoZWNrX2N0cnMsCisJLnN0YXJ0ID0gJnA0X3N0YXJ0LAorCS5zdG9wID0gJnA0X3N0b3AKK307CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvb3Byb2ZpbGUvb3BfbW9kZWxfcHByby5jIGIvYXJjaC9pMzg2L29wcm9maWxlL29wX21vZGVsX3Bwcm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzE5MDE1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L29wcm9maWxlL29wX21vZGVsX3Bwcm8uYwpAQCAtMCwwICsxLDE0MyBAQAorLyoqCisgKiBAZmlsZSBvcF9tb2RlbF9wcHJvLmgKKyAqIHBlbnRpdW0gcHJvIC8gUDYgbW9kZWwtc3BlY2lmaWMgTVNSIG9wZXJhdGlvbnMKKyAqCisgKiBAcmVtYXJrIENvcHlyaWdodCAyMDAyIE9Qcm9maWxlIGF1dGhvcnMKKyAqIEByZW1hcmsgUmVhZCB0aGUgZmlsZSBDT1BZSU5HCisgKgorICogQGF1dGhvciBKb2huIExldm9uCisgKiBAYXV0aG9yIFBoaWxpcHBlIEVsaWUKKyAqIEBhdXRob3IgR3JheWRvbiBIb2FyZQorICovCisKKyNpbmNsdWRlIDxsaW51eC9vcHJvZmlsZS5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKyAKKyNpbmNsdWRlICJvcF94ODZfbW9kZWwuaCIKKyNpbmNsdWRlICJvcF9jb3VudGVyLmgiCisKKyNkZWZpbmUgTlVNX0NPVU5URVJTIDIKKyNkZWZpbmUgTlVNX0NPTlRST0xTIDIKKworI2RlZmluZSBDVFJfUkVBRChsLGgsbXNycyxjKSBkbyB7cmRtc3IobXNycy0+Y291bnRlcnNbKGMpXS5hZGRyLCAobCksIChoKSk7fSB3aGlsZSAoMCkKKyNkZWZpbmUgQ1RSX1dSSVRFKGwsbXNycyxjKSBkbyB7d3Jtc3IobXNycy0+Y291bnRlcnNbKGMpXS5hZGRyLCAtKHUzMikobCksIC0xKTt9IHdoaWxlICgwKQorI2RlZmluZSBDVFJfT1ZFUkZMT1dFRChuKSAoISgobikgJiAoMVU8PDMxKSkpCisKKyNkZWZpbmUgQ1RSTF9SRUFEKGwsaCxtc3JzLGMpIGRvIHtyZG1zcigobXNycy0+Y29udHJvbHNbKGMpXS5hZGRyKSwgKGwpLCAoaCkpO30gd2hpbGUgKDApCisjZGVmaW5lIENUUkxfV1JJVEUobCxoLG1zcnMsYykgZG8ge3dybXNyKChtc3JzLT5jb250cm9sc1soYyldLmFkZHIpLCAobCksIChoKSk7fSB3aGlsZSAoMCkKKyNkZWZpbmUgQ1RSTF9TRVRfQUNUSVZFKG4pIChuIHw9ICgxPDwyMikpCisjZGVmaW5lIENUUkxfU0VUX0lOQUNUSVZFKG4pIChuICY9IH4oMTw8MjIpKQorI2RlZmluZSBDVFJMX0NMRUFSKHgpICh4ICY9ICgxPDwyMSkpCisjZGVmaW5lIENUUkxfU0VUX0VOQUJMRSh2YWwpICh2YWwgfD0gMTw8MjApCisjZGVmaW5lIENUUkxfU0VUX1VTUih2YWwsdSkgKHZhbCB8PSAoKHUgJiAxKSA8PCAxNikpCisjZGVmaW5lIENUUkxfU0VUX0tFUk4odmFsLGspICh2YWwgfD0gKChrICYgMSkgPDwgMTcpKQorI2RlZmluZSBDVFJMX1NFVF9VTSh2YWwsIG0pICh2YWwgfD0gKG0gPDwgOCkpCisjZGVmaW5lIENUUkxfU0VUX0VWRU5UKHZhbCwgZSkgKHZhbCB8PSBlKQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyByZXNldF92YWx1ZVtOVU1fQ09VTlRFUlNdOworIAorc3RhdGljIHZvaWQgcHByb19maWxsX2luX2FkZHJlc3NlcyhzdHJ1Y3Qgb3BfbXNycyAqIGNvbnN0IG1zcnMpCit7CisJbXNycy0+Y291bnRlcnNbMF0uYWRkciA9IE1TUl9QNl9QRVJGQ1RSMDsKKwltc3JzLT5jb3VudGVyc1sxXS5hZGRyID0gTVNSX1A2X1BFUkZDVFIxOworCQorCW1zcnMtPmNvbnRyb2xzWzBdLmFkZHIgPSBNU1JfUDZfRVZOVFNFTDA7CisJbXNycy0+Y29udHJvbHNbMV0uYWRkciA9IE1TUl9QNl9FVk5UU0VMMTsKK30KKworCitzdGF0aWMgdm9pZCBwcHJvX3NldHVwX2N0cnMoc3RydWN0IG9wX21zcnMgY29uc3QgKiBjb25zdCBtc3JzKQoreworCXVuc2lnbmVkIGludCBsb3csIGhpZ2g7CisJaW50IGk7CisKKwkvKiBjbGVhciBhbGwgY291bnRlcnMgKi8KKwlmb3IgKGkgPSAwIDsgaSA8IE5VTV9DT05UUk9MUzsgKytpKSB7CisJCUNUUkxfUkVBRChsb3csIGhpZ2gsIG1zcnMsIGkpOworCQlDVFJMX0NMRUFSKGxvdyk7CisJCUNUUkxfV1JJVEUobG93LCBoaWdoLCBtc3JzLCBpKTsKKwl9CisJCisJLyogYXZvaWQgYSBmYWxzZSBkZXRlY3Rpb24gb2YgY3RyIG92ZXJmbG93cyBpbiBOTUkgaGFuZGxlciAqLworCWZvciAoaSA9IDA7IGkgPCBOVU1fQ09VTlRFUlM7ICsraSkgeworCQlDVFJfV1JJVEUoMSwgbXNycywgaSk7CisJfQorCisJLyogZW5hYmxlIGFjdGl2ZSBjb3VudGVycyAqLworCWZvciAoaSA9IDA7IGkgPCBOVU1fQ09VTlRFUlM7ICsraSkgeworCQlpZiAoY291bnRlcl9jb25maWdbaV0uZW5hYmxlZCkgeworCQkJcmVzZXRfdmFsdWVbaV0gPSBjb3VudGVyX2NvbmZpZ1tpXS5jb3VudDsKKworCQkJQ1RSX1dSSVRFKGNvdW50ZXJfY29uZmlnW2ldLmNvdW50LCBtc3JzLCBpKTsKKworCQkJQ1RSTF9SRUFEKGxvdywgaGlnaCwgbXNycywgaSk7CisJCQlDVFJMX0NMRUFSKGxvdyk7CisJCQlDVFJMX1NFVF9FTkFCTEUobG93KTsKKwkJCUNUUkxfU0VUX1VTUihsb3csIGNvdW50ZXJfY29uZmlnW2ldLnVzZXIpOworCQkJQ1RSTF9TRVRfS0VSTihsb3csIGNvdW50ZXJfY29uZmlnW2ldLmtlcm5lbCk7CisJCQlDVFJMX1NFVF9VTShsb3csIGNvdW50ZXJfY29uZmlnW2ldLnVuaXRfbWFzayk7CisJCQlDVFJMX1NFVF9FVkVOVChsb3csIGNvdW50ZXJfY29uZmlnW2ldLmV2ZW50KTsKKwkJCUNUUkxfV1JJVEUobG93LCBoaWdoLCBtc3JzLCBpKTsKKwkJfQorCX0KK30KKworIAorc3RhdGljIGludCBwcHJvX2NoZWNrX2N0cnMoc3RydWN0IHB0X3JlZ3MgKiBjb25zdCByZWdzLAorCQkJICAgc3RydWN0IG9wX21zcnMgY29uc3QgKiBjb25zdCBtc3JzKQoreworCXVuc2lnbmVkIGludCBsb3csIGhpZ2g7CisJaW50IGk7CisgCisJZm9yIChpID0gMCA7IGkgPCBOVU1fQ09VTlRFUlM7ICsraSkgeworCQlDVFJfUkVBRChsb3csIGhpZ2gsIG1zcnMsIGkpOworCQlpZiAoQ1RSX09WRVJGTE9XRUQobG93KSkgeworCQkJb3Byb2ZpbGVfYWRkX3NhbXBsZShyZWdzLCBpKTsKKwkJCUNUUl9XUklURShyZXNldF92YWx1ZVtpXSwgbXNycywgaSk7CisJCX0KKwl9CisKKwkvKiBPbmx5IFA2IGJhc2VkIFBlbnRpdW0gTSBuZWVkIHRvIHJlLXVubWFzayB0aGUgYXBpYyB2ZWN0b3IgYnV0IGl0CisJICogZG9lc24ndCBodXJ0IG90aGVyIFA2IHZhcmlhbnQgKi8KKwlhcGljX3dyaXRlKEFQSUNfTFZUUEMsIGFwaWNfcmVhZChBUElDX0xWVFBDKSAmIH5BUElDX0xWVF9NQVNLRUQpOworCisJLyogV2UgY2FuJ3Qgd29yayBvdXQgaWYgd2UgcmVhbGx5IGhhbmRsZWQgYW4gaW50ZXJydXB0LiBXZQorCSAqIG1pZ2h0IGhhdmUgY2F1Z2h0IGEgKnNlY29uZCogY291bnRlciBqdXN0IGFmdGVyIG92ZXJmbG93aW5nCisJICogdGhlIGludGVycnVwdCBmb3IgdGhpcyBjb3VudGVyIHRoZW4gYXJyaXZlcworCSAqIGFuZCB3ZSBkb24ndCBmaW5kIGEgY291bnRlciB0aGF0J3Mgb3ZlcmZsb3dlZCwgc28gd2UKKwkgKiB3b3VsZCByZXR1cm4gMCBhbmQgZ2V0IGRhemVkICsgY29uZnVzZWQuIEluc3RlYWQgd2UgYWx3YXlzCisJICogYXNzdW1lIHdlIGZvdW5kIGFuIG92ZXJmbG93LiBUaGlzIHN1Y2tzLgorCSAqLworCXJldHVybiAxOworfQorCisgCitzdGF0aWMgdm9pZCBwcHJvX3N0YXJ0KHN0cnVjdCBvcF9tc3JzIGNvbnN0ICogY29uc3QgbXNycykKK3sKKwl1bnNpZ25lZCBpbnQgbG93LGhpZ2g7CisJQ1RSTF9SRUFEKGxvdywgaGlnaCwgbXNycywgMCk7CisJQ1RSTF9TRVRfQUNUSVZFKGxvdyk7CisJQ1RSTF9XUklURShsb3csIGhpZ2gsIG1zcnMsIDApOworfQorCisKK3N0YXRpYyB2b2lkIHBwcm9fc3RvcChzdHJ1Y3Qgb3BfbXNycyBjb25zdCAqIGNvbnN0IG1zcnMpCit7CisJdW5zaWduZWQgaW50IGxvdyxoaWdoOworCUNUUkxfUkVBRChsb3csIGhpZ2gsIG1zcnMsIDApOworCUNUUkxfU0VUX0lOQUNUSVZFKGxvdyk7CisJQ1RSTF9XUklURShsb3csIGhpZ2gsIG1zcnMsIDApOworfQorCisKK3N0cnVjdCBvcF94ODZfbW9kZWxfc3BlYyBjb25zdCBvcF9wcHJvX3NwZWMgPSB7CisJLm51bV9jb3VudGVycyA9IE5VTV9DT1VOVEVSUywKKwkubnVtX2NvbnRyb2xzID0gTlVNX0NPTlRST0xTLAorCS5maWxsX2luX2FkZHJlc3NlcyA9ICZwcHJvX2ZpbGxfaW5fYWRkcmVzc2VzLAorCS5zZXR1cF9jdHJzID0gJnBwcm9fc2V0dXBfY3RycywKKwkuY2hlY2tfY3RycyA9ICZwcHJvX2NoZWNrX2N0cnMsCisJLnN0YXJ0ID0gJnBwcm9fc3RhcnQsCisJLnN0b3AgPSAmcHByb19zdG9wCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L29wcm9maWxlL29wX3g4Nl9tb2RlbC5oIGIvYXJjaC9pMzg2L29wcm9maWxlL29wX3g4Nl9tb2RlbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyM2I3ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvb3Byb2ZpbGUvb3BfeDg2X21vZGVsLmgKQEAgLTAsMCArMSw1MCBAQAorLyoqCisgKiBAZmlsZSBvcF94ODZfbW9kZWwuaAorICogaW50ZXJmYWNlIHRvIHg4NiBtb2RlbC1zcGVjaWZpYyBNU1Igb3BlcmF0aW9ucworICoKKyAqIEByZW1hcmsgQ29weXJpZ2h0IDIwMDIgT1Byb2ZpbGUgYXV0aG9ycworICogQHJlbWFyayBSZWFkIHRoZSBmaWxlIENPUFlJTkcKKyAqCisgKiBAYXV0aG9yIEdyYXlkb24gSG9hcmUKKyAqLworCisjaWZuZGVmIE9QX1g4Nl9NT0RFTF9ICisjZGVmaW5lIE9QX1g4Nl9NT0RFTF9ICisKK3N0cnVjdCBvcF9zYXZlZF9tc3IgeworCXVuc2lnbmVkIGludCBoaWdoOworCXVuc2lnbmVkIGludCBsb3c7Cit9OworCitzdHJ1Y3Qgb3BfbXNyIHsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJc3RydWN0IG9wX3NhdmVkX21zciBzYXZlZDsKK307CisKK3N0cnVjdCBvcF9tc3JzIHsKKwlzdHJ1Y3Qgb3BfbXNyICogY291bnRlcnM7CisJc3RydWN0IG9wX21zciAqIGNvbnRyb2xzOworfTsKKworc3RydWN0IHB0X3JlZ3M7CisKKy8qIFRoZSBtb2RlbCB2dGFibGUgYWJzdHJhY3RzIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuCisgKiB2YXJpb3VzIHg4NiBDUFUgbW9kZWwncyBwZXJmY3RyIHN1cHBvcnQuCisgKi8KK3N0cnVjdCBvcF94ODZfbW9kZWxfc3BlYyB7CisJdW5zaWduZWQgaW50IGNvbnN0IG51bV9jb3VudGVyczsKKwl1bnNpZ25lZCBpbnQgY29uc3QgbnVtX2NvbnRyb2xzOworCXZvaWQgKCpmaWxsX2luX2FkZHJlc3Nlcykoc3RydWN0IG9wX21zcnMgKiBjb25zdCBtc3JzKTsKKwl2b2lkICgqc2V0dXBfY3Rycykoc3RydWN0IG9wX21zcnMgY29uc3QgKiBjb25zdCBtc3JzKTsKKwlpbnQgKCpjaGVja19jdHJzKShzdHJ1Y3QgcHRfcmVncyAqIGNvbnN0IHJlZ3MsCisJCXN0cnVjdCBvcF9tc3JzIGNvbnN0ICogY29uc3QgbXNycyk7CisJdm9pZCAoKnN0YXJ0KShzdHJ1Y3Qgb3BfbXNycyBjb25zdCAqIGNvbnN0IG1zcnMpOworCXZvaWQgKCpzdG9wKShzdHJ1Y3Qgb3BfbXNycyBjb25zdCAqIGNvbnN0IG1zcnMpOworfTsKKworZXh0ZXJuIHN0cnVjdCBvcF94ODZfbW9kZWxfc3BlYyBjb25zdCBvcF9wcHJvX3NwZWM7CitleHRlcm4gc3RydWN0IG9wX3g4Nl9tb2RlbF9zcGVjIGNvbnN0IG9wX3A0X3NwZWM7CitleHRlcm4gc3RydWN0IG9wX3g4Nl9tb2RlbF9zcGVjIGNvbnN0IG9wX3A0X2h0Ml9zcGVjOworZXh0ZXJuIHN0cnVjdCBvcF94ODZfbW9kZWxfc3BlYyBjb25zdCBvcF9hdGhsb25fc3BlYzsKKworI2VuZGlmIC8qIE9QX1g4Nl9NT0RFTF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcGNpL01ha2VmaWxlIGIvYXJjaC9pMzg2L3BjaS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmZmMDNmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L3BjaS9NYWtlZmlsZQpAQCAtMCwwICsxLDE0IEBACitvYmoteQkJCQk6PSBpMzg2Lm8KKworb2JqLSQoQ09ORklHX1BDSV9CSU9TKQkJKz0gcGNiaW9zLm8KK29iai0kKENPTkZJR19QQ0lfTU1DT05GSUcpCSs9IG1tY29uZmlnLm8KK29iai0kKENPTkZJR19QQ0lfRElSRUNUKQkrPSBkaXJlY3QubworCitwY2kteQkJCQk6PSBmaXh1cC5vCitwY2ktJChDT05GSUdfQUNQSV9QQ0kpCQkrPSBhY3BpLm8KK3BjaS15CQkJCSs9IGxlZ2FjeS5vIGlycS5vCisKK3BjaS0kKENPTkZJR19YODZfVklTV1MpCQk6PSB2aXN3cy5vIGZpeHVwLm8KK3BjaS0kKENPTkZJR19YODZfTlVNQVEpCQk6PSBudW1hLm8gaXJxLm8KKworb2JqLXkJCQkJKz0gJChwY2kteSkgY29tbW9uLm8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9wY2kvYWNwaS5jIGIvYXJjaC9pMzg2L3BjaS9hY3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRiNjVlYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9wY2kvYWNwaS5jCkBAIC0wLDAgKzEsNTMgQEAKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGFzbS9od19pcnEuaD4KKyNpbmNsdWRlICJwY2kuaCIKKworc3RydWN0IHBjaV9idXMgKiBfX2RldmluaXQgcGNpX2FjcGlfc2Nhbl9yb290KHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgZG9tYWluLCBpbnQgYnVzbnVtKQoreworCWlmIChkb21haW4gIT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJQQ0k6IE11bHRpcGxlIGRvbWFpbnMgbm90IHN1cHBvcnRlZFxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBwY2liaW9zX3NjYW5fcm9vdChidXNudW0pOworfQorCitleHRlcm4gaW50IHBjaV9yb3V0ZWlycTsKK3N0YXRpYyBpbnQgX19pbml0IHBjaV9hY3BpX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKKworCWlmIChwY2liaW9zX3NjYW5uZWQpCisJCXJldHVybiAwOworCisJaWYgKGFjcGlfbm9pcnEpCisJCXJldHVybiAwOworCisJcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBVc2luZyBBQ1BJIGZvciBJUlEgcm91dGluZ1xuIik7CisJYWNwaV9pcnFfcGVuYWx0eV9pbml0KCk7CisJcGNpYmlvc19zY2FubmVkKys7CisJcGNpYmlvc19lbmFibGVfaXJxID0gYWNwaV9wY2lfaXJxX2VuYWJsZTsKKworCWlmIChwY2lfcm91dGVpcnEpIHsKKwkJLyoKKwkJICogUENJIElSUSByb3V0aW5nIGlzIHNldCB1cCBieSBwY2lfZW5hYmxlX2RldmljZSgpLCBidXQgd2UKKwkJICogYWxzbyBkbyBpdCBoZXJlIGluIGNhc2UgdGhlcmUgYXJlIHN0aWxsIGJyb2tlbiBkcml2ZXJzIHRoYXQKKwkJICogZG9uJ3QgdXNlIHBjaV9lbmFibGVfZGV2aWNlKCkuCisJCSAqLworCQlwcmludGsoS0VSTl9JTkZPICJQQ0k6IFJvdXRpbmcgUENJIGludGVycnVwdHMgZm9yIGFsbCBkZXZpY2VzIGJlY2F1c2UgXCJwY2k9cm91dGVpcnFcIiBzcGVjaWZpZWRcbiIpOworCQl3aGlsZSAoKGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIGRldikpICE9IE5VTEwpCisJCQlhY3BpX3BjaV9pcnFfZW5hYmxlKGRldik7CisJfSBlbHNlCisJCXByaW50ayhLRVJOX0lORk8gIlBDSTogSWYgYSBkZXZpY2UgZG9lc24ndCB3b3JrLCB0cnkgXCJwY2k9cm91dGVpcnFcIi4gIElmIGl0IGhlbHBzLCBwb3N0IGEgcmVwb3J0XG4iKTsKKworI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQworCWlmIChhY3BpX2lvYXBpYykKKwkJcHJpbnRfSU9fQVBJQygpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KK3N1YnN5c19pbml0Y2FsbChwY2lfYWNwaV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9wY2kvY29tbW9uLmMgYi9hcmNoL2kzODYvcGNpL2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMDk3NWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvcGNpL2NvbW1vbi5jCkBAIC0wLDAgKzEsMjUxIEBACisvKgorICoJTG93LUxldmVsIFBDSSBTdXBwb3J0IGZvciBQQworICoKKyAqCShjKSAxOTk5LS0yMDAwIE1hcnRpbiBNYXJlcyA8bWpAdWN3LmN6PgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9hY3BpLmg+CisjaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc21wLmg+CisKKyNpbmNsdWRlICJwY2kuaCIKKworI2lmZGVmIENPTkZJR19QQ0lfQklPUworZXh0ZXJuICB2b2lkIHBjaWJpb3Nfc29ydCh2b2lkKTsKKyNlbmRpZgorCit1bnNpZ25lZCBpbnQgcGNpX3Byb2JlID0gUENJX1BST0JFX0JJT1MgfCBQQ0lfUFJPQkVfQ09ORjEgfCBQQ0lfUFJPQkVfQ09ORjIgfAorCQkJCVBDSV9QUk9CRV9NTUNPTkY7CisKK2ludCBwY2lfcm91dGVpcnE7CitpbnQgcGNpYmlvc19sYXN0X2J1cyA9IC0xOworc3RydWN0IHBjaV9idXMgKnBjaV9yb290X2J1cyA9IE5VTEw7CitzdHJ1Y3QgcGNpX3Jhd19vcHMgKnJhd19wY2lfb3BzOworCitzdGF0aWMgaW50IHBjaV9yZWFkKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyICp2YWx1ZSkKK3sKKwlyZXR1cm4gcmF3X3BjaV9vcHMtPnJlYWQoMCwgYnVzLT5udW1iZXIsIGRldmZuLCB3aGVyZSwgc2l6ZSwgdmFsdWUpOworfQorCitzdGF0aWMgaW50IHBjaV93cml0ZShzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCB3aGVyZSwgaW50IHNpemUsIHUzMiB2YWx1ZSkKK3sKKwlyZXR1cm4gcmF3X3BjaV9vcHMtPndyaXRlKDAsIGJ1cy0+bnVtYmVyLCBkZXZmbiwgd2hlcmUsIHNpemUsIHZhbHVlKTsKK30KKworc3RydWN0IHBjaV9vcHMgcGNpX3Jvb3Rfb3BzID0geworCS5yZWFkID0gcGNpX3JlYWQsCisJLndyaXRlID0gcGNpX3dyaXRlLAorfTsKKworLyoKKyAqIGxlZ2FjeSwgbnVtYSwgYW5kIGFjcGkgYWxsIHdhbnQgdG8gY2FsbCBwY2liaW9zX3NjYW5fcm9vdAorICogZnJvbSB0aGVpciBpbml0Y2FsbHMuIFRoaXMgZmxhZyBwcmV2ZW50cyB0aGF0LgorICovCitpbnQgcGNpYmlvc19zY2FubmVkOworCisvKgorICogVGhpcyBpbnRlcnJ1cHQtc2FmZSBzcGlubG9jayBwcm90ZWN0cyBhbGwgYWNjZXNzZXMgdG8gUENJCisgKiBjb25maWd1cmF0aW9uIHNwYWNlLgorICovCitERUZJTkVfU1BJTkxPQ0socGNpX2NvbmZpZ19sb2NrKTsKKworLyoKKyAqIFNldmVyYWwgYnVnZ3kgbW90aGVyYm9hcmRzIGFkZHJlc3Mgb25seSAxNiBkZXZpY2VzIGFuZCBtaXJyb3IKKyAqIHRoZW0gdG8gbmV4dCAxNiBJRHMuIFdlIHRyeSB0byBkZXRlY3QgdGhpcyBgZmVhdHVyZScgb24gYWxsCisgKiBwcmltYXJ5IGJ1c2VzICh0aG9zZSBjb250YWluaW5nIGhvc3QgYnJpZGdlcyBhcyB0aGV5IGFyZQorICogZXhwZWN0ZWQgdG8gYmUgdW5pcXVlKSBhbmQgcmVtb3ZlIHRoZSBnaG9zdCBkZXZpY2VzLgorICovCisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBwY2liaW9zX2ZpeHVwX2dob3N0cyhzdHJ1Y3QgcGNpX2J1cyAqYikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsbiwgKm1uOworCXN0cnVjdCBwY2lfZGV2ICpkLCAqZTsKKwlpbnQgbWlycm9yID0gUENJX0RFVkZOKDE2LDApOworCWludCBzZWVuX2hvc3RfYnJpZGdlID0gMDsKKwlpbnQgaTsKKworCURCRygiUENJOiBTY2FubmluZyBmb3IgZ2hvc3QgZGV2aWNlcyBvbiBidXMgJWRcbiIsIGItPm51bWJlcik7CisJbGlzdF9mb3JfZWFjaChsbiwgJmItPmRldmljZXMpIHsKKwkJZCA9IHBjaV9kZXZfYihsbik7CisJCWlmICgoZC0+Y2xhc3MgPj4gOCkgPT0gUENJX0NMQVNTX0JSSURHRV9IT1NUKQorCQkJc2Vlbl9ob3N0X2JyaWRnZSsrOworCQlmb3IgKG1uPWxuLT5uZXh0OyBtbiAhPSAmYi0+ZGV2aWNlczsgbW49bW4tPm5leHQpIHsKKwkJCWUgPSBwY2lfZGV2X2IobW4pOworCQkJaWYgKGUtPmRldmZuICE9IGQtPmRldmZuICsgbWlycm9yIHx8CisJCQkgICAgZS0+dmVuZG9yICE9IGQtPnZlbmRvciB8fAorCQkJICAgIGUtPmRldmljZSAhPSBkLT5kZXZpY2UgfHwKKwkJCSAgICBlLT5jbGFzcyAhPSBkLT5jbGFzcykKKwkJCQljb250aW51ZTsKKwkJCWZvcihpPTA7IGk8UENJX05VTV9SRVNPVVJDRVM7IGkrKykKKwkJCQlpZiAoZS0+cmVzb3VyY2VbaV0uc3RhcnQgIT0gZC0+cmVzb3VyY2VbaV0uc3RhcnQgfHwKKwkJCQkgICAgZS0+cmVzb3VyY2VbaV0uZW5kICE9IGQtPnJlc291cmNlW2ldLmVuZCB8fAorCQkJCSAgICBlLT5yZXNvdXJjZVtpXS5mbGFncyAhPSBkLT5yZXNvdXJjZVtpXS5mbGFncykKKwkJCQkJY29udGludWU7CisJCQlicmVhazsKKwkJfQorCQlpZiAobW4gPT0gJmItPmRldmljZXMpCisJCQlyZXR1cm47CisJfQorCWlmICghc2Vlbl9ob3N0X2JyaWRnZSkKKwkJcmV0dXJuOworCXByaW50ayhLRVJOX1dBUk5JTkcgIlBDSTogSWdub3JpbmcgZ2hvc3QgZGV2aWNlcyBvbiBidXMgJTAyeFxuIiwgYi0+bnVtYmVyKTsKKworCWxuID0gJmItPmRldmljZXM7CisJd2hpbGUgKGxuLT5uZXh0ICE9ICZiLT5kZXZpY2VzKSB7CisJCWQgPSBwY2lfZGV2X2IobG4tPm5leHQpOworCQlpZiAoZC0+ZGV2Zm4gPj0gbWlycm9yKSB7CisJCQlsaXN0X2RlbCgmZC0+Z2xvYmFsX2xpc3QpOworCQkJbGlzdF9kZWwoJmQtPmJ1c19saXN0KTsKKwkJCWtmcmVlKGQpOworCQl9IGVsc2UKKwkJCWxuID0gbG4tPm5leHQ7CisJfQorfQorCisvKgorICogIENhbGxlZCBhZnRlciBlYWNoIGJ1cyBpcyBwcm9iZWQsIGJ1dCBiZWZvcmUgaXRzIGNoaWxkcmVuCisgKiAgYXJlIGV4YW1pbmVkLgorICovCisKK3ZvaWQgX19kZXZpbml0ICBwY2liaW9zX2ZpeHVwX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYikKK3sKKwlwY2liaW9zX2ZpeHVwX2dob3N0cyhiKTsKKwlwY2lfcmVhZF9icmlkZ2VfYmFzZXMoYik7Cit9CisKKworc3RydWN0IHBjaV9idXMgKiBfX2RldmluaXQgcGNpYmlvc19zY2FuX3Jvb3QoaW50IGJ1c251bSkKK3sKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzID0gTlVMTDsKKworCXdoaWxlICgoYnVzID0gcGNpX2ZpbmRfbmV4dF9idXMoYnVzKSkgIT0gTlVMTCkgeworCQlpZiAoYnVzLT5udW1iZXIgPT0gYnVzbnVtKSB7CisJCQkvKiBBbHJlYWR5IHNjYW5uZWQgKi8KKwkJCXJldHVybiBidXM7CisJCX0KKwl9CisKKwlwcmludGsoIlBDSTogUHJvYmluZyBQQ0kgaGFyZHdhcmUgKGJ1cyAlMDJ4KVxuIiwgYnVzbnVtKTsKKworCXJldHVybiBwY2lfc2Nhbl9idXMoYnVzbnVtLCAmcGNpX3Jvb3Rfb3BzLCBOVUxMKTsKK30KKworZXh0ZXJuIHU4IHBjaV9jYWNoZV9saW5lX3NpemU7CisKK3N0YXRpYyBpbnQgX19pbml0IHBjaWJpb3NfaW5pdCh2b2lkKQoreworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICZib290X2NwdV9kYXRhOworCisJaWYgKCFyYXdfcGNpX29wcykgeworCQlwcmludGsoIlBDSTogU3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgUENJXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBBc3N1bWUgUENJIGNhY2hlbGluZSBzaXplIG9mIDMyIGJ5dGVzIGZvciBhbGwgeDg2cyBleGNlcHQgSzcvSzgKKwkgKiBhbmQgUDQuIEl0J3MgYWxzbyBnb29kIGZvciAzODYvNDg2cyAod2hpY2ggYWN0dWFsbHkgaGF2ZSAxNikKKwkgKiBhcyBxdWl0ZSBhIGZldyBQQ0kgZGV2aWNlcyBkbyBub3Qgc3VwcG9ydCBzbWFsbGVyIHZhbHVlcy4KKwkgKi8KKwlwY2lfY2FjaGVfbGluZV9zaXplID0gMzIgPj4gMjsKKwlpZiAoYy0+eDg2ID49IDYgJiYgYy0+eDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0FNRCkKKwkJcGNpX2NhY2hlX2xpbmVfc2l6ZSA9IDY0ID4+IDI7CS8qIEs3ICYgSzggKi8KKwllbHNlIGlmIChjLT54ODYgPiA2ICYmIGMtPng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9JTlRFTCkKKwkJcGNpX2NhY2hlX2xpbmVfc2l6ZSA9IDEyOCA+PiAyOwkvKiBQNCAqLworCisJcGNpYmlvc19yZXNvdXJjZV9zdXJ2ZXkoKTsKKworI2lmZGVmIENPTkZJR19QQ0lfQklPUworCWlmICgocGNpX3Byb2JlICYgUENJX0JJT1NfU09SVCkgJiYgIShwY2lfcHJvYmUgJiBQQ0lfTk9fU09SVCkpCisJCXBjaWJpb3Nfc29ydCgpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N1YnN5c19pbml0Y2FsbChwY2liaW9zX2luaXQpOworCitjaGFyICogX19kZXZpbml0ICBwY2liaW9zX3NldHVwKGNoYXIgKnN0cikKK3sKKwlpZiAoIXN0cmNtcChzdHIsICJvZmYiKSkgeworCQlwY2lfcHJvYmUgPSAwOworCQlyZXR1cm4gTlVMTDsKKwl9CisjaWZkZWYgQ09ORklHX1BDSV9CSU9TCisJZWxzZSBpZiAoIXN0cmNtcChzdHIsICJiaW9zIikpIHsKKwkJcGNpX3Byb2JlID0gUENJX1BST0JFX0JJT1M7CisJCXJldHVybiBOVUxMOworCX0gZWxzZSBpZiAoIXN0cmNtcChzdHIsICJub2Jpb3MiKSkgeworCQlwY2lfcHJvYmUgJj0gflBDSV9QUk9CRV9CSU9TOworCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyLCAibm9zb3J0IikpIHsKKwkJcGNpX3Byb2JlIHw9IFBDSV9OT19TT1JUOworCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyLCAiYmlvc2lycSIpKSB7CisJCXBjaV9wcm9iZSB8PSBQQ0lfQklPU19JUlFfU0NBTjsKKwkJcmV0dXJuIE5VTEw7CisJfQorI2VuZGlmCisjaWZkZWYgQ09ORklHX1BDSV9ESVJFQ1QKKwllbHNlIGlmICghc3RyY21wKHN0ciwgImNvbmYxIikpIHsKKwkJcGNpX3Byb2JlID0gUENJX1BST0JFX0NPTkYxIHwgUENJX05PX0NIRUNLUzsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWVsc2UgaWYgKCFzdHJjbXAoc3RyLCAiY29uZjIiKSkgeworCQlwY2lfcHJvYmUgPSBQQ0lfUFJPQkVfQ09ORjIgfCBQQ0lfTk9fQ0hFQ0tTOworCQlyZXR1cm4gTlVMTDsKKwl9CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUENJX01NQ09ORklHCisJZWxzZSBpZiAoIXN0cmNtcChzdHIsICJub21tY29uZiIpKSB7CisJCXBjaV9wcm9iZSAmPSB+UENJX1BST0JFX01NQ09ORjsKKwkJcmV0dXJuIE5VTEw7CisJfQorI2VuZGlmCisJZWxzZSBpZiAoIXN0cmNtcChzdHIsICJub2FjcGkiKSkgeworCQlhY3BpX25vaXJxX3NldCgpOworCQlyZXR1cm4gTlVMTDsKKwl9CisjaWZuZGVmIENPTkZJR19YODZfVklTV1MKKwllbHNlIGlmICghc3RyY21wKHN0ciwgInVzZXBpcnFtYXNrIikpIHsKKwkJcGNpX3Byb2JlIHw9IFBDSV9VU0VfUElSUV9NQVNLOworCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UgaWYgKCFzdHJuY21wKHN0ciwgImlycW1hc2s9IiwgOCkpIHsKKwkJcGNpYmlvc19pcnFfbWFzayA9IHNpbXBsZV9zdHJ0b2woc3RyKzgsIE5VTEwsIDApOworCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UgaWYgKCFzdHJuY21wKHN0ciwgImxhc3RidXM9IiwgOCkpIHsKKwkJcGNpYmlvc19sYXN0X2J1cyA9IHNpbXBsZV9zdHJ0b2woc3RyKzgsIE5VTEwsIDApOworCQlyZXR1cm4gTlVMTDsKKwl9CisjZW5kaWYKKwllbHNlIGlmICghc3RyY21wKHN0ciwgInJvbSIpKSB7CisJCXBjaV9wcm9iZSB8PSBQQ0lfQVNTSUdOX1JPTVM7CisJCXJldHVybiBOVUxMOworCX0gZWxzZSBpZiAoIXN0cmNtcChzdHIsICJhc3NpZ24tYnVzc2VzIikpIHsKKwkJcGNpX3Byb2JlIHw9IFBDSV9BU1NJR05fQUxMX0JVU1NFUzsKKwkJcmV0dXJuIE5VTEw7CisJfSBlbHNlIGlmICghc3RyY21wKHN0ciwgInJvdXRlaXJxIikpIHsKKwkJcGNpX3JvdXRlaXJxID0gMTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBzdHI7Cit9CisKK3Vuc2lnbmVkIGludCBwY2liaW9zX2Fzc2lnbl9hbGxfYnVzc2VzKHZvaWQpCit7CisJcmV0dXJuIChwY2lfcHJvYmUgJiBQQ0lfQVNTSUdOX0FMTF9CVVNTRVMpID8gMSA6IDA7Cit9CisKK2ludCBwY2liaW9zX2VuYWJsZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG1hc2spCit7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gcGNpYmlvc19lbmFibGVfcmVzb3VyY2VzKGRldiwgbWFzaykpIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiBwY2liaW9zX2VuYWJsZV9pcnEoZGV2KTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9wY2kvZGlyZWN0LmMgYi9hcmNoL2kzODYvcGNpL2RpcmVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYjdlOWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvcGNpL2RpcmVjdC5jCkBAIC0wLDAgKzEsMjg5IEBACisvKgorICogZGlyZWN0LmMgLSBMb3ctbGV2ZWwgZGlyZWN0IFBDSSBjb25maWcgc3BhY2UgYWNjZXNzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlICJwY2kuaCIKKworLyoKKyAqIEZ1bmN0aW9ucyBmb3IgYWNjZXNzaW5nIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIHdpdGggdHlwZSAxIGFjY2Vzc2VzCisgKi8KKworI2RlZmluZSBQQ0lfQ09ORjFfQUREUkVTUyhidXMsIGRldmZuLCByZWcpIFwKKwkoMHg4MDAwMDAwMCB8IChidXMgPDwgMTYpIHwgKGRldmZuIDw8IDgpIHwgKHJlZyAmIH4zKSkKKworc3RhdGljIGludCBwY2lfY29uZjFfcmVhZCh1bnNpZ25lZCBpbnQgc2VnLCB1bnNpZ25lZCBpbnQgYnVzLAorCQkJICB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCByZWcsIGludCBsZW4sIHUzMiAqdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghdmFsdWUgfHwgKGJ1cyA+IDI1NSkgfHwgKGRldmZuID4gMjU1KSB8fCAocmVnID4gMjU1KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGNpX2NvbmZpZ19sb2NrLCBmbGFncyk7CisKKwlvdXRsKFBDSV9DT05GMV9BRERSRVNTKGJ1cywgZGV2Zm4sIHJlZyksIDB4Q0Y4KTsKKworCXN3aXRjaCAobGVuKSB7CisJY2FzZSAxOgorCQkqdmFsdWUgPSBpbmIoMHhDRkMgKyAocmVnICYgMykpOworCQlicmVhazsKKwljYXNlIDI6CisJCSp2YWx1ZSA9IGludygweENGQyArIChyZWcgJiAyKSk7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJKnZhbHVlID0gaW5sKDB4Q0ZDKTsKKwkJYnJlYWs7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNpX2NvbmZpZ19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwY2lfY29uZjFfd3JpdGUodW5zaWduZWQgaW50IHNlZywgdW5zaWduZWQgaW50IGJ1cywKKwkJCSAgIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IHJlZywgaW50IGxlbiwgdTMyIHZhbHVlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoKGJ1cyA+IDI1NSkgfHwgKGRldmZuID4gMjU1KSB8fCAocmVnID4gMjU1KSkgCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBjaV9jb25maWdfbG9jaywgZmxhZ3MpOworCisJb3V0bChQQ0lfQ09ORjFfQUREUkVTUyhidXMsIGRldmZuLCByZWcpLCAweENGOCk7CisKKwlzd2l0Y2ggKGxlbikgeworCWNhc2UgMToKKwkJb3V0YigodTgpdmFsdWUsIDB4Q0ZDICsgKHJlZyAmIDMpKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlvdXR3KCh1MTYpdmFsdWUsIDB4Q0ZDICsgKHJlZyAmIDIpKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlvdXRsKCh1MzIpdmFsdWUsIDB4Q0ZDKTsKKwkJYnJlYWs7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNpX2NvbmZpZ19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworI3VuZGVmIFBDSV9DT05GMV9BRERSRVNTCisKK3N0cnVjdCBwY2lfcmF3X29wcyBwY2lfZGlyZWN0X2NvbmYxID0geworCS5yZWFkID0JCXBjaV9jb25mMV9yZWFkLAorCS53cml0ZSA9CXBjaV9jb25mMV93cml0ZSwKK307CisKKworLyoKKyAqIEZ1bmN0aW9ucyBmb3IgYWNjZXNzaW5nIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIHdpdGggdHlwZSAyIGFjY2Vzc2VzCisgKi8KKworI2RlZmluZSBQQ0lfQ09ORjJfQUREUkVTUyhkZXYsIHJlZykJKHUxNikoMHhDMDAwIHwgKGRldiA8PCA4KSB8IHJlZykKKworc3RhdGljIGludCBwY2lfY29uZjJfcmVhZCh1bnNpZ25lZCBpbnQgc2VnLCB1bnNpZ25lZCBpbnQgYnVzLAorCQkJICB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCByZWcsIGludCBsZW4sIHUzMiAqdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZGV2LCBmbjsKKworCWlmICghdmFsdWUgfHwgKGJ1cyA+IDI1NSkgfHwgKGRldmZuID4gMjU1KSB8fCAocmVnID4gMjU1KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXYgPSBQQ0lfU0xPVChkZXZmbik7CisJZm4gPSBQQ0lfRlVOQyhkZXZmbik7CisKKwlpZiAoZGV2ICYgMHgxMCkgCisJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGNpX2NvbmZpZ19sb2NrLCBmbGFncyk7CisKKwlvdXRiKCh1OCkoMHhGMCB8IChmbiA8PCAxKSksIDB4Q0Y4KTsKKwlvdXRiKCh1OClidXMsIDB4Q0ZBKTsKKworCXN3aXRjaCAobGVuKSB7CisJY2FzZSAxOgorCQkqdmFsdWUgPSBpbmIoUENJX0NPTkYyX0FERFJFU1MoZGV2LCByZWcpKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQkqdmFsdWUgPSBpbncoUENJX0NPTkYyX0FERFJFU1MoZGV2LCByZWcpKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQkqdmFsdWUgPSBpbmwoUENJX0NPTkYyX0FERFJFU1MoZGV2LCByZWcpKTsKKwkJYnJlYWs7CisJfQorCisJb3V0YigwLCAweENGOCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY2lfY29uZmlnX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjaV9jb25mMl93cml0ZSh1bnNpZ25lZCBpbnQgc2VnLCB1bnNpZ25lZCBpbnQgYnVzLAorCQkJICAgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgcmVnLCBpbnQgbGVuLCB1MzIgdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZGV2LCBmbjsKKworCWlmICgoYnVzID4gMjU1KSB8fCAoZGV2Zm4gPiAyNTUpIHx8IChyZWcgPiAyNTUpKSAKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXYgPSBQQ0lfU0xPVChkZXZmbik7CisJZm4gPSBQQ0lfRlVOQyhkZXZmbik7CisKKwlpZiAoZGV2ICYgMHgxMCkgCisJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGNpX2NvbmZpZ19sb2NrLCBmbGFncyk7CisKKwlvdXRiKCh1OCkoMHhGMCB8IChmbiA8PCAxKSksIDB4Q0Y4KTsKKwlvdXRiKCh1OClidXMsIDB4Q0ZBKTsKKworCXN3aXRjaCAobGVuKSB7CisJY2FzZSAxOgorCQlvdXRiKCh1OCl2YWx1ZSwgUENJX0NPTkYyX0FERFJFU1MoZGV2LCByZWcpKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlvdXR3KCh1MTYpdmFsdWUsIFBDSV9DT05GMl9BRERSRVNTKGRldiwgcmVnKSk7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJb3V0bCgodTMyKXZhbHVlLCBQQ0lfQ09ORjJfQUREUkVTUyhkZXYsIHJlZykpOworCQlicmVhazsKKwl9CisKKwlvdXRiKDAsIDB4Q0Y4KTsgICAgCisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY2lfY29uZmlnX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisjdW5kZWYgUENJX0NPTkYyX0FERFJFU1MKKworc3RhdGljIHN0cnVjdCBwY2lfcmF3X29wcyBwY2lfZGlyZWN0X2NvbmYyID0geworCS5yZWFkID0JCXBjaV9jb25mMl9yZWFkLAorCS53cml0ZSA9CXBjaV9jb25mMl93cml0ZSwKK307CisKKworLyoKKyAqIEJlZm9yZSB3ZSBkZWNpZGUgdG8gdXNlIGRpcmVjdCBoYXJkd2FyZSBhY2Nlc3MgbWVjaGFuaXNtcywgd2UgdHJ5IHRvIGRvIHNvbWUKKyAqIHRyaXZpYWwgY2hlY2tzIHRvIGVuc3VyZSBpdCBhdCBsZWFzdCBfc2VlbXNfIHRvIGJlIHdvcmtpbmcgLS0gd2UganVzdCB0ZXN0CisgKiB3aGV0aGVyIGJ1cyAwMCBjb250YWlucyBhIGhvc3QgYnJpZGdlICh0aGlzIGlzIHNpbWlsYXIgdG8gY2hlY2tpbmcKKyAqIHRlY2huaXF1ZXMgdXNlZCBpbiBYRnJlZTg2LCBidXQgb3VycyBzaG91bGQgYmUgbW9yZSByZWxpYWJsZSBzaW5jZSB3ZQorICogYXR0ZW1wdCB0byBtYWtlIHVzZSBvZiBkaXJlY3QgYWNjZXNzIGhpbnRzIHByb3ZpZGVkIGJ5IHRoZSBQQ0kgQklPUykuCisgKgorICogVGhpcyBzaG91bGQgYmUgY2xvc2UgdG8gdHJpdmlhbCwgYnV0IGl0IGlzbid0LCBiZWNhdXNlIHRoZXJlIGFyZSBidWdneQorICogY2hpcHNldHMgKHllcywgeW91IGd1ZXNzZWQgaXQsIGJ5IEludGVsIGFuZCBDb21wYXEpIHRoYXQgaGF2ZSBubyBjbGFzcyBJRC4KKyAqLworc3RhdGljIGludCBfX2luaXQgcGNpX3Nhbml0eV9jaGVjayhzdHJ1Y3QgcGNpX3Jhd19vcHMgKm8pCit7CisJdTMyIHggPSAwOworCWludCBkZXZmbjsKKworCWlmIChwY2lfcHJvYmUgJiBQQ0lfTk9fQ0hFQ0tTKQorCQlyZXR1cm4gMTsKKworCWZvciAoZGV2Zm4gPSAwOyBkZXZmbiA8IDB4MTAwOyBkZXZmbisrKSB7CisJCWlmIChvLT5yZWFkKDAsIDAsIGRldmZuLCBQQ0lfQ0xBU1NfREVWSUNFLCAyLCAmeCkpCisJCQljb250aW51ZTsKKwkJaWYgKHggPT0gUENJX0NMQVNTX0JSSURHRV9IT1NUIHx8IHggPT0gUENJX0NMQVNTX0RJU1BMQVlfVkdBKQorCQkJcmV0dXJuIDE7CisKKwkJaWYgKG8tPnJlYWQoMCwgMCwgZGV2Zm4sIFBDSV9WRU5ET1JfSUQsIDIsICZ4KSkKKwkJCWNvbnRpbnVlOworCQlpZiAoeCA9PSBQQ0lfVkVORE9SX0lEX0lOVEVMIHx8IHggPT0gUENJX1ZFTkRPUl9JRF9DT01QQVEpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlEQkcoIlBDSTogU2FuaXR5IGNoZWNrIGZhaWxlZFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHBjaV9jaGVja190eXBlMSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IHRtcDsKKwlpbnQgd29ya3MgPSAwOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJb3V0YigweDAxLCAweENGQik7CisJdG1wID0gaW5sKDB4Q0Y4KTsKKwlvdXRsKDB4ODAwMDAwMDAsIDB4Q0Y4KTsKKwlpZiAoaW5sKDB4Q0Y4KSA9PSAweDgwMDAwMDAwICYmIHBjaV9zYW5pdHlfY2hlY2soJnBjaV9kaXJlY3RfY29uZjEpKSB7CisJCXdvcmtzID0gMTsKKwl9CisJb3V0bCh0bXAsIDB4Q0Y4KTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gd29ya3M7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHBjaV9jaGVja190eXBlMih2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHdvcmtzID0gMDsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCW91dGIoMHgwMCwgMHhDRkIpOworCW91dGIoMHgwMCwgMHhDRjgpOworCW91dGIoMHgwMCwgMHhDRkEpOworCWlmIChpbmIoMHhDRjgpID09IDB4MDAgJiYgaW5iKDB4Q0ZBKSA9PSAweDAwICYmCisJICAgIHBjaV9zYW5pdHlfY2hlY2soJnBjaV9kaXJlY3RfY29uZjIpKSB7CisJCXdvcmtzID0gMTsKKwl9CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gd29ya3M7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHBjaV9kaXJlY3RfaW5pdCh2b2lkKQoreworCXN0cnVjdCByZXNvdXJjZSAqcmVnaW9uLCAqcmVnaW9uMjsKKworCWlmICgocGNpX3Byb2JlICYgUENJX1BST0JFX0NPTkYxKSA9PSAwKQorCQlnb3RvIHR5cGUyOworCXJlZ2lvbiA9IHJlcXVlc3RfcmVnaW9uKDB4Q0Y4LCA4LCAiUENJIGNvbmYxIik7CisJaWYgKCFyZWdpb24pCisJCWdvdG8gdHlwZTI7CisKKwlpZiAocGNpX2NoZWNrX3R5cGUxKCkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBVc2luZyBjb25maWd1cmF0aW9uIHR5cGUgMVxuIik7CisJCXJhd19wY2lfb3BzID0gJnBjaV9kaXJlY3RfY29uZjE7CisJCXJldHVybiAwOworCX0KKwlyZWxlYXNlX3Jlc291cmNlKHJlZ2lvbik7CisKKyB0eXBlMjoKKwlpZiAoKHBjaV9wcm9iZSAmIFBDSV9QUk9CRV9DT05GMikgPT0gMCkKKwkJZ290byBvdXQ7CisJcmVnaW9uID0gcmVxdWVzdF9yZWdpb24oMHhDRjgsIDQsICJQQ0kgY29uZjIiKTsKKwlpZiAoIXJlZ2lvbikKKwkJZ290byBvdXQ7CisJcmVnaW9uMiA9IHJlcXVlc3RfcmVnaW9uKDB4QzAwMCwgMHgxMDAwLCAiUENJIGNvbmYyIik7CisJaWYgKCFyZWdpb24yKQorCQlnb3RvIGZhaWwyOworCisJaWYgKHBjaV9jaGVja190eXBlMigpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIlBDSTogVXNpbmcgY29uZmlndXJhdGlvbiB0eXBlIDJcbiIpOworCQlyYXdfcGNpX29wcyA9ICZwY2lfZGlyZWN0X2NvbmYyOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZWxlYXNlX3Jlc291cmNlKHJlZ2lvbjIpOworIGZhaWwyOgorCXJlbGVhc2VfcmVzb3VyY2UocmVnaW9uKTsKKworIG91dDoKKwlyZXR1cm4gMDsKK30KKworYXJjaF9pbml0Y2FsbChwY2lfZGlyZWN0X2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L3BjaS9maXh1cC5jIGIvYXJjaC9pMzg2L3BjaS9maXh1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNTJjNWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvcGNpL2ZpeHVwLmMKQEAgLTAsMCArMSwzODYgQEAKKy8qCisgKiBFeGNlcHRpb25zIGZvciBzcGVjaWZpYyBkZXZpY2VzLiBVc3VhbGx5IHdvcmstYXJvdW5kcyBmb3IgZmF0YWwgZGVzaWduIGZsYXdzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSAicGNpLmgiCisKKworc3RhdGljIHZvaWQgX19kZXZpbml0IHBjaV9maXh1cF9pNDUwbngoc3RydWN0IHBjaV9kZXYgKmQpCit7CisJLyoKKwkgKiBpNDUwTlggLS0gRmluZCBhbmQgc2NhbiBhbGwgc2Vjb25kYXJ5IGJ1c2VzIG9uIGFsbCBQWEIncy4KKwkgKi8KKwlpbnQgcHhiLCByZWc7CisJdTggYnVzbm8sIHN1YmEsIHN1YmI7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICJQQ0k6IFNlYXJjaGluZyBmb3IgaTQ1ME5YIGhvc3QgYnJpZGdlcyBvbiAlc1xuIiwgcGNpX25hbWUoZCkpOworCXJlZyA9IDB4ZDA7CisJZm9yKHB4Yj0wOyBweGI8MjsgcHhiKyspIHsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZCwgcmVnKyssICZidXNubyk7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGQsIHJlZysrLCAmc3ViYSk7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGQsIHJlZysrLCAmc3ViYik7CisJCURCRygiaTQ1ME5YIFBYQiAlZDogJTAyeC8lMDJ4LyUwMnhcbiIsIHB4YiwgYnVzbm8sIHN1YmEsIHN1YmIpOworCQlpZiAoYnVzbm8pCisJCQlwY2lfc2Nhbl9idXMoYnVzbm8sICZwY2lfcm9vdF9vcHMsIE5VTEwpOwkvKiBCdXMgQSAqLworCQlpZiAoc3ViYSA8IHN1YmIpCisJCQlwY2lfc2Nhbl9idXMoc3ViYSsxLCAmcGNpX3Jvb3Rfb3BzLCBOVUxMKTsJLyogQnVzIEIgKi8KKwl9CisJcGNpYmlvc19sYXN0X2J1cyA9IC0xOworfQorREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI0NTFOWCwgcGNpX2ZpeHVwX2k0NTBueCk7CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBwY2lfZml4dXBfaTQ1MGd4KHN0cnVjdCBwY2lfZGV2ICpkKQoreworCS8qCisJICogaTQ1MEdYIGFuZCBpNDUwS1ggLS0gRmluZCBhbmQgc2NhbiBhbGwgc2Vjb25kYXJ5IGJ1c2VzLgorCSAqIChjYWxsZWQgc2VwYXJhdGVseSBmb3IgZWFjaCBQQ0kgYnJpZGdlIGZvdW5kKQorCSAqLworCXU4IGJ1c25vOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGQsIDB4NGEsICZidXNubyk7CisJcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBpNDQwS1gvR1ggaG9zdCBicmlkZ2UgJXM6IHNlY29uZGFyeSBidXMgJTAyeFxuIiwgcGNpX25hbWUoZCksIGJ1c25vKTsKKwlwY2lfc2Nhbl9idXMoYnVzbm8sICZwY2lfcm9vdF9vcHMsIE5VTEwpOworCXBjaWJpb3NfbGFzdF9idXMgPSAtMTsKK30KK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNDU0R1gsIHBjaV9maXh1cF9pNDUwZ3gpOworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgIHBjaV9maXh1cF91bWNfaWRlKHN0cnVjdCBwY2lfZGV2ICpkKQoreworCS8qCisJICogVU04ODg2QkYgSURFIGNvbnRyb2xsZXIgc2V0cyByZWdpb24gdHlwZSBiaXRzIGluY29ycmVjdGx5LAorCSAqIHRoZXJlZm9yZSB0aGV5IGxvb2sgbGlrZSBtZW1vcnkgZGVzcGl0ZSBvZiB0aGVtIGJlaW5nIEkvTy4KKwkgKi8KKwlpbnQgaTsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgIlBDSTogRml4aW5nIGJhc2UgYWRkcmVzcyBmbGFncyBmb3IgZGV2aWNlICVzXG4iLCBwY2lfbmFtZShkKSk7CisJZm9yKGk9MDsgaTw0OyBpKyspCisJCWQtPnJlc291cmNlW2ldLmZsYWdzIHw9IFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfSU87Cit9CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9VTUMsIFBDSV9ERVZJQ0VfSURfVU1DX1VNODg4NkJGLCBwY2lfZml4dXBfdW1jX2lkZSk7CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCAgcGNpX2ZpeHVwX25jcjUzYzgxMChzdHJ1Y3QgcGNpX2RldiAqZCkKK3sKKwkvKgorCSAqIE5DUiA1M0M4MTAgcmV0dXJucyBjbGFzcyBjb2RlIDAgKGF0IGxlYXN0IG9uIHNvbWUgc3lzdGVtcykuCisJICogRml4IGNsYXNzIHRvIGJlIFBDSV9DTEFTU19TVE9SQUdFX1NDU0kKKwkgKi8KKwlpZiAoIWQtPmNsYXNzKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlBDSTogZml4aW5nIE5DUiA1M0M4MTAgY2xhc3MgY29kZSBmb3IgJXNcbiIsIHBjaV9uYW1lKGQpKTsKKwkJZC0+Y2xhc3MgPSBQQ0lfQ0xBU1NfU1RPUkFHRV9TQ1NJIDw8IDg7CisJfQorfQorREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfTkNSLCBQQ0lfREVWSUNFX0lEX05DUl81M0M4MTAsIHBjaV9maXh1cF9uY3I1M2M4MTApOworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcGNpX2ZpeHVwX2lkZV9iYXNlcyhzdHJ1Y3QgcGNpX2RldiAqZCkKK3sKKwlpbnQgaTsKKworCS8qCisJICogUENJIElERSBjb250cm9sbGVycyB1c2Ugbm9uLXN0YW5kYXJkIEkvTyBwb3J0IGRlY29kaW5nLCByZXNwZWN0IGl0LgorCSAqLworCWlmICgoZC0+Y2xhc3MgPj4gOCkgIT0gUENJX0NMQVNTX1NUT1JBR0VfSURFKQorCQlyZXR1cm47CisJREJHKCJQQ0k6IElERSBiYXNlIGFkZHJlc3MgZml4dXAgZm9yICVzXG4iLCBwY2lfbmFtZShkKSk7CisJZm9yKGk9MDsgaTw0OyBpKyspIHsKKwkJc3RydWN0IHJlc291cmNlICpyID0gJmQtPnJlc291cmNlW2ldOworCQlpZiAoKHItPnN0YXJ0ICYgfjB4ODApID09IDB4Mzc0KSB7CisJCQlyLT5zdGFydCB8PSAyOworCQkJci0+ZW5kID0gci0+c3RhcnQ7CisJCX0KKwl9Cit9CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGNpX2ZpeHVwX2lkZV9iYXNlcyk7CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCAgcGNpX2ZpeHVwX2lkZV90cmFzaChzdHJ1Y3QgcGNpX2RldiAqZCkKK3sKKwlpbnQgaTsKKworCS8qCisJICogUnVucyB0aGUgZml4dXAgb25seSBmb3IgdGhlIGZpcnN0IElERSBjb250cm9sbGVyCisJICogKFNoYWkgRnVsdGhlaW0gLSBzaGFpQGZ0Y29uLmNvbSkKKwkgKi8KKwlzdGF0aWMgaW50IGNhbGxlZCA9IDA7CisJaWYgKGNhbGxlZCkKKwkJcmV0dXJuOworCWNhbGxlZCA9IDE7CisKKwkvKgorCSAqIFRoZXJlIGV4aXN0IFBDSSBJREUgY29udHJvbGxlcnMgd2hpY2ggaGF2ZSB1dHRlciBnYXJiYWdlCisJICogaW4gZmlyc3QgZm91ciBiYXNlIHJlZ2lzdGVycy4gSWdub3JlIHRoYXQuCisJICovCisJREJHKCJQQ0k6IElERSBiYXNlIGFkZHJlc3MgdHJhc2ggY2xlYXJlZCBmb3IgJXNcbiIsIHBjaV9uYW1lKGQpKTsKKwlmb3IoaT0wOyBpPDQ7IGkrKykKKwkJZC0+cmVzb3VyY2VbaV0uc3RhcnQgPSBkLT5yZXNvdXJjZVtpXS5lbmQgPSBkLT5yZXNvdXJjZVtpXS5mbGFncyA9IDA7Cit9CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9TSSwgUENJX0RFVklDRV9JRF9TSV81NTEzLCBwY2lfZml4dXBfaWRlX3RyYXNoKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQ0FfMTAsIHBjaV9maXh1cF9pZGVfdHJhc2gpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFDQV8xMSwgcGNpX2ZpeHVwX2lkZV90cmFzaCk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMURCXzksIHBjaV9maXh1cF9pZGVfdHJhc2gpOworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgIHBjaV9maXh1cF9sYXRlbmN5KHN0cnVjdCBwY2lfZGV2ICpkKQoreworCS8qCisJICogIFNpUyA1NTk3IGFuZCA1NTk4IGNoaXBzZXRzIHJlcXVpcmUgbGF0ZW5jeSB0aW1lciBzZXQgdG8KKwkgKiAgYXQgbW9zdCAzMiB0byBhdm9pZCBsb2NrdXBzLgorCSAqLworCURCRygiUENJOiBTZXR0aW5nIG1heCBsYXRlbmN5IHRvIDMyXG4iKTsKKwlwY2liaW9zX21heF9sYXRlbmN5ID0gMzI7Cit9CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9TSSwgUENJX0RFVklDRV9JRF9TSV81NTk3LCBwY2lfZml4dXBfbGF0ZW5jeSk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9TSSwgUENJX0RFVklDRV9JRF9TSV81NTk4LCBwY2lfZml4dXBfbGF0ZW5jeSk7CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBwY2lfZml4dXBfcGlpeDRfYWNwaShzdHJ1Y3QgcGNpX2RldiAqZCkKK3sKKwkvKgorCSAqIFBJSVg0IEFDUEkgZGV2aWNlOiBoYXJkd2lyZWQgSVJROQorCSAqLworCWQtPmlycSA9IDk7Cit9CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MUFCXzMsIHBjaV9maXh1cF9waWl4NF9hY3BpKTsKKworLyoKKyAqIEFkZHJlc3NlcyBpc3N1ZXMgd2l0aCBwcm9ibGVtcyBpbiB0aGUgbWVtb3J5IHdyaXRlIHF1ZXVlIHRpbWVyIGluCisgKiBjZXJ0YWluIFZJQSBOb3J0aGJyaWRnZXMuICBUaGlzIGJ1Z2ZpeCBpcyBwZXIgVklBJ3Mgc3BlY2lmaWNhdGlvbnMsCisgKiBleGNlcHQgZm9yIHRoZSBLTDEzMy9LTTEzMzogY2xlYXJpbmcgYml0IDUgb24gdGhvc2UgTm9ydGhicmlkZ2VzIHNlZW1zCisgKiB0byB0cmlnZ2VyIGEgYnVnIGluIGl0cyBpbnRlZ3JhdGVkIFByb1NhdmFnZSB2aWRlbyBjYXJkLCB3aGljaAorICogY2F1c2VzIHNjcmVlbiBjb3JydXB0aW9uLiAgV2Ugb25seSBjbGVhciBiaXRzIDYgYW5kIDcgZm9yIHRoYXQgY2hpcHNldCwKKyAqIHVudGlsIFZJQSBjYW4gcHJvdmlkZSB1cyB3aXRoIGRlZmluaXRpdmUgaW5mb3JtYXRpb24gb24gd2h5IHNjcmVlbgorICogY29ycnVwdGlvbiBvY2N1cnMsIGFuZCB3aGF0IGV4YWN0bHkgdGhvc2UgYml0cyBkby4KKyAqCisgKiBWSUEgODM2Myw4NjIyLDgzNjEgTm9ydGhicmlkZ2VzOgorICogIC0gYml0cyAgNSwgNiwgNyBhdCBvZmZzZXQgMHg1NSBuZWVkIHRvIGJlIHR1cm5lZCBvZmYKKyAqIFZJQSA4MzY3IChLVDI2NngpIE5vcnRoYnJpZGdlczoKKyAqICAtIGJpdHMgIDUsIDYsIDcgYXQgb2Zmc2V0IDB4OTUgbmVlZCB0byBiZSB0dXJuZWQgb2ZmCisgKiBWSUEgODM2MyByZXYgMHg4MS8weDg0IChLTDEzMy9LTTEzMykgTm9ydGhicmlkZ2VzOgorICogIC0gYml0cyAgICAgNiwgNyBhdCBvZmZzZXQgMHg1NSBuZWVkIHRvIGJlIHR1cm5lZCBvZmYKKyAqLworCisjZGVmaW5lIFZJQV84MzYzX0tMMTMzX1JFVklTSU9OX0lEIDB4ODEKKyNkZWZpbmUgVklBXzgzNjNfS00xMzNfUkVWSVNJT05fSUQgMHg4NAorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcGNpX2ZpeHVwX3ZpYV9ub3J0aGJyaWRnZV9idWcoc3RydWN0IHBjaV9kZXYgKmQpCit7CisJdTggdjsKKwl1OCByZXZpc2lvbjsKKwlpbnQgd2hlcmUgPSAweDU1OworCWludCBtYXNrID0gMHgxZjsgLyogY2xlYXIgYml0cyA1LCA2LCA3IGJ5IGRlZmF1bHQgKi8KKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGQsIFBDSV9SRVZJU0lPTl9JRCwgJnJldmlzaW9uKTsKKworCWlmIChkLT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9WSUFfODM2N18wKSB7CisJCS8qIGZpeCBwY2kgYnVzIGxhdGVuY3kgaXNzdWVzIHJlc3VsdGVkIGJ5IE5CIGJpb3MgZXJyb3IKKwkJICAgaXQgYXBwZWFycyBvbiBidWcgZnJlZV5XcmVkdWNlZCBrdDI2NngncyBiaW9zIGZvcmNlcworCQkgICBOQiBsYXRlbmN5IHRvIHplcm8gKi8KKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGQsIFBDSV9MQVRFTkNZX1RJTUVSLCAwKTsKKworCQl3aGVyZSA9IDB4OTU7IC8qIHRoZSBtZW1vcnkgd3JpdGUgcXVldWUgdGltZXIgcmVnaXN0ZXIgaXMgCisJCQkJZGlmZmVyZW50IGZvciB0aGUgS1QyNjZ4J3M6IDB4OTUgbm90IDB4NTUgKi8KKwl9IGVsc2UgaWYgKGQtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1ZJQV84MzYzXzAgJiYKKwkJCShyZXZpc2lvbiA9PSBWSUFfODM2M19LTDEzM19SRVZJU0lPTl9JRCB8fCAKKwkJCXJldmlzaW9uID09IFZJQV84MzYzX0tNMTMzX1JFVklTSU9OX0lEKSkgeworCQkJbWFzayA9IDB4M2Y7IC8qIGNsZWFyIG9ubHkgYml0cyA2IGFuZCA3OyBjbGVhcmluZyBiaXQgNQorCQkJCQljYXVzZXMgc2NyZWVuIGNvcnJ1cHRpb24gb24gdGhlIEtMMTMzL0tNMTMzICovCisJfQorCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZCwgd2hlcmUsICZ2KTsKKwlpZiAodiAmIH5tYXNrKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkRpc2FibGluZyBWSUEgbWVtb3J5IHdyaXRlIHF1ZXVlIChQQ0kgSUQgJTA0eCwgcmV2ICUwMngpOiBbJTAyeF0gJTAyeCAmICUwMnggLT4gJTAyeFxuIiwgXAorCQkJZC0+ZGV2aWNlLCByZXZpc2lvbiwgd2hlcmUsIHYsIG1hc2ssIHYgJiBtYXNrKTsKKwkJdiAmPSBtYXNrOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZCwgd2hlcmUsIHYpOworCX0KK30KK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODM2M18wLCBwY2lfZml4dXBfdmlhX25vcnRoYnJpZGdlX2J1Zyk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9WSUEsIFBDSV9ERVZJQ0VfSURfVklBXzg2MjIsIHBjaV9maXh1cF92aWFfbm9ydGhicmlkZ2VfYnVnKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODM2MSwgcGNpX2ZpeHVwX3ZpYV9ub3J0aGJyaWRnZV9idWcpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfVklBLCBQQ0lfREVWSUNFX0lEX1ZJQV84MzY3XzAsIHBjaV9maXh1cF92aWFfbm9ydGhicmlkZ2VfYnVnKTsKKworLyoKKyAqIEZvciBzb21lIHJlYXNvbnMgSW50ZWwgZGVjaWRlZCB0aGF0IGNlcnRhaW4gcGFydHMgb2YgdGhlaXIKKyAqIDgxNSwgODQ1IGFuZCBzb21lIG90aGVyIGNoaXBzZXRzIG11c3QgbG9vayBsaWtlIFBDSS10by1QQ0kgYnJpZGdlcworICogd2hpbGUgdGhleSBhcmUgb2J2aW91c2x5IG5vdC4gVGhlIDgyODAxIGZhbWlseSAoQUEsIEFCLCBCQU0vQ0FNLAorICogQkEvQ0EvREIgYW5kIEUpIFBDSSBicmlkZ2VzIGFyZSBhY3R1YWxseSBIVUItdG8tUENJIG9uZXMsIGFjY29yZGluZworICogdG8gSW50ZWwgdGVybWlub2xvZ3kuIFRoZXNlIGRldmljZXMgZG8gZm9yd2FyZCBhbGwgYWRkcmVzc2VzIGZyb20KKyAqIHN5c3RlbSB0byBQQ0kgYnVzIG5vIG1hdHRlciB3aGF0IGFyZSB0aGVpciB3aW5kb3cgc2V0dGluZ3MsIHNvIHRoZXkgYXJlCisgKiAidHJhbnNwYXJlbnQiIChvciBzdWJ0cmFjdGl2ZSBkZWNvZGluZykgZnJvbSBwcm9ncmFtbWVycyBwb2ludCBvZiB2aWV3LgorICovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcGNpX2ZpeHVwX3RyYW5zcGFyZW50X2JyaWRnZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWlmICgoZGV2LT5jbGFzcyA+PiA4KSA9PSBQQ0lfQ0xBU1NfQlJJREdFX1BDSSAmJgorCSAgICAoZGV2LT5kZXZpY2UgJiAweGZmMDApID09IDB4MjQwMCkKKwkJZGV2LT50cmFuc3BhcmVudCA9IDE7Cit9CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0FOWV9JRCwgcGNpX2ZpeHVwX3RyYW5zcGFyZW50X2JyaWRnZSk7CisKKy8qCisgKiBGaXh1cCBmb3IgQzEgSGFsdCBEaXNjb25uZWN0IHByb2JsZW0gb24gbkZvcmNlMiBzeXN0ZW1zLgorICoKKyAqIEZyb20gaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgIkFsbGVuIE1hcnRpbiIgPEFNYXJ0aW5AbnZpZGlhLmNvbT46CisgKgorICogQSBoYW5nIGlzIGNhdXNlZCB3aGVuIHRoZSBDUFUgZ2VuZXJhdGVzIGEgdmVyeSBmYXN0IENPTk5FQ1QvSEFMVCBjeWNsZQorICogc2VxdWVuY2UuICBXb3JrYXJvdW5kIGlzIHRvIHNldCB0aGUgU1lTVEVNX0lETEVfVElNRU9VVCB0byA4MCBucy4KKyAqIFRoaXMgYWxsb3dzIHRoZSBzdGF0ZS1tYWNoaW5lIGFuZCB0aW1lciB0byByZXR1cm4gdG8gYSBwcm9wZXIgc3RhdGUgd2l0aGluCisgKiA4MCBucyBvZiB0aGUgQ09OTkVDVCBhbmQgcHJvYmUgYXBwZWFyaW5nIHRvZ2V0aGVyLiAgU2luY2UgdGhlIENQVSB3aWxsIG5vdAorICogaXNzdWUgYW5vdGhlciBIQUxUIHdpdGhpbiA4MCBucyBvZiB0aGUgaW5pdGlhbCBIQUxULCB0aGUgZmFpbHVyZSBjb25kaXRpb24KKyAqIGlzIGF2b2lkZWQuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBwY2lfZml4dXBfbmZvcmNlMihzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXUzMiB2YWw7CisKKwkvKgorCSAqIENoaXAgIE9sZCB2YWx1ZSAgIE5ldyB2YWx1ZQorCSAqIEMxNyAgIDB4MUYwRkZGMDEgIDB4MUYwMUZGMDEKKwkgKiBDMThEICAweDlGMEZGRjAxICAweDlGMDFGRjAxCisJICoKKwkgKiBOb3J0aGJyaWRnZSBjaGlwIHZlcnNpb24gbWF5IGJlIGRldGVybWluZWQgYnkKKwkgKiByZWFkaW5nIHRoZSBQQ0kgcmV2aXNpb24gSUQgKDB4QzEgb3IgZ3JlYXRlciBpcyBDMThEKS4KKwkgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCAweDZjLCAmdmFsKTsKKworCS8qCisJICogQXBwbHkgZml4dXAgaWYgbmVlZGVkLCBidXQgZG9uJ3QgdG91Y2ggZGlzY29ubmVjdCBzdGF0ZQorCSAqLworCWlmICgodmFsICYgMHgwMEZGMDAwMCkgIT0gMHgwMDAxMDAwMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJQQ0k6IG5Gb3JjZTIgQzEgSGFsdCBEaXNjb25uZWN0IGZpeHVwXG4iKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIDB4NmMsICh2YWwgJiAweEZGMDBGRkZGKSB8IDB4MDAwMTAwMDApOworCX0KK30KK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFMiwgcGNpX2ZpeHVwX25mb3JjZTIpOworCisvKiBNYXggUENJIEV4cHJlc3Mgcm9vdCBwb3J0cyAqLworI2RlZmluZSBNQVhfUENJRVJPT1QJNgorc3RhdGljIGludCBxdWlya19hc3BtX29mZnNldFtNQVhfUENJRVJPT1QgPDwgM107CisKKyNkZWZpbmUgR0VUX0lOREVYKGEsIGIpICgoKGEgLSBQQ0lfREVWSUNFX0lEX0lOVEVMX01DSF9QQSkgPDwgMykgKyBiKQorCitzdGF0aWMgaW50IHF1aXJrX3BjaWVfYXNwbV9yZWFkKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyICp2YWx1ZSkKK3sKKwlyZXR1cm4gcmF3X3BjaV9vcHMtPnJlYWQoMCwgYnVzLT5udW1iZXIsIGRldmZuLCB3aGVyZSwgc2l6ZSwgdmFsdWUpOworfQorCisvKgorICogUmVwbGFjZSB0aGUgb3JpZ2luYWwgcGNpIGJ1cyBvcHMgZm9yIHdyaXRlIHdpdGggYSBuZXcgb25lIHRoYXQgd2lsbCBmaWx0ZXIKKyAqIHRoZSByZXF1ZXN0IHRvIGluc3VyZSBBU1BNIGNhbm5vdCBiZSBlbmFibGVkLgorICovCitzdGF0aWMgaW50IHF1aXJrX3BjaWVfYXNwbV93cml0ZShzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCB3aGVyZSwgaW50IHNpemUsIHUzMiB2YWx1ZSkKK3sKKwl1OCBvZmZzZXQ7CisKKwlvZmZzZXQgPSBxdWlya19hc3BtX29mZnNldFtHRVRfSU5ERVgoYnVzLT5zZWxmLT5kZXZpY2UsIGRldmZuKV07CisKKwlpZiAoKG9mZnNldCkgJiYgKHdoZXJlID09IG9mZnNldCkpCisJCXZhbHVlID0gdmFsdWUgJiAweGZmZmZmZmZjOworCQorCXJldHVybiByYXdfcGNpX29wcy0+d3JpdGUoMCwgYnVzLT5udW1iZXIsIGRldmZuLCB3aGVyZSwgc2l6ZSwgdmFsdWUpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9vcHMgcXVpcmtfcGNpZV9hc3BtX29wcyA9IHsKKwkucmVhZCA9IHF1aXJrX3BjaWVfYXNwbV9yZWFkLAorCS53cml0ZSA9IHF1aXJrX3BjaWVfYXNwbV93cml0ZSwKK307CisKKy8qCisgKiBQcmV2ZW50cyBQQ0kgRXhwcmVzcyBBU1BNIChBY3RpdmUgU3RhdGUgUG93ZXIgTWFuYWdlbWVudCkgYmVpbmcgZW5hYmxlZC4KKyAqCisgKiBTYXZlIHRoZSByZWdpc3RlciBvZmZzZXQsIHdoZXJlIHRoZSBBU1BNIGNvbnRyb2wgYml0cyBhcmUgbG9jYXRlZCwKKyAqIGZvciBlYWNoIFBDSSBFeHByZXNzIGRldmljZSB0aGF0IGlzIGluIHRoZSBkZXZpY2UgbGlzdCBvZgorICogdGhlIHJvb3QgcG9ydCBpbiBhbiBhcnJheSBmb3IgZmFzdCBpbmRleGluZy4gUmVwbGFjZSB0aGUgYnVzIG9wcworICogd2l0aCB0aGUgbW9kaWZpZWQgb25lLgorICovCitzdGF0aWMgdm9pZCBwY2llX3Jvb3Rwb3J0X2FzcG1fcXVpcmsoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaW50IGNhcF9iYXNlLCBpOworCXN0cnVjdCBwY2lfYnVzICAqcGJ1czsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2OworCisJaWYgKChwYnVzID0gcGRldi0+c3Vib3JkaW5hdGUpID09IE5VTEwpCisJCXJldHVybjsKKworCS8qCisJICogQ2hlY2sgaWYgdGhlIERJRCBvZiBwZGV2IG1hdGNoZXMgb25lIG9mIHRoZSBzaXggcm9vdCBwb3J0cy4gVGhpcworCSAqIGNoZWNrIGlzIG5lZWRlZCBpbiB0aGUgY2FzZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBkaXJlY3RseSBieSB0aGUKKwkgKiBob3QtcGx1ZyBkcml2ZXIuCisJICovCisJaWYgKChwZGV2LT5kZXZpY2UgPCBQQ0lfREVWSUNFX0lEX0lOVEVMX01DSF9QQSkgfHwKKwkgICAgKHBkZXYtPmRldmljZSA+IFBDSV9ERVZJQ0VfSURfSU5URUxfTUNIX1BDMSkpCisJCXJldHVybjsKKworCWlmIChsaXN0X2VtcHR5KCZwYnVzLT5kZXZpY2VzKSkgeworCQkvKgorCQkgKiBJZiBubyBkZXZpY2UgaXMgYXR0YWNoZWQgdG8gdGhlIHJvb3QgcG9ydCBhdCBwb3dlci11cCBvcgorCQkgKiBhZnRlciBob3QtcmVtb3ZlLCB0aGUgcGJ1cy0+ZGV2aWNlcyBpcyBlbXB0eSBhbmQgdGhpcyBjb2RlCisJCSAqIHdpbGwgc2V0IHRoZSBvZmZzZXRzIHRvIHplcm8gYW5kIHRoZSBidXMgb3BzIHRvIHBhcmVudCdzIGJ1cworCQkgKiBvcHMsIHdoaWNoIGlzIHVubW9kaWZpZWQuCisJIAkgKi8KKwkJZm9yIChpPSBHRVRfSU5ERVgocGRldi0+ZGV2aWNlLCAwKTsgaSA8PSBHRVRfSU5ERVgocGRldi0+ZGV2aWNlLCA3KTsgKytpKQorCQkJcXVpcmtfYXNwbV9vZmZzZXRbaV0gPSAwOworCisJCXBidXMtPm9wcyA9IHBidXMtPnBhcmVudC0+b3BzOworCX0gZWxzZSB7CisJCS8qCisJCSAqIElmIGRldmljZXMgYXJlIGF0dGFjaGVkIHRvIHRoZSByb290IHBvcnQgYXQgcG93ZXItdXAgb3IKKwkJICogYWZ0ZXIgaG90LWFkZCwgdGhlIGNvZGUgbG9vcHMgdGhyb3VnaCB0aGUgZGV2aWNlIGxpc3Qgb2YKKwkJICogZWFjaCByb290IHBvcnQgdG8gc2F2ZSB0aGUgcmVnaXN0ZXIgb2Zmc2V0cyBhbmQgcmVwbGFjZSB0aGUKKwkJICogYnVzIG9wcy4KKwkJICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmcGJ1cy0+ZGV2aWNlcywgYnVzX2xpc3QpIHsKKwkJCS8qIFRoZXJlIGFyZSAwIHRvIDggZGV2aWNlcyBhdHRhY2hlZCB0byB0aGlzIGJ1cyAqLworCQkJY2FwX2Jhc2UgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGRldiwgUENJX0NBUF9JRF9FWFApOworCQkJcXVpcmtfYXNwbV9vZmZzZXRbR0VUX0lOREVYKHBkZXYtPmRldmljZSwgZGV2LT5kZXZmbildPSBjYXBfYmFzZSArIDB4MTA7CisJCX0KKwkJcGJ1cy0+b3BzID0gJnF1aXJrX3BjaWVfYXNwbV9vcHM7CisJfQorfQorREVDTEFSRV9QQ0lfRklYVVBfRklOQUwoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9NQ0hfUEEsCXBjaWVfcm9vdHBvcnRfYXNwbV9xdWlyayApOworREVDTEFSRV9QQ0lfRklYVVBfRklOQUwoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9NQ0hfUEExLAlwY2llX3Jvb3Rwb3J0X2FzcG1fcXVpcmsgKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0ZJTkFMKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfTUNIX1BCLAlwY2llX3Jvb3Rwb3J0X2FzcG1fcXVpcmsgKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0ZJTkFMKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfTUNIX1BCMSwJcGNpZV9yb290cG9ydF9hc3BtX3F1aXJrICk7CitERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX01DSF9QQywJcGNpZV9yb290cG9ydF9hc3BtX3F1aXJrICk7CitERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX01DSF9QQzEsCXBjaWVfcm9vdHBvcnRfYXNwbV9xdWlyayApOworCisvKgorICogRml4dXAgdG8gbWFyayBib290IEJJT1MgdmlkZW8gc2VsZWN0ZWQgYnkgQklPUyBiZWZvcmUgaXQgY2hhbmdlcworICoKKyAqIEZyb20gaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgIkpvbiBTbWlybCIgPGpvbnNtaXJsQGdtYWlsLmNvbT4KKyAqCisgKiBUaGUgc3RhbmRhcmQgYm9vdCBST00gc2VxdWVuY2UgZm9yIGFuIHg4NiBtYWNoaW5lIHVzZXMgdGhlIEJJT1MKKyAqIHRvIHNlbGVjdCBhbiBpbml0aWFsIHZpZGVvIGNhcmQgZm9yIGJvb3QgZGlzcGxheS4gVGhpcyBib290IHZpZGVvIAorICogY2FyZCB3aWxsIGhhdmUgaXQncyBCSU9TIGNvcGllZCB0byBDMDAwMCBpbiBzeXN0ZW0gUkFNLiAKKyAqIElPUkVTT1VSQ0VfUk9NX1NIQURPVyBpcyB1c2VkIHRvIGFzc29jaWF0ZSB0aGUgYm9vdCB2aWRlbworICogY2FyZCB3aXRoIHRoaXMgY29weS4gT24gbGFwdG9wcyB0aGlzIGNvcHkgaGFzIHRvIGJlIHVzZWQgc2luY2UKKyAqIHRoZSBtYWluIFJPTSBtYXkgYmUgY29tcHJlc3NlZCBvciBjb21iaW5lZCB3aXRoIGFub3RoZXIgaW1hZ2UuCisgKiBTZWUgcGNpX21hcF9yb20oKSBmb3IgdXNlIG9mIHRoaXMgZmxhZy4gSU9SRVNPVVJDRV9ST01fU0hBRE9XCisgKiBpcyBtYXJrZWQgaGVyZSBzaW5jZSB0aGUgYm9vdCB2aWRlbyBkZXZpY2Ugd2lsbCBiZSB0aGUgb25seSBlbmFibGVkCisgKiB2aWRlbyBkZXZpY2UgYXQgdGhpcyBwb2ludC4KKyAqLworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcGNpX2ZpeHVwX3ZpZGVvKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2U7CisJc3RydWN0IHBjaV9idXMgKmJ1czsKKwl1MTYgY29uZmlnOworCisJaWYgKChwZGV2LT5jbGFzcyA+PiA4KSAhPSBQQ0lfQ0xBU1NfRElTUExBWV9WR0EpCisJCXJldHVybjsKKworCS8qIElzIFZHQSByb3V0ZWQgdG8gdXM/ICovCisJYnVzID0gcGRldi0+YnVzOworCXdoaWxlIChidXMpIHsKKwkJYnJpZGdlID0gYnVzLT5zZWxmOworCQlpZiAoYnJpZGdlKSB7CisJCQlwY2lfcmVhZF9jb25maWdfd29yZChicmlkZ2UsIFBDSV9CUklER0VfQ09OVFJPTCwKKwkJCQkJCSZjb25maWcpOworCQkJaWYgKCEoY29uZmlnICYgUENJX0JSSURHRV9DVExfVkdBKSkKKwkJCQlyZXR1cm47CisJCX0KKwkJYnVzID0gYnVzLT5wYXJlbnQ7CisJfQorCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmY29uZmlnKTsKKwlpZiAoY29uZmlnICYgKFBDSV9DT01NQU5EX0lPIHwgUENJX0NPTU1BTkRfTUVNT1JZKSkgeworCQlwZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXS5mbGFncyB8PSBJT1JFU09VUkNFX1JPTV9TSEFET1c7CisJCXByaW50ayhLRVJOX0RFQlVHICJCb290IHZpZGVvIGRldmljZSBpcyAlc1xuIiwgcGNpX25hbWUocGRldikpOworCX0KK30KK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwY2lfZml4dXBfdmlkZW8pOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L3BjaS9pMzg2LmMgYi9hcmNoL2kzODYvcGNpL2kzODYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjA1ZWE3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L3BjaS9pMzg2LmMKQEAgLTAsMCArMSwzMDQgQEAKKy8qCisgKglMb3ctTGV2ZWwgUENJIEFjY2VzcyBmb3IgaTM4NiBtYWNoaW5lcworICoKKyAqIENvcHlyaWdodCAxOTkzLCAxOTk0IERyZXcgRWNraGFyZHQKKyAqICAgICAgVmlzaW9uYXJ5IENvbXB1dGluZworICogICAgICAoVW5peCBhbmQgTGludXggY29uc3VsdGluZyBhbmQgY3VzdG9tIHByb2dyYW1taW5nKQorICogICAgICBEcmV3QENvbG9yYWRvLkVEVQorICogICAgICArMSAoMzAzKSA3ODYtNzk3NQorICoKKyAqIERyZXcncyB3b3JrIHdhcyBzcG9uc29yZWQgYnk6CisgKglpWCBNdWx0aXVzZXIgTXVsdGl0YXNraW5nIE1hZ2F6aW5lCisgKglIYW5ub3ZlciwgR2VybWFueQorICoJaG1AaXguZGUKKyAqCisgKiBDb3B5cmlnaHQgMTk5Ny0tMjAwMCBNYXJ0aW4gTWFyZXMgPG1qQHVjdy5jej4KKyAqCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIGNvbnN1bHQgdGhlIGZvbGxvd2luZyBtYW51YWxzIChsb29rIGF0CisgKiBodHRwOi8vd3d3LnBjaXNpZy5jb20vIGZvciBob3cgdG8gZ2V0IHRoZW0pOgorICoKKyAqIFBDSSBCSU9TIFNwZWNpZmljYXRpb24KKyAqIFBDSSBMb2NhbCBCdXMgU3BlY2lmaWNhdGlvbgorICogUENJIHRvIFBDSSBCcmlkZ2UgU3BlY2lmaWNhdGlvbgorICogUENJIFN5c3RlbSBEZXNpZ24gR3VpZGUKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKKyNpbmNsdWRlICJwY2kuaCIKKworLyoKKyAqIFdlIG5lZWQgdG8gYXZvaWQgY29sbGlzaW9ucyB3aXRoIGBtaXJyb3JlZCcgVkdBIHBvcnRzCisgKiBhbmQgb3RoZXIgc3RyYW5nZSBJU0EgaGFyZHdhcmUsIHNvIHdlIGFsd2F5cyB3YW50IHRoZQorICogYWRkcmVzc2VzIHRvIGJlIGFsbG9jYXRlZCBpbiB0aGUgMHgwMDAtMHgwZmYgcmVnaW9uCisgKiBtb2R1bG8gMHg0MDAuCisgKgorICogV2h5PyBCZWNhdXNlIHNvbWUgc2lsbHkgZXh0ZXJuYWwgSU8gY2FyZHMgb25seSBkZWNvZGUKKyAqIHRoZSBsb3cgMTAgYml0cyBvZiB0aGUgSU8gYWRkcmVzcy4gVGhlIDB4MDAtMHhmZiByZWdpb24KKyAqIGlzIHJlc2VydmVkIGZvciBtb3RoZXJib2FyZCBkZXZpY2VzIHRoYXQgZGVjb2RlIGFsbCAxNgorICogYml0cywgc28gaXQncyBvayB0byBhbGxvY2F0ZSBhdCwgc2F5LCAweDI4MDAtMHgyOGZmLAorICogYnV0IHdlIHdhbnQgdG8gdHJ5IHRvIGF2b2lkIGFsbG9jYXRpbmcgYXQgMHgyOTAwLTB4MmJmZgorICogd2hpY2ggbWlnaHQgaGF2ZSBiZSBtaXJyb3JlZCBhdCAweDAxMDAtMHgwM2ZmLi4KKyAqLwordm9pZAorcGNpYmlvc19hbGlnbl9yZXNvdXJjZSh2b2lkICpkYXRhLCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBhbGlnbikKK3sKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pIHsKKwkJdW5zaWduZWQgbG9uZyBzdGFydCA9IHJlcy0+c3RhcnQ7CisKKwkJaWYgKHN0YXJ0ICYgMHgzMDApIHsKKwkJCXN0YXJ0ID0gKHN0YXJ0ICsgMHgzZmYpICYgfjB4M2ZmOworCQkJcmVzLT5zdGFydCA9IHN0YXJ0OworCQl9CisJfQorfQorCisKKy8qCisgKiAgSGFuZGxlIHJlc291cmNlcyBvZiBQQ0kgZGV2aWNlcy4gIElmIHRoZSB3b3JsZCB3ZXJlIHBlcmZlY3QsIHdlIGNvdWxkCisgKiAganVzdCBhbGxvY2F0ZSBhbGwgdGhlIHJlc291cmNlIHJlZ2lvbnMgYW5kIGRvIG5vdGhpbmcgbW9yZS4gIEl0IGlzbid0LgorICogIE9uIHRoZSBvdGhlciBoYW5kLCB3ZSBjYW5ub3QganVzdCByZS1hbGxvY2F0ZSBhbGwgZGV2aWNlcywgYXMgaXQgd291bGQKKyAqICByZXF1aXJlIHVzIHRvIGtub3cgbG90cyBvZiBob3N0IGJyaWRnZSBpbnRlcm5hbHMuICBTbyB3ZSBhdHRlbXB0IHRvCisgKiAga2VlcCBhcyBtdWNoIG9mIHRoZSBvcmlnaW5hbCBjb25maWd1cmF0aW9uIGFzIHBvc3NpYmxlLCBidXQgdHdlYWsgaXQKKyAqICB3aGVuIGl0J3MgZm91bmQgdG8gYmUgd3JvbmcuCisgKgorICogIEtub3duIEJJT1MgcHJvYmxlbXMgd2UgaGF2ZSB0byB3b3JrIGFyb3VuZDoKKyAqCS0gSS9PIG9yIG1lbW9yeSByZWdpb25zIG5vdCBjb25maWd1cmVkCisgKgktIHJlZ2lvbnMgY29uZmlndXJlZCwgYnV0IG5vdCBlbmFibGVkIGluIHRoZSBjb21tYW5kIHJlZ2lzdGVyCisgKgktIGJvZ3VzIEkvTyBhZGRyZXNzZXMgYWJvdmUgNjRLIHVzZWQKKyAqCS0gZXhwYW5zaW9uIFJPTXMgbGVmdCBlbmFibGVkICh0aGlzIG1heSBzb3VuZCBoYXJtbGVzcywgYnV0IGdpdmVuCisgKgkgIHRoZSBmYWN0IHRoZSBQQ0kgc3BlY3MgZXhwbGljaXRseSBhbGxvdyBhZGRyZXNzIGRlY29kZXJzIHRvIGJlCisgKgkgIHNoYXJlZCBiZXR3ZWVuIGV4cGFuc2lvbiBST01zIGFuZCBvdGhlciByZXNvdXJjZSByZWdpb25zLCBpdCdzCisgKgkgIGF0IGxlYXN0IGRhbmdlcm91cykKKyAqCisgKiAgT3VyIHNvbHV0aW9uOgorICoJKDEpIEFsbG9jYXRlIHJlc291cmNlcyBmb3IgYWxsIGJ1c2VzIGJlaGluZCBQQ0ktdG8tUENJIGJyaWRnZXMuCisgKgkgICAgVGhpcyBnaXZlcyB1cyBmaXhlZCBiYXJyaWVycyBvbiB3aGVyZSB3ZSBjYW4gYWxsb2NhdGUuCisgKgkoMikgQWxsb2NhdGUgcmVzb3VyY2VzIGZvciBhbGwgZW5hYmxlZCBkZXZpY2VzLiAgSWYgdGhlcmUgaXMKKyAqCSAgICBhIGNvbGxpc2lvbiwganVzdCBtYXJrIHRoZSByZXNvdXJjZSBhcyB1bmFsbG9jYXRlZC4gQWxzbworICoJICAgIGRpc2FibGUgZXhwYW5zaW9uIFJPTXMgZHVyaW5nIHRoaXMgc3RlcC4KKyAqCSgzKSBUcnkgdG8gYWxsb2NhdGUgcmVzb3VyY2VzIGZvciBkaXNhYmxlZCBkZXZpY2VzLiAgSWYgdGhlCisgKgkgICAgcmVzb3VyY2VzIHdlcmUgYXNzaWduZWQgY29ycmVjdGx5LCBldmVyeXRoaW5nIGdvZXMgd2VsbCwKKyAqCSAgICBpZiB0aGV5IHdlcmVuJ3QsIHRoZXkgd29uJ3QgZGlzdHVyYiBhbGxvY2F0aW9uIG9mIG90aGVyCisgKgkgICAgcmVzb3VyY2VzLgorICoJKDQpIEFzc2lnbiBuZXcgYWRkcmVzc2VzIHRvIHJlc291cmNlcyB3aGljaCB3ZXJlIGVpdGhlcgorICoJICAgIG5vdCBjb25maWd1cmVkIGF0IGFsbCBvciBtaXNjb25maWd1cmVkLiAgSWYgZXhwbGljaXRseQorICoJICAgIHJlcXVlc3RlZCBieSB0aGUgdXNlciwgY29uZmlndXJlIGV4cGFuc2lvbiBST00gYWRkcmVzcworICoJICAgIGFzIHdlbGwuCisgKi8KKworc3RhdGljIHZvaWQgX19pbml0IHBjaWJpb3NfYWxsb2NhdGVfYnVzX3Jlc291cmNlcyhzdHJ1Y3QgbGlzdF9oZWFkICpidXNfbGlzdCkKK3sKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzOworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisJaW50IGlkeDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnIsICpwcjsKKworCS8qIERlcHRoLUZpcnN0IFNlYXJjaCBvbiBidXMgdHJlZSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoYnVzLCBidXNfbGlzdCwgbm9kZSkgeworCQlpZiAoKGRldiA9IGJ1cy0+c2VsZikpIHsKKwkJCWZvciAoaWR4ID0gUENJX0JSSURHRV9SRVNPVVJDRVM7IGlkeCA8IFBDSV9OVU1fUkVTT1VSQ0VTOyBpZHgrKykgeworCQkJCXIgPSAmZGV2LT5yZXNvdXJjZVtpZHhdOworCQkJCWlmICghci0+c3RhcnQpCisJCQkJCWNvbnRpbnVlOworCQkJCXByID0gcGNpX2ZpbmRfcGFyZW50X3Jlc291cmNlKGRldiwgcik7CisJCQkJaWYgKCFwciB8fCByZXF1ZXN0X3Jlc291cmNlKHByLCByKSA8IDApCisJCQkJCXByaW50ayhLRVJOX0VSUiAiUENJOiBDYW5ub3QgYWxsb2NhdGUgcmVzb3VyY2UgcmVnaW9uICVkIG9mIGJyaWRnZSAlc1xuIiwgaWR4LCBwY2lfbmFtZShkZXYpKTsKKwkJCX0KKwkJfQorCQlwY2liaW9zX2FsbG9jYXRlX2J1c19yZXNvdXJjZXMoJmJ1cy0+Y2hpbGRyZW4pOworCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0IHBjaWJpb3NfYWxsb2NhdGVfcmVzb3VyY2VzKGludCBwYXNzKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOworCWludCBpZHgsIGRpc2FibGVkOworCXUxNiBjb21tYW5kOworCXN0cnVjdCByZXNvdXJjZSAqciwgKnByOworCisJZm9yX2VhY2hfcGNpX2RldihkZXYpIHsKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJmNvbW1hbmQpOworCQlmb3IoaWR4ID0gMDsgaWR4IDwgNjsgaWR4KyspIHsKKwkJCXIgPSAmZGV2LT5yZXNvdXJjZVtpZHhdOworCQkJaWYgKHItPnBhcmVudCkJCS8qIEFscmVhZHkgYWxsb2NhdGVkICovCisJCQkJY29udGludWU7CisJCQlpZiAoIXItPnN0YXJ0KQkJLyogQWRkcmVzcyBub3QgYXNzaWduZWQgYXQgYWxsICovCisJCQkJY29udGludWU7CisJCQlpZiAoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQorCQkJCWRpc2FibGVkID0gIShjb21tYW5kICYgUENJX0NPTU1BTkRfSU8pOworCQkJZWxzZQorCQkJCWRpc2FibGVkID0gIShjb21tYW5kICYgUENJX0NPTU1BTkRfTUVNT1JZKTsKKwkJCWlmIChwYXNzID09IGRpc2FibGVkKSB7CisJCQkJREJHKCJQQ0k6IFJlc291cmNlICUwOGx4LSUwOGx4IChmPSVseCwgZD0lZCwgcD0lZClcbiIsCisJCQkJICAgIHItPnN0YXJ0LCByLT5lbmQsIHItPmZsYWdzLCBkaXNhYmxlZCwgcGFzcyk7CisJCQkJcHIgPSBwY2lfZmluZF9wYXJlbnRfcmVzb3VyY2UoZGV2LCByKTsKKwkJCQlpZiAoIXByIHx8IHJlcXVlc3RfcmVzb3VyY2UocHIsIHIpIDwgMCkgeworCQkJCQlwcmludGsoS0VSTl9FUlIgIlBDSTogQ2Fubm90IGFsbG9jYXRlIHJlc291cmNlIHJlZ2lvbiAlZCBvZiBkZXZpY2UgJXNcbiIsIGlkeCwgcGNpX25hbWUoZGV2KSk7CisJCQkJCS8qIFdlJ2xsIGFzc2lnbiBhIG5ldyBhZGRyZXNzIGxhdGVyICovCisJCQkJCXItPmVuZCAtPSByLT5zdGFydDsKKwkJCQkJci0+c3RhcnQgPSAwOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoIXBhc3MpIHsKKwkJCXIgPSAmZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXTsKKwkJCWlmIChyLT5mbGFncyAmIElPUkVTT1VSQ0VfUk9NX0VOQUJMRSkgeworCQkJCS8qIFR1cm4gdGhlIFJPTSBvZmYsIGxlYXZlIHRoZSByZXNvdXJjZSByZWdpb24sIGJ1dCBrZWVwIGl0IHVucmVnaXN0ZXJlZC4gKi8KKwkJCQl1MzIgcmVnOworCQkJCURCRygiUENJOiBTd2l0Y2hpbmcgb2ZmIFJPTSBvZiAlc1xuIiwgcGNpX25hbWUoZGV2KSk7CisJCQkJci0+ZmxhZ3MgJj0gfklPUkVTT1VSQ0VfUk9NX0VOQUJMRTsKKwkJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBkZXYtPnJvbV9iYXNlX3JlZywgJnJlZyk7CisJCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIGRldi0+cm9tX2Jhc2VfcmVnLCByZWcgJiB+UENJX1JPTV9BRERSRVNTX0VOQUJMRSk7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHBjaWJpb3NfYXNzaWduX3Jlc291cmNlcyh2b2lkKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOworCWludCBpZHg7CisJc3RydWN0IHJlc291cmNlICpyOworCisJZm9yX2VhY2hfcGNpX2RldihkZXYpIHsKKwkJaW50IGNsYXNzID0gZGV2LT5jbGFzcyA+PiA4OworCisJCS8qIERvbid0IHRvdWNoIGNsYXNzbGVzcyBkZXZpY2VzIGFuZCBob3N0IGJyaWRnZXMgKi8KKwkJaWYgKCFjbGFzcyB8fCBjbGFzcyA9PSBQQ0lfQ0xBU1NfQlJJREdFX0hPU1QpCisJCQljb250aW51ZTsKKworCQlmb3IoaWR4PTA7IGlkeDw2OyBpZHgrKykgeworCQkJciA9ICZkZXYtPnJlc291cmNlW2lkeF07CisKKwkJCS8qCisJCQkgKiAgRG9uJ3QgdG91Y2ggSURFIGNvbnRyb2xsZXJzIGFuZCBJL08gcG9ydHMgb2YgdmlkZW8gY2FyZHMhCisJCQkgKi8KKwkJCWlmICgoY2xhc3MgPT0gUENJX0NMQVNTX1NUT1JBR0VfSURFICYmIGlkeCA8IDQpIHx8CisJCQkgICAgKGNsYXNzID09IFBDSV9DTEFTU19ESVNQTEFZX1ZHQSAmJiAoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSkpCisJCQkJY29udGludWU7CisKKwkJCS8qCisJCQkgKiAgV2Ugc2hhbGwgYXNzaWduIGEgbmV3IGFkZHJlc3MgdG8gdGhpcyByZXNvdXJjZSwgZWl0aGVyIGJlY2F1c2UKKwkJCSAqICB0aGUgQklPUyBmb3Jnb3QgdG8gZG8gc28gb3IgYmVjYXVzZSB3ZSBoYXZlIGRlY2lkZWQgdGhlIG9sZAorCQkJICogIGFkZHJlc3Mgd2FzIHVudXNhYmxlIGZvciBzb21lIHJlYXNvbi4KKwkJCSAqLworCQkJaWYgKCFyLT5zdGFydCAmJiByLT5lbmQpCisJCQkJcGNpX2Fzc2lnbl9yZXNvdXJjZShkZXYsIGlkeCk7CisJCX0KKworCQlpZiAocGNpX3Byb2JlICYgUENJX0FTU0lHTl9ST01TKSB7CisJCQlyID0gJmRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV07CisJCQlyLT5lbmQgLT0gci0+c3RhcnQ7CisJCQlyLT5zdGFydCA9IDA7CisJCQlpZiAoci0+ZW5kKQorCQkJCXBjaV9hc3NpZ25fcmVzb3VyY2UoZGV2LCBQQ0lfUk9NX1JFU09VUkNFKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBfX2luaXQgcGNpYmlvc19yZXNvdXJjZV9zdXJ2ZXkodm9pZCkKK3sKKwlEQkcoIlBDSTogQWxsb2NhdGluZyByZXNvdXJjZXNcbiIpOworCXBjaWJpb3NfYWxsb2NhdGVfYnVzX3Jlc291cmNlcygmcGNpX3Jvb3RfYnVzZXMpOworCXBjaWJpb3NfYWxsb2NhdGVfcmVzb3VyY2VzKDApOworCXBjaWJpb3NfYWxsb2NhdGVfcmVzb3VyY2VzKDEpOworfQorCisvKioKKyAqIGNhbGxlZCBpbiBmc19pbml0Y2FsbCAob25lIGJlbG93IHN1YnN5c19pbml0Y2FsbCksCisgKiBnaXZlIGEgY2hhbmNlIGZvciBtb3RoZXJib2FyZCByZXNlcnZlIHJlc291cmNlcworICovCitmc19pbml0Y2FsbChwY2liaW9zX2Fzc2lnbl9yZXNvdXJjZXMpOworCitpbnQgcGNpYmlvc19lbmFibGVfcmVzb3VyY2VzKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBtYXNrKQoreworCXUxNiBjbWQsIG9sZF9jbWQ7CisJaW50IGlkeDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnI7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCAmY21kKTsKKwlvbGRfY21kID0gY21kOworCWZvcihpZHg9MDsgaWR4PDY7IGlkeCsrKSB7CisJCS8qIE9ubHkgc2V0IHVwIHRoZSByZXF1ZXN0ZWQgc3R1ZmYgKi8KKwkJaWYgKCEobWFzayAmICgxPDxpZHgpKSkKKwkJCWNvbnRpbnVlOworCisJCXIgPSAmZGV2LT5yZXNvdXJjZVtpZHhdOworCQlpZiAoIXItPnN0YXJ0ICYmIHItPmVuZCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IERldmljZSAlcyBub3QgYXZhaWxhYmxlIGJlY2F1c2Ugb2YgcmVzb3VyY2UgY29sbGlzaW9uc1xuIiwgcGNpX25hbWUoZGV2KSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQorCQkJY21kIHw9IFBDSV9DT01NQU5EX0lPOworCQlpZiAoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkKKwkJCWNtZCB8PSBQQ0lfQ09NTUFORF9NRU1PUlk7CisJfQorCWlmIChkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdLnN0YXJ0KQorCQljbWQgfD0gUENJX0NPTU1BTkRfTUVNT1JZOworCWlmIChjbWQgIT0gb2xkX2NtZCkgeworCQlwcmludGsoIlBDSTogRW5hYmxpbmcgZGV2aWNlICVzICglMDR4IC0+ICUwNHgpXG4iLCBwY2lfbmFtZShkZXYpLCBvbGRfY21kLCBjbWQpOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgY21kKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgSWYgd2Ugc2V0IHVwIGEgZGV2aWNlIGZvciBidXMgbWFzdGVyaW5nLCB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBsYXRlbmN5CisgKiAgdGltZXIgYXMgY2VydGFpbiBjcmFwcHkgQklPU2VzIGZvcmdldCB0byBzZXQgaXQgcHJvcGVybHkuCisgKi8KK3Vuc2lnbmVkIGludCBwY2liaW9zX21heF9sYXRlbmN5ID0gMjU1OworCit2b2lkIHBjaWJpb3Nfc2V0X21hc3RlcihzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXU4IGxhdDsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAmbGF0KTsKKwlpZiAobGF0IDwgMTYpCisJCWxhdCA9ICg2NCA8PSBwY2liaW9zX21heF9sYXRlbmN5KSA/IDY0IDogcGNpYmlvc19tYXhfbGF0ZW5jeTsKKwllbHNlIGlmIChsYXQgPiBwY2liaW9zX21heF9sYXRlbmN5KQorCQlsYXQgPSBwY2liaW9zX21heF9sYXRlbmN5OworCWVsc2UKKwkJcmV0dXJuOworCXByaW50ayhLRVJOX0RFQlVHICJQQ0k6IFNldHRpbmcgbGF0ZW5jeSB0aW1lciBvZiBkZXZpY2UgJXMgdG8gJWRcbiIsIHBjaV9uYW1lKGRldiksIGxhdCk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0xBVEVOQ1lfVElNRVIsIGxhdCk7Cit9CisKK2ludCBwY2lfbW1hcF9wYWdlX3JhbmdlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJZW51bSBwY2lfbW1hcF9zdGF0ZSBtbWFwX3N0YXRlLCBpbnQgd3JpdGVfY29tYmluZSkKK3sKKwl1bnNpZ25lZCBsb25nIHByb3Q7CisKKwkvKiBJL08gc3BhY2UgY2Fubm90IGJlIGFjY2Vzc2VkIHZpYSBub3JtYWwgcHJvY2Vzc29yIGxvYWRzIGFuZAorCSAqIHN0b3JlcyBvbiB0aGlzIHBsYXRmb3JtLgorCSAqLworCWlmIChtbWFwX3N0YXRlID09IHBjaV9tbWFwX2lvKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIExlYXZlIHZtX3Bnb2ZmIGFzLWlzLCB0aGUgUENJIHNwYWNlIGFkZHJlc3MgaXMgdGhlIHBoeXNpY2FsCisJICogYWRkcmVzcyBvbiB0aGlzIHBsYXRmb3JtLgorCSAqLworCXZtYS0+dm1fZmxhZ3MgfD0gKFZNX1NITSB8IFZNX0xPQ0tFRCB8IFZNX0lPKTsKKworCXByb3QgPSBwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KTsKKwlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPiAzKQorCQlwcm90IHw9IF9QQUdFX1BDRCB8IF9QQUdFX1BXVDsKKwl2bWEtPnZtX3BhZ2VfcHJvdCA9IF9fcGdwcm90KHByb3QpOworCisJLyogV3JpdGUtY29tYmluZSBzZXR0aW5nIGlzIGlnbm9yZWQsIGl0IGlzIGNoYW5nZWQgdmlhIHRoZSBtdHJyCisJICogaW50ZXJmYWNlcyBvbiB0aGlzIHBsYXRmb3JtLgorCSAqLworCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX3Bnb2ZmLAorCQkJICAgICB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsCisJCQkgICAgIHZtYS0+dm1fcGFnZV9wcm90KSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9wY2kvaXJxLmMgYi9hcmNoL2kzODYvcGNpL2lycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMjg0NTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvcGNpL2lycS5jCkBAIC0wLDAgKzEsMTExOSBAQAorLyoKKyAqCUxvdy1MZXZlbCBQQ0kgU3VwcG9ydCBmb3IgUEMgLS0gUm91dGluZyBvZiBJbnRlcnJ1cHRzCisgKgorICoJKGMpIDE5OTktLTIwMDAgTWFydGluIE1hcmVzIDxtakB1Y3cuY3o+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc21wLmg+CisjaW5jbHVkZSA8YXNtL2lvX2FwaWMuaD4KKyNpbmNsdWRlIDxhc20vaHdfaXJxLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorCisjaW5jbHVkZSAicGNpLmgiCisKKyNkZWZpbmUgUElSUV9TSUdOQVRVUkUJKCgnJCcgPDwgMCkgKyAoJ1AnIDw8IDgpICsgKCdJJyA8PCAxNikgKyAoJ1InIDw8IDI0KSkKKyNkZWZpbmUgUElSUV9WRVJTSU9OIDB4MDEwMAorCitzdGF0aWMgaW50IGJyb2tlbl9ocF9iaW9zX2lycTk7CitzdGF0aWMgaW50IGFjZXJfdG0zNjBfaXJxcm91dGluZzsKKworc3RhdGljIHN0cnVjdCBpcnFfcm91dGluZ190YWJsZSAqcGlycV90YWJsZTsKKworc3RhdGljIGludCBwaXJxX2VuYWJsZV9pcnEoc3RydWN0IHBjaV9kZXYgKmRldik7CisKKy8qCisgKiBOZXZlciB1c2U6IDAsIDEsIDIgKHRpbWVyLCBrZXlib2FyZCwgYW5kIGNhc2NhZGUpCisgKiBBdm9pZCB1c2luZzogMTMsIDE0IGFuZCAxNSAoRlAgZXJyb3IgYW5kIElERSkuCisgKiBQZW5hbGl6ZTogMywgNCwgNiwgNywgMTIgKGtub3duIElTQSB1c2VzOiBzZXJpYWwsIGZsb3BweSwgcGFyYWxsZWwgYW5kIG1vdXNlKQorICovCit1bnNpZ25lZCBpbnQgcGNpYmlvc19pcnFfbWFzayA9IDB4ZmZmODsKKworc3RhdGljIGludCBwaXJxX3BlbmFsdHlbMTZdID0geworCTEwMDAwMDAsIDEwMDAwMDAsIDEwMDAwMDAsIDEwMDAsIDEwMDAsIDAsIDEwMDAsIDEwMDAsCisJMCwgMCwgMCwgMCwgMTAwMCwgMTAwMDAwLCAxMDAwMDAsIDEwMDAwMAorfTsKKworc3RydWN0IGlycV9yb3V0ZXIgeworCWNoYXIgKm5hbWU7CisJdTE2IHZlbmRvciwgZGV2aWNlOworCWludCAoKmdldCkoc3RydWN0IHBjaV9kZXYgKnJvdXRlciwgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHBpcnEpOworCWludCAoKnNldCkoc3RydWN0IHBjaV9kZXYgKnJvdXRlciwgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHBpcnEsIGludCBuZXcpOworfTsKKworc3RydWN0IGlycV9yb3V0ZXJfaGFuZGxlciB7CisJdTE2IHZlbmRvcjsKKwlpbnQgKCpwcm9iZSkoc3RydWN0IGlycV9yb3V0ZXIgKnIsIHN0cnVjdCBwY2lfZGV2ICpyb3V0ZXIsIHUxNiBkZXZpY2UpOworfTsKKworaW50ICgqcGNpYmlvc19lbmFibGVfaXJxKShzdHJ1Y3QgcGNpX2RldiAqZGV2KSA9IE5VTEw7CisKKy8qCisgKiAgU2VhcmNoIDB4ZjAwMDAgLS0gMHhmZmZmZiBmb3IgdGhlIFBDSSBJUlEgUm91dGluZyBUYWJsZS4KKyAqLworCitzdGF0aWMgc3RydWN0IGlycV9yb3V0aW5nX3RhYmxlICogX19pbml0IHBpcnFfZmluZF9yb3V0aW5nX3RhYmxlKHZvaWQpCit7CisJdTggKmFkZHI7CisJc3RydWN0IGlycV9yb3V0aW5nX3RhYmxlICpydDsKKwlpbnQgaTsKKwl1OCBzdW07CisKKwlmb3IoYWRkciA9ICh1OCAqKSBfX3ZhKDB4ZjAwMDApOyBhZGRyIDwgKHU4ICopIF9fdmEoMHgxMDAwMDApOyBhZGRyICs9IDE2KSB7CisJCXJ0ID0gKHN0cnVjdCBpcnFfcm91dGluZ190YWJsZSAqKSBhZGRyOworCQlpZiAocnQtPnNpZ25hdHVyZSAhPSBQSVJRX1NJR05BVFVSRSB8fAorCQkgICAgcnQtPnZlcnNpb24gIT0gUElSUV9WRVJTSU9OIHx8CisJCSAgICBydC0+c2l6ZSAlIDE2IHx8CisJCSAgICBydC0+c2l6ZSA8IHNpemVvZihzdHJ1Y3QgaXJxX3JvdXRpbmdfdGFibGUpKQorCQkJY29udGludWU7CisJCXN1bSA9IDA7CisJCWZvcihpPTA7IGk8cnQtPnNpemU7IGkrKykKKwkJCXN1bSArPSBhZGRyW2ldOworCQlpZiAoIXN1bSkgeworCQkJREJHKCJQQ0k6IEludGVycnVwdCBSb3V0aW5nIFRhYmxlIGZvdW5kIGF0IDB4JXBcbiIsIHJ0KTsKKwkJCXJldHVybiBydDsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqICBJZiB3ZSBoYXZlIGEgSVJRIHJvdXRpbmcgdGFibGUsIHVzZSBpdCB0byBzZWFyY2ggZm9yIHBlZXIgaG9zdAorICogIGJyaWRnZXMuICBJdCdzIGEgZ3Jvc3MgaGFjaywgYnV0IHNpbmNlIHRoZXJlIGFyZSBubyBvdGhlciBrbm93bgorICogIHdheXMgaG93IHRvIGdldCBhIGxpc3Qgb2YgYnVzZXMsIHdlIGhhdmUgdG8gZ28gdGhpcyB3YXkuCisgKi8KKworc3RhdGljIHZvaWQgX19pbml0IHBpcnFfcGVlcl90cmljayh2b2lkKQoreworCXN0cnVjdCBpcnFfcm91dGluZ190YWJsZSAqcnQgPSBwaXJxX3RhYmxlOworCXU4IGJ1c21hcFsyNTZdOworCWludCBpOworCXN0cnVjdCBpcnFfaW5mbyAqZTsKKworCW1lbXNldChidXNtYXAsIDAsIHNpemVvZihidXNtYXApKTsKKwlmb3IoaT0wOyBpIDwgKHJ0LT5zaXplIC0gc2l6ZW9mKHN0cnVjdCBpcnFfcm91dGluZ190YWJsZSkpIC8gc2l6ZW9mKHN0cnVjdCBpcnFfaW5mbyk7IGkrKykgeworCQllID0gJnJ0LT5zbG90c1tpXTsKKyNpZmRlZiBERUJVRworCQl7CisJCQlpbnQgajsKKwkJCURCRygiJTAyeDolMDJ4IHNsb3Q9JTAyeCIsIGUtPmJ1cywgZS0+ZGV2Zm4vOCwgZS0+c2xvdCk7CisJCQlmb3Ioaj0wOyBqPDQ7IGorKykKKwkJCQlEQkcoIiAlZDolMDJ4LyUwNHgiLCBqLCBlLT5pcnFbal0ubGluaywgZS0+aXJxW2pdLmJpdG1hcCk7CisJCQlEQkcoIlxuIik7CisJCX0KKyNlbmRpZgorCQlidXNtYXBbZS0+YnVzXSA9IDE7CisJfQorCWZvcihpID0gMTsgaSA8IDI1NjsgaSsrKSB7CisJCWlmICghYnVzbWFwW2ldIHx8IHBjaV9maW5kX2J1cygwLCBpKSkKKwkJCWNvbnRpbnVlOworCQlpZiAocGNpX3NjYW5fYnVzKGksICZwY2lfcm9vdF9vcHMsIE5VTEwpKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBEaXNjb3ZlcmVkIHByaW1hcnkgcGVlciBidXMgJTAyeCBbSVJRXVxuIiwgaSk7CisJfQorCXBjaWJpb3NfbGFzdF9idXMgPSAtMTsKK30KKworLyoKKyAqICBDb2RlIGZvciBxdWVyeWluZyBhbmQgc2V0dGluZyBvZiBJUlEgcm91dGVzIG9uIHZhcmlvdXMgaW50ZXJydXB0IHJvdXRlcnMuCisgKi8KKwordm9pZCBlaXNhX3NldF9sZXZlbF9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBjaGFyIG1hc2sgPSAxIDw8IChpcnEgJiA3KTsKKwl1bnNpZ25lZCBpbnQgcG9ydCA9IDB4NGQwICsgKGlycSA+PiAzKTsKKwl1bnNpZ25lZCBjaGFyIHZhbDsKKwlzdGF0aWMgdTE2IGVpc2FfaXJxX21hc2s7CisKKwlpZiAoaXJxID49IDE2IHx8ICgxIDw8IGlycSkgJiBlaXNhX2lycV9tYXNrKQorCQlyZXR1cm47CisKKwllaXNhX2lycV9tYXNrIHw9ICgxIDw8IGlycSk7CisJcHJpbnRrKCJQQ0k6IHNldHRpbmcgSVJRICV1IGFzIGxldmVsLXRyaWdnZXJlZFxuIiwgaXJxKTsKKwl2YWwgPSBpbmIocG9ydCk7CisJaWYgKCEodmFsICYgbWFzaykpIHsKKwkJREJHKCIgLT4gZWRnZSIpOworCQlvdXRiKHZhbCB8IG1hc2ssIHBvcnQpOworCX0KK30KKworLyoKKyAqIENvbW1vbiBJUlEgcm91dGluZyBwcmFjdGljZTogbnliYmxlcyBpbiBjb25maWcgc3BhY2UsCisgKiBvZmZzZXQgYnkgc29tZSBtYWdpYyBjb25zdGFudC4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCByZWFkX2NvbmZpZ19ueWJibGUoc3RydWN0IHBjaV9kZXYgKnJvdXRlciwgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBucikKK3sKKwl1OCB4OworCXVuc2lnbmVkIHJlZyA9IG9mZnNldCArIChuciA+PiAxKTsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHJvdXRlciwgcmVnLCAmeCk7CisJcmV0dXJuIChuciAmIDEpID8gKHggPj4gNCkgOiAoeCAmIDB4Zik7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX2NvbmZpZ19ueWJibGUoc3RydWN0IHBjaV9kZXYgKnJvdXRlciwgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBuciwgdW5zaWduZWQgaW50IHZhbCkKK3sKKwl1OCB4OworCXVuc2lnbmVkIHJlZyA9IG9mZnNldCArIChuciA+PiAxKTsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHJvdXRlciwgcmVnLCAmeCk7CisJeCA9IChuciAmIDEpID8gKCh4ICYgMHgwZikgfCAodmFsIDw8IDQpKSA6ICgoeCAmIDB4ZjApIHwgdmFsKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocm91dGVyLCByZWcsIHgpOworfQorCisvKgorICogQUxJIHBpcnEgZW50cmllcyBhcmUgZGFtbiB1Z2x5LCBhbmQgY29tcGxldGVseSB1bmRvY3VtZW50ZWQuCisgKiBUaGlzIGhhcyBiZWVuIGZpZ3VyZWQgb3V0IGZyb20gcGlycSB0YWJsZXMsIGFuZCBpdCdzIG5vdCBhIHByZXR0eQorICogcGljdHVyZS4KKyAqLworc3RhdGljIGludCBwaXJxX2FsaV9nZXQoc3RydWN0IHBjaV9kZXYgKnJvdXRlciwgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHBpcnEpCit7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgaXJxbWFwWzE2XSA9IHsgMCwgOSwgMywgMTAsIDQsIDUsIDcsIDYsIDEsIDExLCAwLCAxMiwgMCwgMTQsIDAsIDE1IH07CisKKwlyZXR1cm4gaXJxbWFwW3JlYWRfY29uZmlnX255YmJsZShyb3V0ZXIsIDB4NDgsIHBpcnEtMSldOworfQorCitzdGF0aWMgaW50IHBpcnFfYWxpX3NldChzdHJ1Y3QgcGNpX2RldiAqcm91dGVyLCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcGlycSwgaW50IGlycSkKK3sKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBpcnFtYXBbMTZdID0geyAwLCA4LCAwLCAyLCA0LCA1LCA3LCA2LCAwLCAxLCAzLCA5LCAxMSwgMCwgMTMsIDE1IH07CisJdW5zaWduZWQgaW50IHZhbCA9IGlycW1hcFtpcnFdOworCQkKKwlpZiAodmFsKSB7CisJCXdyaXRlX2NvbmZpZ19ueWJibGUocm91dGVyLCAweDQ4LCBwaXJxLTEsIHZhbCk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoZSBJbnRlbCBQSUlYNCBwaXJxIHJ1bGVzIGFyZSBmYWlybHkgc2ltcGxlOiAicGlycSIgaXMKKyAqIGp1c3QgYSBwb2ludGVyIHRvIHRoZSBjb25maWcgc3BhY2UuCisgKi8KK3N0YXRpYyBpbnQgcGlycV9waWl4X2dldChzdHJ1Y3QgcGNpX2RldiAqcm91dGVyLCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcGlycSkKK3sKKwl1OCB4OworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocm91dGVyLCBwaXJxLCAmeCk7CisJcmV0dXJuICh4IDwgMTYpID8geCA6IDA7Cit9CisKK3N0YXRpYyBpbnQgcGlycV9waWl4X3NldChzdHJ1Y3QgcGNpX2RldiAqcm91dGVyLCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcGlycSwgaW50IGlycSkKK3sKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocm91dGVyLCBwaXJxLCBpcnEpOworCXJldHVybiAxOworfQorCisvKgorICogVGhlIFZJQSBwaXJxIHJ1bGVzIGFyZSBuaWJibGUtYmFzZWQsIGxpa2UgQUxJLAorICogYnV0IHdpdGhvdXQgdGhlIHVnbHkgaXJxIG51bWJlciBtdW5naW5nLgorICogSG93ZXZlciwgUElSUUQgaXMgaW4gdGhlIHVwcGVyIGluc3RlYWQgb2YgbG93ZXIgNCBiaXRzLgorICovCitzdGF0aWMgaW50IHBpcnFfdmlhX2dldChzdHJ1Y3QgcGNpX2RldiAqcm91dGVyLCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcGlycSkKK3sKKwlyZXR1cm4gcmVhZF9jb25maWdfbnliYmxlKHJvdXRlciwgMHg1NSwgcGlycSA9PSA0ID8gNSA6IHBpcnEpOworfQorCitzdGF0aWMgaW50IHBpcnFfdmlhX3NldChzdHJ1Y3QgcGNpX2RldiAqcm91dGVyLCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcGlycSwgaW50IGlycSkKK3sKKwl3cml0ZV9jb25maWdfbnliYmxlKHJvdXRlciwgMHg1NSwgcGlycSA9PSA0ID8gNSA6IHBpcnEsIGlycSk7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBJVEUgODMzMEcgcGlycSBydWxlcyBhcmUgbmliYmxlLWJhc2VkCisgKiBGSVhNRTogcGlycW1hcCBtYXkgYmUgeyAxLCAwLCAzLCAyIH0sCisgKiAJICAyKzMgYXJlIGJvdGggbWFwcGVkIHRvIGlycSA5IG9uIG15IHN5c3RlbQorICovCitzdGF0aWMgaW50IHBpcnFfaXRlX2dldChzdHJ1Y3QgcGNpX2RldiAqcm91dGVyLCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcGlycSkKK3sKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBwaXJxbWFwWzRdID0geyAxLCAwLCAyLCAzIH07CisJcmV0dXJuIHJlYWRfY29uZmlnX255YmJsZShyb3V0ZXIsMHg0MywgcGlycW1hcFtwaXJxLTFdKTsKK30KKworc3RhdGljIGludCBwaXJxX2l0ZV9zZXQoc3RydWN0IHBjaV9kZXYgKnJvdXRlciwgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHBpcnEsIGludCBpcnEpCit7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgcGlycW1hcFs0XSA9IHsgMSwgMCwgMiwgMyB9OworCXdyaXRlX2NvbmZpZ19ueWJibGUocm91dGVyLCAweDQzLCBwaXJxbWFwW3BpcnEtMV0sIGlycSk7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBPUFRJOiBoaWdoIGZvdXIgYml0cyBhcmUgbmliYmxlIHBvaW50ZXIuLgorICogSSB3b25kZXIgd2hhdCB0aGUgbG93IGJpdHMgZG8/CisgKi8KK3N0YXRpYyBpbnQgcGlycV9vcHRpX2dldChzdHJ1Y3QgcGNpX2RldiAqcm91dGVyLCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcGlycSkKK3sKKwlyZXR1cm4gcmVhZF9jb25maWdfbnliYmxlKHJvdXRlciwgMHhiOCwgcGlycSA+PiA0KTsKK30KKworc3RhdGljIGludCBwaXJxX29wdGlfc2V0KHN0cnVjdCBwY2lfZGV2ICpyb3V0ZXIsIHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBwaXJxLCBpbnQgaXJxKQoreworCXdyaXRlX2NvbmZpZ19ueWJibGUocm91dGVyLCAweGI4LCBwaXJxID4+IDQsIGlycSk7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBDeXJpeDogbmliYmxlIG9mZnNldCAweDVDCisgKiAweDVDIGJpdHMgNzo0IGlzIElOVEIgYml0cyAzOjAgaXMgSU5UQSAKKyAqIDB4NUQgYml0cyA3OjQgaXMgSU5URCBiaXRzIDM6MCBpcyBJTlRDCisgKi8KK3N0YXRpYyBpbnQgcGlycV9jeXJpeF9nZXQoc3RydWN0IHBjaV9kZXYgKnJvdXRlciwgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHBpcnEpCit7CisJcmV0dXJuIHJlYWRfY29uZmlnX255YmJsZShyb3V0ZXIsIDB4NUMsIChwaXJxLTEpXjEpOworfQorCitzdGF0aWMgaW50IHBpcnFfY3lyaXhfc2V0KHN0cnVjdCBwY2lfZGV2ICpyb3V0ZXIsIHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBwaXJxLCBpbnQgaXJxKQoreworCXdyaXRlX2NvbmZpZ19ueWJibGUocm91dGVyLCAweDVDLCAocGlycS0xKV4xLCBpcnEpOworCXJldHVybiAxOworfQorCisvKgorICoJUElSUSByb3V0aW5nIGZvciBTaVMgODVDNTAzIHJvdXRlciB1c2VkIGluIHNldmVyYWwgU2lTIGNoaXBzZXRzLgorICoJV2UgaGF2ZSB0byBkZWFsIHdpdGggdGhlIGZvbGxvd2luZyBpc3N1ZXMgaGVyZToKKyAqCS0gdmVuZG9ycyBoYXZlIGRpZmZlcmVudCBpZGVhcyBhYm91dCB0aGUgbWVhbmluZyBvZiBsaW5rIHZhbHVlcworICoJLSBzb21lIG9uYm9hcmQgZGV2aWNlcyAoaW50ZWdyYXRlZCBpbiB0aGUgY2hpcHNldCkgaGF2ZSBzcGVjaWFsCisgKgkgIGxpbmtzIGFuZCBhcmUgdGh1cyByb3V0ZWQgZGlmZmVyZW50bHkgKGkuZS4gbm90IHZpYSBQQ0kgSU5UQS1JTlREKQorICoJLSBkaWZmZXJlbnQgcmV2aXNpb24gb2YgdGhlIHJvdXRlciBoYXZlIGEgZGlmZmVyZW50IGxheW91dCBmb3IKKyAqCSAgdGhlIHJvdXRpbmcgcmVnaXN0ZXJzLCBwYXJ0aWN1bGFybHkgZm9yIHRoZSBvbmNoaXAgZGV2aWNlcworICoKKyAqCUZvciBhbGwgcm91dGluZyByZWdpc3RlcnMgdGhlIGNvbW1vbiB0aGluZyBpcyB3ZSBoYXZlIG9uZSBieXRlCisgKglwZXIgcm91dGVhYmxlIGxpbmsgd2hpY2ggaXMgZGVmaW5lZCBhczoKKyAqCQkgYml0IDcgICAgICBJUlEgbWFwcGluZyBlbmFibGVkICgwKSBvciBkaXNhYmxlZCAoMSkKKyAqCQkgYml0cyBbNjo0XSByZXNlcnZlZCAoc29tZXRpbWVzIHVzZWQgZm9yIG9uY2hpcCBkZXZpY2VzKQorICoJCSBiaXRzIFszOjBdIElSUSB0byBtYXAgdG8KKyAqCQkgICAgIGFsbG93ZWQ6IDMtNywgOS0xMiwgMTQtMTUKKyAqCQkgICAgIHJlc2VydmVkOiAwLCAxLCAyLCA4LCAxMworICoKKyAqCVRoZSBjb25maWctc3BhY2UgcmVnaXN0ZXJzIGxvY2F0ZWQgYXQgMHg0MS8weDQyLzB4NDMvMHg0NCBhcmUKKyAqCWFsd2F5cyB1c2VkIHRvIHJvdXRlIHRoZSBub3JtYWwgUENJIElOVCBBL0IvQy9EIHJlc3BlY3RpdmVseS4KKyAqCUFwcGFyZW50bHkgdGhlcmUgYXJlIHN5c3RlbXMgaW1wbGVtZW50aW5nIFBDSSByb3V0aW5nIHRhYmxlIHVzaW5nCisgKglsaW5rIHZhbHVlcyAweDAxLTB4MDQgYW5kIG90aGVycyB1c2luZyAweDQxLTB4NDQgZm9yIFBDSSBJTlRBLi5ELgorICoJV2UgdHJ5IG91ciBiZXN0IHRvIGhhbmRsZSBib3RoIGxpbmsgbWFwcGluZ3MuCisgKgkKKyAqCUN1cnJlbnRseSAoMjAwMy0wNS0yMSkgaXQgYXBwZWFycyBtb3N0IFNpUyBjaGlwc2V0cyBmb2xsb3cgdGhlCisgKglkZWZpbml0aW9uIG9mIHJvdXRpbmcgcmVnaXN0ZXJzIGZyb20gdGhlIFNpUy01NTk1IHNvdXRoYnJpZGdlLgorICoJQWNjb3JkaW5nIHRvIHRoZSBTaVMgNTU5NSBkYXRhc2hlZXRzIHRoZSByZXZpc2lvbiBpZCdzIG9mIHRoZQorICoJcm91dGVyIChJU0EtYnJpZGdlKSBzaG91bGQgYmUgMHgwMSBvciAweGIwLgorICoKKyAqCUZ1cnRoZXJtb3JlIHdlJ3ZlIGFsc28gc2VlbiBsc3BjaSBkdW1wcyB3aXRoIHJldmlzaW9uIDB4MDAgYW5kIDB4YjEuCisgKglMb29rcyBsaWtlIHRoZXNlIGFyZSB1c2VkIGluIGEgbnVtYmVyIG9mIFNpUyA1eHgvNnh4Lzd4eCBjaGlwc2V0cy4KKyAqCVRoZXkgc2VlbSB0byB3b3JrIHdpdGggdGhlIGN1cnJlbnQgcm91dGluZyBjb2RlLiBIb3dldmVyIHRoZXJlIGlzCisgKglzb21lIGNvbmNlcm4gYmVjYXVzZSBvZiB0aGUgdHdvIFVTQi1PSENJIEhDcyAob3JpZ2luYWwgU2lTIDU1OTUKKyAqCWhhZCBvbmx5IG9uZSkuIFlNTVYuCisgKgorICoJT25jaGlwIHJvdXRpbmcgZm9yIHJvdXRlciByZXYtaWQgMHgwMS8weGIwIGFuZCBwcm9iYWJseSAweDAwLzB4YjE6CisgKgorICoJMHg2MToJSURFSVJROgorICoJCWJpdHMgWzY6NV0gbXVzdCBiZSB3cml0dGVuIDAxCisgKgkJYml0IDQgY2hhbm5lbC1zZWxlY3QgcHJpbWFyeSAoMCksIHNlY29uZGFyeSAoMSkKKyAqCisgKgkweDYyOglVU0JJUlE6CisgKgkJYml0IDYgT0hDSSBmdW5jdGlvbiBkaXNhYmxlZCAoMCksIGVuYWJsZWQgKDEpCisgKgkKKyAqCTB4NmE6CUFDUEkvU0NJIElSUTogYml0cyA0LTYgcmVzZXJ2ZWQKKyAqCisgKgkweDdlOglEYXRhIEFjcS4gTW9kdWxlIElSUSAtIGJpdHMgNC02IHJlc2VydmVkCisgKgorICoJV2Ugc3VwcG9ydCBVU0JJUlEgKGluIGFkZGl0aW9uIHRvIElOVEEtSU5URCkgYW5kIGtlZXAgdGhlCisgKglJREUsIEFDUEkgYW5kIERBUSByb3V0aW5nIHVudG91Y2hlZCBhcyBzZXQgYnkgdGhlIEJJT1MuCisgKgorICoJQ3VycmVudGx5IHRoZSBvbmx5IHJlcG9ydGVkIGV4Y2VwdGlvbiBpcyB0aGUgbmV3IFNpUyA2NXggY2hpcHNldAorICoJd2hpY2ggaW5jbHVkZXMgdGhlIFNpUyA2OXggc291dGhicmlkZ2UuIEhlcmUgd2UgaGF2ZSB0aGUgODVDNTAzCisgKglyb3V0ZXIgcmV2aXNpb24gMHgwNCBhbmQgdGhlcmUgYXJlIGNoYW5nZXMgaW4gdGhlIHJlZ2lzdGVyIGxheW91dAorICoJbW9zdGx5IHJlbGF0ZWQgdG8gdGhlIGRpZmZlcmVudCBVU0IgSENzIHdpdGggVVNCIDIuMCBzdXBwb3J0LgorICoKKyAqCU9uY2hpcCByb3V0aW5nIGZvciByb3V0ZXIgcmV2LWlkIDB4MDQgKHRyeS1hbmQtZXJyb3Igb2JzZXJ2YXRpb24pCisgKgorICoJMHg2MC8weDYxLzB4NjIvMHg2MzoJMXhFSENJIGFuZCAzeE9IQ0kgKGNvbXBhbmlvbikgVVNCLUhDcworICoJCQkJYml0IDYtNCBhcmUgcHJvYmFibHkgdW51c2VkLCBub3QgbGlrZSA1NTk1CisgKi8KKworI2RlZmluZSBQSVJRX1NJU19JUlFfTUFTSwkweDBmCisjZGVmaW5lIFBJUlFfU0lTX0lSUV9ESVNBQkxFCTB4ODAKKyNkZWZpbmUgUElSUV9TSVNfVVNCX0VOQUJMRQkweDQwCisKK3N0YXRpYyBpbnQgcGlycV9zaXNfZ2V0KHN0cnVjdCBwY2lfZGV2ICpyb3V0ZXIsIHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBwaXJxKQoreworCXU4IHg7CisJaW50IHJlZzsKKworCXJlZyA9IHBpcnE7CisJaWYgKHJlZyA+PSAweDAxICYmIHJlZyA8PSAweDA0KQorCQlyZWcgKz0gMHg0MDsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShyb3V0ZXIsIHJlZywgJngpOworCXJldHVybiAoeCAmIFBJUlFfU0lTX0lSUV9ESVNBQkxFKSA/IDAgOiAoeCAmIFBJUlFfU0lTX0lSUV9NQVNLKTsKK30KKworc3RhdGljIGludCBwaXJxX3Npc19zZXQoc3RydWN0IHBjaV9kZXYgKnJvdXRlciwgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHBpcnEsIGludCBpcnEpCit7CisJdTggeDsKKwlpbnQgcmVnOworCisJcmVnID0gcGlycTsKKwlpZiAocmVnID49IDB4MDEgJiYgcmVnIDw9IDB4MDQpCisJCXJlZyArPSAweDQwOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHJvdXRlciwgcmVnLCAmeCk7CisJeCAmPSB+KFBJUlFfU0lTX0lSUV9NQVNLIHwgUElSUV9TSVNfSVJRX0RJU0FCTEUpOworCXggfD0gaXJxID8gaXJxOiBQSVJRX1NJU19JUlFfRElTQUJMRTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocm91dGVyLCByZWcsIHgpOworCXJldHVybiAxOworfQorCisKKy8qCisgKiBWTFNJOiBuaWJibGUgb2Zmc2V0IDB4NzQgLSBlZHVjYXRlZCBndWVzcyBkdWUgdG8gcm91dGluZyB0YWJsZSBhbmQKKyAqICAgICAgIGNvbmZpZyBzcGFjZSBvZiBWTFNJIDgyQzUzNCBQQ0ktYnJpZGdlL3JvdXRlciAoMTAwNDowMTAyKQorICogICAgICAgVGVzdGVkIG9uIEhQIE9tbmlCb29rIDgwMCBjb3ZlcmluZyBQSVJRIDEsIDIsIDQsIDggZm9yIG9uYm9hcmQKKyAqICAgICAgIGRldmljZXMsIFBJUlEgMyBmb3Igbm9uLXBjaSghKSBzb3VuZGNoaXAgYW5kICh1bnRlc3RlZCkgUElSUSA2CisgKiAgICAgICBmb3IgdGhlIGJ1c2JyaWRnZSB0byB0aGUgZG9ja2luZyBzdGF0aW9uLgorICovCisKK3N0YXRpYyBpbnQgcGlycV92bHNpX2dldChzdHJ1Y3QgcGNpX2RldiAqcm91dGVyLCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcGlycSkKK3sKKwlpZiAocGlycSA+IDgpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiVkxTSSByb3V0ZXIgcGlycSBlc2NhcGUgKCVkKVxuIiwgcGlycSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gcmVhZF9jb25maWdfbnliYmxlKHJvdXRlciwgMHg3NCwgcGlycS0xKTsKK30KKworc3RhdGljIGludCBwaXJxX3Zsc2lfc2V0KHN0cnVjdCBwY2lfZGV2ICpyb3V0ZXIsIHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBwaXJxLCBpbnQgaXJxKQoreworCWlmIChwaXJxID4gOCkgeworCQlwcmludGsoS0VSTl9JTkZPICJWTFNJIHJvdXRlciBwaXJxIGVzY2FwZSAoJWQpXG4iLCBwaXJxKTsKKwkJcmV0dXJuIDA7CisJfQorCXdyaXRlX2NvbmZpZ19ueWJibGUocm91dGVyLCAweDc0LCBwaXJxLTEsIGlycSk7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBTZXJ2ZXJXb3JrczogUENJIGludGVycnVwdHMgbWFwcGVkIHRvIHN5c3RlbSBJUlEgbGluZXMgdGhyb3VnaCBJbmRleAorICogYW5kIFJlZGlyZWN0IEkvTyByZWdpc3RlcnMgKDB4MGMwMCBhbmQgMHgwYzAxKS4gIFRoZSBJbmRleCByZWdpc3RlcgorICogZm9ybWF0IGlzIChQQ0lJUlEjIyB8IDB4MTApLCBlLmcuOiBQQ0lJUlExMD0weDFhLiAgVGhlIFJlZGlyZWN0CisgKiByZWdpc3RlciBpcyBhIHN0cmFpZ2h0IGJpbmFyeSBjb2Rpbmcgb2YgZGVzaXJlZCBQSUMgSVJRIChsb3cgbmliYmxlKS4KKyAqCisgKiBUaGUgJ2xpbmsnIHZhbHVlIGluIHRoZSBQSVJRIHRhYmxlIGlzIGFscmVhZHkgaW4gdGhlIGNvcnJlY3QgZm9ybWF0CisgKiBmb3IgdGhlIEluZGV4IHJlZ2lzdGVyLiAgVGhlcmUgYXJlIHNvbWUgc3BlY2lhbCBpbmRleCB2YWx1ZXM6CisgKiAweDAwIGZvciBBQ1BJIChTQ0kpLCAweDAxIGZvciBVU0IsIDB4MDIgZm9yIElERTAsIDB4MDQgZm9yIElERTEsCisgKiBhbmQgMHgwMyBmb3IgU01CdXMuCisgKi8KK3N0YXRpYyBpbnQgcGlycV9zZXJ2ZXJ3b3Jrc19nZXQoc3RydWN0IHBjaV9kZXYgKnJvdXRlciwgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHBpcnEpCit7CisJb3V0Yl9wKHBpcnEsIDB4YzAwKTsKKwlyZXR1cm4gaW5iKDB4YzAxKSAmIDB4ZjsKK30KKworc3RhdGljIGludCBwaXJxX3NlcnZlcndvcmtzX3NldChzdHJ1Y3QgcGNpX2RldiAqcm91dGVyLCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcGlycSwgaW50IGlycSkKK3sKKwlvdXRiX3AocGlycSwgMHhjMDApOworCW91dGJfcChpcnEsIDB4YzAxKTsKKwlyZXR1cm4gMTsKK30KKworLyogU3VwcG9ydCBmb3IgQU1ENzU2IFBDSSBJUlEgUm91dGluZworICogSmhvbiBILiBDYWljZWRvIDxqaGNhaWNlZEBvc3NvLm9yZy5jbz4KKyAqIEp1bi8yMS8yMDAxIDAuMi4wIFJlbGVhc2UsIGZpeGVkIHRvIHVzZSAibnliYmxlIiBmdW5jdGlvbnMuLi4gKGpoY2FpY2VkKQorICogSnVuLzE5LzIwMDEgQWxwaGEgUmVsZWFzZSAwLjEuMCAoamhjYWljZWQpCisgKiBUaGUgQU1ENzU2IHBpcnEgcnVsZXMgYXJlIG5pYmJsZS1iYXNlZAorICogb2Zmc2V0IDB4NTYgMC0zIFBJUlFBICA0LTcgIFBJUlFCCisgKiBvZmZzZXQgMHg1NyAwLTMgUElSUUMgIDQtNyAgUElSUUQKKyAqLworc3RhdGljIGludCBwaXJxX2FtZDc1Nl9nZXQoc3RydWN0IHBjaV9kZXYgKnJvdXRlciwgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHBpcnEpCit7CisJdTggaXJxOworCWlycSA9IDA7CisJaWYgKHBpcnEgPD0gNCkKKwl7CisJCWlycSA9IHJlYWRfY29uZmlnX255YmJsZShyb3V0ZXIsIDB4NTYsIHBpcnEgLSAxKTsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiQU1ENzU2OiBkZXYgJTA0eDolMDR4LCByb3V0ZXIgcGlycSA6ICVkIGdldCBpcnEgOiAlMmRcbiIsCisJCWRldi0+dmVuZG9yLCBkZXYtPmRldmljZSwgcGlycSwgaXJxKTsKKwlyZXR1cm4gaXJxOworfQorCitzdGF0aWMgaW50IHBpcnFfYW1kNzU2X3NldChzdHJ1Y3QgcGNpX2RldiAqcm91dGVyLCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcGlycSwgaW50IGlycSkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJBTUQ3NTY6IGRldiAlMDR4OiUwNHgsIHJvdXRlciBwaXJxIDogJWQgU0VUIGlycSA6ICUyZFxuIiwgCisJCWRldi0+dmVuZG9yLCBkZXYtPmRldmljZSwgcGlycSwgaXJxKTsKKwlpZiAocGlycSA8PSA0KQorCXsKKwkJd3JpdGVfY29uZmlnX255YmJsZShyb3V0ZXIsIDB4NTYsIHBpcnEgLSAxLCBpcnEpOworCX0KKwlyZXR1cm4gMTsKK30KKworI2lmZGVmIENPTkZJR19QQ0lfQklPUworCitzdGF0aWMgaW50IHBpcnFfYmlvc19zZXQoc3RydWN0IHBjaV9kZXYgKnJvdXRlciwgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHBpcnEsIGludCBpcnEpCit7CisJc3RydWN0IHBjaV9kZXYgKmJyaWRnZTsKKwlpbnQgcGluID0gcGNpX2dldF9pbnRlcnJ1cHRfcGluKGRldiwgJmJyaWRnZSk7CisJcmV0dXJuIHBjaWJpb3Nfc2V0X2lycV9yb3V0aW5nKGJyaWRnZSwgcGluLCBpcnEpOworfQorCisjZW5kaWYKKworc3RhdGljIF9faW5pdCBpbnQgaW50ZWxfcm91dGVyX3Byb2JlKHN0cnVjdCBpcnFfcm91dGVyICpyLCBzdHJ1Y3QgcGNpX2RldiAqcm91dGVyLCB1MTYgZGV2aWNlKQoreworCXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwaXJxXzQ0MGd4W10gPSB7CisJCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNDQzR1hfMCkgfSwKKwkJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI0NDNHWF8yKSB9LAorCQl7IH0sCisJfTsKKworCS8qIDQ0MEdYIGhhcyBhIHByb3ByaWV0YXJ5IFBJUlEgcm91dGVyIC0tIGRvbid0IHVzZSBpdCAqLworCWlmIChwY2lfZGV2X3ByZXNlbnQocGlycV80NDBneCkpCisJCXJldHVybiAwOworCisJc3dpdGNoKGRldmljZSkKKwl7CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MUZCXzA6CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MVNCXzA6CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MUFCXzA6CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MU1YOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI0NDNNWF8wOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFBQV8wOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFBQl8wOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFCQV8wOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFCQV8xMDoKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQ0FfMDoKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQ0FfMTI6CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMURCXzA6CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUVfMDoKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxRUJfMDoKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0VTQl8xOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNINl8wOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNINl8xOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIN18wOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIN18xOgorCQkJci0+bmFtZSA9ICJQSUlYL0lDSCI7CisJCQlyLT5nZXQgPSBwaXJxX3BpaXhfZ2V0OworCQkJci0+c2V0ID0gcGlycV9waWl4X3NldDsKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5pdCBpbnQgdmlhX3JvdXRlcl9wcm9iZShzdHJ1Y3QgaXJxX3JvdXRlciAqciwgc3RydWN0IHBjaV9kZXYgKnJvdXRlciwgdTE2IGRldmljZSkKK3sKKwkvKiBGSVhNRTogV2Ugc2hvdWxkIG1vdmUgc29tZSBvZiB0aGUgcXVpcmsgZml4dXAgc3R1ZmYgaGVyZSAqLworCXN3aXRjaChkZXZpY2UpCisJeworCQljYXNlIFBDSV9ERVZJQ0VfSURfVklBXzgyQzU4Nl8wOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfVklBXzgyQzU5NjoKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1ZJQV84MkM2ODY6CisJCWNhc2UgUENJX0RFVklDRV9JRF9WSUFfODIzMToKKwkJLyogRklYTUU6IGFkZCBuZXcgb25lcyBmb3IgODIzMy81ICovCisJCQlyLT5uYW1lID0gIlZJQSI7CisJCQlyLT5nZXQgPSBwaXJxX3ZpYV9nZXQ7CisJCQlyLT5zZXQgPSBwaXJxX3ZpYV9zZXQ7CisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2luaXQgaW50IHZsc2lfcm91dGVyX3Byb2JlKHN0cnVjdCBpcnFfcm91dGVyICpyLCBzdHJ1Y3QgcGNpX2RldiAqcm91dGVyLCB1MTYgZGV2aWNlKQoreworCXN3aXRjaChkZXZpY2UpCisJeworCQljYXNlIFBDSV9ERVZJQ0VfSURfVkxTSV84MkM1MzQ6CisJCQlyLT5uYW1lID0gIlZMU0kgODJDNTM0IjsKKwkJCXItPmdldCA9IHBpcnFfdmxzaV9nZXQ7CisJCQlyLT5zZXQgPSBwaXJxX3Zsc2lfc2V0OworCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBfX2luaXQgaW50IHNlcnZlcndvcmtzX3JvdXRlcl9wcm9iZShzdHJ1Y3QgaXJxX3JvdXRlciAqciwgc3RydWN0IHBjaV9kZXYgKnJvdXRlciwgdTE2IGRldmljZSkKK3sKKwlzd2l0Y2goZGV2aWNlKQorCXsKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX09TQjQ6CisJCWNhc2UgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I1OgorCQkJci0+bmFtZSA9ICJTZXJ2ZXJXb3JrcyI7CisJCQlyLT5nZXQgPSBwaXJxX3NlcnZlcndvcmtzX2dldDsKKwkJCXItPnNldCA9IHBpcnFfc2VydmVyd29ya3Nfc2V0OworCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgX19pbml0IGludCBzaXNfcm91dGVyX3Byb2JlKHN0cnVjdCBpcnFfcm91dGVyICpyLCBzdHJ1Y3QgcGNpX2RldiAqcm91dGVyLCB1MTYgZGV2aWNlKQoreworCWlmIChkZXZpY2UgIT0gUENJX0RFVklDRV9JRF9TSV81MDMpCisJCXJldHVybiAwOworCQkKKwlyLT5uYW1lID0gIlNJUyI7CisJci0+Z2V0ID0gcGlycV9zaXNfZ2V0OworCXItPnNldCA9IHBpcnFfc2lzX3NldDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIF9faW5pdCBpbnQgY3lyaXhfcm91dGVyX3Byb2JlKHN0cnVjdCBpcnFfcm91dGVyICpyLCBzdHJ1Y3QgcGNpX2RldiAqcm91dGVyLCB1MTYgZGV2aWNlKQoreworCXN3aXRjaChkZXZpY2UpCisJeworCQljYXNlIFBDSV9ERVZJQ0VfSURfQ1lSSVhfNTUyMDoKKwkJCXItPm5hbWUgPSAiTmF0U2VtaSI7CisJCQlyLT5nZXQgPSBwaXJxX2N5cml4X2dldDsKKwkJCXItPnNldCA9IHBpcnFfY3lyaXhfc2V0OworCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgX19pbml0IGludCBvcHRpX3JvdXRlcl9wcm9iZShzdHJ1Y3QgaXJxX3JvdXRlciAqciwgc3RydWN0IHBjaV9kZXYgKnJvdXRlciwgdTE2IGRldmljZSkKK3sKKwlzd2l0Y2goZGV2aWNlKQorCXsKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX09QVElfODJDNzAwOgorCQkJci0+bmFtZSA9ICJPUFRJIjsKKwkJCXItPmdldCA9IHBpcnFfb3B0aV9nZXQ7CisJCQlyLT5zZXQgPSBwaXJxX29wdGlfc2V0OworCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgX19pbml0IGludCBpdGVfcm91dGVyX3Byb2JlKHN0cnVjdCBpcnFfcm91dGVyICpyLCBzdHJ1Y3QgcGNpX2RldiAqcm91dGVyLCB1MTYgZGV2aWNlKQoreworCXN3aXRjaChkZXZpY2UpCisJeworCQljYXNlIFBDSV9ERVZJQ0VfSURfSVRFX0lUODMzMEdfMDoKKwkJCXItPm5hbWUgPSAiSVRFIjsKKwkJCXItPmdldCA9IHBpcnFfaXRlX2dldDsKKwkJCXItPnNldCA9IHBpcnFfaXRlX3NldDsKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5pdCBpbnQgYWxpX3JvdXRlcl9wcm9iZShzdHJ1Y3QgaXJxX3JvdXRlciAqciwgc3RydWN0IHBjaV9kZXYgKnJvdXRlciwgdTE2IGRldmljZSkKK3sKKwlzd2l0Y2goZGV2aWNlKQorCXsKKwljYXNlIFBDSV9ERVZJQ0VfSURfQUxfTTE1MzM6CisJY2FzZSBQQ0lfREVWSUNFX0lEX0FMX00xNTYzOgorCQlwcmludGsoIlBDSTogVXNpbmcgQUxJIElSUSBSb3V0ZXJcbiIpOworCQkJci0+bmFtZSA9ICJBTEkiOworCQkJci0+Z2V0ID0gcGlycV9hbGlfZ2V0OworCQkJci0+c2V0ID0gcGlycV9hbGlfc2V0OworCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgX19pbml0IGludCBhbWRfcm91dGVyX3Byb2JlKHN0cnVjdCBpcnFfcm91dGVyICpyLCBzdHJ1Y3QgcGNpX2RldiAqcm91dGVyLCB1MTYgZGV2aWNlKQoreworCXN3aXRjaChkZXZpY2UpCisJeworCQljYXNlIFBDSV9ERVZJQ0VfSURfQU1EX1ZJUEVSXzc0MEI6CisJCQlyLT5uYW1lID0gIkFNRDc1NiI7CisJCQlicmVhazsKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0FNRF9WSVBFUl83NDEzOgorCQkJci0+bmFtZSA9ICJBTUQ3NjYiOworCQkJYnJlYWs7CisJCWNhc2UgUENJX0RFVklDRV9JRF9BTURfVklQRVJfNzQ0MzoKKwkJCXItPm5hbWUgPSAiQU1ENzY4IjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJfQorCXItPmdldCA9IHBpcnFfYW1kNzU2X2dldDsKKwlyLT5zZXQgPSBwaXJxX2FtZDc1Nl9zZXQ7CisJcmV0dXJuIDE7Cit9CisJCQorc3RhdGljIF9faW5pdGRhdGEgc3RydWN0IGlycV9yb3V0ZXJfaGFuZGxlciBwaXJxX3JvdXRlcnNbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIGludGVsX3JvdXRlcl9wcm9iZSB9LAorCXsgUENJX1ZFTkRPUl9JRF9BTCwgYWxpX3JvdXRlcl9wcm9iZSB9LAorCXsgUENJX1ZFTkRPUl9JRF9JVEUsIGl0ZV9yb3V0ZXJfcHJvYmUgfSwKKwl7IFBDSV9WRU5ET1JfSURfVklBLCB2aWFfcm91dGVyX3Byb2JlIH0sCisJeyBQQ0lfVkVORE9SX0lEX09QVEksIG9wdGlfcm91dGVyX3Byb2JlIH0sCisJeyBQQ0lfVkVORE9SX0lEX1NJLCBzaXNfcm91dGVyX3Byb2JlIH0sCisJeyBQQ0lfVkVORE9SX0lEX0NZUklYLCBjeXJpeF9yb3V0ZXJfcHJvYmUgfSwKKwl7IFBDSV9WRU5ET1JfSURfVkxTSSwgdmxzaV9yb3V0ZXJfcHJvYmUgfSwKKwl7IFBDSV9WRU5ET1JfSURfU0VSVkVSV09SS1MsIHNlcnZlcndvcmtzX3JvdXRlcl9wcm9iZSB9LAorCXsgUENJX1ZFTkRPUl9JRF9BTUQsIGFtZF9yb3V0ZXJfcHJvYmUgfSwKKwkvKiBTb21lb25lIHdpdGggZG9jcyBuZWVkcyB0byBhZGQgdGhlIEFUSSBSYWRlb24gSUdQICovCisJeyAwLCBOVUxMIH0KK307CitzdGF0aWMgc3RydWN0IGlycV9yb3V0ZXIgcGlycV9yb3V0ZXI7CitzdGF0aWMgc3RydWN0IHBjaV9kZXYgKnBpcnFfcm91dGVyX2RldjsKKworCisvKgorICoJRklYTUU6IHNob3VsZCB3ZSBoYXZlIGFuIG9wdGlvbiB0byBzYXkgImdlbmVyaWMgZm9yCisgKgljaGlwc2V0IiA/CisgKi8KKyAKK3N0YXRpYyB2b2lkIF9faW5pdCBwaXJxX2ZpbmRfcm91dGVyKHN0cnVjdCBpcnFfcm91dGVyICpyKQoreworCXN0cnVjdCBpcnFfcm91dGluZ190YWJsZSAqcnQgPSBwaXJxX3RhYmxlOworCXN0cnVjdCBpcnFfcm91dGVyX2hhbmRsZXIgKmg7CisKKyNpZmRlZiBDT05GSUdfUENJX0JJT1MKKwlpZiAoIXJ0LT5zaWduYXR1cmUpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBVc2luZyBCSU9TIGZvciBJUlEgcm91dGluZ1xuIik7CisJCXItPnNldCA9IHBpcnFfYmlvc19zZXQ7CisJCXItPm5hbWUgPSAiQklPUyI7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKworCS8qIERlZmF1bHQgdW5sZXNzIGEgZHJpdmVyIHJlbG9hZHMgaXQgKi8KKwlyLT5uYW1lID0gImRlZmF1bHQiOworCXItPmdldCA9IE5VTEw7CisJci0+c2V0ID0gTlVMTDsKKwkKKwlEQkcoIlBDSTogQXR0ZW1wdGluZyB0byBmaW5kIElSUSByb3V0ZXIgZm9yICUwNHg6JTA0eFxuIiwKKwkgICAgcnQtPnJ0cl92ZW5kb3IsIHJ0LT5ydHJfZGV2aWNlKTsKKworCXBpcnFfcm91dGVyX2RldiA9IHBjaV9maW5kX3Nsb3QocnQtPnJ0cl9idXMsIHJ0LT5ydHJfZGV2Zm4pOworCWlmICghcGlycV9yb3V0ZXJfZGV2KSB7CisJCURCRygiUENJOiBJbnRlcnJ1cHQgcm91dGVyIG5vdCBmb3VuZCBhdCAlMDJ4OiUwMnhcbiIsIHJ0LT5ydHJfYnVzLCBydC0+cnRyX2RldmZuKTsKKwkJcmV0dXJuOworCX0KKworCWZvciggaCA9IHBpcnFfcm91dGVyczsgaC0+dmVuZG9yOyBoKyspIHsKKwkJLyogRmlyc3QgbG9vayBmb3IgYSByb3V0ZXIgbWF0Y2ggKi8KKwkJaWYgKHJ0LT5ydHJfdmVuZG9yID09IGgtPnZlbmRvciAmJiBoLT5wcm9iZShyLCBwaXJxX3JvdXRlcl9kZXYsIHJ0LT5ydHJfZGV2aWNlKSkKKwkJCWJyZWFrOworCQkvKiBGYWxsIGJhY2sgdG8gYSBkZXZpY2UgbWF0Y2ggKi8KKwkJaWYgKHBpcnFfcm91dGVyX2Rldi0+dmVuZG9yID09IGgtPnZlbmRvciAmJiBoLT5wcm9iZShyLCBwaXJxX3JvdXRlcl9kZXYsIHBpcnFfcm91dGVyX2Rldi0+ZGV2aWNlKSkKKwkJCWJyZWFrOworCX0KKwlwcmludGsoS0VSTl9JTkZPICJQQ0k6IFVzaW5nIElSUSByb3V0ZXIgJXMgWyUwNHgvJTA0eF0gYXQgJXNcbiIsCisJCXBpcnFfcm91dGVyLm5hbWUsCisJCXBpcnFfcm91dGVyX2Rldi0+dmVuZG9yLAorCQlwaXJxX3JvdXRlcl9kZXYtPmRldmljZSwKKwkJcGNpX25hbWUocGlycV9yb3V0ZXJfZGV2KSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2luZm8gKnBpcnFfZ2V0X2luZm8oc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgaXJxX3JvdXRpbmdfdGFibGUgKnJ0ID0gcGlycV90YWJsZTsKKwlpbnQgZW50cmllcyA9IChydC0+c2l6ZSAtIHNpemVvZihzdHJ1Y3QgaXJxX3JvdXRpbmdfdGFibGUpKSAvIHNpemVvZihzdHJ1Y3QgaXJxX2luZm8pOworCXN0cnVjdCBpcnFfaW5mbyAqaW5mbzsKKworCWZvciAoaW5mbyA9IHJ0LT5zbG90czsgZW50cmllcy0tOyBpbmZvKyspCisJCWlmIChpbmZvLT5idXMgPT0gZGV2LT5idXMtPm51bWJlciAmJiBQQ0lfU0xPVChpbmZvLT5kZXZmbikgPT0gUENJX1NMT1QoZGV2LT5kZXZmbikpCisJCQlyZXR1cm4gaW5mbzsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBwY2liaW9zX2xvb2t1cF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGFzc2lnbikKK3sKKwl1OCBwaW47CisJc3RydWN0IGlycV9pbmZvICppbmZvOworCWludCBpLCBwaXJxLCBuZXdpcnE7CisJaW50IGlycSA9IDA7CisJdTMyIG1hc2s7CisJc3RydWN0IGlycV9yb3V0ZXIgKnIgPSAmcGlycV9yb3V0ZXI7CisJc3RydWN0IHBjaV9kZXYgKmRldjIgPSBOVUxMOworCWNoYXIgKm1zZyA9IE5VTEw7CisKKwkvKiBGaW5kIElSUSBwaW4gKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfUElOLCAmcGluKTsKKwlpZiAoIXBpbikgeworCQlEQkcoIiAtPiBubyBpbnRlcnJ1cHQgcGluXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCXBpbiA9IHBpbiAtIDE7CisKKwkvKiBGaW5kIElSUSByb3V0aW5nIGVudHJ5ICovCisKKwlpZiAoIXBpcnFfdGFibGUpCisJCXJldHVybiAwOworCQorCURCRygiSVJRIGZvciAlc1slY10iLCBwY2lfbmFtZShkZXYpLCAnQScgKyBwaW4pOworCWluZm8gPSBwaXJxX2dldF9pbmZvKGRldik7CisJaWYgKCFpbmZvKSB7CisJCURCRygiIC0+IG5vdCBmb3VuZCBpbiByb3V0aW5nIHRhYmxlXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCXBpcnEgPSBpbmZvLT5pcnFbcGluXS5saW5rOworCW1hc2sgPSBpbmZvLT5pcnFbcGluXS5iaXRtYXA7CisJaWYgKCFwaXJxKSB7CisJCURCRygiIC0+IG5vdCByb3V0ZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJREJHKCIgLT4gUElSUSAlMDJ4LCBtYXNrICUwNHgsIGV4Y2wgJTA0eCIsIHBpcnEsIG1hc2ssIHBpcnFfdGFibGUtPmV4Y2x1c2l2ZV9pcnFzKTsKKwltYXNrICY9IHBjaWJpb3NfaXJxX21hc2s7CisKKwkvKiBXb3JrIGFyb3VuZCBicm9rZW4gSFAgUGF2aWxpb24gTm90ZWJvb2tzIHdoaWNoIGFzc2lnbiBVU0IgdG8KKwkgICBJUlEgOSBldmVuIHRob3VnaCBpdCBpcyBhY3R1YWxseSB3aXJlZCB0byBJUlEgMTEgKi8KKworCWlmIChicm9rZW5faHBfYmlvc19pcnE5ICYmIHBpcnEgPT0gMHg1OSAmJiBkZXYtPmlycSA9PSA5KSB7CisJCWRldi0+aXJxID0gMTE7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgMTEpOworCQlyLT5zZXQocGlycV9yb3V0ZXJfZGV2LCBkZXYsIHBpcnEsIDExKTsKKwl9CisKKwkvKiBzYW1lIGZvciBBY2VyIFRyYXZlbG1hdGUgMzYwLCBidXQgd2l0aCBDQiBhbmQgaXJxIDExIC0+IDEwICovCisJaWYgKGFjZXJfdG0zNjBfaXJxcm91dGluZyAmJiBkZXYtPmlycSA9PSAxMSAmJiBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX08yKSB7CisJCXBpcnEgPSAweDY4OworCQltYXNrID0gMHg0MDA7CisJCWRldi0+aXJxID0gci0+Z2V0KHBpcnFfcm91dGVyX2RldiwgZGV2LCBwaXJxKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBkZXYtPmlycSk7CisJfQorCisJLyoKKwkgKiBGaW5kIHRoZSBiZXN0IElSUSB0byBhc3NpZ246IHVzZSB0aGUgb25lCisJICogcmVwb3J0ZWQgYnkgdGhlIGRldmljZSBpZiBwb3NzaWJsZS4KKwkgKi8KKwluZXdpcnEgPSBkZXYtPmlycTsKKwlpZiAoISgoMSA8PCBuZXdpcnEpICYgbWFzaykpIHsKKwkJaWYgKCBwY2lfcHJvYmUgJiBQQ0lfVVNFX1BJUlFfTUFTSykgbmV3aXJxID0gMDsKKwkJZWxzZSBwcmludGsoS0VSTl9XQVJOSU5HICJQQ0k6IElSUSAlaSBmb3IgZGV2aWNlICVzIGRvZXNuJ3QgbWF0Y2ggUElSUSBtYXNrIC0gdHJ5IHBjaT11c2VwaXJxbWFza1xuIiwgbmV3aXJxLCBwY2lfbmFtZShkZXYpKTsKKwl9CisJaWYgKCFuZXdpcnEgJiYgYXNzaWduKSB7CisJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCQlpZiAoIShtYXNrICYgKDEgPDwgaSkpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHBpcnFfcGVuYWx0eVtpXSA8IHBpcnFfcGVuYWx0eVtuZXdpcnFdICYmIGNhbl9yZXF1ZXN0X2lycShpLCBTQV9TSElSUSkpCisJCQkJbmV3aXJxID0gaTsKKwkJfQorCX0KKwlEQkcoIiAtPiBuZXdpcnE9JWQiLCBuZXdpcnEpOworCisJLyogQ2hlY2sgaWYgaXQgaXMgaGFyZGNvZGVkICovCisJaWYgKChwaXJxICYgMHhmMCkgPT0gMHhmMCkgeworCQlpcnEgPSBwaXJxICYgMHhmOworCQlEQkcoIiAtPiBoYXJkY29kZWQgSVJRICVkXG4iLCBpcnEpOworCQltc2cgPSAiSGFyZGNvZGVkIjsKKwl9IGVsc2UgaWYgKCByLT5nZXQgJiYgKGlycSA9IHItPmdldChwaXJxX3JvdXRlcl9kZXYsIGRldiwgcGlycSkpICYmIFwKKwkoKCEocGNpX3Byb2JlICYgUENJX1VTRV9QSVJRX01BU0spKSB8fCAoKDEgPDwgaXJxKSAmIG1hc2spKSApIHsKKwkJREJHKCIgLT4gZ290IElSUSAlZFxuIiwgaXJxKTsKKwkJbXNnID0gIkZvdW5kIjsKKwl9IGVsc2UgaWYgKG5ld2lycSAmJiByLT5zZXQgJiYgKGRldi0+Y2xhc3MgPj4gOCkgIT0gUENJX0NMQVNTX0RJU1BMQVlfVkdBKSB7CisJCURCRygiIC0+IGFzc2lnbmluZyBJUlEgJWQiLCBuZXdpcnEpOworCQlpZiAoci0+c2V0KHBpcnFfcm91dGVyX2RldiwgZGV2LCBwaXJxLCBuZXdpcnEpKSB7CisJCQllaXNhX3NldF9sZXZlbF9pcnEobmV3aXJxKTsKKwkJCURCRygiIC4uLiBPS1xuIik7CisJCQltc2cgPSAiQXNzaWduZWQiOworCQkJaXJxID0gbmV3aXJxOworCQl9CisJfQorCisJaWYgKCFpcnEpIHsKKwkJREJHKCIgLi4uIGZhaWxlZFxuIik7CisJCWlmIChuZXdpcnEgJiYgbWFzayA9PSAoMSA8PCBuZXdpcnEpKSB7CisJCQltc2cgPSAiR3Vlc3NlZCI7CisJCQlpcnEgPSBuZXdpcnE7CisJCX0gZWxzZQorCQkJcmV0dXJuIDA7CisJfQorCXByaW50ayhLRVJOX0lORk8gIlBDSTogJXMgSVJRICVkIGZvciBkZXZpY2UgJXNcbiIsIG1zZywgaXJxLCBwY2lfbmFtZShkZXYpKTsKKworCS8qIFVwZGF0ZSBJUlEgZm9yIGFsbCBkZXZpY2VzIHdpdGggdGhlIHNhbWUgcGlycSB2YWx1ZSAqLworCXdoaWxlICgoZGV2MiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIGRldjIpKSAhPSBOVUxMKSB7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldjIsIFBDSV9JTlRFUlJVUFRfUElOLCAmcGluKTsKKwkJaWYgKCFwaW4pCisJCQljb250aW51ZTsKKwkJcGluLS07CisJCWluZm8gPSBwaXJxX2dldF9pbmZvKGRldjIpOworCQlpZiAoIWluZm8pCisJCQljb250aW51ZTsKKwkJaWYgKGluZm8tPmlycVtwaW5dLmxpbmsgPT0gcGlycSkgeworCQkJLyogV2UgcmVmdXNlIHRvIG92ZXJyaWRlIHRoZSBkZXYtPmlycSBpbmZvcm1hdGlvbi4gR2l2ZSBhIHdhcm5pbmchICovCisJCSAgICAJaWYgKCBkZXYyLT5pcnEgJiYgZGV2Mi0+aXJxICE9IGlycSAmJiBcCisJCQkoIShwY2lfcHJvYmUgJiBQQ0lfVVNFX1BJUlFfTUFTSykgfHwgXAorCQkJKCgxIDw8IGRldjItPmlycSkgJiBtYXNrKSkgKSB7CisjaWZuZGVmIENPTkZJR19QQ0lfTVNJCisJCSAgICAJCXByaW50ayhLRVJOX0lORk8gIklSUSByb3V0aW5nIGNvbmZsaWN0IGZvciAlcywgaGF2ZSBpcnEgJWQsIHdhbnQgaXJxICVkXG4iLAorCQkJCSAgICAgICBwY2lfbmFtZShkZXYyKSwgZGV2Mi0+aXJxLCBpcnEpOworI2VuZGlmCisJCSAgICAJCWNvbnRpbnVlOworCQkgICAgCX0KKwkJCWRldjItPmlycSA9IGlycTsKKwkJCXBpcnFfcGVuYWx0eVtpcnFdKys7CisJCQlpZiAoZGV2ICE9IGRldjIpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBTaGFyaW5nIElSUSAlZCB3aXRoICVzXG4iLCBpcnEsIHBjaV9uYW1lKGRldjIpKTsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHBjaWJpb3NfZml4dXBfaXJxcyh2b2lkKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOworCXU4IHBpbjsKKworCURCRygiUENJOiBJUlEgZml4dXBcbiIpOworCXdoaWxlICgoZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgZGV2KSkgIT0gTlVMTCkgeworCQkvKgorCQkgKiBJZiB0aGUgQklPUyBoYXMgc2V0IGFuIG91dCBvZiByYW5nZSBJUlEgbnVtYmVyLCBqdXN0IGlnbm9yZSBpdC4KKwkJICogQWxzbyBrZWVwIHRyYWNrIG9mIHdoaWNoIElSUSdzIGFyZSBhbHJlYWR5IGluIHVzZS4KKwkJICovCisJCWlmIChkZXYtPmlycSA+PSAxNikgeworCQkJREJHKCIlczogaWdub3JpbmcgYm9ndXMgSVJRICVkXG4iLCBwY2lfbmFtZShkZXYpLCBkZXYtPmlycSk7CisJCQlkZXYtPmlycSA9IDA7CisJCX0KKwkJLyogSWYgdGhlIElSUSBpcyBhbHJlYWR5IGFzc2lnbmVkIHRvIGEgUENJIGRldmljZSwgaWdub3JlIGl0cyBJU0EgdXNlIHBlbmFsdHkgKi8KKwkJaWYgKHBpcnFfcGVuYWx0eVtkZXYtPmlycV0gPj0gMTAwICYmIHBpcnFfcGVuYWx0eVtkZXYtPmlycV0gPCAxMDAwMDApCisJCQlwaXJxX3BlbmFsdHlbZGV2LT5pcnFdID0gMDsKKwkJcGlycV9wZW5hbHR5W2Rldi0+aXJxXSsrOworCX0KKworCWRldiA9IE5VTEw7CisJd2hpbGUgKChkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBkZXYpKSAhPSBOVUxMKSB7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9QSU4sICZwaW4pOworI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQworCQkvKgorCQkgKiBSZWNhbGN1bGF0ZSBJUlEgbnVtYmVycyBpZiB3ZSB1c2UgdGhlIEkvTyBBUElDLgorCQkgKi8KKwkJaWYgKGlvX2FwaWNfYXNzaWduX3BjaV9pcnFzKQorCQl7CisJCQlpbnQgaXJxOworCisJCQlpZiAocGluKSB7CisJCQkJcGluLS07CQkvKiBpbnRlcnJ1cHQgcGlucyBhcmUgbnVtYmVyZWQgc3RhcnRpbmcgZnJvbSAxICovCisJCQkJaXJxID0gSU9fQVBJQ19nZXRfUENJX2lycV92ZWN0b3IoZGV2LT5idXMtPm51bWJlciwgUENJX1NMT1QoZGV2LT5kZXZmbiksIHBpbik7CisJLyoKKwkgKiBCdXNzZXMgYmVoaW5kIGJyaWRnZXMgYXJlIHR5cGljYWxseSBub3QgbGlzdGVkIGluIHRoZSBNUC10YWJsZS4KKwkgKiBJbiB0aGlzIGNhc2Ugd2UgaGF2ZSB0byBsb29rIHVwIHRoZSBJUlEgYmFzZWQgb24gdGhlIHBhcmVudCBidXMsCisJICogcGFyZW50IHNsb3QsIGFuZCBwaW4gbnVtYmVyLiBUaGUgU01QIGNvZGUgZGV0ZWN0cyBzdWNoIGJyaWRnZWQKKwkgKiBidXNzZXMgaXRzZWxmIHNvIHdlIHNob3VsZCBnZXQgaW50byB0aGlzIGJyYW5jaCByZWxpYWJseS4KKwkgKi8KKwkJCQlpZiAoaXJxIDwgMCAmJiBkZXYtPmJ1cy0+cGFyZW50KSB7IC8qIGdvIGJhY2sgdG8gdGhlIGJyaWRnZSAqLworCQkJCQlzdHJ1Y3QgcGNpX2RldiAqIGJyaWRnZSA9IGRldi0+YnVzLT5zZWxmOworCisJCQkJCXBpbiA9IChwaW4gKyBQQ0lfU0xPVChkZXYtPmRldmZuKSkgJSA0OworCQkJCQlpcnEgPSBJT19BUElDX2dldF9QQ0lfaXJxX3ZlY3RvcihicmlkZ2UtPmJ1cy0+bnVtYmVyLCAKKwkJCQkJCQlQQ0lfU0xPVChicmlkZ2UtPmRldmZuKSwgcGluKTsKKwkJCQkJaWYgKGlycSA+PSAwKQorCQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUENJOiB1c2luZyBQUEIgJXNbJWNdIHRvIGdldCBpcnEgJWRcbiIsCisJCQkJCQkJcGNpX25hbWUoYnJpZGdlKSwgJ0EnICsgcGluLCBpcnEpOworCQkJCX0KKwkJCQlpZiAoaXJxID49IDApIHsKKwkJCQkJaWYgKHVzZV9wY2lfdmVjdG9yKCkgJiYKKwkJCQkJCSFwbGF0Zm9ybV9sZWdhY3lfaXJxKGlycSkpCisJCQkJCQlpcnEgPSBJT19BUElDX1ZFQ1RPUihpcnEpOworCisJCQkJCXByaW50ayhLRVJOX0lORk8gIlBDSS0+QVBJQyBJUlEgdHJhbnNmb3JtOiAlc1slY10gLT4gSVJRICVkXG4iLAorCQkJCQkJcGNpX25hbWUoZGV2KSwgJ0EnICsgcGluLCBpcnEpOworCQkJCQlkZXYtPmlycSA9IGlycTsKKwkJCQl9CisJCQl9CisJCX0KKyNlbmRpZgorCQkvKgorCQkgKiBTdGlsbCBubyBJUlE/IFRyeSB0byBsb29rdXAgb25lLi4uCisJCSAqLworCQlpZiAocGluICYmICFkZXYtPmlycSkKKwkJCXBjaWJpb3NfbG9va3VwX2lycShkZXYsIDApOworCX0KK30KKworLyoKKyAqIFdvcmsgYXJvdW5kIGJyb2tlbiBIUCBQYXZpbGlvbiBOb3RlYm9va3Mgd2hpY2ggYXNzaWduIFVTQiB0bworICogSVJRIDkgZXZlbiB0aG91Z2ggaXQgaXMgYWN0dWFsbHkgd2lyZWQgdG8gSVJRIDExCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGZpeF9icm9rZW5faHBfYmlvc19pcnE5KHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQoreworCWlmICghYnJva2VuX2hwX2Jpb3NfaXJxOSkgeworCQlicm9rZW5faHBfYmlvc19pcnE5ID0gMTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgZGV0ZWN0ZWQgLSBmaXhpbmcgYnJva2VuIElSUSByb3V0aW5nXG4iLCBkLT5pZGVudCk7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogV29yayBhcm91bmQgYnJva2VuIEFjZXIgVHJhdmVsTWF0ZSAzNjAgTm90ZWJvb2tzIHdoaWNoIGFzc2lnbgorICogQ2FyZGJ1cyB0byBJUlEgMTEgZXZlbiB0aG91Z2ggaXQgaXMgYWN0dWFsbHkgd2lyZWQgdG8gSVJRIDEwCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGZpeF9hY2VyX3RtMzYwX2lycXJvdXRpbmcoc3RydWN0IGRtaV9zeXN0ZW1faWQgKmQpCit7CisJaWYgKCFhY2VyX3RtMzYwX2lycXJvdXRpbmcpIHsKKwkJYWNlcl90bTM2MF9pcnFyb3V0aW5nID0gMTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgZGV0ZWN0ZWQgLSBmaXhpbmcgYnJva2VuIElSUSByb3V0aW5nXG4iLCBkLT5pZGVudCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRtaV9zeXN0ZW1faWQgX19pbml0ZGF0YSBwY2lpcnFfZG1pX3RhYmxlW10gPSB7CisJeworCQkuY2FsbGJhY2sgPSBmaXhfYnJva2VuX2hwX2Jpb3NfaXJxOSwKKwkJLmlkZW50ID0gIkhQIFBhdmlsaW9uIE41NDAwIFNlcmllcyBMYXB0b3AiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkhld2xldHQtUGFja2FyZCIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX1ZFUlNJT04sICJHRS5NMS4wMyIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX1ZFUlNJT04sICJIUCBQYXZpbGlvbiBOb3RlYm9vayBNb2RlbCBHRSIpLAorCQkJRE1JX01BVENIKERNSV9CT0FSRF9WRVJTSU9OLCAiT21uaUJvb2sgTjMyTi03MzYiKSwKKwkJfSwKKwl9LAorCXsKKwkJLmNhbGxiYWNrID0gZml4X2FjZXJfdG0zNjBfaXJxcm91dGluZywKKwkJLmlkZW50ID0gIkFjZXIgVHJhdmVsTWF0ZSAzNnggTGFwdG9wIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBY2VyIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlRyYXZlbE1hdGUgMzYwIiksCisJCX0sCisJfSwKKwl7IH0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBjaWJpb3NfaXJxX2luaXQodm9pZCkKK3sKKwlEQkcoIlBDSTogSVJRIGluaXRcbiIpOworCisJaWYgKHBjaWJpb3NfZW5hYmxlX2lycSB8fCByYXdfcGNpX29wcyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWRtaV9jaGVja19zeXN0ZW0ocGNpaXJxX2RtaV90YWJsZSk7CisKKwlwaXJxX3RhYmxlID0gcGlycV9maW5kX3JvdXRpbmdfdGFibGUoKTsKKworI2lmZGVmIENPTkZJR19QQ0lfQklPUworCWlmICghcGlycV90YWJsZSAmJiAocGNpX3Byb2JlICYgUENJX0JJT1NfSVJRX1NDQU4pKQorCQlwaXJxX3RhYmxlID0gcGNpYmlvc19nZXRfaXJxX3JvdXRpbmdfdGFibGUoKTsKKyNlbmRpZgorCWlmIChwaXJxX3RhYmxlKSB7CisJCXBpcnFfcGVlcl90cmljaygpOworCQlwaXJxX2ZpbmRfcm91dGVyKCZwaXJxX3JvdXRlcik7CisJCWlmIChwaXJxX3RhYmxlLT5leGNsdXNpdmVfaXJxcykgeworCQkJaW50IGk7CisJCQlmb3IgKGk9MDsgaTwxNjsgaSsrKQorCQkJCWlmICghKHBpcnFfdGFibGUtPmV4Y2x1c2l2ZV9pcnFzICYgKDEgPDwgaSkpKQorCQkJCQlwaXJxX3BlbmFsdHlbaV0gKz0gMTAwOworCQl9CisJCS8qIElmIHdlJ3JlIHVzaW5nIHRoZSBJL08gQVBJQywgYXZvaWQgdXNpbmcgdGhlIFBDSSBJUlEgcm91dGluZyB0YWJsZSAqLworCQlpZiAoaW9fYXBpY19hc3NpZ25fcGNpX2lycXMpCisJCQlwaXJxX3RhYmxlID0gTlVMTDsKKwl9CisKKwlwY2liaW9zX2VuYWJsZV9pcnEgPSBwaXJxX2VuYWJsZV9pcnE7CisKKwlwY2liaW9zX2ZpeHVwX2lycXMoKTsKKwlyZXR1cm4gMDsKK30KKworc3Vic3lzX2luaXRjYWxsKHBjaWJpb3NfaXJxX2luaXQpOworCisKK3N0YXRpYyB2b2lkIHBpcnFfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxKQoreworCS8qCisJICogIElmIGFueSBJU0FQblAgZGV2aWNlIHJlcG9ydHMgYW4gSVJRIGluIGl0cyBsaXN0IG9mIHBvc3NpYmxlCisJICogIElSUSdzLCB3ZSB0cnkgdG8gYXZvaWQgYXNzaWduaW5nIGl0IHRvIFBDSSBkZXZpY2VzLgorCSAqLworCWlmIChpcnEgPCAxNikKKwkJcGlycV9wZW5hbHR5W2lycV0gKz0gMTAwOworfQorCit2b2lkIHBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxKQoreworI2lmZGVmIENPTkZJR19BQ1BJX1BDSQorCWlmICghYWNwaV9ub2lycSkKKwkJYWNwaV9wZW5hbGl6ZV9pc2FfaXJxKGlycSk7CisJZWxzZQorI2VuZGlmCisJCXBpcnFfcGVuYWxpemVfaXNhX2lycShpcnEpOworfQorCitzdGF0aWMgaW50IHBpcnFfZW5hYmxlX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXU4IHBpbjsKKwlleHRlcm4gaW50IHZpYV9pbnRlcnJ1cHRfbGluZV9xdWlyazsKKwlzdHJ1Y3QgcGNpX2RldiAqdGVtcF9kZXY7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfUElOLCAmcGluKTsKKwlpZiAocGluICYmICFwY2liaW9zX2xvb2t1cF9pcnEoZGV2LCAxKSAmJiAhZGV2LT5pcnEpIHsKKwkJY2hhciAqbXNnID0gIiI7CisKKwkJcGluLS07CQkvKiBpbnRlcnJ1cHQgcGlucyBhcmUgbnVtYmVyZWQgc3RhcnRpbmcgZnJvbSAxICovCisKKwkJaWYgKGlvX2FwaWNfYXNzaWduX3BjaV9pcnFzKSB7CisJCQlpbnQgaXJxOworCisJCQlpcnEgPSBJT19BUElDX2dldF9QQ0lfaXJxX3ZlY3RvcihkZXYtPmJ1cy0+bnVtYmVyLCBQQ0lfU0xPVChkZXYtPmRldmZuKSwgcGluKTsKKwkJCS8qCisJCQkgKiBCdXNzZXMgYmVoaW5kIGJyaWRnZXMgYXJlIHR5cGljYWxseSBub3QgbGlzdGVkIGluIHRoZSBNUC10YWJsZS4KKwkJCSAqIEluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIGxvb2sgdXAgdGhlIElSUSBiYXNlZCBvbiB0aGUgcGFyZW50IGJ1cywKKwkJCSAqIHBhcmVudCBzbG90LCBhbmQgcGluIG51bWJlci4gVGhlIFNNUCBjb2RlIGRldGVjdHMgc3VjaCBicmlkZ2VkCisJCQkgKiBidXNzZXMgaXRzZWxmIHNvIHdlIHNob3VsZCBnZXQgaW50byB0aGlzIGJyYW5jaCByZWxpYWJseS4KKwkJCSAqLworCQkJdGVtcF9kZXYgPSBkZXY7CisJCQl3aGlsZSAoaXJxIDwgMCAmJiBkZXYtPmJ1cy0+cGFyZW50KSB7IC8qIGdvIGJhY2sgdG8gdGhlIGJyaWRnZSAqLworCQkJCXN0cnVjdCBwY2lfZGV2ICogYnJpZGdlID0gZGV2LT5idXMtPnNlbGY7CisKKwkJCQlwaW4gPSAocGluICsgUENJX1NMT1QoZGV2LT5kZXZmbikpICUgNDsKKwkJCQlpcnEgPSBJT19BUElDX2dldF9QQ0lfaXJxX3ZlY3RvcihicmlkZ2UtPmJ1cy0+bnVtYmVyLCAKKwkJCQkJCVBDSV9TTE9UKGJyaWRnZS0+ZGV2Zm4pLCBwaW4pOworCQkJCWlmIChpcnEgPj0gMCkKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUENJOiB1c2luZyBQUEIgJXNbJWNdIHRvIGdldCBpcnEgJWRcbiIsCisJCQkJCQlwY2lfbmFtZShicmlkZ2UpLCAnQScgKyBwaW4sIGlycSk7CisJCQkJZGV2ID0gYnJpZGdlOworCQkJfQorCQkJZGV2ID0gdGVtcF9kZXY7CisJCQlpZiAoaXJxID49IDApIHsKKyNpZmRlZiBDT05GSUdfUENJX01TSQorCQkJCWlmICghcGxhdGZvcm1fbGVnYWN5X2lycShpcnEpKQorCQkJCQlpcnEgPSBJT19BUElDX1ZFQ1RPUihpcnEpOworI2VuZGlmCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiUENJLT5BUElDIElSUSB0cmFuc2Zvcm06ICVzWyVjXSAtPiBJUlEgJWRcbiIsCisJCQkJCXBjaV9uYW1lKGRldiksICdBJyArIHBpbiwgaXJxKTsKKwkJCQlkZXYtPmlycSA9IGlycTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0gZWxzZQorCQkJCW1zZyA9ICIgUHJvYmFibHkgYnVnZ3kgTVAgdGFibGUuIjsKKwkJfSBlbHNlIGlmIChwY2lfcHJvYmUgJiBQQ0lfQklPU19JUlFfU0NBTikKKwkJCW1zZyA9ICIiOworCQllbHNlCisJCQltc2cgPSAiIFBsZWFzZSB0cnkgdXNpbmcgcGNpPWJpb3NpcnEuIjsKKworCQkvKiBXaXRoIElERSBsZWdhY3kgZGV2aWNlcyB0aGUgSVJRIGxvb2t1cCBmYWlsdXJlIGlzIG5vdCBhIHByb2JsZW0uLiAqLworCQlpZiAoZGV2LT5jbGFzcyA+PiA4ID09IFBDSV9DTEFTU19TVE9SQUdFX0lERSAmJiAhKGRldi0+Y2xhc3MgJiAweDUpKQorCQkJcmV0dXJuIDA7CisKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiUENJOiBObyBJUlEga25vd24gZm9yIGludGVycnVwdCBwaW4gJWMgb2YgZGV2aWNlICVzLiVzXG4iLAorCQkgICAgICAgJ0EnICsgcGluLCBwY2lfbmFtZShkZXYpLCBtc2cpOworCX0KKwkvKiBWSUEgYnJpZGdlcyB1c2UgaW50ZXJydXB0IGxpbmUgZm9yIGFwaWMvcGNpIHN0ZWVyaW5nIGFjcm9zcworCSAgIHRoZSBWLUxpbmsgKi8KKwllbHNlIGlmICh2aWFfaW50ZXJydXB0X2xpbmVfcXVpcmspCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgZGV2LT5pcnEgJiAxNSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBwY2lfdmVjdG9yX3Jlc291cmNlcyhpbnQgbGFzdCwgaW50IG5yX3JlbGVhc2VkKQoreworCWludCBjb3VudCA9IG5yX3JlbGVhc2VkOworCisJaW50IG5leHQgPSBsYXN0OworCWludCBvZmZzZXQgPSAobGFzdCAlIDgpOworCisJd2hpbGUgKG5leHQgPCBGSVJTVF9TWVNURU1fVkVDVE9SKSB7CisJCW5leHQgKz0gODsKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJCWlmIChuZXh0ID09IElBMzJfU1lTQ0FMTF9WRUNUT1IpCisJCQljb250aW51ZTsKKyNlbHNlCisJCWlmIChuZXh0ID09IFNZU0NBTExfVkVDVE9SKQorCQkJY29udGludWU7CisjZW5kaWYKKwkJY291bnQrKzsKKwkJaWYgKG5leHQgPj0gRklSU1RfU1lTVEVNX1ZFQ1RPUikgeworCQkJaWYgKG9mZnNldCU4KSB7CisJCQkJbmV4dCA9IEZJUlNUX0RFVklDRV9WRUNUT1IgKyBvZmZzZXQ7CisJCQkJb2Zmc2V0Kys7CisJCQkJY29udGludWU7CisJCQl9CisJCQljb3VudC0tOworCQl9CisJfQorCisJcmV0dXJuIGNvdW50OworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L3BjaS9sZWdhY3kuYyBiL2FyY2gvaTM4Ni9wY2kvbGVnYWN5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ5MmUzNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9wY2kvbGVnYWN5LmMKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIGxlZ2FjeS5jIC0gdHJhZGl0aW9uYWwsIG9sZCBzY2hvb2wgUENJIGJ1cyBwcm9iaW5nCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSAicGNpLmgiCisKKy8qCisgKiBEaXNjb3ZlciByZW1haW5pbmcgUENJIGJ1c2VzIGluIGNhc2UgdGhlcmUgYXJlIHBlZXIgaG9zdCBicmlkZ2VzLgorICogV2UgdXNlIHRoZSBudW1iZXIgb2YgbGFzdCBQQ0kgYnVzIHByb3ZpZGVkIGJ5IHRoZSBQQ0kgQklPUy4KKyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IHBjaWJpb3NfZml4dXBfcGVlcl9icmlkZ2VzKHZvaWQpCit7CisJaW50IG4sIGRldmZuOworCisJaWYgKHBjaWJpb3NfbGFzdF9idXMgPD0gMCB8fCBwY2liaW9zX2xhc3RfYnVzID49IDB4ZmYpCisJCXJldHVybjsKKwlEQkcoIlBDSTogUGVlciBicmlkZ2UgZml4dXBcbiIpOworCisJZm9yIChuPTA7IG4gPD0gcGNpYmlvc19sYXN0X2J1czsgbisrKSB7CisJCXUzMiBsOworCQlpZiAocGNpX2ZpbmRfYnVzKDAsIG4pKQorCQkJY29udGludWU7CisJCWZvciAoZGV2Zm4gPSAwOyBkZXZmbiA8IDI1NjsgZGV2Zm4gKz0gOCkgeworCQkJaWYgKCFyYXdfcGNpX29wcy0+cmVhZCgwLCBuLCBkZXZmbiwgUENJX1ZFTkRPUl9JRCwgMiwgJmwpICYmCisJCQkgICAgbCAhPSAweDAwMDAgJiYgbCAhPSAweGZmZmYpIHsKKwkJCQlEQkcoIkZvdW5kIGRldmljZSBhdCAlMDJ4OiUwMnggWyUwNHhdXG4iLCBuLCBkZXZmbiwgbCk7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBEaXNjb3ZlcmVkIHBlZXIgYnVzICUwMnhcbiIsIG4pOworCQkJCXBjaV9zY2FuX2J1cyhuLCAmcGNpX3Jvb3Rfb3BzLCBOVUxMKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIGludCBfX2luaXQgcGNpX2xlZ2FjeV9pbml0KHZvaWQpCit7CisJaWYgKCFyYXdfcGNpX29wcykgeworCQlwcmludGsoIlBDSTogU3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgUENJXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHBjaWJpb3Nfc2Nhbm5lZCsrKQorCQlyZXR1cm4gMDsKKworCXByaW50aygiUENJOiBQcm9iaW5nIFBDSSBoYXJkd2FyZVxuIik7CisJcGNpX3Jvb3RfYnVzID0gcGNpYmlvc19zY2FuX3Jvb3QoMCk7CisKKwlwY2liaW9zX2ZpeHVwX3BlZXJfYnJpZGdlcygpOworCisJcmV0dXJuIDA7Cit9CisKK3N1YnN5c19pbml0Y2FsbChwY2lfbGVnYWN5X2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L3BjaS9tbWNvbmZpZy5jIGIvYXJjaC9pMzg2L3BjaS9tbWNvbmZpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMWE1MGEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvcGNpL21tY29uZmlnLmMKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgTWF0dGhldyBXaWxjb3ggPG1hdHRoZXdAd2lsLmN4PgorICogQ29weXJpZ2h0IChDKSAyMDA0IEludGVsIENvcnAuCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCisgKi8KKworLyoKKyAqIG1tY29uZmlnLmMgLSBMb3ctbGV2ZWwgZGlyZWN0IFBDSSBjb25maWcgc3BhY2UgYWNjZXNzIHZpYSBNTUNPTkZJRworICovCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSAicGNpLmgiCisKKy8qIFRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBNTUNPTkZJRyBhcGVydHVyZS4gIFNldCBmcm9tIEFDUEkgdGFibGVzLiAqLwordTMyIHBjaV9tbWNmZ19iYXNlX2FkZHI7CisKKyNkZWZpbmUgbW1jZmdfdmlydF9hZGRyICgodm9pZCBfX2lvbWVtICopIGZpeF90b192aXJ0KEZJWF9QQ0lFX01DRkcpKQorCisvKiBUaGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBsYXN0IE1NQ09ORklHIGRldmljZSBhY2Nlc3NlZCAqLworc3RhdGljIHUzMiBtbWNmZ19sYXN0X2FjY2Vzc2VkX2RldmljZTsKKworLyoKKyAqIEZ1bmN0aW9ucyBmb3IgYWNjZXNzaW5nIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIHdpdGggTU1DT05GSUcgYWNjZXNzZXMKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpX2V4cF9zZXRfZGV2X2Jhc2UoaW50IGJ1cywgaW50IGRldmZuKQoreworCXUzMiBkZXZfYmFzZSA9IHBjaV9tbWNmZ19iYXNlX2FkZHIgfCAoYnVzIDw8IDIwKSB8IChkZXZmbiA8PCAxMik7CisJaWYgKGRldl9iYXNlICE9IG1tY2ZnX2xhc3RfYWNjZXNzZWRfZGV2aWNlKSB7CisJCW1tY2ZnX2xhc3RfYWNjZXNzZWRfZGV2aWNlID0gZGV2X2Jhc2U7CisJCXNldF9maXhtYXBfbm9jYWNoZShGSVhfUENJRV9NQ0ZHLCBkZXZfYmFzZSk7CisJfQorfQorCitzdGF0aWMgaW50IHBjaV9tbWNmZ19yZWFkKHVuc2lnbmVkIGludCBzZWcsIHVuc2lnbmVkIGludCBidXMsCisJCQkgIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IHJlZywgaW50IGxlbiwgdTMyICp2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCF2YWx1ZSB8fCAoYnVzID4gMjU1KSB8fCAoZGV2Zm4gPiAyNTUpIHx8IChyZWcgPiA0MDk1KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGNpX2NvbmZpZ19sb2NrLCBmbGFncyk7CisKKwlwY2lfZXhwX3NldF9kZXZfYmFzZShidXMsIGRldmZuKTsKKworCXN3aXRjaCAobGVuKSB7CisJY2FzZSAxOgorCQkqdmFsdWUgPSByZWFkYihtbWNmZ192aXJ0X2FkZHIgKyByZWcpOworCQlicmVhazsKKwljYXNlIDI6CisJCSp2YWx1ZSA9IHJlYWR3KG1tY2ZnX3ZpcnRfYWRkciArIHJlZyk7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJKnZhbHVlID0gcmVhZGwobW1jZmdfdmlydF9hZGRyICsgcmVnKTsKKwkJYnJlYWs7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNpX2NvbmZpZ19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwY2lfbW1jZmdfd3JpdGUodW5zaWduZWQgaW50IHNlZywgdW5zaWduZWQgaW50IGJ1cywKKwkJCSAgIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IHJlZywgaW50IGxlbiwgdTMyIHZhbHVlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoKGJ1cyA+IDI1NSkgfHwgKGRldmZuID4gMjU1KSB8fCAocmVnID4gNDA5NSkpIAorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwY2lfY29uZmlnX2xvY2ssIGZsYWdzKTsKKworCXBjaV9leHBfc2V0X2Rldl9iYXNlKGJ1cywgZGV2Zm4pOworCisJc3dpdGNoIChsZW4pIHsKKwljYXNlIDE6CisJCXdyaXRlYih2YWx1ZSwgbW1jZmdfdmlydF9hZGRyICsgcmVnKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQl3cml0ZXcodmFsdWUsIG1tY2ZnX3ZpcnRfYWRkciArIHJlZyk7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJd3JpdGVsKHZhbHVlLCBtbWNmZ192aXJ0X2FkZHIgKyByZWcpOworCQlicmVhazsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY2lfY29uZmlnX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9yYXdfb3BzIHBjaV9tbWNmZyA9IHsKKwkucmVhZCA9CQlwY2lfbW1jZmdfcmVhZCwKKwkud3JpdGUgPQlwY2lfbW1jZmdfd3JpdGUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwY2lfbW1jZmdfaW5pdCh2b2lkKQoreworCWlmICgocGNpX3Byb2JlICYgUENJX1BST0JFX01NQ09ORikgPT0gMCkKKwkJZ290byBvdXQ7CisJaWYgKCFwY2lfbW1jZmdfYmFzZV9hZGRyKQorCQlnb3RvIG91dDsKKworCS8qIEtsdWRnZSBmb3Igbm93LiBEb24ndCB1c2UgbW1jb25maWcgb24gQU1EIHN5c3RlbXMgYmVjYXVzZQorCSAgIHRob3NlIGhhdmUgc29tZSBidXNzZXMgd2hlcmUgbW1jb25maWcgZG9lc24ndCB3b3JrLAorCSAgIGFuZCB3ZSBkb24ndCBwYXJzZSBBQ1BJIE1DRkcgd2VsbCBlbm91Z2ggdG8gaGFuZGxlIHRoYXQuIAorCSAgIFJlbW92ZSB3aGVuIHByb3BlciBoYW5kbGluZyBpcyBhZGRlZC4gKi8KKwlpZiAoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfQU1EKQorCQlnb3RvIG91dDsgCisKKwlwcmludGsoS0VSTl9JTkZPICJQQ0k6IFVzaW5nIE1NQ09ORklHXG4iKTsKKwlyYXdfcGNpX29wcyA9ICZwY2lfbW1jZmc7CisJcGNpX3Byb2JlID0gKHBjaV9wcm9iZSAmIH5QQ0lfUFJPQkVfTUFTSykgfCBQQ0lfUFJPQkVfTU1DT05GOworCisgb3V0OgorCXJldHVybiAwOworfQorCithcmNoX2luaXRjYWxsKHBjaV9tbWNmZ19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9wY2kvbnVtYS5jIGIvYXJjaC9pMzg2L3BjaS9udW1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUzNjk1NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9wY2kvbnVtYS5jCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogbnVtYS5jIC0gTG93LWxldmVsIFBDSSBhY2Nlc3MgZm9yIE5VTUEtUSBtYWNoaW5lcworICovCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbm9kZW1hc2suaD4KKyNpbmNsdWRlICJwY2kuaCIKKworI2RlZmluZSBCVVMyUVVBRChnbG9iYWwpIChtcF9idXNfaWRfdG9fbm9kZVtnbG9iYWxdKQorI2RlZmluZSBCVVMyTE9DQUwoZ2xvYmFsKSAobXBfYnVzX2lkX3RvX2xvY2FsW2dsb2JhbF0pCisjZGVmaW5lIFFVQURMT0NBTDJCVVMocXVhZCxsb2NhbCkgKHF1YWRfbG9jYWxfdG9fbXBfYnVzX2lkW3F1YWRdW2xvY2FsXSkKKworI2RlZmluZSBQQ0lfQ09ORjFfTVFfQUREUkVTUyhidXMsIGRldmZuLCByZWcpIFwKKwkoMHg4MDAwMDAwMCB8IChCVVMyTE9DQUwoYnVzKSA8PCAxNikgfCAoZGV2Zm4gPDwgOCkgfCAocmVnICYgfjMpKQorCitzdGF0aWMgaW50IHBjaV9jb25mMV9tcV9yZWFkKHVuc2lnbmVkIGludCBzZWcsIHVuc2lnbmVkIGludCBidXMsCisJCQkgICAgIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IHJlZywgaW50IGxlbiwgdTMyICp2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCF2YWx1ZSB8fCAoYnVzID49IE1BWF9NUF9CVVNTRVMpIHx8IChkZXZmbiA+IDI1NSkgfHwgKHJlZyA+IDI1NSkpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBjaV9jb25maWdfbG9jaywgZmxhZ3MpOworCisJb3V0bF9xdWFkKFBDSV9DT05GMV9NUV9BRERSRVNTKGJ1cywgZGV2Zm4sIHJlZyksIDB4Q0Y4LCBCVVMyUVVBRChidXMpKTsKKworCXN3aXRjaCAobGVuKSB7CisJY2FzZSAxOgorCQkqdmFsdWUgPSBpbmJfcXVhZCgweENGQyArIChyZWcgJiAzKSwgQlVTMlFVQUQoYnVzKSk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJKnZhbHVlID0gaW53X3F1YWQoMHhDRkMgKyAocmVnICYgMiksIEJVUzJRVUFEKGJ1cykpOworCQlicmVhazsKKwljYXNlIDQ6CisJCSp2YWx1ZSA9IGlubF9xdWFkKDB4Q0ZDLCBCVVMyUVVBRChidXMpKTsKKwkJYnJlYWs7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNpX2NvbmZpZ19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwY2lfY29uZjFfbXFfd3JpdGUodW5zaWduZWQgaW50IHNlZywgdW5zaWduZWQgaW50IGJ1cywKKwkJCSAgICAgIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IHJlZywgaW50IGxlbiwgdTMyIHZhbHVlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoKGJ1cyA+PSBNQVhfTVBfQlVTU0VTKSB8fCAoZGV2Zm4gPiAyNTUpIHx8IChyZWcgPiAyNTUpKSAKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGNpX2NvbmZpZ19sb2NrLCBmbGFncyk7CisKKwlvdXRsX3F1YWQoUENJX0NPTkYxX01RX0FERFJFU1MoYnVzLCBkZXZmbiwgcmVnKSwgMHhDRjgsIEJVUzJRVUFEKGJ1cykpOworCisJc3dpdGNoIChsZW4pIHsKKwljYXNlIDE6CisJCW91dGJfcXVhZCgodTgpdmFsdWUsIDB4Q0ZDICsgKHJlZyAmIDMpLCBCVVMyUVVBRChidXMpKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlvdXR3X3F1YWQoKHUxNil2YWx1ZSwgMHhDRkMgKyAocmVnICYgMiksIEJVUzJRVUFEKGJ1cykpOworCQlicmVhazsKKwljYXNlIDQ6CisJCW91dGxfcXVhZCgodTMyKXZhbHVlLCAweENGQywgQlVTMlFVQUQoYnVzKSk7CisJCWJyZWFrOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjaV9jb25maWdfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKyN1bmRlZiBQQ0lfQ09ORjFfTVFfQUREUkVTUworCitzdGF0aWMgc3RydWN0IHBjaV9yYXdfb3BzIHBjaV9kaXJlY3RfY29uZjFfbXEgPSB7CisJLnJlYWQJPSBwY2lfY29uZjFfbXFfcmVhZCwKKwkud3JpdGUJPSBwY2lfY29uZjFfbXFfd3JpdGUKK307CisKKworc3RhdGljIHZvaWQgX19kZXZpbml0IHBjaV9maXh1cF9pNDUwbngoc3RydWN0IHBjaV9kZXYgKmQpCit7CisJLyoKKwkgKiBpNDUwTlggLS0gRmluZCBhbmQgc2NhbiBhbGwgc2Vjb25kYXJ5IGJ1c2VzIG9uIGFsbCBQWEIncy4KKwkgKi8KKwlpbnQgcHhiLCByZWc7CisJdTggYnVzbm8sIHN1YmEsIHN1YmI7CisJaW50IHF1YWQgPSBCVVMyUVVBRChkLT5idXMtPm51bWJlcik7CisKKwlwcmludGsoIlBDSTogU2VhcmNoaW5nIGZvciBpNDUwTlggaG9zdCBicmlkZ2VzIG9uICVzXG4iLCBwY2lfbmFtZShkKSk7CisJcmVnID0gMHhkMDsKKwlmb3IocHhiPTA7IHB4YjwyOyBweGIrKykgeworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkLCByZWcrKywgJmJ1c25vKTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZCwgcmVnKyssICZzdWJhKTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZCwgcmVnKyssICZzdWJiKTsKKwkJREJHKCJpNDUwTlggUFhCICVkOiAlMDJ4LyUwMngvJTAyeFxuIiwgcHhiLCBidXNubywgc3ViYSwgc3ViYik7CisJCWlmIChidXNubykKKwkJCXBjaV9zY2FuX2J1cyhRVUFETE9DQUwyQlVTKHF1YWQsYnVzbm8pLCAmcGNpX3Jvb3Rfb3BzLCBOVUxMKTsJLyogQnVzIEEgKi8KKwkJaWYgKHN1YmEgPCBzdWJiKQorCQkJcGNpX3NjYW5fYnVzKFFVQURMT0NBTDJCVVMocXVhZCxzdWJhKzEpLCAmcGNpX3Jvb3Rfb3BzLCBOVUxMKTsJLyogQnVzIEIgKi8KKwl9CisJcGNpYmlvc19sYXN0X2J1cyA9IC0xOworfQorREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI0NTFOWCwgcGNpX2ZpeHVwX2k0NTBueCk7CisKK3N0YXRpYyBpbnQgX19pbml0IHBjaV9udW1hX2luaXQodm9pZCkKK3sKKwlpbnQgcXVhZDsKKworCXJhd19wY2lfb3BzID0gJnBjaV9kaXJlY3RfY29uZjFfbXE7CisKKwlpZiAocGNpYmlvc19zY2FubmVkKyspCisJCXJldHVybiAwOworCisJcGNpX3Jvb3RfYnVzID0gcGNpYmlvc19zY2FuX3Jvb3QoMCk7CisJaWYgKG51bV9vbmxpbmVfbm9kZXMoKSA+IDEpCisJCWZvcl9lYWNoX29ubGluZV9ub2RlKHF1YWQpIHsKKwkJCWlmIChxdWFkID09IDApCisJCQkJY29udGludWU7CisJCQlwcmludGsoIlNjYW5uaW5nIFBDSSBidXMgJWQgZm9yIHF1YWQgJWRcbiIsIAorCQkJCVFVQURMT0NBTDJCVVMocXVhZCwwKSwgcXVhZCk7CisJCQlwY2lfc2Nhbl9idXMoUVVBRExPQ0FMMkJVUyhxdWFkLDApLCAKKwkJCQkmcGNpX3Jvb3Rfb3BzLCBOVUxMKTsKKwkJfQorCXJldHVybiAwOworfQorCitzdWJzeXNfaW5pdGNhbGwocGNpX251bWFfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcGNpL3BjYmlvcy5jIGIvYXJjaC9pMzg2L3BjaS9wY2Jpb3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDE0MjFiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L3BjaS9wY2Jpb3MuYwpAQCAtMCwwICsxLDQ4NyBAQAorLyoKKyAqIEJJT1MzMiBhbmQgUENJIEJJT1MgaGFuZGxpbmcuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlICJwY2kuaCIKKyNpbmNsdWRlICJwY2ktZnVuY3Rpb25zLmgiCisKKworLyogQklPUzMyIHNpZ25hdHVyZTogIl8zMl8iICovCisjZGVmaW5lIEJJT1MzMl9TSUdOQVRVUkUJKCgnXycgPDwgMCkgKyAoJzMnIDw8IDgpICsgKCcyJyA8PCAxNikgKyAoJ18nIDw8IDI0KSkKKworLyogUENJIHNpZ25hdHVyZTogIlBDSSAiICovCisjZGVmaW5lIFBDSV9TSUdOQVRVUkUJCSgoJ1AnIDw8IDApICsgKCdDJyA8PCA4KSArICgnSScgPDwgMTYpICsgKCcgJyA8PCAyNCkpCisKKy8qIFBDSSBzZXJ2aWNlIHNpZ25hdHVyZTogIiRQQ0kiICovCisjZGVmaW5lIFBDSV9TRVJWSUNFCQkoKCckJyA8PCAwKSArICgnUCcgPDwgOCkgKyAoJ0MnIDw8IDE2KSArICgnSScgPDwgMjQpKQorCisvKiBQQ0kgQklPUyBoYXJkd2FyZSBtZWNoYW5pc20gZmxhZ3MgKi8KKyNkZWZpbmUgUENJQklPU19IV19UWVBFMQkJMHgwMQorI2RlZmluZSBQQ0lCSU9TX0hXX1RZUEUyCQkweDAyCisjZGVmaW5lIFBDSUJJT1NfSFdfVFlQRTFfU1BFQwkJMHgxMAorI2RlZmluZSBQQ0lCSU9TX0hXX1RZUEUyX1NQRUMJCTB4MjAKKworLyoKKyAqIFRoaXMgaXMgdGhlIHN0YW5kYXJkIHN0cnVjdHVyZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBlbnRyeSBwb2ludAorICogdG8gdGhlIEJJT1MzMiBTZXJ2aWNlIERpcmVjdG9yeSwgYXMgZG9jdW1lbnRlZCBpbgorICogCVN0YW5kYXJkIEJJT1MgMzItYml0IFNlcnZpY2UgRGlyZWN0b3J5IFByb3Bvc2FsCisgKiAJUmV2aXNpb24gMC40IE1heSAyNCwgMTk5MworICogCVBob2VuaXggVGVjaG5vbG9naWVzIEx0ZC4KKyAqCU5vcndvb2QsIE1BCisgKiBhbmQgdGhlIFBDSSBCSU9TIHNwZWNpZmljYXRpb24uCisgKi8KKwordW5pb24gYmlvczMyIHsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBsb25nIHNpZ25hdHVyZTsJLyogXzMyXyAqLworCQl1bnNpZ25lZCBsb25nIGVudHJ5OwkJLyogMzIgYml0IHBoeXNpY2FsIGFkZHJlc3MgKi8KKwkJdW5zaWduZWQgY2hhciByZXZpc2lvbjsJCS8qIFJldmlzaW9uIGxldmVsLCAwICovCisJCXVuc2lnbmVkIGNoYXIgbGVuZ3RoOwkJLyogTGVuZ3RoIGluIHBhcmFncmFwaHMgc2hvdWxkIGJlIDAxICovCisJCXVuc2lnbmVkIGNoYXIgY2hlY2tzdW07CQkvKiBBbGwgYnl0ZXMgbXVzdCBhZGQgdXAgdG8gemVybyAqLworCQl1bnNpZ25lZCBjaGFyIHJlc2VydmVkWzVdOyAJLyogTXVzdCBiZSB6ZXJvICovCisJfSBmaWVsZHM7CisJY2hhciBjaGFyc1sxNl07Cit9OworCisvKgorICogUGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgc2VydmljZSBkaXJlY3RvcnkuICBJIGRvbid0IGtub3cgaWYgd2UncmUKKyAqIGFsbG93ZWQgdG8gaGF2ZSBtb3JlIHRoYW4gb25lIG9mIHRoZXNlIG9yIG5vdCwgc28ganVzdCBpbiBjYXNlCisgKiB3ZSdsbCBtYWtlIHBjaWJpb3NfcHJlc2VudCgpIHRha2UgYSBtZW1vcnkgc3RhcnQgcGFyYW1ldGVyIGFuZCBzdG9yZQorICogdGhlIGFycmF5IHRoZXJlLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKKwl1bnNpZ25lZCBzaG9ydCBzZWdtZW50OworfSBiaW9zMzJfaW5kaXJlY3QgPSB7IDAsIF9fS0VSTkVMX0NTIH07CisKKy8qCisgKiBSZXR1cm5zIHRoZSBlbnRyeSBwb2ludCBmb3IgdGhlIGdpdmVuIHNlcnZpY2UsIE5VTEwgb24gZXJyb3IKKyAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBiaW9zMzJfc2VydmljZSh1bnNpZ25lZCBsb25nIHNlcnZpY2UpCit7CisJdW5zaWduZWQgY2hhciByZXR1cm5fY29kZTsJLyogJWFsICovCisJdW5zaWduZWQgbG9uZyBhZGRyZXNzOwkJLyogJWVieCAqLworCXVuc2lnbmVkIGxvbmcgbGVuZ3RoOwkJLyogJWVjeCAqLworCXVuc2lnbmVkIGxvbmcgZW50cnk7CQkvKiAlZWR4ICovCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlfX2FzbV9fKCJsY2FsbCAqKCUlZWRpKTsgY2xkIgorCQk6ICI9YSIgKHJldHVybl9jb2RlKSwKKwkJICAiPWIiIChhZGRyZXNzKSwKKwkJICAiPWMiIChsZW5ndGgpLAorCQkgICI9ZCIgKGVudHJ5KQorCQk6ICIwIiAoc2VydmljZSksCisJCSAgIjEiICgwKSwKKwkJICAiRCIgKCZiaW9zMzJfaW5kaXJlY3QpKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlzd2l0Y2ggKHJldHVybl9jb2RlKSB7CisJCWNhc2UgMDoKKwkJCXJldHVybiBhZGRyZXNzICsgZW50cnk7CisJCWNhc2UgMHg4MDoJLyogTm90IHByZXNlbnQgKi8KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImJpb3MzMl9zZXJ2aWNlKDB4JWx4KTogbm90IHByZXNlbnRcbiIsIHNlcnZpY2UpOworCQkJcmV0dXJuIDA7CisJCWRlZmF1bHQ6IC8qIFNob3VsZG4ndCBoYXBwZW4gKi8KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImJpb3MzMl9zZXJ2aWNlKDB4JWx4KTogcmV0dXJuZWQgMHgleCAtLSBCSU9TIGJ1ZyFcbiIsCisJCQkJc2VydmljZSwgcmV0dXJuX2NvZGUpOworCQkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CisJdW5zaWduZWQgc2hvcnQgc2VnbWVudDsKK30gcGNpX2luZGlyZWN0ID0geyAwLCBfX0tFUk5FTF9DUyB9OworCitzdGF0aWMgaW50IHBjaV9iaW9zX3ByZXNlbnQ7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGNoZWNrX3BjaWJpb3Modm9pZCkKK3sKKwl1MzIgc2lnbmF0dXJlLCBlYXgsIGVieCwgZWN4OworCXU4IHN0YXR1cywgbWFqb3JfdmVyLCBtaW5vcl92ZXIsIGh3X21lY2g7CisJdW5zaWduZWQgbG9uZyBmbGFncywgcGNpYmlvc19lbnRyeTsKKworCWlmICgocGNpYmlvc19lbnRyeSA9IGJpb3MzMl9zZXJ2aWNlKFBDSV9TRVJWSUNFKSkpIHsKKwkJcGNpX2luZGlyZWN0LmFkZHJlc3MgPSBwY2liaW9zX2VudHJ5ICsgUEFHRV9PRkZTRVQ7CisKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQlfX2FzbV9fKAorCQkJImxjYWxsICooJSVlZGkpOyBjbGRcblx0IgorCQkJImpjIDFmXG5cdCIKKwkJCSJ4b3IgJSVhaCwgJSVhaFxuIgorCQkJIjE6IgorCQkJOiAiPWQiIChzaWduYXR1cmUpLAorCQkJICAiPWEiIChlYXgpLAorCQkJICAiPWIiIChlYngpLAorCQkJICAiPWMiIChlY3gpCisJCQk6ICIxIiAoUENJQklPU19QQ0lfQklPU19QUkVTRU5UKSwKKwkJCSAgIkQiICgmcGNpX2luZGlyZWN0KQorCQkJOiAibWVtb3J5Iik7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCQlzdGF0dXMgPSAoZWF4ID4+IDgpICYgMHhmZjsKKwkJaHdfbWVjaCA9IGVheCAmIDB4ZmY7CisJCW1ham9yX3ZlciA9IChlYnggPj4gOCkgJiAweGZmOworCQltaW5vcl92ZXIgPSBlYnggJiAweGZmOworCQlpZiAocGNpYmlvc19sYXN0X2J1cyA8IDApCisJCQlwY2liaW9zX2xhc3RfYnVzID0gZWN4ICYgMHhmZjsKKwkJREJHKCJQQ0k6IEJJT1MgcHJvYmUgcmV0dXJuZWQgcz0lMDJ4IGh3PSUwMnggdmVyPSUwMnguJTAyeCBsPSUwMnhcbiIsCisJCQlzdGF0dXMsIGh3X21lY2gsIG1ham9yX3ZlciwgbWlub3JfdmVyLCBwY2liaW9zX2xhc3RfYnVzKTsKKwkJaWYgKHN0YXR1cyB8fCBzaWduYXR1cmUgIT0gUENJX1NJR05BVFVSRSkgeworCQkJcHJpbnRrIChLRVJOX0VSUiAiUENJOiBCSU9TIEJVRyAjJXhbJTA4eF0gZm91bmRcbiIsCisJCQkJc3RhdHVzLCBzaWduYXR1cmUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBQQ0kgQklPUyByZXZpc2lvbiAleC4lMDJ4IGVudHJ5IGF0IDB4JWx4LCBsYXN0IGJ1cz0lZFxuIiwKKwkJCW1ham9yX3ZlciwgbWlub3JfdmVyLCBwY2liaW9zX2VudHJ5LCBwY2liaW9zX2xhc3RfYnVzKTsKKyNpZmRlZiBDT05GSUdfUENJX0RJUkVDVAorCQlpZiAoIShod19tZWNoICYgUENJQklPU19IV19UWVBFMSkpCisJCQlwY2lfcHJvYmUgJj0gflBDSV9QUk9CRV9DT05GMTsKKwkJaWYgKCEoaHdfbWVjaCAmIFBDSUJJT1NfSFdfVFlQRTIpKQorCQkJcGNpX3Byb2JlICY9IH5QQ0lfUFJPQkVfQ09ORjI7CisjZW5kaWYKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwY2lfYmlvc19maW5kX2RldmljZSAodW5zaWduZWQgc2hvcnQgdmVuZG9yLCB1bnNpZ25lZCBzaG9ydCBkZXZpY2VfaWQsCisJCQkJCXVuc2lnbmVkIHNob3J0IGluZGV4LCB1bnNpZ25lZCBjaGFyICpidXMsIHVuc2lnbmVkIGNoYXIgKmRldmljZV9mbikKK3sKKwl1bnNpZ25lZCBzaG9ydCBieDsKKwl1bnNpZ25lZCBzaG9ydCByZXQ7CisKKwlfX2FzbV9fKCJsY2FsbCAqKCUlZWRpKTsgY2xkXG5cdCIKKwkJImpjIDFmXG5cdCIKKwkJInhvciAlJWFoLCAlJWFoXG4iCisJCSIxOiIKKwkJOiAiPWIiIChieCksCisJCSAgIj1hIiAocmV0KQorCQk6ICIxIiAoUENJQklPU19GSU5EX1BDSV9ERVZJQ0UpLAorCQkgICJjIiAoZGV2aWNlX2lkKSwKKwkJICAiZCIgKHZlbmRvciksCisJCSAgIlMiICgoaW50KSBpbmRleCksCisJCSAgIkQiICgmcGNpX2luZGlyZWN0KSk7CisJKmJ1cyA9IChieCA+PiA4KSAmIDB4ZmY7CisJKmRldmljZV9mbiA9IGJ4ICYgMHhmZjsKKwlyZXR1cm4gKGludCkgKHJldCAmIDB4ZmYwMCkgPj4gODsKK30KKworc3RhdGljIGludCBwY2lfYmlvc19yZWFkKHVuc2lnbmVkIGludCBzZWcsIHVuc2lnbmVkIGludCBidXMsCisJCQkgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgcmVnLCBpbnQgbGVuLCB1MzIgKnZhbHVlKQoreworCXVuc2lnbmVkIGxvbmcgcmVzdWx0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgYnggPSAoYnVzIDw8IDgpIHwgZGV2Zm47CisKKwlpZiAoIXZhbHVlIHx8IChidXMgPiAyNTUpIHx8IChkZXZmbiA+IDI1NSkgfHwgKHJlZyA+IDI1NSkpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBjaV9jb25maWdfbG9jaywgZmxhZ3MpOworCisJc3dpdGNoIChsZW4pIHsKKwljYXNlIDE6CisJCV9fYXNtX18oImxjYWxsICooJSVlc2kpOyBjbGRcblx0IgorCQkJImpjIDFmXG5cdCIKKwkJCSJ4b3IgJSVhaCwgJSVhaFxuIgorCQkJIjE6IgorCQkJOiAiPWMiICgqdmFsdWUpLAorCQkJICAiPWEiIChyZXN1bHQpCisJCQk6ICIxIiAoUENJQklPU19SRUFEX0NPTkZJR19CWVRFKSwKKwkJCSAgImIiIChieCksCisJCQkgICJEIiAoKGxvbmcpcmVnKSwKKwkJCSAgIlMiICgmcGNpX2luZGlyZWN0KSk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJX19hc21fXygibGNhbGwgKiglJWVzaSk7IGNsZFxuXHQiCisJCQkiamMgMWZcblx0IgorCQkJInhvciAlJWFoLCAlJWFoXG4iCisJCQkiMToiCisJCQk6ICI9YyIgKCp2YWx1ZSksCisJCQkgICI9YSIgKHJlc3VsdCkKKwkJCTogIjEiIChQQ0lCSU9TX1JFQURfQ09ORklHX1dPUkQpLAorCQkJICAiYiIgKGJ4KSwKKwkJCSAgIkQiICgobG9uZylyZWcpLAorCQkJICAiUyIgKCZwY2lfaW5kaXJlY3QpKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlfX2FzbV9fKCJsY2FsbCAqKCUlZXNpKTsgY2xkXG5cdCIKKwkJCSJqYyAxZlxuXHQiCisJCQkieG9yICUlYWgsICUlYWhcbiIKKwkJCSIxOiIKKwkJCTogIj1jIiAoKnZhbHVlKSwKKwkJCSAgIj1hIiAocmVzdWx0KQorCQkJOiAiMSIgKFBDSUJJT1NfUkVBRF9DT05GSUdfRFdPUkQpLAorCQkJICAiYiIgKGJ4KSwKKwkJCSAgIkQiICgobG9uZylyZWcpLAorCQkJICAiUyIgKCZwY2lfaW5kaXJlY3QpKTsKKwkJYnJlYWs7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNpX2NvbmZpZ19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gKGludCkoKHJlc3VsdCAmIDB4ZmYwMCkgPj4gOCk7Cit9CisKK3N0YXRpYyBpbnQgcGNpX2Jpb3Nfd3JpdGUodW5zaWduZWQgaW50IHNlZywgdW5zaWduZWQgaW50IGJ1cywKKwkJCSAgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgcmVnLCBpbnQgbGVuLCB1MzIgdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyByZXN1bHQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBieCA9IChidXMgPDwgOCkgfCBkZXZmbjsKKworCWlmICgoYnVzID4gMjU1KSB8fCAoZGV2Zm4gPiAyNTUpIHx8IChyZWcgPiAyNTUpKSAKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGNpX2NvbmZpZ19sb2NrLCBmbGFncyk7CisKKwlzd2l0Y2ggKGxlbikgeworCWNhc2UgMToKKwkJX19hc21fXygibGNhbGwgKiglJWVzaSk7IGNsZFxuXHQiCisJCQkiamMgMWZcblx0IgorCQkJInhvciAlJWFoLCAlJWFoXG4iCisJCQkiMToiCisJCQk6ICI9YSIgKHJlc3VsdCkKKwkJCTogIjAiIChQQ0lCSU9TX1dSSVRFX0NPTkZJR19CWVRFKSwKKwkJCSAgImMiICh2YWx1ZSksCisJCQkgICJiIiAoYngpLAorCQkJICAiRCIgKChsb25nKXJlZyksCisJCQkgICJTIiAoJnBjaV9pbmRpcmVjdCkpOworCQlicmVhazsKKwljYXNlIDI6CisJCV9fYXNtX18oImxjYWxsICooJSVlc2kpOyBjbGRcblx0IgorCQkJImpjIDFmXG5cdCIKKwkJCSJ4b3IgJSVhaCwgJSVhaFxuIgorCQkJIjE6IgorCQkJOiAiPWEiIChyZXN1bHQpCisJCQk6ICIwIiAoUENJQklPU19XUklURV9DT05GSUdfV09SRCksCisJCQkgICJjIiAodmFsdWUpLAorCQkJICAiYiIgKGJ4KSwKKwkJCSAgIkQiICgobG9uZylyZWcpLAorCQkJICAiUyIgKCZwY2lfaW5kaXJlY3QpKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlfX2FzbV9fKCJsY2FsbCAqKCUlZXNpKTsgY2xkXG5cdCIKKwkJCSJqYyAxZlxuXHQiCisJCQkieG9yICUlYWgsICUlYWhcbiIKKwkJCSIxOiIKKwkJCTogIj1hIiAocmVzdWx0KQorCQkJOiAiMCIgKFBDSUJJT1NfV1JJVEVfQ09ORklHX0RXT1JEKSwKKwkJCSAgImMiICh2YWx1ZSksCisJCQkgICJiIiAoYngpLAorCQkJICAiRCIgKChsb25nKXJlZyksCisJCQkgICJTIiAoJnBjaV9pbmRpcmVjdCkpOworCQlicmVhazsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY2lfY29uZmlnX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAoaW50KSgocmVzdWx0ICYgMHhmZjAwKSA+PiA4KTsKK30KKworCisvKgorICogRnVuY3Rpb24gdGFibGUgZm9yIEJJT1MzMiBhY2Nlc3MKKyAqLworCitzdGF0aWMgc3RydWN0IHBjaV9yYXdfb3BzIHBjaV9iaW9zX2FjY2VzcyA9IHsKKwkucmVhZCA9CQlwY2lfYmlvc19yZWFkLAorCS53cml0ZSA9CXBjaV9iaW9zX3dyaXRlCit9OworCisvKgorICogVHJ5IHRvIGZpbmQgUENJIEJJT1MuCisgKi8KKworc3RhdGljIHN0cnVjdCBwY2lfcmF3X29wcyAqIF9fZGV2aW5pdCBwY2lfZmluZF9iaW9zKHZvaWQpCit7CisJdW5pb24gYmlvczMyICpjaGVjazsKKwl1bnNpZ25lZCBjaGFyIHN1bTsKKwlpbnQgaSwgbGVuZ3RoOworCisJLyoKKwkgKiBGb2xsb3cgdGhlIHN0YW5kYXJkIHByb2NlZHVyZSBmb3IgbG9jYXRpbmcgdGhlIEJJT1MzMiBTZXJ2aWNlCisJICogZGlyZWN0b3J5IGJ5IHNjYW5uaW5nIHRoZSBwZXJtaXNzaWJsZSBhZGRyZXNzIHJhbmdlIGZyb20KKwkgKiAweGUwMDAwIHRocm91Z2ggMHhmZmZmZiBmb3IgYSB2YWxpZCBCSU9TMzIgc3RydWN0dXJlLgorCSAqLworCisJZm9yIChjaGVjayA9ICh1bmlvbiBiaW9zMzIgKikgX192YSgweGUwMDAwKTsKKwkgICAgIGNoZWNrIDw9ICh1bmlvbiBiaW9zMzIgKikgX192YSgweGZmZmYwKTsKKwkgICAgICsrY2hlY2spIHsKKwkJaWYgKGNoZWNrLT5maWVsZHMuc2lnbmF0dXJlICE9IEJJT1MzMl9TSUdOQVRVUkUpCisJCQljb250aW51ZTsKKwkJbGVuZ3RoID0gY2hlY2stPmZpZWxkcy5sZW5ndGggKiAxNjsKKwkJaWYgKCFsZW5ndGgpCisJCQljb250aW51ZTsKKwkJc3VtID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IGxlbmd0aCA7ICsraSkKKwkJCXN1bSArPSBjaGVjay0+Y2hhcnNbaV07CisJCWlmIChzdW0gIT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoY2hlY2stPmZpZWxkcy5yZXZpc2lvbiAhPSAwKSB7CisJCQlwcmludGsoIlBDSTogdW5zdXBwb3J0ZWQgQklPUzMyIHJldmlzaW9uICVkIGF0IDB4JXBcbiIsCisJCQkJY2hlY2stPmZpZWxkcy5yZXZpc2lvbiwgY2hlY2spOworCQkJY29udGludWU7CisJCX0KKwkJREJHKCJQQ0k6IEJJT1MzMiBTZXJ2aWNlIERpcmVjdG9yeSBzdHJ1Y3R1cmUgYXQgMHglcFxuIiwgY2hlY2spOworCQlpZiAoY2hlY2stPmZpZWxkcy5lbnRyeSA+PSAweDEwMDAwMCkgeworCQkJcHJpbnRrKCJQQ0k6IEJJT1MzMiBlbnRyeSAoMHglcCkgaW4gaGlnaCBtZW1vcnksIGNhbm5vdCB1c2UuXG4iLCBjaGVjayk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCXVuc2lnbmVkIGxvbmcgYmlvczMyX2VudHJ5ID0gY2hlY2stPmZpZWxkcy5lbnRyeTsKKwkJCURCRygiUENJOiBCSU9TMzIgU2VydmljZSBEaXJlY3RvcnkgZW50cnkgYXQgMHglbHhcbiIsIGJpb3MzMl9lbnRyeSk7CisJCQliaW9zMzJfaW5kaXJlY3QuYWRkcmVzcyA9IGJpb3MzMl9lbnRyeSArIFBBR0VfT0ZGU0VUOworCQkJaWYgKGNoZWNrX3BjaWJpb3MoKSkKKwkJCQlyZXR1cm4gJnBjaV9iaW9zX2FjY2VzczsKKwkJfQorCQlicmVhazsJLyogSG9wZWZ1bGx5IG1vcmUgdGhhbiBvbmUgQklPUzMyIGNhbm5vdCBoYXBwZW4uLi4gKi8KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIFNvcnQgdGhlIGRldmljZSBsaXN0IGFjY29yZGluZyB0byBQQ0kgQklPUy4gTmFzdHkgaGFjaywgYnV0IHNpbmNlIHNvbWUKKyAqIGZvb2wgZm9yZ290IHRvIGRlZmluZSB0aGUgYGNvcnJlY3QnIGRldmljZSBvcmRlciBpbiB0aGUgUENJIEJJT1Mgc3BlY3MKKyAqIGFuZCB3ZSB3YW50IHRvIGJlIChwb3NzaWJseSBidWctdG8tYnVnIDstXSkgY29tcGF0aWJsZSB3aXRoIG9sZGVyIGtlcm5lbHMKKyAqIHdoaWNoIHVzZWQgQklPUyBvcmRlcmluZywgd2UgYXJlIGJvdW5kIHRvIGRvIHRoaXMuLi4KKyAqLworCit2b2lkIF9fZGV2aW5pdCBwY2liaW9zX3NvcnQodm9pZCkKK3sKKwlMSVNUX0hFQUQoc29ydGVkX2RldmljZXMpOworCXN0cnVjdCBsaXN0X2hlYWQgKmxuOworCXN0cnVjdCBwY2lfZGV2ICpkZXYsICpkOworCWludCBpZHgsIGZvdW5kOworCXVuc2lnbmVkIGNoYXIgYnVzLCBkZXZmbjsKKworCURCRygiUENJOiBTb3J0aW5nIGRldmljZSBsaXN0Li4uXG4iKTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnBjaV9kZXZpY2VzKSkgeworCQlsbiA9IHBjaV9kZXZpY2VzLm5leHQ7CisJCWRldiA9IHBjaV9kZXZfZyhsbik7CisJCWlkeCA9IGZvdW5kID0gMDsKKwkJd2hpbGUgKHBjaV9iaW9zX2ZpbmRfZGV2aWNlKGRldi0+dmVuZG9yLCBkZXYtPmRldmljZSwgaWR4LCAmYnVzLCAmZGV2Zm4pID09IFBDSUJJT1NfU1VDQ0VTU0ZVTCkgeworCQkJaWR4Kys7CisJCQlsaXN0X2Zvcl9lYWNoKGxuLCAmcGNpX2RldmljZXMpIHsKKwkJCQlkID0gcGNpX2Rldl9nKGxuKTsKKwkJCQlpZiAoZC0+YnVzLT5udW1iZXIgPT0gYnVzICYmIGQtPmRldmZuID09IGRldmZuKSB7CisJCQkJCWxpc3RfZGVsKCZkLT5nbG9iYWxfbGlzdCk7CisJCQkJCWxpc3RfYWRkX3RhaWwoJmQtPmdsb2JhbF9saXN0LCAmc29ydGVkX2RldmljZXMpOworCQkJCQlpZiAoZCA9PSBkZXYpCisJCQkJCQlmb3VuZCA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmIChsbiA9PSAmcGNpX2RldmljZXMpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJQQ0k6IEJJT1MgcmVwb3J0aW5nIHVua25vd24gZGV2aWNlICUwMng6JTAyeFxuIiwgYnVzLCBkZXZmbik7CisJCQkJLyoKKwkJCQkgKiBXZSBtdXN0IG5vdCBjb250aW51ZSBzY2FubmluZyBhcyBzZXZlcmFsIGJ1Z2d5IEJJT1NlcworCQkJCSAqIHJldHVybiBnYXJiYWdlIGFmdGVyIHRoZSBsYXN0IGRldmljZS4gR3JyLgorCQkJCSAqLworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICghZm91bmQpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlBDSTogRGV2aWNlICVzIG5vdCBmb3VuZCBieSBCSU9TXG4iLAorCQkJCXBjaV9uYW1lKGRldikpOworCQkJbGlzdF9kZWwoJmRldi0+Z2xvYmFsX2xpc3QpOworCQkJbGlzdF9hZGRfdGFpbCgmZGV2LT5nbG9iYWxfbGlzdCwgJnNvcnRlZF9kZXZpY2VzKTsKKwkJfQorCX0KKwlsaXN0X3NwbGljZSgmc29ydGVkX2RldmljZXMsICZwY2lfZGV2aWNlcyk7Cit9CisKKy8qCisgKiAgQklPUyBGdW5jdGlvbnMgZm9yIElSUSBSb3V0aW5nCisgKi8KKworc3RydWN0IGlycV9yb3V0aW5nX29wdGlvbnMgeworCXUxNiBzaXplOworCXN0cnVjdCBpcnFfaW5mbyAqdGFibGU7CisJdTE2IHNlZ21lbnQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgaXJxX3JvdXRpbmdfdGFibGUgKiBfX2RldmluaXQgcGNpYmlvc19nZXRfaXJxX3JvdXRpbmdfdGFibGUodm9pZCkKK3sKKwlzdHJ1Y3QgaXJxX3JvdXRpbmdfb3B0aW9ucyBvcHQ7CisJc3RydWN0IGlycV9yb3V0aW5nX3RhYmxlICpydCA9IE5VTEw7CisJaW50IHJldCwgbWFwOworCXVuc2lnbmVkIGxvbmcgcGFnZTsKKworCWlmICghcGNpX2Jpb3NfcHJlc2VudCkKKwkJcmV0dXJuIE5VTEw7CisJcGFnZSA9IF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIXBhZ2UpCisJCXJldHVybiBOVUxMOworCW9wdC50YWJsZSA9IChzdHJ1Y3QgaXJxX2luZm8gKikgcGFnZTsKKwlvcHQuc2l6ZSA9IFBBR0VfU0laRTsKKwlvcHQuc2VnbWVudCA9IF9fS0VSTkVMX0RTOworCisJREJHKCJQQ0k6IEZldGNoaW5nIElSUSByb3V0aW5nIHRhYmxlLi4uICIpOworCV9fYXNtX18oInB1c2ggJSVlc1xuXHQiCisJCSJwdXNoICUlZHNcblx0IgorCQkicG9wICAlJWVzXG5cdCIKKwkJImxjYWxsICooJSVlc2kpOyBjbGRcblx0IgorCQkicG9wICUlZXNcblx0IgorCQkiamMgMWZcblx0IgorCQkieG9yICUlYWgsICUlYWhcbiIKKwkJIjE6IgorCQk6ICI9YSIgKHJldCksCisJCSAgIj1iIiAobWFwKSwKKwkJICAiPW0iIChvcHQpCisJCTogIjAiIChQQ0lCSU9TX0dFVF9ST1VUSU5HX09QVElPTlMpLAorCQkgICIxIiAoMCksCisJCSAgIkQiICgobG9uZykgJm9wdCksCisJCSAgIlMiICgmcGNpX2luZGlyZWN0KSwKKwkJICAibSIgKG9wdCkKKwkJOiAibWVtb3J5Iik7CisJREJHKCJPSyAgcmV0PSVkLCBzaXplPSVkLCBtYXA9JXhcbiIsIHJldCwgb3B0LnNpemUsIG1hcCk7CisJaWYgKHJldCAmIDB4ZmYwMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IEVycm9yICUwMnggd2hlbiBmZXRjaGluZyBJUlEgcm91dGluZyB0YWJsZS5cbiIsIChyZXQgPj4gOCkgJiAweGZmKTsKKwllbHNlIGlmIChvcHQuc2l6ZSkgeworCQlydCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcnFfcm91dGluZ190YWJsZSkgKyBvcHQuc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmIChydCkgeworCQkJbWVtc2V0KHJ0LCAwLCBzaXplb2Yoc3RydWN0IGlycV9yb3V0aW5nX3RhYmxlKSk7CisJCQlydC0+c2l6ZSA9IG9wdC5zaXplICsgc2l6ZW9mKHN0cnVjdCBpcnFfcm91dGluZ190YWJsZSk7CisJCQlydC0+ZXhjbHVzaXZlX2lycXMgPSBtYXA7CisJCQltZW1jcHkocnQtPnNsb3RzLCAodm9pZCAqKSBwYWdlLCBvcHQuc2l6ZSk7CisJCQlwcmludGsoS0VSTl9JTkZPICJQQ0k6IFVzaW5nIEJJT1MgSW50ZXJydXB0IFJvdXRpbmcgVGFibGVcbiIpOworCQl9CisJfQorCWZyZWVfcGFnZShwYWdlKTsKKwlyZXR1cm4gcnQ7Cit9CisKKworaW50IHBjaWJpb3Nfc2V0X2lycV9yb3V0aW5nKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBwaW4sIGludCBpcnEpCit7CisJaW50IHJldDsKKworCV9fYXNtX18oImxjYWxsICooJSVlc2kpOyBjbGRcblx0IgorCQkiamMgMWZcblx0IgorCQkieG9yICUlYWgsICUlYWhcbiIKKwkJIjE6IgorCQk6ICI9YSIgKHJldCkKKwkJOiAiMCIgKFBDSUJJT1NfU0VUX1BDSV9IV19JTlQpLAorCQkgICJiIiAoKGRldi0+YnVzLT5udW1iZXIgPDwgOCkgfCBkZXYtPmRldmZuKSwKKwkJICAiYyIgKChpcnEgPDwgOCkgfCAocGluICsgMTApKSwKKwkJICAiUyIgKCZwY2lfaW5kaXJlY3QpKTsKKwlyZXR1cm4gIShyZXQgJiAweGZmMDApOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwY2lfcGNiaW9zX2luaXQodm9pZCkKK3sKKwlpZiAoKHBjaV9wcm9iZSAmIFBDSV9QUk9CRV9CSU9TKSAKKwkJJiYgKChyYXdfcGNpX29wcyA9IHBjaV9maW5kX2Jpb3MoKSkpKSB7CisJCXBjaV9wcm9iZSB8PSBQQ0lfQklPU19TT1JUOworCQlwY2lfYmlvc19wcmVzZW50ID0gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2FyY2hfaW5pdGNhbGwocGNpX3BjYmlvc19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9wY2kvcGNpLmggYi9hcmNoL2kzODYvcGNpL3BjaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZmM4MGMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvcGNpL3BjaS5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKglMb3ctTGV2ZWwgUENJIEFjY2VzcyBmb3IgaTM4NiBtYWNoaW5lcy4KKyAqCisgKgkoYykgMTk5OSBNYXJ0aW4gTWFyZXMgPG1qQHVjdy5jej4KKyAqLworCisjdW5kZWYgREVCVUcKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIERCRyh4Li4uKSBwcmludGsoeCkKKyNlbHNlCisjZGVmaW5lIERCRyh4Li4uKQorI2VuZGlmCisKKyNkZWZpbmUgUENJX1BST0JFX0JJT1MJCTB4MDAwMQorI2RlZmluZSBQQ0lfUFJPQkVfQ09ORjEJCTB4MDAwMgorI2RlZmluZSBQQ0lfUFJPQkVfQ09ORjIJCTB4MDAwNAorI2RlZmluZSBQQ0lfUFJPQkVfTU1DT05GCTB4MDAwOAorI2RlZmluZSBQQ0lfUFJPQkVfTUFTSwkJMHgwMDBmCisKKyNkZWZpbmUgUENJX05PX1NPUlQJCTB4MDEwMAorI2RlZmluZSBQQ0lfQklPU19TT1JUCQkweDAyMDAKKyNkZWZpbmUgUENJX05PX0NIRUNLUwkJMHgwNDAwCisjZGVmaW5lIFBDSV9VU0VfUElSUV9NQVNLCTB4MDgwMAorI2RlZmluZSBQQ0lfQVNTSUdOX1JPTVMJCTB4MTAwMAorI2RlZmluZSBQQ0lfQklPU19JUlFfU0NBTgkweDIwMDAKKyNkZWZpbmUgUENJX0FTU0lHTl9BTExfQlVTU0VTCTB4NDAwMAorCitleHRlcm4gdW5zaWduZWQgaW50IHBjaV9wcm9iZTsKKworLyogcGNpLWkzODYuYyAqLworCitleHRlcm4gdW5zaWduZWQgaW50IHBjaWJpb3NfbWF4X2xhdGVuY3k7CisKK3ZvaWQgcGNpYmlvc19yZXNvdXJjZV9zdXJ2ZXkodm9pZCk7CitpbnQgcGNpYmlvc19lbmFibGVfcmVzb3VyY2VzKHN0cnVjdCBwY2lfZGV2ICosIGludCk7CisKKy8qIHBjaS1wYy5jICovCisKK2V4dGVybiBpbnQgcGNpYmlvc19sYXN0X2J1czsKK2V4dGVybiBzdHJ1Y3QgcGNpX2J1cyAqcGNpX3Jvb3RfYnVzOworZXh0ZXJuIHN0cnVjdCBwY2lfb3BzIHBjaV9yb290X29wczsKKworLyogcGNpLWlycS5jICovCisKK3N0cnVjdCBpcnFfaW5mbyB7CisJdTggYnVzLCBkZXZmbjsJCQkvKiBCdXMsIGRldmljZSBhbmQgZnVuY3Rpb24gKi8KKwlzdHJ1Y3QgeworCQl1OCBsaW5rOwkJLyogSVJRIGxpbmUgSUQsIGNoaXBzZXQgZGVwZW5kZW50LCAwPW5vdCByb3V0ZWQgKi8KKwkJdTE2IGJpdG1hcDsJCS8qIEF2YWlsYWJsZSBJUlFzICovCisJfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBpcnFbNF07CisJdTggc2xvdDsJCQkvKiBTbG90IG51bWJlciwgMD1vbmJvYXJkICovCisJdTggcmZ1OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGlycV9yb3V0aW5nX3RhYmxlIHsKKwl1MzIgc2lnbmF0dXJlOwkJCS8qIFBJUlFfU0lHTkFUVVJFIHNob3VsZCBiZSBoZXJlICovCisJdTE2IHZlcnNpb247CQkJLyogUElSUV9WRVJTSU9OICovCisJdTE2IHNpemU7CQkJLyogVGFibGUgc2l6ZSBpbiBieXRlcyAqLworCXU4IHJ0cl9idXMsIHJ0cl9kZXZmbjsJCS8qIFdoZXJlIHRoZSBpbnRlcnJ1cHQgcm91dGVyIGxpZXMgKi8KKwl1MTYgZXhjbHVzaXZlX2lycXM7CQkvKiBJUlFzIGRldm90ZWQgZXhjbHVzaXZlbHkgdG8gUENJIHVzYWdlICovCisJdTE2IHJ0cl92ZW5kb3IsIHJ0cl9kZXZpY2U7CS8qIFZlbmRvciBhbmQgZGV2aWNlIElEIG9mIGludGVycnVwdCByb3V0ZXIgKi8KKwl1MzIgbWluaXBvcnRfZGF0YTsJCS8qIENyYXAgKi8KKwl1OCByZnVbMTFdOworCXU4IGNoZWNrc3VtOwkJCS8qIE1vZHVsbyAyNTYgY2hlY2tzdW0gbXVzdCBnaXZlIHplcm8gKi8KKwlzdHJ1Y3QgaXJxX2luZm8gc2xvdHNbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitleHRlcm4gdW5zaWduZWQgaW50IHBjaWJpb3NfaXJxX21hc2s7CisKK2V4dGVybiBpbnQgcGNpYmlvc19zY2FubmVkOworZXh0ZXJuIHNwaW5sb2NrX3QgcGNpX2NvbmZpZ19sb2NrOworCitleHRlcm4gaW50ICgqcGNpYmlvc19lbmFibGVfaXJxKShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9wY2kvdmlzd3MuYyBiL2FyY2gvaTM4Ni9wY2kvdmlzd3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTkyNDg3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L3BjaS92aXN3cy5jCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICoJTG93LUxldmVsIFBDSSBTdXBwb3J0IGZvciBTR0kgVmlzdWFsIFdvcmtzdGF0aW9uCisgKgorICoJKGMpIDE5OTktLTIwMDAgTWFydGluIE1hcmVzIDxtakB1Y3cuY3o+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgImNvYmFsdC5oIgorI2luY2x1ZGUgImxpdGhpdW0uaCIKKworI2luY2x1ZGUgInBjaS5oIgorCisKK2V4dGVybiBzdHJ1Y3QgcGNpX3Jhd19vcHMgcGNpX2RpcmVjdF9jb25mMTsKKworc3RhdGljIGludCBwY2lfdmlzd3NfZW5hYmxlX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2KSB7IHJldHVybiAwOyB9CisKK2ludCAoKnBjaWJpb3NfZW5hYmxlX2lycSkoc3RydWN0IHBjaV9kZXYgKmRldikgPSAmcGNpX3Zpc3dzX2VuYWJsZV9pcnE7CisKK3ZvaWQgX19pbml0IHBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxKSB7fQorCisKK3Vuc2lnbmVkIGludCBwY2lfYnVzMCwgcGNpX2J1czE7CisKK3N0YXRpYyBpbmxpbmUgdTggYnJpZGdlX3N3aXp6bGUodTggcGluLCB1OCBzbG90KSAKK3sKKwlyZXR1cm4gKCgocGluIC0gMSkgKyBzbG90KSAlIDQpICsgMTsKK30KKworc3RhdGljIHU4IF9faW5pdCB2aXN3c19zd2l6emxlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4ICpwaW5wKQoreworCXU4IHBpbiA9ICpwaW5wOworCisJd2hpbGUgKGRldi0+YnVzLT5zZWxmKSB7CS8qIE1vdmUgdXAgdGhlIGNoYWluIG9mIGJyaWRnZXMuICovCisJCXBpbiA9IGJyaWRnZV9zd2l6emxlKHBpbiwgUENJX1NMT1QoZGV2LT5kZXZmbikpOworCQlkZXYgPSBkZXYtPmJ1cy0+c2VsZjsKKwl9CisJKnBpbnAgPSBwaW47CisKKwlyZXR1cm4gUENJX1NMT1QoZGV2LT5kZXZmbik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHZpc3dzX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQoreworCWludCBpcnEsIGJ1cyA9IGRldi0+YnVzLT5udW1iZXI7CisKKwlwaW4tLTsKKworCS8qIE5vdGhpbmcgdXNlZnVsIGF0IFBJSVg0IHBpbiAxICovCisJaWYgKGJ1cyA9PSBwY2lfYnVzMCAmJiBzbG90ID09IDQgJiYgcGluID09IDApCisJCXJldHVybiAtMTsKKworCS8qIFBJSVg0IFVTQiBpcyBvbiBCdXMgMCwgU2xvdCA0LCBMaW5lIDMgKi8KKwlpZiAoYnVzID09IHBjaV9idXMwICYmIHNsb3QgPT0gNCAmJiBwaW4gPT0gMykgeworCQlpcnEgPSBDT19JUlEoQ09fQVBJQ19QSUlYNF9VU0IpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBGaXJzdCBwaW4gc3ByZWFkIGRvd24gMSBBUElDIGVudHJ5IHBlciBzbG90ICovCisJaWYgKHBpbiA9PSAwKSB7CisJCWlycSA9IENPX0lSUSgoYnVzID09IHBjaV9idXMwID8gQ09fQVBJQ19QQ0lCX0JBU0UwIDoKKwkJCQkJCUNPX0FQSUNfUENJQV9CQVNFMCkgKyBzbG90KTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogbGluZXMgMSwyLDMgZnJvbSBhbnkgc2xvdCBpcyBzaGFyZWQgaW4gdGhpcyB0d2lybHkgcGF0dGVybiAqLworCWlmIChidXMgPT0gcGNpX2J1czEpIHsKKwkJLyogbGluZXMgMS0zIGZyb20gZGV2aWNlcyAwIDEgcm90YXRlIG92ZXIgMiBhcGljIGVudHJpZXMgKi8KKwkJaXJxID0gQ09fSVJRKENPX0FQSUNfUENJQV9CQVNFMTIzICsgKChzbG90ICsgKHBpbiAtIDEpKSAlIDIpKTsKKwl9IGVsc2UgeyAvKiBidXMgPT0gcGNpX2J1czAgKi8KKwkJLyogbGluZXMgMS0zIGZyb20gZGV2aWNlcyAwLTMgcm90YXRlIG92ZXIgMyBhcGljIGVudHJpZXMgKi8KKwkJaWYgKHNsb3QgPT0gMCkKKwkJCXNsb3QgPSAzOyAvKiBzYW1lIHBhdHRlcm4gKi8KKwkJaXJxID0gQ09fSVJRKENPX0FQSUNfUENJQV9CQVNFMTIzICsgKCgzIC0gc2xvdCkgKyAocGluIC0gMSkgJSAzKSk7CisJfQorb3V0OgorCXByaW50ayhLRVJOX0RFQlVHICJQQ0k6IEJ1cyAlZCBTbG90ICVkIExpbmUgJWQgLT4gSVJRICVkXG4iLCBidXMsIHNsb3QsIHBpbiwgaXJxKTsKKwlyZXR1cm4gaXJxOworfQorCit2b2lkIF9faW5pdCBwY2liaW9zX3VwZGF0ZV9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGlycSkKK3sKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsIGlycSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHBjaWJpb3NfaW5pdCh2b2lkKQoreworCS8qIFRoZSBWSVNXUyBzdXBwb3J0cyBjb25maWd1cmF0aW9uIGFjY2VzcyB0eXBlIDEgb25seSAqLworCXBjaV9wcm9iZSA9IChwY2lfcHJvYmUgfCBQQ0lfUFJPQkVfQ09ORjEpICYKKwkJICAgIH4oUENJX1BST0JFX0JJT1MgfCBQQ0lfUFJPQkVfQ09ORjIpOworCisJcGNpX2J1czAgPSBsaV9wY2liX3JlYWQxNihMSV9QQ0lfQlVTTlVNKSAmIDB4ZmY7CisJcGNpX2J1czEgPSBsaV9wY2lhX3JlYWQxNihMSV9QQ0lfQlVTTlVNKSAmIDB4ZmY7CisKKwlwcmludGsoS0VSTl9JTkZPICJQQ0k6IExpdGhpdW0gYnJpZGdlIEEgYnVzOiAldSwgIgorCQkiYnJpZGdlIEIgKFBJSVg0KSBidXM6ICV1XG4iLCBwY2lfYnVzMSwgcGNpX2J1czApOworCisJcmF3X3BjaV9vcHMgPSAmcGNpX2RpcmVjdF9jb25mMTsKKwlwY2lfc2Nhbl9idXMocGNpX2J1czAsICZwY2lfcm9vdF9vcHMsIE5VTEwpOworCXBjaV9zY2FuX2J1cyhwY2lfYnVzMSwgJnBjaV9yb290X29wcywgTlVMTCk7CisJcGNpX2ZpeHVwX2lycXModmlzd3Nfc3dpenpsZSwgdmlzd3NfbWFwX2lycSk7CisJcGNpYmlvc19yZXNvdXJjZV9zdXJ2ZXkoKTsKKwlyZXR1cm4gMDsKK30KKworc3Vic3lzX2luaXRjYWxsKHBjaWJpb3NfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcG93ZXIvTWFrZWZpbGUgYi9hcmNoL2kzODYvcG93ZXIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNmYTRlOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9wb3dlci9NYWtlZmlsZQpAQCAtMCwwICsxLDIgQEAKK29iai0kKENPTkZJR19QTSkJCSs9IGNwdS5vCitvYmotJChDT05GSUdfU09GVFdBUkVfU1VTUEVORCkJKz0gc3dzdXNwLm8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9wb3dlci9jcHUuYyBiL2FyY2gvaTM4Ni9wb3dlci9jcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjMzN2M2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L3Bvd2VyL2NwdS5jCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogU3VzcGVuZCBzdXBwb3J0IHNwZWNpZmljIGZvciBpMzg2LgorICoKKyAqIERpc3RyaWJ1dGUgdW5kZXIgR1BMdjIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgUGF2ZWwgTWFjaGVrIDxwYXZlbEBzdXNlLmN6PgorICogQ29weXJpZ2h0IChjKSAyMDAxIFBhdHJpY2sgTW9jaGVsIDxtb2NoZWxAb3NkbC5vcmc+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2FjcGkuaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKworc3RhdGljIHN0cnVjdCBzYXZlZF9jb250ZXh0IHNhdmVkX2NvbnRleHQ7CisKK3Vuc2lnbmVkIGxvbmcgc2F2ZWRfY29udGV4dF9lYng7Cit1bnNpZ25lZCBsb25nIHNhdmVkX2NvbnRleHRfZXNwLCBzYXZlZF9jb250ZXh0X2VicDsKK3Vuc2lnbmVkIGxvbmcgc2F2ZWRfY29udGV4dF9lc2ksIHNhdmVkX2NvbnRleHRfZWRpOwordW5zaWduZWQgbG9uZyBzYXZlZF9jb250ZXh0X2VmbGFnczsKKworZXh0ZXJuIHZvaWQgZW5hYmxlX3NlcF9jcHUodm9pZCAqKTsKKwordm9pZCBfX3NhdmVfcHJvY2Vzc29yX3N0YXRlKHN0cnVjdCBzYXZlZF9jb250ZXh0ICpjdHh0KQoreworCWtlcm5lbF9mcHVfYmVnaW4oKTsKKworCS8qCisJICogZGVzY3JpcHRvciB0YWJsZXMKKwkgKi8KKwlhc20gdm9sYXRpbGUgKCJzZ2R0ICUwIiA6ICI9bSIgKGN0eHQtPmdkdF9saW1pdCkpOworCWFzbSB2b2xhdGlsZSAoInNpZHQgJTAiIDogIj1tIiAoY3R4dC0+aWR0X2xpbWl0KSk7CisJYXNtIHZvbGF0aWxlICgic2xkdCAlMCIgOiAiPW0iIChjdHh0LT5sZHQpKTsKKwlhc20gdm9sYXRpbGUgKCJzdHIgJTAiICA6ICI9bSIgKGN0eHQtPnRyKSk7CisKKwkvKgorCSAqIHNlZ21lbnQgcmVnaXN0ZXJzCisJICovCisJYXNtIHZvbGF0aWxlICgibW92dyAlJWVzLCAlMCIgOiAiPW0iIChjdHh0LT5lcykpOworCWFzbSB2b2xhdGlsZSAoIm1vdncgJSVmcywgJTAiIDogIj1tIiAoY3R4dC0+ZnMpKTsKKwlhc20gdm9sYXRpbGUgKCJtb3Z3ICUlZ3MsICUwIiA6ICI9bSIgKGN0eHQtPmdzKSk7CisJYXNtIHZvbGF0aWxlICgibW92dyAlJXNzLCAlMCIgOiAiPW0iIChjdHh0LT5zcykpOworCisJLyoKKwkgKiBjb250cm9sIHJlZ2lzdGVycyAKKwkgKi8KKwlhc20gdm9sYXRpbGUgKCJtb3ZsICUlY3IwLCAlMCIgOiAiPXIiIChjdHh0LT5jcjApKTsKKwlhc20gdm9sYXRpbGUgKCJtb3ZsICUlY3IyLCAlMCIgOiAiPXIiIChjdHh0LT5jcjIpKTsKKwlhc20gdm9sYXRpbGUgKCJtb3ZsICUlY3IzLCAlMCIgOiAiPXIiIChjdHh0LT5jcjMpKTsKKwlhc20gdm9sYXRpbGUgKCJtb3ZsICUlY3I0LCAlMCIgOiAiPXIiIChjdHh0LT5jcjQpKTsKK30KKwordm9pZCBzYXZlX3Byb2Nlc3Nvcl9zdGF0ZSh2b2lkKQoreworCV9fc2F2ZV9wcm9jZXNzb3Jfc3RhdGUoJnNhdmVkX2NvbnRleHQpOworfQorCitzdGF0aWMgdm9pZAorZG9fZnB1X2VuZCh2b2lkKQoreworICAgICAgICAvKiByZXN0b3JlIEZQVSByZWdzIGlmIG5lY2Vzc2FyeSAqLworCS8qIERvIGl0IG91dCBvZiBsaW5lIHNvIHRoYXQgZ2NjIGRvZXMgbm90IG1vdmUgY3IwIGxvYWQgdG8gc29tZSBzdHVwaWQgcGxhY2UgKi8KKyAgICAgICAga2VybmVsX2ZwdV9lbmQoKTsKKwlteGNzcl9mZWF0dXJlX21hc2tfaW5pdCgpOworfQorCisKK3N0YXRpYyB2b2lkIGZpeF9wcm9jZXNzb3JfY29udGV4dCh2b2lkKQoreworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJc3RydWN0IHRzc19zdHJ1Y3QgKiB0ID0gJnBlcl9jcHUoaW5pdF90c3MsIGNwdSk7CisKKwlzZXRfdHNzX2Rlc2MoY3B1LHQpOwkvKiBUaGlzIGp1c3QgbW9kaWZpZXMgbWVtb3J5OyBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeS4gQnV0Li4uIFRoaXMgaXMgbmVjZXNzYXJ5LCBiZWNhdXNlIDM4NiBoYXJkd2FyZSBoYXMgY29uY2VwdCBvZiBidXN5IFRTUyBvciBzb21lIHNpbWlsYXIgc3R1cGlkaXR5LiAqLworICAgICAgICBwZXJfY3B1KGNwdV9nZHRfdGFibGUsIGNwdSlbR0RUX0VOVFJZX1RTU10uYiAmPSAweGZmZmZmZGZmOworCisJbG9hZF9UUl9kZXNjKCk7CQkJCS8qIFRoaXMgZG9lcyBsdHIgKi8KKwlsb2FkX0xEVCgmY3VycmVudC0+YWN0aXZlX21tLT5jb250ZXh0KTsJLyogVGhpcyBkb2VzIGxsZHQgKi8KKworCS8qCisJICogTm93IG1heWJlIHJlbG9hZCB0aGUgZGVidWcgcmVnaXN0ZXJzCisJICovCisJaWYgKGN1cnJlbnQtPnRocmVhZC5kZWJ1Z3JlZ1s3XSl7CisgICAgICAgICAgICAgICAgbG9hZGRlYnVnKCZjdXJyZW50LT50aHJlYWQsIDApOworICAgICAgICAgICAgICAgIGxvYWRkZWJ1ZygmY3VycmVudC0+dGhyZWFkLCAxKTsKKyAgICAgICAgICAgICAgICBsb2FkZGVidWcoJmN1cnJlbnQtPnRocmVhZCwgMik7CisgICAgICAgICAgICAgICAgbG9hZGRlYnVnKCZjdXJyZW50LT50aHJlYWQsIDMpOworICAgICAgICAgICAgICAgIC8qIG5vIDQgYW5kIDUgKi8KKyAgICAgICAgICAgICAgICBsb2FkZGVidWcoJmN1cnJlbnQtPnRocmVhZCwgNik7CisgICAgICAgICAgICAgICAgbG9hZGRlYnVnKCZjdXJyZW50LT50aHJlYWQsIDcpOworCX0KKworfQorCit2b2lkIF9fcmVzdG9yZV9wcm9jZXNzb3Jfc3RhdGUoc3RydWN0IHNhdmVkX2NvbnRleHQgKmN0eHQpCit7CisKKwkvKgorCSAqIGNvbnRyb2wgcmVnaXN0ZXJzCisJICovCisJYXNtIHZvbGF0aWxlICgibW92bCAlMCwgJSVjcjQiIDo6ICJyIiAoY3R4dC0+Y3I0KSk7CisJYXNtIHZvbGF0aWxlICgibW92bCAlMCwgJSVjcjMiIDo6ICJyIiAoY3R4dC0+Y3IzKSk7CisJYXNtIHZvbGF0aWxlICgibW92bCAlMCwgJSVjcjIiIDo6ICJyIiAoY3R4dC0+Y3IyKSk7CisJYXNtIHZvbGF0aWxlICgibW92bCAlMCwgJSVjcjAiIDo6ICJyIiAoY3R4dC0+Y3IwKSk7CisKKwkvKgorCSAqIHNlZ21lbnQgcmVnaXN0ZXJzCisJICovCisJYXNtIHZvbGF0aWxlICgibW92dyAlMCwgJSVlcyIgOjogInIiIChjdHh0LT5lcykpOworCWFzbSB2b2xhdGlsZSAoIm1vdncgJTAsICUlZnMiIDo6ICJyIiAoY3R4dC0+ZnMpKTsKKwlhc20gdm9sYXRpbGUgKCJtb3Z3ICUwLCAlJWdzIiA6OiAiciIgKGN0eHQtPmdzKSk7CisJYXNtIHZvbGF0aWxlICgibW92dyAlMCwgJSVzcyIgOjogInIiIChjdHh0LT5zcykpOworCisJLyoKKwkgKiBub3cgcmVzdG9yZSB0aGUgZGVzY3JpcHRvciB0YWJsZXMgdG8gdGhlaXIgcHJvcGVyIHZhbHVlcworCSAqIGx0ciBpcyBkb25lIGkgZml4X3Byb2Nlc3Nvcl9jb250ZXh0KCkuCisJICovCisJYXNtIHZvbGF0aWxlICgibGdkdCAlMCIgOjogIm0iIChjdHh0LT5nZHRfbGltaXQpKTsKKwlhc20gdm9sYXRpbGUgKCJsaWR0ICUwIiA6OiAibSIgKGN0eHQtPmlkdF9saW1pdCkpOworCWFzbSB2b2xhdGlsZSAoImxsZHQgJTAiIDo6ICJtIiAoY3R4dC0+bGR0KSk7CisKKwkvKgorCSAqIHN5c2VudGVyIE1TUnMKKwkgKi8KKwlpZiAoYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX1NFUCkpCisJCWVuYWJsZV9zZXBfY3B1KE5VTEwpOworCisJZml4X3Byb2Nlc3Nvcl9jb250ZXh0KCk7CisJZG9fZnB1X2VuZCgpOworfQorCit2b2lkIHJlc3RvcmVfcHJvY2Vzc29yX3N0YXRlKHZvaWQpCit7CisJX19yZXN0b3JlX3Byb2Nlc3Nvcl9zdGF0ZSgmc2F2ZWRfY29udGV4dCk7Cit9CisKKy8qIE5lZWRlZCBieSBhcG0uYyAqLworRVhQT1JUX1NZTUJPTChzYXZlX3Byb2Nlc3Nvcl9zdGF0ZSk7CitFWFBPUlRfU1lNQk9MKHJlc3RvcmVfcHJvY2Vzc29yX3N0YXRlKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9wb3dlci9zd3N1c3AuUyBiL2FyY2gvaTM4Ni9wb3dlci9zd3N1c3AuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDEwNTI4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L3Bvd2VyL3N3c3VzcC5TCkBAIC0wLDAgKzEsNzMgQEAKKy50ZXh0CisKKy8qIE9yaWdpbmFsbHkgZ2NjIGdlbmVyYXRlZCwgbW9kaWZpZWQgYnkgaGFuZAorICoKKyAqIFRoaXMgbWF5IG5vdCB1c2UgYW55IHN0YWNrLCBub3IgYW55IHZhcmlhYmxlIHRoYXQgaXMgbm90ICJOb1NhdmUiOgorICoKKyAqIEl0cyByZXdyaXRpbmcgb25lIGtlcm5lbCBpbWFnZSB3aXRoIGFub3RoZXIuIFdoYXQgaXMgc3RhY2sgaW4gIm9sZCIKKyAqIGltYWdlIGNvdWxkIHZlcnkgd2VsbCBiZSBkYXRhIHBhZ2UgaW4gIm5ldyIgaW1hZ2UsIGFuZCBvdmVyd3JpdGluZworICogeW91ciBvd24gc3RhY2sgdW5kZXIgeW91IGlzIGJhZCBpZGVhLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9hc21fb2Zmc2V0cy5oPgorCisJLnRleHQKKworRU5UUlkoc3dzdXNwX2FyY2hfc3VzcGVuZCkKKworCW1vdmwgJWVzcCwgc2F2ZWRfY29udGV4dF9lc3AKKwltb3ZsICVlYngsIHNhdmVkX2NvbnRleHRfZWJ4CisJbW92bCAlZWJwLCBzYXZlZF9jb250ZXh0X2VicAorCW1vdmwgJWVzaSwgc2F2ZWRfY29udGV4dF9lc2kKKwltb3ZsICVlZGksIHNhdmVkX2NvbnRleHRfZWRpCisJcHVzaGZsIDsgcG9wbCBzYXZlZF9jb250ZXh0X2VmbGFncworCisJY2FsbCBzd3N1c3Bfc2F2ZQorCXJldAorCitFTlRSWShzd3N1c3BfYXJjaF9yZXN1bWUpCisJbW92bAkkc3dzdXNwX3BnX2Rpci1fX1BBR0VfT0ZGU0VULCAlZWN4CisJbW92bAklZWN4LCAlY3IzCisKKwltb3ZsCXBhZ2VkaXJfbm9zYXZlLCAlZWR4CisJLnAyYWxpZ24gNCwsNworCitjb3B5X2xvb3A6CisJdGVzdGwJJWVkeCwgJWVkeAorCWp6CWRvbmUKKworCW1vdmwJcGJlX2FkZHJlc3MoJWVkeCksICVlc2kKKwltb3ZsCXBiZV9vcmlnX2FkZHJlc3MoJWVkeCksICVlZGkKKworCW1vdmwJJDEwMjQsICVlY3gKKwlyZXAKKwltb3ZzbAorCisJbW92bAlwYmVfbmV4dCglZWR4KSwgJWVkeAorCWptcAljb3B5X2xvb3AKKwkucDJhbGlnbiA0LCw3CisKK2RvbmU6CisJLyogRmx1c2ggVExCLCBpbmNsdWRpbmcgImdsb2JhbCIgdGhpbmdzICh2bWFsbG9jKSAqLworCW1vdmwJbW11X2NyNF9mZWF0dXJlcywgJWVheAorCW1vdmwJJWVheCwgJWVkeAorCWFuZGwJJH4oMTw8NyksICVlZHg7ICAjIFBHRQorCW1vdmwJJWVkeCwgJWNyNDsgICMgdHVybiBvZmYgUEdFCisJbW92bAklY3IzLCAlZWN4OyAgIyBmbHVzaCBUTEIKKwltb3ZsCSVlY3gsICVjcjMKKwltb3ZsCSVlYXgsICVjcjQ7ICAjIHR1cm4gUEdFIGJhY2sgb24KKworCW1vdmwgc2F2ZWRfY29udGV4dF9lc3AsICVlc3AKKwltb3ZsIHNhdmVkX2NvbnRleHRfZWJwLCAlZWJwCisJbW92bCBzYXZlZF9jb250ZXh0X2VieCwgJWVieAorCW1vdmwgc2F2ZWRfY29udGV4dF9lc2ksICVlc2kKKwltb3ZsIHNhdmVkX2NvbnRleHRfZWRpLCAlZWRpCisKKwlwdXNobCBzYXZlZF9jb250ZXh0X2VmbGFncyA7IHBvcGZsCisKKwl4b3JsCSVlYXgsICVlYXgKKworCXJldAo=